实验1 单片机IO口应用及数码管显示

发布者:祝福的4号最新更新时间:2016-05-31 来源: eefocus关键字:单片机  IO口  数码管显示 手机看文章 扫描二维码
随时随地手机看文章

1.   单片机驱动蜂鸣器的实验;

a)         说明:Lab51单片机实验板的蜂鸣器连接到单片机的P1.5

b)        基本要求:控制蜂鸣器每2秒响0.5秒。

 
#include
#define unit unsigned int
 
void delay(unit x){
    unit i=x;
    unit j;
    for(;i>0;--i){
       for(j=x;j>0;--j);
    }
}
void main()
{
    while(1){
       P1=0x00;
       delay(250);   //0.5秒
       P1=0xff;
       delay(420);//2秒
    }
}
 

2.  单片机驱动继电器输出实验;

a)         说明:Lab51单片机实验板的蜂鸣器连接到单片机的P1.4

b)        基本要求:控制继电器每5秒吸合0.5秒。

#include
#define unit unsigned int
 
void delay(unit x){
    unit i=x;
        unit j;
    for(;i>0;--i){
    for(j=x;j>0;--j);
    }
}
sbit JiDian=P1^4;
void main()
{
    while(1){
    JiDian=0x00;
    delay(250);   //0.5秒
    JiDian=0xff;
    delay(700);//2秒
    }
}
 

3.延时实现p2口LED流水灯效果(用循环移位指令)

#include
#define unit unsigned int
 
unit table[]={~0x01,~0x02,~0x04,~0x08,~0x10,~0x20,~0x40,~0x80};
void delay(unit x){
    unit i=x;
        unit j;
    for(;i>0;--i){
    for(j=x;j>0;--j);
    }
}
 
void main()
{
       int i;
       P2=0x00;
       while(1){
           for(i=0;i<8;i++){
                  P2=table[i];
                  delay(250);//2秒
           }
       }
}     
 

4.p2口八个灯作二进制加法。理解二进值的计算

#include
#define unit unsigned int
 
void delay(unit x){
    unit i=x;
        unit j;
    for(;i>0;--i){
    for(j=x;j>0;--j);
    }
}
 
void main(){
   while(1){
    P2=0xff;
       while(P2!=0x00){
           P2++;
           delay(250);//2秒
       }
   }
}   

5.直接用IO口做位选信号,控制8位数码管上显示1,2,3,4…F,循环显示

说明:P0是位选,P2是段选
 
#include
#define unit unsigned int
unit code NumTable[]={0x06,~0x24,~0x30,~0x19,~0x12,~0x02,0x87,0xff,~0x10};
void delay(unit x){
    unit i=x;
        unit j;
    for(;i>0;--i){
    for(j=x;j>0;--j);
    }
}
void DisplayNumByOrder(unit DelayNum){
           int i;
           for(i=0;i<=8;i++){
                  P0=NumTable[i];
                  delay(DelayNum);//2秒
           }
}
void main(){
    //P0是段选,P2是位选
    P2=0x00;
    while(1){
           DisplayNumByOrder(250);    
    }
}

6.用译码器138做片选信号,控制4位数码管上做加1显示。从0开始.

说明:JP15与JP16 用8个短路冒连接,JP10 (P0)与J12 用8PIN排线连接
#include
#include
#define unit unsigned int
unit code NumTable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//数字的编码
//  用译码器138做位选信号,控制4位数码管上做加1显示。从0开始.
void delay_1ms(unit x){
    unit i=x;
        unit j;
    for(;i>0;--i){
       for(j=110;j>0;--j);
    }
}
/**
    在数码管上显示对应的值
**/
void display(unsignedchar k)
{
    P0=NumTable[k];
    delay_1ms(3);
}
sbit high=P2^4;
sbit mid=P2^3;
sbit low=P2^2;
/**
    控制数码管显示后4位,并分解计数值
**/
void DisplayNumByOrder(unit Count,unit delay_1msNum){
       low=0; mid=0; high=0;  display(0);        
        low=1; mid=0; high=0;  display(0);               
        low=0; mid=1; high=0;  display(0);
       low=1; mid=1; high=0;  display(0);
       low=0; mid=0; high=1;  display(Count%10/1);
       low=1; mid=0; high=1;  display(Count%1/100);
       low=0; mid=1; high=1;  display(Count%100/10);
       low=1; mid=1; high=1;  display(Count%10);
}
 
//一个是位选,一个是段选
void main(){
    int count=0;
    while(1){
           count++;
           DisplayNumByOrder(count,300);  
           if(count==9) count=0;
    }
}

7.利用动态扫描方法在八位数码管上显示出稳定的87654321.

