找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4067|回复: 6
收起左侧

多功能单片机电子时钟 有闹钟,可以计时,能测温 仿真程序 带DXP PCB文件

  [复制链接]
ID:545665 发表于 2019-5-23 16:14 | 显示全部楼层 |阅读模式
①内容包括:单片机的最小系统的设计、DS18B20温度采集模块的设计、1602液晶显示模块的设计、DS1302定时模块的设计、按键的设计、蜂鸣器的设计。
②使用Proteus软件绘制仿真电路图。
③ 完成相关程序的设计与调试:利用DS1302定时芯片完成时间的获取;完成按键和显示数码的程序,四个按键修改当前日期,设置闹钟时间,并显示在1602液晶显示屏上;利用DS18B20温度采集芯片完成对温度的采集,并将采集结果显示在1602液晶显示屏上;完成蜂鸣器驱动电路,当按键时,蜂鸣器发出短促的蜂鸣声,当闹钟设置的时间达到时,蜂鸣器发出漫长的蜂鸣声。

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)

仿真图

仿真图
0.png 0.png

单片机源程序如下:
  1. #include<reg51.h>


  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. /*------------------寄存器地址定义------------*/
  5. #define WRITE_SECOND                                0x80
  6. #define WRITE_MINUTE                                0x82
  7. #define WRITE_HOUR                                        0x84
  8. #define WRITE_DAY                                        0x86
  9. #define WRITE_MONTH                                        0x88
  10. #define WRITE_YEAR                                        0x8C
  11. #define WRITE_PROTECT                                0x8E
  12. #define WRITE_WEEK                                        0x8A
  13. #define WRITE_CURRENT               0x90

  14. #define READ_SECOND                                        0x81
  15. #define READ_MINUTE                                        0x83
  16. #define READ_HOUR                                        0x85
  17. #define READ_DAY                                        0x87
  18. #define READ_MONTH                                        0x89
  19. #define READ_WEEK                                        0x8B
  20. #define READ_YEAR                                        0x8D


  21. sbit RST=P3^5;            //DS1302片选
  22. sbit DIO=P3^3;           //DS1302数据信号
  23. sbit SCLK=P3^4;          //DS1302时钟信号
  24. sbit ACC7=ACC^7;
  25. sbit ACC0=ACC^0;     
  26. unsigned int count=0;         
  27. sbit beep=P2^2;
  28. void INITIAL_1302();         
  29. unsigned char READ_1302(unsigned char addr);           
  30. void WRITE_1302(unsigned char addr,unsigned char date);
  31. sbit LCD_E=P1^7;         //液晶使能端
  32. sbit LCD_RS=P1^5;       //液晶数据命令选择端
  33. sbit LCD_RW=P1^6;        //液晶读写选择端
  34. sbit key0=P2^4;     //功能键
  35. sbit key1=P2^5;    //增大键
  36. sbit key2=P2^6;    //减小键
  37. sbit key3=P2^7;
  38. sbit DQ=P1^4;           //18b20温度输入输出端
  39. char hour,minute,second,week,day,month,year,temm=1,chour=00,cminute=00,tmpl1,tmph1,tmsecond=00,tsecond=00,dminute=00,dsecond=00;
  40. uint tem;
  41. uint mt=1000,key33=0,ts=0;

  42. unsigned char num=0,flag;
  43. unsigned char str1[]="  -  -       :  ";
  44. unsigned char str2[]="  :  :      C   ";
  45. void speakerr(uint a);
  46. void delay(unsigned char z);
  47. void delay4(uint a);
  48. void LCD_WRITE_COM(unsigned char com);
  49. void LCD_WRITE_DATA(unsigned char date);
  50. void LCD_WRITE_SFM(unsigned char addr,unsigned char date);
  51. void LCD_WRITE_NYR(unsigned char addr,unsigned char date);
  52. void LCD_WRITE_WEEK(unsigned char week);
  53. void LCD_INITIAL();
  54. void LCD_WRITE_TEMP(uchar addr,uchar temp);
  55. void keyscan();
  56. void INITIAL_TEMER0();
  57. uchar TMPH ,TMPL;
  58. void w1602c(uchar com);
  59. void w1602d(uchar data01);
  60. void delay2(uint ms);
  61. void delay3(uint us);

  62. uchar read_byte();
  63. void write_byte(uchar val);

  64. void display();
  65. void DelayUs(uint time);
  66. void Init_Ds18b20(void);
  67. void WriteByte(uint date);
  68. uint ReadTemperature(void);   
  69. void beep1();
  70. void int0();
  71. void LCD_WRITE_M(uchar M);
  72. void main()
  73. {
  74.   LCD_INITIAL();           //液晶初始化
  75.   INITIAL_1302();          //DS1302初始化
  76.   INITIAL_TEMER0();        //定时器初始化
  77.   while(1)
  78.   {
  79.     keyscan();              //按键扫描
  80.                 beep1();
  81.                
  82.         if(flag==0)            //当标志位为0,允许读取DS1302数据,将数据送入液晶显示        
  83.         {
  84.            second=READ_1302(0x81);
  85.      LCD_WRITE_SFM(6,second);
  86.      minute=READ_1302(0x83);
  87.      LCD_WRITE_SFM(3,minute);
  88.      hour=READ_1302(0x85);
  89.      LCD_WRITE_SFM(0,hour);
  90.            week=READ_1302(0x8b);
  91.      LCD_WRITE_WEEK(week);               
  92.                 // LCD_WRITE_NYR(11,chour);
  93.         //         LCD_WRITE_NYR(14,cminute);
  94.      day=READ_1302(0x87);
  95.      LCD_WRITE_NYR(6,day);
  96.      month=READ_1302(0x89);
  97.      LCD_WRITE_NYR(3,month);
  98.      year=READ_1302(0x8d);
  99.      LCD_WRITE_NYR(0,year);
  100.            tem=ReadTemperature();
  101.            LCD_WRITE_TEMP(10,tem);        
  102.            int0();
  103.         }
  104.         
  105.   }
  106. }
  107. void int0()
  108. {
  109.         if(key33==0)//闹钟
  110.   {
  111.                  
  112.      LCD_WRITE_NYR(11,chour);
  113.                  LCD_WRITE_NYR(14,cminute);
  114.      LCD_WRITE_M(key33);
  115.         }

  116. if(key33==1)//秒表
  117.   {
  118.                  
  119.                  LCD_WRITE_NYR(11,tsecond);
  120.                  LCD_WRITE_NYR(14,tmsecond);
  121.      LCD_WRITE_M(key33);
  122.         }
  123.          if(key33==2)//定时器
  124.   {
  125.                  
  126.                  LCD_WRITE_NYR(11,dminute);
  127.                  LCD_WRITE_NYR(14,dsecond);
  128.      LCD_WRITE_M(key33);
  129.         }
  130. }
  131. void beep1()
  132. {
  133.         if(chour==hour&&cminute==minute)
  134.      beep=~beep;
  135. }
  136. /**********************1602BU份******************************************************/

  137. void delay(unsigned char z)                      //1602de延时函数
  138. {
  139.    unsigned char x,y;
  140.    for(x=z;x>0;x--)
  141.       for(y=110;y>0;y--);

  142. }

  143. void LCD_WRITE_COM(unsigned char com)            
  144. {
  145.    LCD_RS=0;
  146.    LCD_RW=0;
  147.    LCD_E=1;
  148.    P0=com;
  149.    delay(5);
  150.    LCD_E=0;
  151. }

  152. void LCD_WRITE_DATA(unsigned char date)               
  153. {
  154.    LCD_RS=1;
  155.    LCD_RW=0;
  156.    LCD_E=1;
  157.    P0=date;
  158.    delay(5);
  159.    LCD_E=0;
  160. }

  161. void LCD_WRITE_SFM(unsigned char addr,unsigned char date)
  162. {
  163.    unsigned char shi,ge;
  164.    shi=date/10;
  165.    ge=date%10;                           
  166.    LCD_WRITE_COM(0x80+0x40+addr);
  167.    LCD_WRITE_DATA(0x30+shi);            
  168.    LCD_WRITE_DATA(0x30+ge);            
  169.                                                    
  170. }

  171. void LCD_WRITE_NYR(unsigned char addr,unsigned char date)
  172. {
  173.    char shi,ge;
  174.    shi=date/10;
  175.    ge=date%10;
  176.    LCD_WRITE_COM(0x80+addr);
  177.    LCD_WRITE_DATA(0x30+shi);
  178.    LCD_WRITE_DATA(0x30+ge);

  179. }


  180. void LCD_WRITE_WEEK(unsigned char week)
  181. {
  182.    LCD_WRITE_COM(0x80+9);
  183.    switch(week)
  184.    {
  185.              case 1: LCD_WRITE_DATA('1');delay(5);
  186.               break;
  187.           case 2: LCD_WRITE_DATA('2');delay(5);
  188.               break;
  189.           case 3: LCD_WRITE_DATA('3');delay(5);
  190.                 break;
  191.           case 4: LCD_WRITE_DATA('4');delay(5);
  192.                  break;
  193.           case 5: LCD_WRITE_DATA('5');delay(5);
  194.                 break;
  195.           case 6: LCD_WRITE_DATA('6');delay(5);
  196.                   break;
  197.           case 7: LCD_WRITE_DATA('7');delay(5);
  198.               ;break;

  199.          }

  200. }
  201. void LCD_WRITE_M(uchar M)
  202. {
  203.    LCD_WRITE_COM(0x80+0x40+0x0e);
  204.    switch(M)
  205.    {
  206.              case 0: LCD_WRITE_DATA('N');delay(5);
  207.               break;
  208.           case 1: LCD_WRITE_DATA('M');delay(5);
  209.               break;
  210.           case 2: LCD_WRITE_DATA('D');delay(5);
  211.                 break;


  212.          }

  213. }
  214. void LCD_WRITE_TEMP(unsigned char addr,unsigned char temp)
  215. {
  216.         char shi,ge;
  217.     shi=temp/10;
  218.     ge=temp%10;
  219.     LCD_WRITE_COM(0x80+0x40+addr);
  220.     LCD_WRITE_DATA(0x30+shi);
  221.     LCD_WRITE_DATA(0x30+ge);
  222.         
  223. }
  224. void LCD_INITIAL()
  225. {
  226.     unsigned char i;

  227.         LCD_WRITE_COM(0x38);   
  228.         LCD_WRITE_COM(0x0c);   
  229.         LCD_WRITE_COM(0x06);                       //经本人试验证明1602初始化不清屏也可实现


  230.         LCD_WRITE_COM(0x80);
  231.         for(i=0;i<16;i++)
  232.         {
  233.            LCD_WRITE_DATA(str1[i]);
  234.            delay(5);                        
  235.         }

  236.         LCD_WRITE_COM(0x80+0x40);//液晶第二行显示
  237.         for(i=0;i<16;i++)
  238.         {
  239.            LCD_WRITE_DATA(str2[i]);
  240.            delay(5);
  241.         }
  242. }
  243. /***************************1302部分***************************************************/


  244. void WRITE_1302(unsigned char addr,unsigned char date)
  245. {
  246.    unsigned char i;
  247.    RST=0;
  248.    SCLK=0;
  249.    RST=1;
  250.    for(i=8;i>0;i--)
  251.    {
  252.             SCLK=0;
  253.          ACC=addr;
  254.          DIO=ACC0;
  255.          addr>>=1;
  256.          SCLK=1;
  257.    }
  258.    for(i=8;i>0;i--)
  259.    {
  260.              SCLK=0;
  261.           ACC=date;
  262.           DIO=ACC0;
  263.           date>>=1;
  264.           SCLK=1;
  265.    }
  266.    RST=0;
  267. }

  268. unsigned char READ_1302(unsigned char addr)
  269. {
  270.    unsigned char i,date1,date2;
  271.    RST=0;
  272.    SCLK=0;
  273.    RST=1;
  274.    for(i=8;i>0;i--)
  275.    {
  276.              SCLK=0;
  277.           ACC=addr;
  278.           DIO=ACC0;
  279.           addr>>=1;
  280.           SCLK=1;
  281.    }
  282.    for(i=8;i>0;i--)
  283.    {
  284.              ACC7=DIO;
  285.           SCLK=1;
  286.           ACC>>=1;
  287.           SCLK=0;
  288.    }
  289.    RST=0;
  290.    date1=ACC;
  291.    date2=date1/16;
  292.    date1=date1%16;
  293.    date1=date1+date2*10;
  294.    return(date1) ;
  295. }


  296. void INITIAL_1302()
  297. {
  298.    WRITE_1302(WRITE_SECOND,READ_1302(READ_SECOND)&0x7f);    //启动DS1302
  299. }
  300. /**************************键盘扫描部分***************************************************/
  301. void keyscan()
  302. {
  303.    if(key0==0)//确认功能键按下
  304.    {
  305.              delay(20);
  306.           if(key0==0)//去抖
  307.            {
  308.       speakerr(mt);
  309.              while(!key0);//释放
  310.                   
  311.                          num++;
  312.                    switch(num)
  313.              {
  314.                    case 1:    flag=1;               //修改时间,禁止从DS1302读数据
  315.                               TR0=0;                //定时器关
  316.                       LCD_WRITE_COM(0x0f);  //光标开始闪烁
  317.                               LCD_WRITE_COM(0x80+1);//第一次按下,光标定位到年位置
  318.                                   break;
  319.                    case 2:  LCD_WRITE_COM(0x80+4);//第二次按下,光标定位到月位置
  320.                                          break;
  321.                    case 3:  LCD_WRITE_COM(0x80+7);//第三次按下,光标定位到日位置
  322.                                    break;
  323.              case 4:  LCD_WRITE_COM(0x80+9);//第四次按下,光标定位到星期位置
  324.                                    break;
  325.              case 5:  LCD_WRITE_COM(0x80+12);//第五次按下,光标定位到定时位置
  326.                                     break;                                
  327.        case 6:  LCD_WRITE_COM(0x80+15);//第五次按下,光标定位到定分位置
  328.                                     break;                                                                 
  329.        case 7:  LCD_WRITE_COM(0x80+0x40+1);//第五次按下,光标定位到时位置
  330.                                     break;                                                
  331.                    case 8:  LCD_WRITE_COM(0x80+0x40+4);//第六次按下,光标定位到分位置
  332.                                      break;
  333.                    case 9:         LCD_WRITE_COM(0x80+0x40+7);//第七次按下,光标定位到秒位置
  334.                                          break;

  335.            case 10:         num=0;//第八次按下,记录清零
  336.                              LCD_WRITE_COM(0x0c);//不显示光标                                                                              
  337.                                        WRITE_1302(WRITE_PROTECT,0x00);            //允许写操作
  338.                                      WRITE_1302(0x80,(second/10*16)+second%10);//将调节后的秒写入DS1302
  339.                          WRITE_1302(0x82,(minute/10*16)+minute%10);//将调节后的分写入DS1302
  340.                          WRITE_1302(0x84,(hour/10*16)+hour%10);//将调节后的时写入DS1302
  341.                                      WRITE_1302(0x8a,(week/10*16)+week%10);//将调节后的星期写入DS1302
  342.                          WRITE_1302(0x86,(day/10*16)+day%10);//将调节后的日写入DS1302
  343.                          WRITE_1302(0x88,(month/10*16)+month%10);//将调节后的月写入DS1302
  344.                                      WRITE_1302(0x8c,(year/10*16)+year%10);//将调节后的年写入DS1302
  345.                                      WRITE_1302(WRITE_PROTECT,0x80);      //开写保护
  346.                                      flag=0;                              //时间修改完毕,允许液晶从DS1302读数据
  347.                                          TR0=1;        
  348.                                          break;
  349.                  
  350.                }  
  351.       
  352.           }
  353.    }
  354.          if(num==0&&key33==1)
  355.          { if(key1==0)//确认增大键按下
  356.           {
  357.                     delay(20);
  358.                   if(key1==0)//增大键确实按下
  359.                   {while(!key1);
  360.               if(ts==0)ts++;
  361.               else ts--;
  362.                         }
  363.                 }
  364.                 if(key2==0)//确认增大键按下
  365.           {
  366.                     delay(20);
  367.                   if(key2==0)//增大键确实按下
  368.                   {while(!key2);
  369. tsecond=tmsecond=0;
  370.                         }
  371.                 }
  372.         }
  373.          if(num!=0)
  374.    {
  375.              if(key1==0)//确认增大键按下
  376.           {
  377.                     delay(20);
  378.                   if(key1==0)//增大键确实按下
  379.                   {
  380.                                 
  381.                                 speakerr(mt);
  382.                           while(!key1);
  383.                         switch(num)
  384.                         {
  385.                            case 1:        year++;//调节年
  386.                                     if(year==100)year=0;
  387.                                     LCD_WRITE_NYR(0,year);//将调节后的年送入液晶显示
  388.                                     LCD_WRITE_COM(0x80+1);//光标回到指定处
  389.                                                 break;
  390.                                 
  391.                            case 2:  month++;//调节月
  392.                                     if(month==13)month=0;
  393.                                     LCD_WRITE_NYR(3,month);//将调节后的月送入液晶显示
  394.                                     LCD_WRITE_COM(0x80+4);//光标回到指定处
  395.                                                 break;
  396.                           
  397.                            case 3:  day++;//调节日
  398.                                 if(day==32)day=0;
  399.                                     LCD_WRITE_NYR(6,day);//将调节后的日送入液晶显示
  400.                                     LCD_WRITE_COM(0x80+7);//光标回到指定处
  401.                                             break;

  402.                            case 4:  week++;
  403.                                     if(week==8)week=0;
  404.                                     LCD_WRITE_WEEK(week);//将调节后的星期送入液晶显示
  405.                                     LCD_WRITE_COM(0x80+9);//光标回到指定处
  406.                                     break;
  407. /*******************************************************************************************/
  408.               case 5:  if(key33==0)
  409.                                  {
  410.                                                   chour++;
  411.                                     if(chour==24)chour=0;
  412.                                     LCD_WRITE_NYR(11,chour);//将调节后的小时送入液晶显示
  413.                                     LCD_WRITE_COM(0x80+12);//光标回到指定处
  414.                                             break;
  415.                                  }
  416.                                  else if(key33==1)
  417.                                  {
  418.                                                   tsecond++;
  419.                                     if(tsecond==60)tsecond=0;
  420.                                     LCD_WRITE_NYR(11,tsecond);//将调节后的小时送入液晶显示
  421.                                     LCD_WRITE_COM(0x80+12);//光标回到指定处
  422.                                             break;
  423.                                  }        
  424.                                  else if(key33==2)
  425.                                  {
  426.                                                   dminute++;
  427.                                     if(dminute==60)dminute=0;
  428.                                     LCD_WRITE_NYR(11,dminute);//将调节后的小时送入液晶显示
  429.                                     LCD_WRITE_COM(0x80+12);//光标回到指定处
  430.                                             break;
  431.                                  }                                         
  432.         /***************************************************************************************/                                                
  433.                                                         
  434.          case 6:  if(key33==0)
  435.                                  {
  436.                                            cminute++;
  437.                                     if(cminute==60)cminute=0;
  438.                                     LCD_WRITE_NYR(14,cminute);//将调节后的小时送入液晶显示
  439.                                     LCD_WRITE_COM(0x80+15);//光标回到指定处
  440.                                             break;
  441.                                  }
  442.                   else  if(key33==1)
  443.                                  {
  444.                                            tmsecond++;
  445.                                     if(tmsecond==100)tmsecond=0;
  446.                                     LCD_WRITE_NYR(14,tmsecond);//将调节后的小时送入液晶显示
  447.                                     LCD_WRITE_COM(0x80+15);//光标回到指定处
  448.                                             break;
  449.                                  }                                 
  450.                   else  if(key33==2)
  451.                                  {
  452.                                            dsecond++;
  453.                                     if(dsecond==60)dsecond=0;
  454.                                     LCD_WRITE_NYR(14,dsecond);//将调节后的小时送入液晶显示
  455.                                     LCD_WRITE_COM(0x80+15);//光标回到指定处
  456.                                             break;
  457.                                  }                                         
  458.                                  
  459.                                  
  460. /********************************************************************************************/                                 
  461.                            case 7:  hour++;
  462.                                     if(hour==24)hour=0;
  463.                                     LCD_WRITE_SFM(0,hour);//将调节后的小时送入液晶显示
  464.                                     LCD_WRITE_COM(0x80+0x40+1);//光标回到指定处
  465.                                             break;
  466.                            
  467.                            case 8:  minute++;
  468.                                     if(minute==60)minute=0;
  469.                                          LCD_WRITE_SFM(3,minute);//将调节后的分送入液晶显示
  470.                                     LCD_WRITE_COM(0x80+0x40+4);//光标回到指定处
  471.                                                break;

  472.                            case 9:  second++;
  473.                                     if(second==60)second=0;
  474.                                     LCD_WRITE_SFM(6,second);//将调节后的秒送入液晶显示
  475.                                     LCD_WRITE_COM(0x80+0x40+7);//光标回到指定处
  476.                                                       break;
  477.                                 default:break;                                         
  478.                         }         
  479.                         
  480.                   }
  481.           }
  482.           if(key2==0)//确认减小键按下
  483.           {
  484.                     delay(20);
  485.                   if(key2==0)//减小键确实按下
  486.                   {
  487.                                 speakerr(mt);
  488.                           while(!key2);
  489.                         switch(num)
  490.                         {
  491.                           case 1:  year--;//调节年
  492.                                     if(year==-1)year=99;
  493.                                             LCD_WRITE_NYR(0,year);
  494.                                             LCD_WRITE_COM(0x80+1);
  495.                                             break;

  496.                           case 2:  month--;//调节月
  497.                                             if(month==-1)month=12;
  498.                                             LCD_WRITE_NYR(3,month);
  499.                                             LCD_WRITE_COM(0x80+4);
  500.                                             break;

  501.                           case 3:  day--;//调节日
  502.                                             if(day==-1)day=31;
  503.                                             LCD_WRITE_NYR(6,day);
  504.                                             LCD_WRITE_COM(0x80+7);
  505.                                             break;
  506.                           case 4:   week--;//调节星期
  507.                                              if(week==0)week=7;
  508.                                              LCD_WRITE_WEEK(week);
  509.                                              LCD_WRITE_COM(0x80+9);
  510.                                              break;
  511. /**************************************************************************************************/        
  512.               case 5:  if(key33==0)
  513.                                  {
  514.                                           chour--;
  515.                                     if(chour==-1)chour=23;
  516.                                     LCD_WRITE_NYR(11,chour);//将调节后的小时送入液晶显示
  517.                                     LCD_WRITE_COM(0x80+12);//光标回到指定处
  518.                                             break;
  519.                                  }
  520.                else if(key33==1)
  521.                                 {
  522.                                                                         tsecond--;
  523.                                     if(tsecond==-1)tsecond=59;
  524.                                     LCD_WRITE_NYR(11,tsecond);//将调节后的小时送入液晶显示
  525.                                     LCD_WRITE_COM(0x80+12);//光标回到指定处
  526.                                             break;
  527.                                                          
  528.                                                          
  529.                                  }
  530.                else if(key33==2)
  531.                                 {
  532.                                                                         dminute--;
  533.                                     if(dminute==-1)dminute=59;
  534.                                     LCD_WRITE_NYR(11,dminute);//将调节后的小时送入液晶显示
  535.                                     LCD_WRITE_COM(0x80+12);//光标回到指定处
  536.                                             break;
  537.                                                          
  538.                                                          
  539.                                  }


  540. /*************************************************************************************************/
  541.         case 6:  
  542.                         if(key33==0)
  543.                                         {         
  544.                                                                         cminute--;
  545.                                     if(cminute==-1)cminute=59;
  546.                                     LCD_WRITE_NYR(14,cminute);//将调节后的小时送入液晶显示
  547.                                     LCD_WRITE_COM(0x80+15);//光标回到指定处
  548.                                             break;
  549.                                         }        
  550.                         else   if(key33==1)
  551.                                         {         
  552.                                                                         tmsecond--;
  553.                                     if(tmsecond==-1)tmsecond=59;
  554.                                     LCD_WRITE_NYR(14,tmsecond);//将调节后的小时送入液晶显示
  555.                                     LCD_WRITE_COM(0x80+15);//光标回到指定处
  556.                                             break;
  557.                                         }                                                        
  558.                         else   if(key33==2)
  559.                                         {         
  560.                                                                         dsecond--;
  561.                                     if(dsecond==-1)dsecond=59;
  562.                                     LCD_WRITE_NYR(14,dsecond);//将调节后的小时送入液晶显示
  563.                                     LCD_WRITE_COM(0x80+15);//光标回到指定处
  564.                                             break;
  565.                                         }                                                
  566.                                                 
  567.                                                 
  568.                                                 
  569. /***********************************************************************************************/
  570.                           case 7:   hour--;//调节时
  571.                                             if(hour==-1)hour=23;
  572.                                             LCD_WRITE_SFM(0,hour);
  573.                                             LCD_WRITE_COM(0x80+0x40+1);
  574.                                             break;

  575.                           case 8:   minute--;//调节分
  576.                                              if(minute==-1)minute=59;
  577.                                              LCD_WRITE_SFM(3,minute);
  578.                                              LCD_WRITE_COM(0x80+0x40+4);
  579.                                              break;

  580.                           case 9:   second--;//调节秒
  581.                                              if(second==-1)second=59;
  582.                                              LCD_WRITE_SFM(6,second);
  583.                                              LCD_WRITE_COM(0x80+0x40+7);
  584.                                              break;
  585.                           default:break;
  586.                                           
  587.                         }
  588.                   }
  589.           }

  590.                
  591.    }
  592.    

  593. }
  594. ……………………

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

所有资料51hei提供下载:
多功能电子时钟.rar (139.37 KB, 下载次数: 215)
回复

使用道具 举报

ID:525478 发表于 2019-5-26 09:57 | 显示全部楼层
这个好 功能强大
回复

使用道具 举报

ID:652786 发表于 2019-11-30 18:37 | 显示全部楼层
下了之后运行错误??仿真图在哪里??
回复

使用道具 举报

ID:571765 发表于 2019-12-8 22:58 | 显示全部楼层
大佬,这个是怎么样具体操作的、
回复

使用道具 举报

ID:706042 发表于 2020-4-1 21:38 | 显示全部楼层
运行报错
回复

使用道具 举报

ID:621496 发表于 2020-5-15 13:17 | 显示全部楼层
proteus仿真在哪里?
回复

使用道具 举报

ID:618097 发表于 2020-5-15 21:41 | 显示全部楼层
原理图那个1602接错了吧
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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