找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1943|回复: 0
打印 上一主题 下一主题
收起左侧

STC89C52的单片机,要实现在单片机的LCD屏上显示时间和秒表,可是编译却是这样该如...

[复制链接]
跳转到指定楼层
楼主


单片机源程序如下:
  1. #include"reg51.h"
  2. #include"LCD1602_elc.h"
  3. #include"delay_elc.h"
  4. //#include"time1.h"
  5. #include"clock.h"
  6.          
  7. uint idata n=0;           //计数
  8. uint idata num=0;     //进入中断次数的计数值,1s的次数的计数值(一次1ms,1000次为1s)
  9. uint idata num1=0;    //0.01s(10ms)的次数的计数值         

  10. void time1()
  11. {
  12.         uchar set=0;
  13.          uint sec=58;                //秒
  14.         uint min=58;                //分
  15.         uint hour=23;   //时
  16.         uint day=4;                //日
  17.         uint week=4;        //周几
  18.         uint month=7;          //月
  19.         uint year=2019; //年
  20.         uint time[6]={0,0,0,0,0,0};//定义一个有6个地址的数组,分别存时,分,秒的个位和十位。
  21.         time0_init();        //初始化定时器
  22.         LcdInit();                //显示测试
  23.         
  24.         
  25.                                                                           
  26.    
  27.    while (1)
  28.    {
  29.    if(K1==0)
  30.    {
  31.                 delay_ms(20);
  32.                 if(K1==0)
  33.                 {
  34.                 TR0=!TR0;
  35.                 while(!K1);
  36.                 }
  37.    }                  
  38.    if(K2==0)
  39.         {
  40.                 delay_ms(20);
  41.                 if(K2==0)
  42.                 {
  43.                         set++;                                                  
  44.                         
  45.                         if(set>7)
  46.                         {
  47.                         set=1;
  48.                 //         TR0=!TR0;
  49.                         }
  50.                         while(!K2);
  51.                 }
  52.         }
  53.         
  54.          if(K3==0)
  55.         {
  56.                 delay_ms(20);
  57.                 if(K3==0)
  58.                 {
  59.                         switch(set)
  60.                         {
  61.                         case 1:hour++;
  62.                                         if(hour>23)
  63.                                         {
  64.                                          hour=0;
  65.                                          day++;
  66.                                          week++;
  67.                                          if(week>7)
  68.                                          {
  69.                                           week=1;
  70.                                          }
  71.                                         }
  72.                                         break;
  73.                         case 2:min++;
  74.                                         if(min>=60)
  75.                                         {
  76.                                          min=0;
  77.                                          hour++;
  78.                                          if(hour>23)
  79.                                          {
  80.                                           hour=0;
  81.                                           day++;
  82.                                           week++;
  83.                                          if(week>7)
  84.                                          {
  85.                                           week=1;
  86.                                          }
  87.                                          }
  88.                                         }
  89.                                         break;
  90.                         case 3:sec++;
  91.                                         if(sec>59)
  92.                                         {
  93.                                          sec=0;
  94.                                          min++;
  95.                                                  if(min>59)
  96.                                                  {
  97.                                                  min=0;
  98.                                                  hour++;
  99.                                                          if(hour>23)
  100.                                                          {
  101.                                                         hour=0;
  102.                                                         day++;
  103.                                                         week++;
  104.                                                                  if(week>7)
  105.                                                                          {
  106.                                                                          week=1;
  107.                                                                          }
  108.                                                          }
  109.                                                  }
  110.                                         }
  111.                                         break;
  112.                         case 4:year++;
  113.                                 if(year%4==0 && year%100!=0 ||year%400==0)//如果是闰年
  114.                                 {
  115.                                         week=week+366%7;
  116.                                         if(week>7)
  117.                                                 {
  118.                                                 week=week-7;
  119.                                                 }
  120.                                 }
  121.                                 else                   //如果是平年
  122.                                 {
  123.                                         week=week+365%7;
  124.                                         if(week>7)
  125.                                                 {
  126.                                                  week=week-7;
  127.                                                 }
  128.                                 }
  129.                                         break;
  130.                         case 5:month++;
  131.                                         if(year%4==0 && year%100!=0 ||year%400==0)        //如果是闰年
  132.                                         {
  133.                                          switch(month)
  134.                                          {
  135.                                            case 1:case 3: case 5: case 7: case 8: case 10: case 12:
  136.                                            week=week+31%7;
  137.                                            if(week>7)
  138.                                            {
  139.                                                    week=week-7;
  140.                                            }
  141.                                            break;
  142.                                            case 2:
  143.                                            week=week+29%7;
  144.                                            if(week>7)
  145.                                            {
  146.                                                    week=week-7;
  147.                                            }
  148.                                            break;
  149.                                            case 4: case 6: case 9: case 11:
  150.                                            week=week+30%7;
  151.                                            if(week>7)
  152.                                            {
  153.                                                    week=week-7;
  154.                                            }
  155.                                            break;
  156.                                          }
  157.                                         }
  158.                                         else
  159.                                         {
  160.                                            switch(month)
  161.                                          {
  162.                                            case 1:case 3: case 5: case 7: case 8: case 10: case 12:
  163.                                            week=week+31%7;
  164.                                            if(week>7)
  165.                                            {
  166.                                                    week=week-7;
  167.                                            }
  168.                                            break;
  169.                                            case 2:
  170.                                            week=week+28%7;
  171.                                            if(week>7)
  172.                                            {
  173.                                                    week=week-7;
  174.                                            }
  175.                                            break;
  176.                                            case 4: case 6: case 9: case 11:
  177.                                            week=week+30%7;
  178.                                            if(week>7)
  179.                                            {
  180.                                                    week=week-7;
  181.                                            }
  182.                                            break;
  183.                                          }
  184.                                         }        
  185.                                         break;
  186.                         case 6:day++;
  187.                                    week++;
  188.                                    if(week>7)
  189.                                    {
  190.                                    week=1;
  191.                                    }
  192.                                         break;
  193.                         case 7:week++;
  194.                                         day++;
  195.                                         if(week>7)
  196.                                         {
  197.                                         week=1;
  198.                                         }
  199.                                         break;  
  200.                         }               
  201.                         while(!K3);
  202.                 }
  203.         }
  204.          if(n>=1000)                                                                 //当n=1000时,表示1s到了
  205.          {         
  206.              n=0;
  207.              sec++;                 //秒加1
  208.                  if(sec>=60)                //当秒满60时,清零,分加1
  209.                  {
  210.                      sec=0;
  211.                      min++;
  212.                          if(min>=60)   //当分满60时,清零,时加1
  213.                          {
  214.                              min=0;
  215.                                  hour++;
  216.                                  if(hour>=24)  //当时满24时,清零
  217.                                  {
  218.                                     hour=0;
  219.                                         day++;
  220.                                         week++;
  221.                                          if(week>7)
  222.                                          {
  223.                                           week=1;
  224.                                          }
  225.                                        
  226.                                  }
  227.                          }
  228.                  }
  229.         
  230.                         
  231.          }
  232.                   time[0]=sec%10;//秒的个位
  233.                  time[1]=sec/10;//秒的十位
  234.                  time[2]=min%10;//分的个位
  235.                  time[3]=min/10;//分的十位
  236.                  time[4]=hour%10;//时的个位
  237.                  time[5]=hour/10;//时的十位         //这一步放在if(n>=1000)的外面更好               
  238.         if(year%4==0 && year%100!=0 ||year%400==0)//如果是闰年
  239.         {
  240.                  switch(month)
  241.                 {
  242.                 case 1:case 3: case 5: case 7: case 8: case 10: case 12:
  243.                         if(day>31)
  244.                         {
  245.                         day=1;
  246.                         month++;
  247.                                 if(month>12)
  248.                                 {
  249.                                 month=1;
  250.                                 year++;
  251.                                 }
  252.                         }
  253.                         break;
  254.                 case 2:
  255.                         if(day>29)
  256.                         {
  257.                         day=1;
  258.                         month++;
  259.                                 if(month>12)
  260.                                 {
  261.                                 month=1;
  262.                                 year++;
  263.                                 }
  264.                         }
  265.                         break;
  266.                 case 4: case 6: case 9: case 11:
  267.                         if(day>30)
  268.                         {
  269.                         day=1;
  270.                         month++;
  271.                                 if(month>12)
  272.                                 {
  273.                                 month=1;
  274.                                 year++;
  275.                                 }
  276.                         }
  277.                 }
  278.         }  
  279.         else                                //如果是平年
  280.         {
  281.            switch(month)
  282.                 {
  283.                 case 1:case 3: case 5: case 7: case 8: case 10: case 12:
  284.                         if(day>31)
  285.                         {
  286.                         day=1;
  287.                         month++;
  288.                                 if(month>12)
  289.                                 {
  290.                                 month=1;
  291.                                 year++;
  292.                                 }
  293.                         }
  294.                         break;
  295.                 case 2:
  296.                         if(day>28)
  297.                         {
  298.                         day=1;
  299.                         month++;
  300.                                 if(month>12)
  301.                                 {
  302.                                 month=1;
  303.                                 year++;
  304.                                 }
  305.                         }
  306.                         break;
  307.                 case 4: case 6: case 9: case 11:
  308.                         if(day>30)
  309.                         {
  310.                         day=1;
  311.                         month++;
  312.                                 if(month>12)
  313.                                 {
  314.                                 month=1;
  315.                                 year++;
  316.                                 }
  317.                         }
  318.                 }
  319.         }
  320.          DigDisplay(time[5],time[4],time[3],time[2],time[1],time[0],year,month,day,week);
  321.    }
  322.                  
  323. }
  324. void secwatch1()
  325. {
  326.         uint cnt=0;   //1s的次数的计数值
  327.         uint ms10=0,ms100=0;        //秒的十分位,秒的百分位
  328.         uint s,s1,min,min1,minu=0;
  329.         //依次是秒的个位,秒的十位,分的个位,分的十位,“minu”表示分的计数位,即多少个一分钟,一分钟加1,
  330. //        InitTimer0();          //初始化定时器
  331.         time0_init();          //初始化定时器
  332.         LcdInit();                //显示测试
  333.         while(1)                        //进入死循环
  334. {        
  335.         if(K1==0)   //检测启动/暂停键是否按下        
  336.         {
  337.                 delay_ms(20); //延时消抖
  338.                 if(K1==0)  //消抖之后再次检测
  339.                 {
  340.                         TR0=!TR0;                //定时器的控制位取反
  341.                         while(!K1);  //等待按键释放
  342.                 }
  343.         }
  344.         
  345. if(K2==0)  //检测复位键是否按下
  346. {
  347.         delay_ms(20);        //延时消抖
  348.         if(K2==0)          //消抖之后再次检测
  349.         {
  350.                 num=0;               
  351.                 num1=0;                //进入中断次数值清0
  352.                 ms100=0;         //百分位的计数值清0
  353.                 ms10=0;                 //十分位的计数值清0
  354.                 cnt=0;                //秒的计数值清0
  355.                 minu=0;                //分的计数值清0
  356.                 while(!K2);                 //等待按键释放
  357.         }
  358. }
  359.         if(num1>=10)                //检测是否达到0.01s,(10个1ms)
  360.         {
  361.                 num1=0;                  //进入中断次数值清零
  362.                 ms100++;                //秒的百分位的计数值加1
  363.                 if(ms100>=10)  //若秒的百分位计数值达到10
  364.                 {
  365.                         ms100=0;  //清零秒的百分位的计数值
  366.                         num1=0;                //进入中断次数值置0
  367.                         ms10++;           //秒的十分位计数值加1
  368.                         if(ms10>=10)          //若秒的十分位计数值达到10
  369.                         {
  370.                                 ms10=0;         //清零秒的十分位的计数值
  371.                                 num1=0;         //进入中断次数值置0
  372.                         }
  373.                 }
  374.         }
  375.         
  376.         if(num>=1000)  //判断计时时间是否达到1s(1000个1ms)
  377.         {
  378.                 num=0;     //进入中断次数值置0
  379.                 cnt++;                 //秒的计数值加1
  380.                 if(cnt>=60) //判断是否达到60s
  381.         {
  382.                 cnt=0;                //若达到60s,将秒的计数值置零
  383.                 minu++;                        //分的计数值加1
  384.                 if(minu>=60)  //判断是否达到60分钟一般秒表是用不到60分的,这是为了程序的严谨性

  385.                 {
  386.                         TR0=!TR0;                        //达到60分钟则关闭定时器并清零所有的计数值
  387.                         num1=0;//
  388.                         num=0;
  389.                         ms10=0;
  390.                         ms100=0;
  391.                         cnt=0;               
  392.                         minu=0;
  393.                         
  394.                 }
  395.         }
  396.         }        
  397.         s=cnt%10;          //从秒的计数值里面分离秒的个位
  398.         s1=cnt/10;         //从秒的计数值里面分离秒的十位
  399.         min=minu%10;        //从分的计数值里面分离分的个位
  400.         min1=minu/10;        //从分的计数值里面分离分的十位
  401.         
  402.         Display(min1,min,s1,s,ms10,ms100);  //显示这5个数
  403.         //DigDisplay(min1,min,s1,s,ms10,ms100,0,0,0,0);  //显示这5个数

  404. }        
  405. }
  406.   
  407. void time0_init()                                                   //定时器初始化函数
  408. {
  409.         TMOD=0x01;                                                          //选择方式1
  410.         TH0=0xFC;                                                          //初值为FC
  411.         TL0=0x19;                                                          //运行值为19
  412.          EA=1;                                                                  //开总中断
  413.         ET0=1;                                                                  //开定时器0中断
  414.         TR0=0;                                                                  //先不打开定时器0
  415. }
  416. void timer0() interrupt 1                                          //定时器0中断
  417. {
  418.         TMOD=0x01;                                                          //选择方式1
  419.         TH0=0xFC;                                                          //重装初值为FC
  420.         TL0=0x19;                                                           //运行值为19
  421.         n++;
  422.         num++;                //让进入中断次数值加1,用于判断是否达到1s
  423.         num1++;            //让进入中断次数值加1,用于判断是否达到0.01s                                          
  424.         
  425. }           

  426. 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)
  427. {
  428.          LCD1602_NUM(1,1,a);
  429.          LCD1602_NUM(1,2,b);
  430.          LCD1602_SYB(1,3,":");
  431.          LCD1602_NUM(1,4,c);
  432.          LCD1602_NUM(1,5,d);
  433.          LCD1602_SYB(1,6,":");
  434.          LCD1602_NUM(1,7,e);
  435.          LCD1602_NUM(1,8,f);   //时间显示

  436.          LCD1602_NUM(2,1,g);
  437.          LCD1602_NUM(2,6,h);
  438.          LCD1602_NUM(2,9,i);
  439.          LCD1602_NUM(2,12,j);  //日期显示
  440.            
  441. }
  442. void Display(unsigned int a ,unsigned int b,unsigned int c,unsigned int d,unsigned int e,unsigned int f)
  443. {
  444.          LCD1602_NUM(1,1,a);
  445.          LCD1602_NUM(1,2,b);
  446.          LCD1602_SYB(1,3,":");
  447.          LCD1602_NUM(1,4,c);
  448.          LCD1602_NUM(1,5,d);
  449.          LCD1602_SYB(1,6,":");
  450.          LCD1602_NUM(1,7,e);
  451.          LCD1602_NUM(1,8,f);              //秒表显示
  452. }           
复制代码

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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