#include
#define unit unsigned int
unit table[]={~0x01,~0x02,~0x04,~0x08,~0x10,~0x20,~0x40,~0x80};
unit code NumTable[]={0x06,~0x24,~0x30,~0x19,~0x12,~0x02,0x87,0xff,~0x10};
void delay(unit x){
    unit i=x;
        unit j;
    for(;i>0;--i){
    for(j=x;j>0;--j);
    }
}
void DisplayNumByOrder(unit DelayNum){
           int i;
           for(i=0;i<=7;i++){
                  P0=NumTable[i];
                  P2=table[i];
                  delay(DelayNum);//5ms
           }
}
//一个是位选,一个是段选
void main(){
    //P0是位选,P2是段选
    //P2=0x00;
    while(1){
           DisplayNumByOrder(5);      
    }
}

8.  数码管前三位显示一个跑表,从到之间以1%秒速度运行,当按下一个独立键盘时跑表停止,松开手后跑表继续运行。

#include
#define unit unsigned int
unit code NumTable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//数字的编码
//数码管前三位显示一个跑表,从到之间以1%秒速度运行,当按下一个独立键盘时跑表停止,松开手后跑表继续运行。
sbit high=P2^4;
sbit mid=P2^3;
sbit low=P2^2;
sbit IsCountKey=P3^0;//是否计数的按键
const bit PRESSED=0;//0的时候运行,1的时候暂停
//监测
void delay_1ms(unit x){
    unit i=x;
    unit j;
    for(;i>0;--i){
       for(j=110;j>0;--j);
    }
}
/**
    在数码管上显示对应的值
**/
void display(unsignedchar Num)
{
    P0=NumTable[Num];
    delay_1ms(1);
    P0=0;      //送完段选信号后,进行消影的处理
}
 
/**
    控制数码管显示后3位,并分解计数值
**/
void DisplayNumByOrder(unit Count){
       low=0; mid=0; high=0;  display(0);        
        low=1; mid=0; high=0;  display(0);               
        low=0; mid=1; high=0;  display(0);
       low=1; mid=1; high=0;  display(0);
       low=0; mid=0; high=1;  display(0);
       low=1; mid=0; high=1;  display(Count%1/100);
       low=0; mid=1; high=1;  display(Count%100/10);
       low=1; mid=1; high=1;  display(Count%10);
}
//是否计数
void IsCount(unit count){
    if(PRESSED==IsCountKey){    //当按键按下
       delay_1ms(10);       //去抖动
       if(PRESSED==IsCountKey){//当按键按下
           while(PRESSED==IsCountKey){//当按键一直按下
              DisplayNumByOrder(count);//显示原数值
           }
       }
    }
}
//扫描键盘
void main(){
    int count=0;
    while(1){
           IsCount(count);
           count++;
           DisplayNumByOrder(count);  
           if(count==) count=0;
    }
}
 
 

9.  在上题的基础上,用另外三个独立键盘实现按下第一个时计时停止,按下第二个时计时开始,按下第三个是计数值清零从头开始。

#include
#define unit unsigned int
unit code NumTable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//数字的编码
//数码管前三位显示一个跑表,从到之间以1%秒速度运行,当按下一个独立键盘时跑表停止,松开手后跑表继续运行。
sbit high=P2^4;
sbit mid=P2^3;
sbit low=P2^2;
sbit Key1=P3^0;//开始
sbit Key2=P3^1;//暂停
sbit Key3=P3^2;//清零
const bit PRESSED=0;//按下
const bit SUSPEND=1;//0的时候运行,1的时候暂停
//监测
void delay_1ms(unit x){
    unit i=x;
    unit j;
    for(;i>0;--i){
       for(j=110;j>0;--j);
    }
}
/**
    在数码管上显示对应的值
**/
void display(unsignedchar Num)
{
    P0=NumTable[Num];
    delay_1ms(1);
    P0=0;      //送完段选信号后,进行消影的处理
}
 
/**
    控制数码管显示后3位,并分解计数值
**/
void DisplayNumByOrder(unit Count){
       low=0; mid=0; high=0;  display(0);        
        low=1; mid=0; high=0;  display(0);               
        low=0; mid=1; high=0;  display(0);
       low=1; mid=1; high=0;  display(0);
       low=0; mid=0; high=1;  display(0);
       low=1; mid=0; high=1;  display(Count%1/100);
       low=0; mid=1; high=1;  display(Count%100/10);
       low=1; mid=1; high=1;  display(Count%10);
}
 
//是否清零
void IsClear(unit * count){
    if(PRESSED==Key3){       //当按键按下
       delay_1ms(10);       //去抖动
       if(PRESSED==Key3){   //当按键按下
           *count=0;
       }
    }
}
//是否暂停
void IsSuspend(unit * count){
    if(PRESSED==Key2){       //当按键按下
       delay_1ms(10);       //去抖动
       if(PRESSED==Key2){   //当按键按下
           while(SUSPEND){  
              IsClear(count);          //监测是否需要清零
              if(PRESSED==Key1)return;//跳出暂停
              DisplayNumByOrder(*count);//显示原数值
           }
       }
    }
}
 
 
//扫描键盘
void main(){
    int count=0;
    while(1){
           IsSuspend(&count);
           IsClear(&count);
           count++;
           DisplayNumByOrder(count);  
           if(count==) count=0;
    }
}
 
 
 

