仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include<reg52.h>
- #define codport P0 //显示段码输出口
- #define sitport P2 //显示位码输出口
- sbit PB1=P1^0;
- sbit PB2=P1^1; // second 调整定义
- sbit PB3=P1^2;
- sbit PB4=P1^3; //second//minite 调整定义
- sbit PB5=P1^4;
- sbit PB6=P1^5; //hour 调整定义
- sbit PB7=P1^6; //暂停
- void delay(int); // 延时子程序
- void keyscan( ); // 按键作用
- unsigned char code ledcode[] /*显示0~9的代码*/
- ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
- unsigned char data hou,min,sec,num; //时分秒中断数
- unsigned char data disbuf[]={0,0,0,0,0,0};
- //显示数组,0元素为最高位
- void delay(int x)
- { int i,j;
- for(i=0;i<x;i++)
- for(j=0;j<120;j++);
- }
- void keyscan (void)
- {
- if(PB1==0) // 按键1 秒加
- {
- delay(200);
- {
- sec++;
- if(sec==60)
- {sec=0; }
- }
- }
- if(PB2==0) // 按键2 秒减
- {
- delay(200);
- {
- sec--;
- if(sec==-1)
- {sec=59;}
- }
- }
- if(PB3==0) // 按键3 分加
- {
- delay(200);
- {
- min++;
- if(min==60)
- {min=0; }
- }
- }
- if(PB4==0) // 按键4 分减
- {
- delay(200);
- {
- min--;
- if(min==-1)
- {min=59; }
- }
- }
-
- if(PB5==0) // 按键5 时加
- {
- delay(200);
- {
- hou++;
- if(hou==60)
- {hou=0;}
- }
- }
- if(PB6==0) // 按键7 暂停
- {
- delay(200);
- {
- hou--;
- if(hou==-1)
- {hou=23; }
- }
- }
- if(PB7==0) // 按键6 时减
- {
- delay(200);
- {
- EA=~EA;
- }
- }
- }
- void display() //显示函数
- { unsigned int j; //j用于循环延时
- unsigned char i,scan; //scan为扫描码
- scan=0x01;
- for(i=0;i<6;i++)
- { sitport=0xff; //先关闭各位
- codport=ledcode[disbuf[i]];
- //输出显示数的段码
- sitport=~scan; //输出位码
- scan=(scan<<1); //指向下一个数位
- for(j=0;j<360;j++); //延时3ms
- } }
- void time0() interrupt 1 //定时器0中断函数
- { TL0=55536%256; //给T0赋初值
- TH0=55536/256;
- num=num+1; //百分之一秒加1
- if(num>99)
- { num=0; sec++; //秒加1
- if(sec>59)
- { sec=0; min++; //分加1
- if(min>59)
- { min=0; hou++; //时加1
- if(hou>23) hou=0;
- } } //把时间变量分离成要显示的各位
- disbuf[0]=hou/10; disbuf[1]=hou%10;
- disbuf[2]=min/10; disbuf[3]=min%10;
- disbuf[4]=sec/10; disbuf[5]=sec%10;
- } }
- void main() //主函数
- {
- TMOD=0x01; //设置T0以模式1定时
- TL0=55536%256; //设置T0定时10ms初值
- TH0=55536/256;
- ET0=1; //开T0中断
- EA=1; //开总中断
- TR0=1; //定时器0开运行
- hou=12; min=0; //时间初始化
- sec=0; num=0;
- while(1) //循环,并随时处理中断
- {
- display(); //调用数码管进行扫描显示
- keyscan( ); // 按键扫描
- } }
复制代码
所有资料51hei提供下载:
电子表可加可减可暂停.rar
(16.96 KB, 下载次数: 24)
|