找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1832|回复: 4
收起左侧

单片机初学者一枚,编写的简易时间闹钟程序,不可调日期。望有大神指点指点

[复制链接]
ID:709387 发表于 2020-3-19 17:00 | 显示全部楼层 |阅读模式
  1. # include <reg52.h>
  2. #define  uchar unsigned char
  3. #define  uint  unsigned int

  4. sbit rs = P3^5;
  5. sbit en = P3^4;
  6. sbit rw = P3^6;
  7. sbit we = P2^7;
  8. sbit du = P2^7;
  9. sbit S2 = P3^0;
  10. sbit S3 = P3^1;
  11. sbit S4 = P3^2;
  12. sbit S5 = P3^3;
  13. sbit fm = P2^3;
  14. sbit led = P1^3;

  15. uchar count, S2num, tian;
  16. uchar sec = 55,        min = 33, hour = 16;

  17. uchar code table[] = "   2020-03-19";
  18. uchar code table1[] = "  16:33:55  MJW";

  19. void delay(uint z)                   //延时函数
  20. {
  21.         uint x, y;
  22.         for(x = z; x > 0;x --)
  23.         for (y = 110; y > 0; y --);
  24. }

  25. void write_com(uchar com)     //写命令函数
  26. {
  27.         rs = 0;
  28.         P0 = com;
  29.         delay(5);
  30.         en = 1;
  31.         delay(5);
  32.         en = 0;
  33. }

  34. void write_dat(uchar date)     //写数据函数
  35. {
  36.         rs = 1;
  37.         P0 = date;
  38.         delay(5);
  39.         en = 1;
  40.         delay(5);
  41.         en = 0;
  42. }

  43. void init()                                        //初始化函数
  44. {
  45.         uchar num;
  46.         rw =0;
  47.         en = 0;
  48.         write_com(0x38);
  49.         write_com(0x0c);
  50.         write_com(0x06);
  51.         write_com(0x01);
  52.         write_com(0x80);
  53.         for(num = 0; num < 13; num ++)        
  54.         write_dat(table[num]);
  55.         write_com(0x80 + 0x40);
  56.         for(num = 0; num < 15; num ++)        
  57.         write_dat(table1[num]);
  58.         TMOD = 0x01;
  59.         TH0 = (65536 - 50000) / 256;//再次装定时器初值
  60.         TL0 = (65536 - 50000) % 256;
  61.         EA = 1;
  62.         ET0 = 1;
  63.         TR0 = 1;
  64. }

  65. void timer0() interrupt 1                        //定时器函数
  66. {
  67.         TH0 = (65536 - 50000) / 256;//再次装定时器初值
  68.         TL0 = (65536 - 50000) % 256;
  69.         count ++;
  70. }

  71. void write_sfm(uchar add, uchar date)          //时分秒函数
  72. {
  73.         uchar shi, ge;
  74.         shi = date / 10;
  75.         ge = date % 10;
  76.         write_com(0x80 + 0x40 + add);  //显示的位置
  77.         write_dat(0x30 + shi);
  78.         write_dat(0x30 + ge);
  79. }

  80. void naozhong()                          //   蜂鸣器/闹钟函数
  81. {
  82.         if(hour == 18)                 //设置闹钟时间:时
  83.         {        
  84.                 if(min == 30)     //设置闹钟时间:分
  85.                 {        
  86.                         if(sec == 0) //设置闹钟时间:秒        
  87.                         fm = 0;           //0打开蜂鸣器,1关闭蜂鸣器
  88.                 }
  89.         }
  90.         if(S5 == 0)
  91.         {
  92.                 delay(5);                        
  93.                 if(S5 == 0)
  94.                         fm = 1;                 //按下S5停止蜂鸣器
  95.         }
  96. }

  97. void Key()                        //按键函数
  98. {
  99.         if(S2 == 0)                                 //按下按键
  100.         {
  101.                 delay(5);                         //软件消抖
  102.                 if(S2 == 0)                         //确认按下
  103.                  {
  104.                          S2num ++;                 //按键次数增加                                            
  105.                         while(!S2);                 //松开按键
  106.                         TR0 = 0;                 //关闭定时器
  107.                         write_com(0x0f); //打开光标且闪烁
  108.                         if(S2num == 1)               
  109.                                 write_com(0x80 + 0x40 + 9);        //修改时间秒数
  110.                         if(S2num == 2)        
  111.                                 write_com(0x80 + 0x40 + 6);        //修改时间分钟数
  112.                         if(S2num == 3)        
  113.                                 write_com(0x80 + 0x40 + 3);        //修改时间小时数
  114.                         if(S2num == 4)        
  115.                                 write_com(0x80 + 12);            //修改日期天数
  116.                         if(S2num == 5)        
  117.                                 write_com(0x80 + 9);                //修改日期月份
  118.                         if(S2num == 6)        
  119.                                 write_com(0x80 + 6);                //修改日期年份
  120.                         if(S2num == 7)
  121.                         {        
  122.                                 S2num = 0;                 //按键次数清零
  123.                                 write_com(0x0c); //关闭光标且停止闪烁
  124.                                 TR0 = 1;                 //打开定时器
  125.                         }   
  126.                 }
  127.         }
  128.         if(S2num != 0)                         //按下修改按键,增加和减少按键才有效
  129.         {
  130.                 if(S3 == 0)                         //增加键按下
  131.                 {
  132.                         delay(5);                //软件消抖
  133.                         if(S3 == 0)
  134.                         {
  135.                                 while(!S3);         //确定按键按下
  136.                                 if(S2num == 1)
  137.                                 {
  138.                                         sec ++;
  139.                                         if(sec == 60)
  140.                                         sec = 0;
  141.                                         write_sfm(8, sec);
  142.                                         write_com(0x80 + 0x40 + 9);
  143.                                 }
  144.                                 if(S2num == 2)
  145.                                 {
  146.                                         min ++;
  147.                                         if(min == 60)
  148.                                         min = 0;
  149.                                         write_sfm(5, min);
  150.                                         write_com(0x80 + 0x40 + 6);
  151.                                 }
  152.                                 if(S2num == 3)
  153.                                 {
  154.                                         hour ++;
  155.                                         if(hour == 24)
  156.                                         hour = 0;
  157.                                         write_sfm(2, hour);
  158.                                         write_com(0x80 + 0x40 + 3);               
  159.                              }
  160.                      }
  161.             }
  162.                  if(S4 == 0)                        //减少键按下
  163.                  {
  164.                         delay(5);
  165.                         if(S4 == 0)
  166.                         {
  167.                                 while(!S4);                 //确定按键按下
  168.                                 if(S2num == 1)
  169.                                 {
  170.                                         sec --;
  171.                                         if(sec == -1)
  172.                                         sec = 59;
  173.                                         write_sfm(8, sec);
  174.                                         write_com(0x80 + 0x40 + 9);
  175.                                 }
  176.                                 if(S2num == 2)
  177.                                 {
  178.                                         min --;
  179.                                         if(min == -1)
  180.                                         min = 59;
  181.                                         write_sfm(5, min);
  182.                                         write_com(0x80 + 0x40 + 6);
  183.                                 }
  184.                                 if(S2num == 3)
  185.                                 {
  186.                                         hour --;
  187.                                         if(hour == -1)
  188.                                         hour = 23;
  189.                                         write_sfm(2, hour);
  190.                                         write_com(0x80 + 0x40 + 3);               
  191.                             }
  192.                     }
  193.                }
  194.           }
  195. }

  196. void main()                        //主函数
  197. {
  198.         init();        
  199.         while(1)
  200.         {        
  201.                 Key();         //插入按键函数
  202.                 naozhong();                   //插入闹钟函数        
  203.                 if(count == 18)         //定时1秒
  204.                 {
  205.                         count = 0;
  206.                         led = ~led;
  207.                         sec ++;
  208.                         if(sec == 60)
  209.                         {
  210.                                 sec = 0;                                          
  211.                                 min ++;                                
  212.                                 if(min == 60)
  213.                                 {
  214.                                         min = 0;
  215.                                         hour ++;
  216.                                         if(hour == 24)
  217.                                         {
  218.                                                 hour = 0;
  219.                                         }
  220.                                         write_sfm(2, hour);          //小时送回LED屏幕显示
  221.                                 }
  222.                                 write_sfm(5, min);                //分钟送回LED屏幕显示
  223.                          }
  224.                         write_sfm(8, sec);                  //秒送回LED屏幕显示                                   
  225.                 }            
  226.         }
  227. }
