找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3103|回复: 3
收起左侧

51单片机数码管24小时可调时钟 可存多条时间记录 用于记录某事件发生时间

[复制链接]
ID:304877 发表于 2019-4-19 21:55 | 显示全部楼层 |阅读模式
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
捕获.JPG

单片机源程序如下:
  1. /*
  2. P1口三个led灯代表模式:
  3. 模式1:开始记录
  4. 模式2:查看记录  按s3下一条  s4下一条
  5. 模式3:时间矫正 按s2选择矫正位  按s3加一 按s4减一  led       
  6. 注:p33口低电平触发记录;  调整实践时时钟停止        可存储十条记录,自动清除最旧记录
  7. */

  8. #include<reg52.h>
  9. #include<intrins.h>
  10. #define uchar unsigned char
  11. #define uint unsigned int
  12. sbit du=P2^6;
  13. sbit we=P2^7;
  14. sbit s2=P3^0;
  15. sbit s3=P3^1;
  16. sbit s4=P3^2;
  17. sbit led1=P1^7;
  18. sbit led2=P1^6;
  19. sbit led3=P1^5;                  //模式状态灯


  20. uchar temp0;//P1口状态存储
  21. uint temp;//秒调整
  22. uchar ii,ii2; //中断存储循环用
  23. uchar Mode=1;//模式选择
  24. uchar num=1; //记录调出值
  25. uchar time[10][4];        //鸡蛋时间记录储存
  26. double timeh,timem,times; //系统时间


  27. uchar code ld[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00};
  28. void display(uchar i,uchar j,uchar k,uchar l);
  29. void delay(uint z);
  30. void inti()
  31. {
  32. EA=1;//总开关
  33. EX1=1;//int1中断                 p33口
  34. IT1=0;//触发方式:低电平
  35. ET0=1;//定时器0中断允许
  36. TMOD=0x01;//模式选择;//定时器0,1,16位定时器
  37. TH0=0x4b;
  38. TL0=0xfe;//50ms
  39. TR0=1;
  40. }               
  41. void main()
  42. {
  43. inti(); //初始化配置
  44. while(1)
  45. {
  46.   if(s2==0)
  47.   {
  48.   Mode++;
  49.   if(Mode==6)Mode=1;
  50.   if(!(Mode==1||Mode==2))ET0=0;
  51.   if(Mode==1||Mode==2)ET0=1;
  52.   while(!s2);
  53.   delay(100);
  54.   }        //模式选择


  55.   if(Mode==1)//模式1     工作模式显示时间
  56.   {
  57.   display(100,timeh,timem,times);
  58.   led1=0;led2=1;led3=1;
  59.   }


  60.   if(Mode==2)//模式2 查询
  61.   {
  62.   led1=1;led2=0;led3=1;
  63.   if(s3==0)
  64.   {
  65.   num++;
  66.   if(num==11)num=10;//防止查询溢出
  67.   while(!s3);
  68.   delay(100);
  69.   }
  70.   if(s4==0)
  71.   {
  72.   num--;
  73.   if(num==0)num=1;//防止查询溢出
  74.   while(!s4);
  75.   delay(100);
  76.   }
  77.   display(num,time[num-1][0],time[num-1][1],time[num-1][2]);  
  78.   }


  79.   if(Mode==3)//模式3   时间矫正  时
  80.   {
  81.   led1=1;led2=1;led3=0;
  82.   if(s3==0)
  83.   {
  84.   timeh++;
  85.   if(timeh==24)timeh=0;
  86.   if(timeh<0)timeh=23;
  87.   while(!s3);
  88.   delay(100);
  89.   }
  90.   if(s4==0)
  91.   {
  92.   timeh--;
  93.   if(timeh==24)timeh=0;
  94.   if(timeh<0)timeh=23;
  95.   while(!s4);
  96.   delay(100);
  97.   }
  98.   display(100,timeh,100,100);
  99.   }
  100.   if(Mode==4)//模式3   时间矫正  分
  101.   {
  102.   led1=1;led2=1;led3=0;
  103.   if(s3==0)
  104.   {
  105.   timem++;
  106.   if(timem==60)timem=0;
  107.   if(timem<0)timem=59;
  108.   while(!s3);
  109.   delay(100);
  110.   }
  111.   if(s4==0)
  112.   {
  113.   timem--;
  114.   if(timem==60)timem=0;
  115.   if(timem<0)timem=59;
  116.   while(!s4);
  117.   delay(100);
  118.   }
  119.   display(100,100,timem,100);
  120.   }
  121.   if(Mode==5)//模式3   时间矫正  秒
  122.   {
  123.   led1=1;led2=1;led3=0;
  124.   if(s3==0)
  125.   {
  126.   times++;
  127.   if(times==60)times=0;
  128.   if(times<0)times=59;
  129.   while(!s3);
  130.   delay(100);
  131.   }
  132.   if(s4==0)
  133.   {
  134.   times--;
  135.   if(times==60)times=0;
  136.   if(times<0)times=59;
  137.   while(!s4);
  138.   delay(100);
  139.   }
  140.   display(100,100,100,times);   
  141.   }

  142. }
  143. }
  144. void timer0() interrupt 1
  145. {

  146. temp++;
  147. TH0=0x4b;
  148. TL0=0xfe; //50ms进入一次
  149. if(temp==20)
  150. {
  151. times++;
  152. temp=0;
  153. }
  154. if(times==60)
  155. {
  156. timem++;
  157. times=0;
  158. }
  159. if(timem==60)
  160. {
  161. timeh++;
  162. timem=0;
  163. }
  164. if(timeh==24)
  165. {
  166. timeh=0;
  167. } //时间计算




  168. }
  169. void int1() interrupt 2         //p33口
  170. {
  171. for(ii=0;ii<10;ii++)
  172. {
  173. for(ii2=0;ii2<3;ii2++)
  174. {
  175.   time[9-ii][ii2]=time[8-ii][ii2];
  176. }
  177. }
  178. time[0][0]=timeh;
  179. time[0][1]=timem;
  180. time[0][2]=times;//存储数据
  181. temp0=P1;
  182. P1=0;//中断响应
  183. delay(1000);
  184. P1=temp0;
  185. }               
  186. void display(uchar i,uchar j,uchar k,uchar l)
  187. {
  188.         
  189.         uchar shi1,ge1,shi2,ge2,shi3,ge3,shi4,ge4;
  190.                 if(i<100)
  191.                 {
  192.                 shi1=i/10;
  193.                 ge1=i%10;
  194.                 }
  195.                 else
  196.                 {
  197.                 shi1=ge1=10;
  198.                 }
  199.                 if(j<100)
  200.                 {
  201.                 shi2=j/10;
  202.                 ge2=j%10;
  203.                 }
  204.                 else
  205.                 {
  206.                 shi2=ge2=10;
  207.                 }
  208.                 if(k<100)
  209.                 {
  210.                 shi3=k/10;
  211.                 ge3=k%10;
  212.                 }
  213.                 else
  214.                 {
  215.                 shi3=ge3=10;
  216.                 }
  217.                 if(l<100)
  218.                 {
  219.                 shi4=l/10;
  220.                 ge4=l%10;
  221.                 }
  222.                 else
  223.                 {
  224.                 shi4=ge4=10;
  225.                 }            
  226.                 P0=0xff;                 //清除段码
  227.         we=1;  
  228.         P0=0xfe;//1111 1110
  229.         we=0;//第一次位选
  230.                              
  231.         du=1;                       
  232.         P0=ld[shi1];
  233.         du=0;
  234.         delay(1);//第一次段选

  235.                 P0=0xff;                 //清除段码
  236.         we=1;  
  237.         P0=0xfd;//1111 1101
  238.         we=0;//第二次位选

  239.         du=1;
  240.         P0=ld[ge1];
  241.         du=0;
  242.         delay(1);//第二次段选


  243.                                 P0=0xff;                 //清除段码
  244.         we=1;  
  245.         P0=0xfb;//1111 1011
  246.         we=0;//第一次位选
  247.                              
  248.         du=1;                       
  249.         P0=ld[shi2];
  250.         du=0;
  251.         delay(1);//第一次段选

  252.                 P0=0xff;                 //清除段码
  253.         we=1;  
  254.         P0=0xf7;//1111 0111
  255.         we=0;//第二次位选

  256.         du=1;
  257.         P0=ld[ge2];
  258.         du=0;
  259.         delay(1);//第二次段选


  260.                                 P0=0xff;                 //清除段码
  261.         we=1;  
  262.         P0=0xef;//1110 1111
  263.         we=0;//第一次位选
  264.                              
  265.         du=1;                       
  266.         P0=ld[shi3];
  267.         du=0;
  268.         delay(1);//第一次段选

  269.                 P0=0xff;                 //清除段码
  270. ……………………

  271. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
proteus仿真51开发板.zip (35.92 KB, 下载次数: 25)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:304877 发表于 2019-4-19 21:59 | 显示全部楼层
喜欢分享自己做的东西  大佬勿喷
回复

使用道具 举报

ID:386381 发表于 2019-4-20 18:57 来自手机 | 显示全部楼层
这个实用,可以记录电池充或放电的时间,谢谢楼主分享。
回复

使用道具 举报

ID:304877 发表于 2019-4-21 22:55 来自手机 | 显示全部楼层
文凤轩 发表于 2019-4-20 18:57
这个实用,可以记录电池充或放电的时间,谢谢楼主分享。

我都没想到呢,,改一改就可以实现记录电池充电和放点时间了呢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表