电子秒表显示器C51仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include "reg51.h"
- #include "stdio.h"
- #define uint unsigned int
- #define uchar unsigned char
- uchar data second=23,minute=10,hour=4;
- uchar data disbuf[6]={0};
- uchar bdata FLAG=0;
- sbit H_M=FLAG^1; //小时 分钟切换标志位 启动后默认为分钟设置状态
- sbit P1_0=P1^0; //增1键
- sbit P3_2=P3^2; //小时,分钟切换键
- //定义共阴段码 0-9
- uchar code table[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
- //计数变量
- uchar data count=0;
- //定时器0的中断服务程序 50ms
- void timer0(void) interrupt 1 using 1
- {TH0=-50000/256;
- TL0=-50000%256;
- count++;
- if(count==20)
- {count=0;
- second++;
- if(second==60)
- {second=0;
- minute++;
- if(minute==60)
- {minute=0;
- hour++;
- if(hour==24)
- {hour=0;}
- }
- }
- }
- return;
- }
- //延时程序
- void dlms(void)
- {uchar i;
- for(i=2000;i>0;i--){}
- }
- //外部中断0的中断服务程序
- void int0(void) interrupt 0 using 2
- {
- while(!P3_2) //等待按键弹起
- {
- dlms();
- }
- dlms( );
- if(P3_2) //按键弹起
- H_M=!H_M;
- }
- //显示程序
- void disp(void)
- {uchar i,j;
- uchar bdata sel;
- disbuf[0]=second%10;
- disbuf[1]=second/10;
- disbuf[2]=minute%10;
- disbuf[3]=minute/10;
- disbuf[4]=hour%10;
- disbuf[5]=hour/10;
- P2=0XFF; //关闭所示数码管显示
- sel=0x01;
- for(i=0;i<6;i++)
- {j=disbuf[i];
- P2=(sel^0xff); //得到位选
- P0=table[j]; //送段码
- dlms();
- P2=0XFF;
- sel=sel<<1; //位选左移1位
- }
- }
- //加1处理程序
- void increa(void)
- {if(H_M) //H_M为1 表示小时设置
- {hour++;
- if(hour==24)
- {hour=0;
- disbuf[4]=0;
- disbuf[5]=0;
- }
- }
- else //H_M为0 表示分钟设置
- {minute++;
- if(minute==60)
- {minute=0;
- disbuf[2]=0;
- disbuf[3]=0;
- }
- }
- }
- int main( )
- {
- TCON=0x01;
- TMOD=0x01;
- TH0=-50000/256;
- TL0=-50000%256;
- EA=1;
- ET0=1;
- EX0=1;
- TR0=1;
- while(1)
- {disp();
- if(!P1_0)
- {while(!P1_0)
- dlms();
- if(P1_0)
- increa();
- }
- }
- }
复制代码 本人初学,仅供参考,存在错误和不足之处,请大家回帖多多指教,切勿照搬,文件下载:
Keil代码与Proteus8.8仿真下载::
实验4-电子钟.7z
(35.15 KB, 下载次数: 29)
|