复制代码


回复

使用道具 举报

ID:584814 发表于 2020-3-20 08:06 | 显示全部楼层
抄程序没问题,不清楚就加注释,关键是上机调试。以上是个人建议。
从程序来看段拉位拉用的是同一口而且莫名其妙;1602用的是四线但指令是八线的......
回复

使用道具 举报

ID:372579 发表于 2020-3-20 10:06 来自手机 | 显示全部楼层
这个建议参考一下郭师傅的那个教程
回复

使用道具 举报

ID:709387 发表于 2020-3-21 18:52 | 显示全部楼层
man1234567 发表于 2020-3-20 08:06
抄程序没问题,不清楚就加注释,关键是上机调试。以上是个人建议。
从程序来看段拉位拉用的是同一口而且莫 ...

都说了初学,最开始确实是跟着教程编写,但是自己也修改了很多,对于段选位选这个我很抱歉,不知道怎么打错了;至于你说的1602,我用的独立键盘控制修改,加减,中断闹钟,且用的板子是STC89C52的;后续我自己也进一步的修改了,能修改日期,时间,闹钟;并且每一天日期都能自己增加
回复

使用道具 举报

ID:709387 发表于 2020-3-21 18:53 | 显示全部楼层
aide51 发表于 2020-3-20 10:06
这个建议参考一下郭师傅的那个教程

确实是按照郭天祥的教程编写,但是自己有修改好吧
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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