单片机源程序如下:
- #include"reg51.h"
- #include"LCD1602_elc.h"
- #include"delay_elc.h"
- //#include"time1.h"
- #include"clock.h"
-
- uint idata n=0; //计数
- uint idata num=0; //进入中断次数的计数值,1s的次数的计数值(一次1ms,1000次为1s)
- uint idata num1=0; //0.01s(10ms)的次数的计数值
-
- void time1()
- {
- uchar set=0;
- uint sec=58; //秒
- uint min=58; //分
- uint hour=23; //时
- uint day=4; //日
- uint week=4; //周几
- uint month=7; //月
- uint year=2019; //年
- uint time[6]={0,0,0,0,0,0};//定义一个有6个地址的数组,分别存时,分,秒的个位和十位。
- time0_init(); //初始化定时器
- LcdInit(); //显示测试
-
-
-
-
- while (1)
- {
- if(K1==0)
- {
- delay_ms(20);
- if(K1==0)
- {
- TR0=!TR0;
- while(!K1);
- }
- }
- if(K2==0)
- {
- delay_ms(20);
- if(K2==0)
- {
- set++;
-
- if(set>7)
- {
- set=1;
- // TR0=!TR0;
- }
- while(!K2);
- }
- }
-
- if(K3==0)
- {
- delay_ms(20);
- if(K3==0)
- {
- switch(set)
- {
- case 1:hour++;
- if(hour>23)
- {
- hour=0;
- day++;
- week++;
- if(week>7)
- {
- week=1;
- }
- }
- break;
- case 2:min++;
- if(min>=60)
- {
- min=0;
- hour++;
- if(hour>23)
- {
- hour=0;
- day++;
- week++;
- if(week>7)
- {
- week=1;
- }
- }
- }
- break;
- case 3:sec++;
- if(sec>59)
- {
- sec=0;
- min++;
- if(min>59)
- {
- min=0;
- hour++;
- if(hour>23)
- {
- hour=0;
- day++;
- week++;
- if(week>7)
- {
- week=1;
- }
- }
- }
- }
- break;
- case 4:year++;
- if(year%4==0 && year%100!=0 ||year%400==0)//如果是闰年
- {
- week=week+366%7;
- if(week>7)
- {
- week=week-7;
- }
- }
- else //如果是平年
- {
- week=week+365%7;
- if(week>7)
- {
- week=week-7;
- }
- }
- break;
- case 5:month++;
- if(year%4==0 && year%100!=0 ||year%400==0) //如果是闰年
- {
- switch(month)
- {
- case 1:case 3: case 5: case 7: case 8: case 10: case 12:
- week=week+31%7;
- if(week>7)
- {
- week=week-7;
- }
- break;
- case 2:
- week=week+29%7;
- if(week>7)
- {
- week=week-7;
- }
- break;
- case 4: case 6: case 9: case 11:
- week=week+30%7;
- if(week>7)
- {
- week=week-7;
- }
- break;
- }
- }
- else
- {
- switch(month)
- {
- case 1:case 3: case 5: case 7: case 8: case 10: case 12:
- week=week+31%7;
- if(week>7)
- {
- week=week-7;
- }
- break;
- case 2:
- week=week+28%7;
- if(week>7)
- {
- week=week-7;
- }
- break;
- case 4: case 6: case 9: case 11:
- week=week+30%7;
- if(week>7)
- {
- week=week-7;
- }
- break;
- }
- }
- break;
- case 6:day++;
- week++;
- if(week>7)
- {
- week=1;
- }
- break;
- case 7:week++;
- day++;
- if(week>7)
- {
- week=1;
- }
- break;
- }
- while(!K3);
- }
- }
- if(n>=1000) //当n=1000时,表示1s到了
- {
- n=0;
- sec++; //秒加1
- if(sec>=60) //当秒满60时,清零,分加1
- {
- sec=0;
- min++;
- if(min>=60) //当分满60时,清零,时加1
- {
- min=0;
- hour++;
- if(hour>=24) //当时满24时,清零
- {
- hour=0;
- day++;
- week++;
- if(week>7)
- {
- week=1;
- }
-
- }
- }
- }
-
-
- }
- time[0]=sec%10;//秒的个位
- time[1]=sec/10;//秒的十位
- time[2]=min%10;//分的个位
- time[3]=min/10;//分的十位
- time[4]=hour%10;//时的个位
- time[5]=hour/10;//时的十位 //这一步放在if(n>=1000)的外面更好
- if(year%4==0 && year%100!=0 ||year%400==0)//如果是闰年
- {
- switch(month)
- {
- case 1:case 3: case 5: case 7: case 8: case 10: case 12:
- if(day>31)
- {
- day=1;
- month++;
- if(month>12)
- {
- month=1;
- year++;
- }
- }
- break;
- case 2:
- if(day>29)
- {
- day=1;
- month++;
- if(month>12)
- {
- month=1;
- year++;
- }
- }
- break;
- case 4: case 6: case 9: case 11:
- if(day>30)
- {
- day=1;
- month++;
- if(month>12)
- {
- month=1;
- year++;
- }
- }
- }
- }
- else //如果是平年
- {
- switch(month)
- {
- case 1:case 3: case 5: case 7: case 8: case 10: case 12:
- if(day>31)
- {
- day=1;
- month++;
- if(month>12)
- {
- month=1;
- year++;
- }
- }
- break;
- case 2:
- if(day>28)
- {
- day=1;
- month++;
- if(month>12)
- {
- month=1;
- year++;
- }
- }
- break;
- case 4: case 6: case 9: case 11:
- if(day>30)
- {
- day=1;
- month++;
- if(month>12)
- {
- month=1;
- year++;
- }
- }
- }
- }
- DigDisplay(time[5],time[4],time[3],time[2],time[1],time[0],year,month,day,week);
- }
-
- }
- void secwatch1()
- {
- uint cnt=0; //1s的次数的计数值
- uint ms10=0,ms100=0; //秒的十分位,秒的百分位
- uint s,s1,min,min1,minu=0;
- //依次是秒的个位,秒的十位,分的个位,分的十位,“minu”表示分的计数位,即多少个一分钟,一分钟加1,
- // InitTimer0(); //初始化定时器
- time0_init(); //初始化定时器
- LcdInit(); //显示测试
- while(1) //进入死循环
- {
- if(K1==0) //检测启动/暂停键是否按下
- {
- delay_ms(20); //延时消抖
- if(K1==0) //消抖之后再次检测
- {
- TR0=!TR0; //定时器的控制位取反
- while(!K1); //等待按键释放
- }
- }
-
- if(K2==0) //检测复位键是否按下
- {
- delay_ms(20); //延时消抖
- if(K2==0) //消抖之后再次检测
- {
- num=0;
- num1=0; //进入中断次数值清0
- ms100=0; //百分位的计数值清0
- ms10=0; //十分位的计数值清0
- cnt=0; //秒的计数值清0
- minu=0; //分的计数值清0
- while(!K2); //等待按键释放
- }
- }
- if(num1>=10) //检测是否达到0.01s,(10个1ms)
- {
- num1=0; //进入中断次数值清零
- ms100++; //秒的百分位的计数值加1
- if(ms100>=10) //若秒的百分位计数值达到10
- {
- ms100=0; //清零秒的百分位的计数值
- num1=0; //进入中断次数值置0
- ms10++; //秒的十分位计数值加1
- if(ms10>=10) //若秒的十分位计数值达到10
- {
- ms10=0; //清零秒的十分位的计数值
- num1=0; //进入中断次数值置0
- }
- }
- }
-
- if(num>=1000) //判断计时时间是否达到1s(1000个1ms)
- {
- num=0; //进入中断次数值置0
- cnt++; //秒的计数值加1
- if(cnt>=60) //判断是否达到60s
- {
- cnt=0; //若达到60s,将秒的计数值置零
- minu++; //分的计数值加1
- if(minu>=60) //判断是否达到60分钟一般秒表是用不到60分的,这是为了程序的严谨性
- {
- TR0=!TR0; //达到60分钟则关闭定时器并清零所有的计数值
- num1=0;//
- num=0;
- ms10=0;
- ms100=0;
- cnt=0;
- minu=0;
-
- }
- }
- }
- s=cnt%10; //从秒的计数值里面分离秒的个位
- s1=cnt/10; //从秒的计数值里面分离秒的十位
- min=minu%10; //从分的计数值里面分离分的个位
- min1=minu/10; //从分的计数值里面分离分的十位
-
- Display(min1,min,s1,s,ms10,ms100); //显示这5个数
- //DigDisplay(min1,min,s1,s,ms10,ms100,0,0,0,0); //显示这5个数
- }
- }
-
- void time0_init() //定时器初始化函数
- {
- TMOD=0x01; //选择方式1
- TH0=0xFC; //初值为FC
- TL0=0x19; //运行值为19
- EA=1; //开总中断
- ET0=1; //开定时器0中断
- TR0=0; //先不打开定时器0
- }
- void timer0() interrupt 1 //定时器0中断
- {
- TMOD=0x01; //选择方式1
- TH0=0xFC; //重装初值为FC
- TL0=0x19; //运行值为19
- n++;
- num++; //让进入中断次数值加1,用于判断是否达到1s
- num1++; //让进入中断次数值加1,用于判断是否达到0.01s
-
- }
- void DigDisplay(unsigned int a ,unsigned int b,unsigned int c,unsigned int d,unsigned int e,unsigned int f,unsigned int g,unsigned int h,unsigned int i,unsigned int j)
- {
- LCD1602_NUM(1,1,a);
- LCD1602_NUM(1,2,b);
- LCD1602_SYB(1,3,":");
- LCD1602_NUM(1,4,c);
- LCD1602_NUM(1,5,d);
- LCD1602_SYB(1,6,":");
- LCD1602_NUM(1,7,e);
- LCD1602_NUM(1,8,f); //时间显示
- LCD1602_NUM(2,1,g);
- LCD1602_NUM(2,6,h);
- LCD1602_NUM(2,9,i);
- LCD1602_NUM(2,12,j); //日期显示
-
- }
- void Display(unsigned int a ,unsigned int b,unsigned int c,unsigned int d,unsigned int e,unsigned int f)
- {
- LCD1602_NUM(1,1,a);
- LCD1602_NUM(1,2,b);
- LCD1602_SYB(1,3,":");
- LCD1602_NUM(1,4,c);
- LCD1602_NUM(1,5,d);
- LCD1602_SYB(1,6,":");
- LCD1602_NUM(1,7,e);
- LCD1602_NUM(1,8,f); //秒表显示
- }
复制代码
|