10.按下16个矩阵键盘依次在数码管上显示1-16的平方。如按下第一个显示1,第二个显示4...

#include
#include
#define unit unsigned int
#define uchar unsigned char
 
unit code NumTable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//数字的编码
//10.按下16个矩阵键盘依次在数码管上显示1-16的平方。如按下第一个显示1,第二个显示4...
 
sbit high=P2^4;
sbit mid=P2^3;
sbit low=P2^2;
sbit Key1=P3^0;//开始
sbit Key2=P3^1;//暂停
sbit Key3=P3^2;//清零
const bit PRESSED=0;//按下
const bit SUSPEND=1;//0的时候运行,1的时候暂停
//延时
void delay_1ms(unit x){
    unit i=x;
    unit j;
    for(;i>0;--i){
       for(j=110;j>0;--j);
    }
}
/**
    在数码管上显示对应的值
**/
void display(unsignedchar Num)
{
    P0=NumTable[Num];
    delay_1ms(1);
    P0=0;      //送完段选信号后,进行消影的处理
}
 
/**
    控制数码管显示后3位,并分解计数值
**/
void DisplayNumByOrder(unit Count){
       low=0; mid=0; high=0;  display(0);        
        low=1; mid=0; high=0;  display(0);               
        low=0; mid=1; high=0;  display(0);
       low=1; mid=1; high=0;  display(0);
       low=0; mid=0; high=1;  display(0);
       low=1; mid=0; high=1;  display(Count%1/100);
       low=0; mid=1; high=1;  display(Count%100/10);
       low=1; mid=1; high=1;  display(Count%10);
}
 
//是否清零
void IsClear(unit * count){
    if(PRESSED==Key3){       //当按键按下
       delay_1ms(10);       //去抖动
       if(PRESSED==Key3){   //当按键按下
           *count=0;
       }
    }
}
//是否暂停
void IsSuspend(unit * count){
    if(PRESSED==Key2){       //当按键按下
       delay_1ms(10);       //去抖动
       if(PRESSED==Key2){   //当按键按下
           while(SUSPEND){  
              IsClear(count);          //监测是否需要清零
              if(PRESSED==Key1)return;//跳出暂停
              DisplayNumByOrder(*count);//显示原数值
           }
       }
    }
}
 
uchar scanKey(){
    uchar tmp, key;
 
    P3 =0xf0;
    tmp = P3;
    tmp = tmp &0xf0;
    if(tmp !=0xf0){//确定列
       switch(tmp){
       case0xe0:key =1;break;
       case0xd0:key =2;break;
       case0xb0:key =3;break;
       case0x70:key =4;break;
       }
    }
    //确定行
    P3 =0x0f;
    tmp = P3;
    tmp = tmp &0x0f;
    if(tmp !=0x0f){
       switch(tmp){
       case0x0d:key = key;break;
       case0x0b:key =4+ key;break;
       case0x07:key =8+ key;break;
       }         
    }
    return key;
}
 
//扫描键盘
void main(){
    // int count=0;
    while(1){
       unit key= scanKey();
       DisplayNumByOrder(key*key);
    }
}
关键字:单片机  IO口  数码管显示 引用地址:实验1 单片机IO口应用及数码管显示

上一篇:单片机IO口模拟SPI四种模式的程序
下一篇:51单片机 EEPROM 24c02 + 数码管 + 中断 统计开机次数

推荐阅读最新更新时间:2024-03-16 14:55

