这是我这个周用单片机做的时钟,用数码管显示,用定时器来即时。
Clock.zip
(93.36 KB, 下载次数: 15)
单片机源程序:
- #include"reg51.h"
- #define uchar unsigned char
- uchar code scan_con[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
- uchar code dis_7[12]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
- 0x80,0x90,0xff,0xbf};
- uchar data dis[8]={0x00,0x00,0x0b,0x00,0x00,0x0b,0x00,0x00};
- uchar data timedata[3]={0x00,0x00,0x00};
- //timedata[0]: 秒计数 timedata[1] :分计数 timedata[2] :小时计数
- uchar data ms50=0x00,con=0x00,con1=0x00,con2=0x00;
- //ms50:每过50ms加一 con按键按下计数 为1 改变分钟 为2改变小时
- //con1 con2
- sbit key0=P1^0;
- sbit key1=P1^1;
- sbit key2=P1^2;
- void delay1ms(int t)
- {
- unsigned char a,b;
- for(b=0;b<t;b++)
- for(a=0;a<120;a++);
- }
- void keyscan() //按键检测函数
- {
- EA=0; //关闭总中断
- if(key0==0) //判断按键是否按下
- {
- delay1ms(10); //延时消抖
- while(key0==0); //等待按键释放
- con++; //计数值加
- TR0=0; //关闭定时器0
- ET0=0; //关闭定时器0中断
- if(con>=3) //若按下3次
- {
- con=0; //计数值清0
- TR0=1; //开启定时器
- ET0=1; //开启定时器中断
- }
- }
- if(con!=0) //若按键0按下一次
- {
- if(key1==0) //如果按键1按下
- {
- delay1ms(10); //延时消抖
- while(key1==0); //等待按键释放
- timedata[con]++; //(分/时)自加
- if(con==2) //若按下两次
- con1=24;
- else con1=60;
- if(timedata[con]>=con1) //若加到最大值则将0赋值给变量
- timedata[con]=0;
- }
- }
- if(con!=0)
- {
- if(key2==0)
- {
- delay1ms(10);
- while(key2==0);
- timedata[con]--;
- if(con==2)
- con1=23;
- else con1=59;
- if(timedata[con]<=0)
- timedata[con]=con1; //若减到最小值0则将最大值付给变量
- }
- }
- EA=1;
- }
- void scan()
- {
- char k;
- dis[0]=timedata[0]%10; //显示秒个位数据
- dis[1]=timedata[0]/10; //显示秒十位数据
- dis[3]=timedata[1]%10; //显示分个位数据
- dis[4]=timedata[1]/10; //显示分十位数据
- dis[6]=timedata[2]%10; //显示时个位数据
- dis[7]=timedata[2]/10; //显示时十位数据
- for(k=0;k<8;k++)
- {
- P0=~dis_7[dis[k]]; //段选端
- P2=scan_con[k]; //位选端
- delay1ms(1);
- P2=0xff; //消影
- }
- }
- void main(void)
- {
- TMOD=0X01; //开启定时器0
- TH0=0X3C; //选择工作方式2
- TL0=0XB0; //载入高位初值
- TR0=1; //载入低位初值
- ET0=1; //开启定时器中断0
- EA=1; //全局中断使能
- while(1)
- {
- scan();
- keyscan();
- }
- }
- void time_intt0(void) interrupt 1
- {
- ET0=0; //关闭定时器0中断
- TR0=0; //
- TH0=0X3C;
- TL0=0XB0;
- TR0=1; //
- ms50++; //50毫秒计数
- if(ms50==20) //1秒
- {
- ms50=0x00;
- timedata[0]++;
- if(timedata[0]==60)
- {
- timedata[0]=0;
- timedata[1]++;
- if(timedata[1]==60)
- {
- timedata[1]=0;
- timedata[2]++;
- if(timedata[2]==24)
- {
- timedata[2]=0;
- }
- }
- }
- }
- ET0=1;
- }
复制代码
|