MSP430单片机标准寄存器和bit位的定义
一、标准bit位定义(STANDARD BITS) : WORD:字 15 14 7 1 0 BIT15
[单片机]
智能化数字电源系统的优化设计
0 引言   目前,开关电源正朝着智能化、数字化的方向发展。最近刚问世的智能数字电源系统以其优良的特性和完备的监控功能,正引起人们的关注。数字电源提供了智能化的适应性与灵活性,具备直接监控、处理并适应系统条件的能力,能满足任何复杂的电源要求。此外,数字电源还可通过远程诊断来确保系统长期工作的可靠性,包括故障管理、过电流保护以及避免停机等。 1 数字电源系统的主要特点及发展现状 l.1 数字电源系统的主要特点   数字电源系统具有以下特点。   1)它是以数字信号处理器(DSP)或微控制器(MCU)为核心,将数字电源驱动器及PWM控制器作为控制对象而构成的智能化开关电源系统。传统的由微控制器(μP或μC)控制的开关电源,一般只
[电源管理]
STC15408AS单片机的EEPROM测试程序
我用的是4位595驱动的数码管作为数据显示; #include STC15w408as.H #include intrins.h #define U8 unsigned char #define U16 unsigned int #include EEPROM.H //这个文件在附件中可以下载 sbit DS=P1^2; //测试键 sbit SDA=P1^1; //595驱动数码管 sbit CLK=P1^0; sbit ST=P3^7; U8 shuzi ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //数码管编码 void
[单片机]
AT89C52单片机定时器如何设置工作方式
  AT89C52是一个低电压,高性能CMOS 8位单片机,片内含8k bytes的可反复擦写的Flash只读程序存储器和256 bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash存储单元,AT89C52单片机在电子行业中有着广泛的应用。   AT89C52单片机硬件结构   如图3-1所示,为AT89C52的硬件结构图。AT89C52单片机的内部结构与MCS-51系列单片机的构成基本相同。CPU是由运算器和控制器所构成的。运算器主要用来对操作数进行算术、逻辑运算和位操作的。控制器是单片机的指挥控制部件,主要任务的识
[单片机]
AT89C52<font color='red'>单片机</font>定时器如何设置工作方式
BTS7960大功率直流电机驱动板电路图与PCB及单片机
【简要说明】 一、尺寸:长76mmX宽65mmX高28mm 二、主要芯片:BTS7960、lm2576 三、工作电压:控制信号直流3V至12V;驱动电机电压6V至27V 四、可驱动直流(6V至27V之间电压的电机) 五、最大输出电流43A 六、特点:1、具有信号指示和电源指示 2、转速可调 3、抗干扰能力强输入全光电隔离 4、内部具有续流保护 5、可单独控制一台直流电机 6、PWM脉宽平滑调速(可使用PWM信号对直流电机调速) 7、可实现正反转 8、此驱动器非常适合控制飞思卡尔智能车,驱动器压降小,电流大,驱动能力强 适用场合:单片机学习、电子竞赛、产品
[单片机]
BTS7960大功率直流电机驱动板电路图与PCB及<font color='red'>单片机</font>
51单片机汇编:多路延时开关
要求:51单片机,8个按键、8个发光二极管。 ;一个键按下则对应灯亮,3秒后灭,每个键控制一个灯。 ;题目要求的电路,非常简单,用 P1 连接按键、P2 连接 LED 即可。 ;用定时器,定时 7.5 ms,中断 400 遍,即为 3 秒钟。 ;针对每个灯,都要有一个计时单元,用来控制亮灯 3 秒钟的时间。 ;用汇编语言编写程序如下: KEY EQU 30H K_L EQU 31H K_T EQU 32H ORG 0000H AJMP START ORG 000BH ;T0中断入口地址 JMP T0_INT START: MOV TH0, #40 ;定时
[单片机]
51<font color='red'>单片机</font>汇编:多路延时开关
毫米波传感器让汽车应用和工业电子效率升级
世界瞬息万变,无论是道路、楼宇还是我们所生活的城市,这种高速的变幻可见一斑。   全新的高精度单芯片毫米波(mmWave)传感器正在顺应世界高速发展的潮流,为从汽车 雷达 到工业自动化的众多应用提供支持。这些精密的传感器为设计人员带来了全新的平台,能够帮助汽车、楼宇、工厂和无人机实现更高的智能化、安全性和自主性。例如 毫米波传感器 这样的技术进步犹如一场及时雨。之所以这样说,是基于以下几个塬因:   · 到2020年,公路上自动驾驶汽车的数量或将达到1000万辆。   · 56%的工业企业将在未来五年内实现效率升级。   · 到2020年,81%的住宅和楼宇将实现自动化。     这些变化将对精确感测能力提出更高的要求,不仅要求
[嵌入式]
基于单片机和CPLD的高精度大型望远镜伺服控制器设计
设计基于高速单片机C8051F120和CPLD的高精度大型望远镜的伺服控制器,由单片机实现闭环控制算法、上位机通信和LCD显示控制,CPLD实现增量式编码器计数、电机驱动波形发生以及I/O接口。该控制器可独立进行电机控制,也可配合上位机进行控制,具有实时性和抗干扰能力强、成本低、调试方便等特点。 引言 微电子技术和计算机的发展推动着伺服控制技术的进步,控制系统的硬件系统越来越高速化、小型化、模块化,功能也日趋强大完善;而且,伺服控制技术是朝着更开放、更加模块化的控制结构的方向发展的,要求控制器算法实现简单、控制接口灵活,针对不同的伺服控制对象时硬件系统不变,软件系统也可以完成参数的自动调整。 在高精度大型望远镜伺服控制应用
[单片机]
基于<font color='red'>单片机</font>和CPLD的高精度大型望远镜伺服控制器设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved