找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3801|回复: 5
收起左侧

基于51单片机的多功能时钟温度计 DS1302+LCD1602 原理图PCB程序

[复制链接]
ID:623579 发表于 2019-12-20 16:30 | 显示全部楼层 |阅读模式
本设计是由STC89C52单片机为控制核心,具有在线编程功能,低功耗;时钟电路由DS1302提供,它是一种高性能、低功耗的时钟电路,工作电压为3V~5V;所以采用DS1302作为本设计的日历芯片;显示部份使用LCD1602B液晶模块进行数字显示,1602B液晶模块可以显示2行16个字符,有8位数据总线D0—D7,和RS、R/W、EN三个控制端口,工作电压为5V,并且带有字符对比度调节和背光。该模块也可以只用D4-D7作为四位数据分两次传送,这样就可以节省MCU的I/O口资源,系统主要由晶振电路、复位电路、时钟电路部分、中央处理单元、晶显示部分组成。

电路原理图如下:
1576830270(1).jpg

制作出来的实物图如下:
IMG_20150308_231544.jpg IMG_20150308_231217.jpg

Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)
51hei.png

单片机源程序如下:
  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. #define     LCDIO      P0
  6. sbit rs=P2^0;  
  7. sbit rd=P2^1;
  8. sbit lcden=P2^2;
  9. sbit acc0=ACC^0;             //移位时的第0位
  10. sbit acc7=ACC^7;             //移位时用的第7位
  11. sbit ct=P2^3;
  12. sbit speaker=P3^5;
  13. sbit DQ=P2^5;//ds18b20与单片机连接口
  14. int djs11=0,js,dsmin=0,dshour=0;

  15. uchar second,minute,hour,day,month,year,week,count=0;   
  16. uchar ReadValue,num,time;   
  17. uint tvalue;//温度值
  18. uchar tflag;
  19. uchar code        table[]={" 2000-00-00 FRI"};
  20. uchar code table1[]={" 00:00:00       "};
  21. uchar code table2[]= "THUFRISATSUNMONTUEWES";
  22. char szdata[8];
  23. char szdata1[8];
  24. uchar data disdata[5];
  25. sbit DATA=P3^3;   //时钟数据接口
  26. sbit RST=P3^4;   
  27. sbit SCLK=P3^2;   
  28. sbit menu=P2^7;              //菜单
  29. sbit add=P2^6;               //加一
  30. sbit dec=P2^4;
  31. sbit set=P2^3 ;              //减一
  32. sbit djs=P3^6;
  33. void miaobiao();
  34. void yx();
  35. void delayms(int x)
  36. {
  37. char i;
  38. while(x--)
  39. {
  40.   for(i=150;i>0;i--);
  41. }
  42. }
  43. void delay(uint z)
  44. {
  45.         uint x,y;
  46.         for(x=z;x>0;x--)
  47.                 for(y=110;y>0;y--);
  48. }
  49. void delay1(uint z)
  50. {
  51.         for(;z>0;z--);
  52. }
  53. void write_com(uchar com)
  54. {
  55.         rs=0;
  56.         rd=0;
  57.         lcden=0;
  58.         LCDIO=com;
  59.         delay(5);
  60.         lcden=1;
  61.         delay(5);
  62.         lcden=0;       
  63. }

  64. void write_date(uchar date)
  65. {
  66.         rs=1;
  67.         rd=0;
  68.         lcden=0;
  69.         LCDIO=date;
  70.         delay(5);
  71.         lcden=1;
  72.         delay(5);
  73.         lcden=0;       
  74. }

  75. void init()
  76. {
  77.         uchar num;
  78.         lcden=0;

  79.         write_com(0x38);
  80.         write_com(0x0c);
  81.         write_com(0x06);
  82.         write_com(0x01);
  83.         write_com(0x80);
  84.         delay(5);
  85.         write_com(0x80);
  86.         for(num=0;num<15;num++)
  87.                 {
  88.                         write_date(table[num]);
  89.                         delay(5);
  90.                 }
  91.         write_com(0x80+0x40);
  92.         for(num=0;num<15;num++)
  93.                 {
  94.                         write_date(table1[num]);
  95.                         delay(5);
  96.                 }      
  97.        

  98. }

  99. void Write1302(uchar dat)
  100. {
  101.   uchar i;
  102.   SCLK=0;           //拉低SCLK,为脉冲上升沿写入数据做好准备
  103.   delay1(2);       //稍微等待,使硬件做好准备
  104.   for(i=0;i<8;i++)      //连续写8个二进制位数据
  105.     {
  106.      DATA=dat&0x01;    //取出dat的第0位数据写入1302
  107.   delay(2);       //稍微等待,使硬件做好准备
  108.    SCLK=1;           //上升沿写入数据
  109.    delay1(2);      //稍微等待,使硬件做好准备
  110.    SCLK=0;           //重新拉低SCLK,形成脉冲
  111.    dat>>=1;          //将dat的各数据位右移1位,准备写入下一个数据位
  112.    }
  113. }

  114. void WriteSet1302(uchar Cmd,uchar dat)
  115. {
  116.    RST=0;           //禁止数据传递
  117.    SCLK=0;          //确保写数居前SCLK被拉低
  118.    RST=1;           //启动数据传输
  119.    delay1(2);     //稍微等待,使硬件做好准备
  120.    Write1302(Cmd);  //写入命令字
  121.    Write1302(dat);  //写数据
  122.    SCLK=1;          //将时钟电平置于已知状态
  123.    RST=0;           //禁止数据传递
  124. }

  125. uchar Read1302(void)
  126. {
  127.    uchar i,dat;
  128.    delay(2);       //稍微等待,使硬件做好准备
  129.    for(i=0;i<8;i++)   //连续读8个二进制位数据
  130.    {
  131.     dat>>=1;       //将dat的各数据位右移1位,因为先读出的是字节的最低位
  132.     if(DATA==1)    //如果读出的数据是1
  133.     dat|=0x80;    //将1取出,写在dat的最高位
  134.     SCLK=1;       //将SCLK置于高电平,为下降沿读出
  135.     delay1(2);  //稍微等待
  136.     SCLK=0;       //拉低SCLK,形成脉冲下降沿
  137.     delay1(2);  //稍微等待
  138.     }  
  139.   return dat;        //将读出的数据返回
  140.   }

  141. uchar  ReadSet1302(uchar Cmd)
  142. {
  143.   uchar dat;
  144.   RST=0;                 //拉低RST
  145.   SCLK=0;                //确保写数居前SCLK被拉低
  146.   RST=1;                 //启动数据传输
  147.   Write1302(Cmd);       //写入命令字
  148.   dat=Read1302();       //读出数据
  149.   SCLK=1;              //将时钟电平置于已知状态
  150.   RST=0;               //禁止数据传递
  151.   return dat;          //将读出的数据返回
  152. }
  153. void Init_DS1302(void)
  154. {
  155. WriteSet1302(0x8E,0x00);                 //根据写状态寄存器命令字,写入不保护指令
  156. WriteSet1302(0x80,((0/10)<<4|(0%10)));   //根据写秒寄存器命令字,写入秒的初始值
  157. WriteSet1302(0x82,((12/10)<<4|(12%10)));   //根据写分寄存器命令字,写入分的初始值
  158. WriteSet1302(0x84,((11/10)<<4|(11%10))); //根据写小时寄存器命令字,写入小时的初始值
  159. WriteSet1302(0x86,((25/10)<<4|(25%10))); //根据写日寄存器命令字,写入日的初始值
  160. WriteSet1302(0x88,((1/10)<<4|(1%10))); //根据写月寄存器命令字,写入月的初始值
  161. WriteSet1302(0x8c,((13/10)<<4|(13%10)));   //nian
  162. WriteSet1302(0x8a,((1/10)<<4|(1%10)));
  163. }

  164. void DisplaySecond(uchar x)
  165. {
  166. uchar i,j;   
  167. i=x/10;
  168. j=x%10;
  169. write_com(0xc7);   
  170. write_date(0x30+i);   
  171. write_date(0x30+j);      
  172. }
  173. void DisplayMinute(uchar x)
  174. {
  175. uchar i,j;   
  176. i=x/10;
  177. j=x%10;
  178. write_com(0xc4);   
  179. write_date(0x30+i);  
  180. write_date(0x30+j);        
  181. }
  182. void DisplayHour(uchar x)
  183. {
  184. uchar i,j;   
  185. i=x/10;
  186. j=x%10;
  187. write_com(0xc1);   
  188. write_date(0x30+i);  
  189. write_date(0x30+j);        
  190. }

  191. void DisplayDay(uchar x)
  192. {
  193. uchar i,j;   
  194. i=x/10;
  195. j=x%10;   
  196. write_com(0x89);   
  197. write_date(0x30+i);  
  198. write_date(0x30+j);      
  199. }

  200. void DisplayMonth(uchar x)
  201. {
  202. uchar i,j;     
  203. i=x/10;
  204. j=x%10;  
  205. write_com(0x86);   
  206. write_date(0x30+i);  
  207. write_date(0x30+j);  
  208. }

  209. void DisplayYear(uchar x)
  210. {
  211. uchar i,j;  
  212.   i=x/10;
  213. j=x%10;
  214. write_com(0x83);   
  215. write_date(0x30+i);
  216. write_date(0x30+j);  
  217. }   
  218. void DisplayWeek(uchar x)
  219. { uchar i;
  220.    x=x*3;
  221. write_com(0x8c);   
  222. for(i=0;i<3;i++)
  223.    {
  224.            write_date(table2[x]);
  225.         x++;  
  226.    }
  227. }   

  228. void  read_date(void)
  229. {
  230.      ReadValue = ReadSet1302(0x81);   
  231.      second=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
  232.      ReadValue = ReadSet1302(0x83);  
  233.      minute=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
  234.      ReadValue = ReadSet1302(0x85);  
  235.      hour=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
  236.      ReadValue = ReadSet1302(0x87);  
  237.      day=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
  238.      ReadValue = ReadSet1302(0x89);  
  239.      month=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
  240.      ReadValue = ReadSet1302(0x8d);  
  241.      year=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
  242.          ReadValue=ReadSet1302(0x8b);                     //读星期
  243.      week=ReadValue&0x07;
  244.          if((year==szdata[1])&&(month==szdata[2])&&(day==szdata[3])&&(week==szdata[4])&&(hour==szdata[5])&&(minute==szdata[6])&&(second==szdata[7]))             speaker=0;
  245.          DisplaySecond(second);           
  246.      DisplayMinute(minute);        
  247.      DisplayHour(hour);            
  248.      DisplayDay(day);               
  249.      DisplayMonth(month);            
  250.      DisplayYear(year);         
  251.          DisplayWeek(week);  
  252. }

  253. void turn_val(char newval,uchar flag,uchar  newaddr,uchar s1num)
  254.     {
  255.                    newval=ReadSet1302(newaddr);                     //读取当前时间
  256.                    newval=((newval&0x70)>>4)*10+(newval&0x0f);    //将bcd码转换成十进制
  257.                    if(flag)                  //判断是加一还是减一
  258.                    {
  259.                                      newval++;
  260.                      switch(s1num)
  261.                        { case 1: if(newval>99) newval=0;
  262.                                                       DisplayYear(newval);      
  263.                                                                   break;
  264.                                              case 2: if(newval>12) newval=1;
  265.                                                                    DisplayMonth(newval);
  266.                                                                   break;
  267.                                              case 3: if(newval>31) newval=1;
  268.                                                           DisplayDay(newval);  
  269.                                                                   break;
  270.                                              case 4: if(newval>6) newval=0;
  271.                                                           DisplayWeek(newval);
  272.                                                                   break;
  273.                          case 5: if(newval>23) newval=0;
  274.                                                           DisplayHour(newval);
  275.                                                                   break;
  276.                          case 6: if(newval>59) newval=0;
  277.                                                           DisplayMinute(newval);
  278.                                                                   break;
  279.                          case 7: if(newval>59) newval=0;
  280.                                                           DisplaySecond(newval);
  281.                                                                   break;
  282.                          default:break;
  283.                        }
  284.                                          }   
  285.                                 else
  286.                    {
  287.                                     newval--;
  288.                                         switch(s1num)
  289.                        { case 1: if(newval<0) newval=99;
  290.                                                       DisplayYear(newval);
  291.                                                                   break;
  292.                                              case 2: if(newval<0) newval=12;
  293.                                                                    DisplayMonth(newval);
  294.                                                           break;
  295.                                              case 3: if(newval<0) newval=31;
  296.                                                                    DisplayDay(newval);
  297.                                                           break;
  298.                                              case 4: if(newval<0) newval=6;
  299.                                                           DisplayWeek(newval);
  300.                                                                   break;
  301.                          case 5: if(newval<0) newval=23;
  302.                                                           DisplayHour(newval);
  303.                                                                   break;
  304.                          case 6: if(newval<0) newval=59;
  305.                                                           DisplayMinute(newval);
  306.                                                                   break;
  307.                          case 7: if(newval<0) newval=59;
  308.                                                           DisplaySecond(newval);
  309.                                                                   break;
  310.                                                  default:break;
  311.                                        }
  312.                                          }
  313.                 WriteSet1302((newaddr-1),((newval/10)<<4)|(newval%10));  //将新数据写入寄存器
  314.            
  315.         }   


  316. void turn_val11(char newval,uchar flag,uchar  newaddr,uchar s1num)
  317.     {
  318.                    newval=szdata[s1num];                     //读取当前时间
  319.                    //newval=((newval&0x70)>>4)*10+(newval&0x0f);    //将bcd码转换成十进制
  320.                    if(flag)                  //判断是加一还是减一
  321.                    {
  322.                                      newval++;
  323.                      switch(s1num)
  324.                        { case 1: if(newval>99) newval=0;
  325.                                                       DisplayYear(newval);      
  326.                                                                   break;
  327.                                              case 2: if(newval>12) newval=1;
  328.                                                                    DisplayMonth(newval);
  329.                                                                   break;
  330.                                              case 3: if(newval>31) newval=1;
  331.                                                           DisplayDay(newval);  
  332.                                                                   break;
  333.                                              case 4: if(newval>6) newval=0;
  334.                                                           DisplayWeek(newval);
  335.                                                                   break;
  336.                          case 5: if(newval>23) newval=0;
  337.                                                           DisplayHour(newval);
  338.                                                                   break;
  339.                          case 6: if(newval>59) newval=0;
  340.                                                           DisplayMinute(newval);
  341.                                                                   break;
  342.                          case 7: if(newval>59) newval=0;
  343.                                                           DisplaySecond(newval);
  344.                                                                   break;
  345.                          default:break;
  346.                        }
  347.                                          }   
  348.                                 else
  349.                    {
  350.                                     newval--;
  351.                                         switch(s1num)
  352.                        { case 1: if(newval<0) newval=99;
  353.                                                       DisplayYear(newval);
  354.                                                                   break;
  355.                                              case 2: if(newval<0) newval=12;
  356.                                                                    DisplayMonth(newval);
  357.                                                           break;
  358.                                              case 3: if(newval<0) newval=31;
  359.                                                                    DisplayDay(newval);
  360.                                                           break;
  361.                                              case 4: if(newval<0) newval=6;
  362.                                                           DisplayWeek(newval);
  363.                                                                   break;
  364.                          case 5: if(newval<0) newval=23;
  365.                                                           DisplayHour(newval);
  366.                                                                   break;
  367.                          case 6: if(newval<0) newval=59;
  368.                                                           DisplayMinute(newval);
  369.                                                                   break;
  370.                          case 7: if(newval<0) newval=59;
  371.                                                           DisplaySecond(newval);
  372.                                                                   break;
  373.                                                  default:break;
  374.                                        }
  375.                                          }
  376.                  szdata[s1num]= newval;
  377.                                  szdata1[s1num]=newval;
  378.                                 //WriteSet1302((newaddr-1),((newval/10)<<4)|(newval%10));  //将新数据写入寄存器
  379.            
  380.         }   

  381. //键盘扫描程序
  382. //*******************************************
  383. void key_scan(void)
  384. {        uchar miao,s1num=0;       

  385.         if(menu==0)
  386.      {
  387.        delay(5);
  388.            if(menu==0)
  389.            {
  390.              while(!menu);          
  391.                   s1num++;
  392.                                                  write_com(0xc9);
  393.            write_date(' ');//显示符号位
  394.            write_com(0xca);
  395.            write_date(' ');//显示百位
  396.            write_com(0xcb);
  397.            write_date('T');//显示十位        
  398.            write_com(0xcc);
  399.            write_date('-');//显示个位        
  400.            write_com(0xcd);
  401.            write_date('S');//显示小数点        
  402.            write_com(0xce);
  403.            write_date('E');//显示小数位
  404.            write_com(0xcf);
  405.            write_date('T');
  406.                 while(1)
  407.             {

  408.                     if(menu==0)
  409.              {
  410.                 delay(5);
  411.                     if(menu==0)
  412.                       {
  413.                                      while(!menu);
  414.                          s1num++;
  415.                           }
  416.                  }

  417.                 rd=0;
  418.                         miao=ReadSet1302(0x81);
  419.                         second=miao;
  420.                         WriteSet1302(0x80,miao|0x80);
  421.                     write_com(0x0f);//光标闪射
  422.                        
  423.                         if(s1num==1)
  424.                         {        year=ReadSet1302(0x8d);                 
  425.                                 write_com(0x80+4);        //年光标

  426.                             if(add==0)
  427.                              {
  428.                                delay(3);
  429.                                if(add==0)
  430.                                  {         while(!add);
  431.                                turn_val(year,1,0x8d,1);                       
  432.                
  433.                                  }
  434.                               }
  435.                     if(dec==0)
  436.                          {
  437.                                 delay(3);
  438.                                 if(dec==0)
  439.                                  {        while(!dec);
  440.                                    turn_val(year,0,0x8d,1);                                     
  441.                                  }
  442.                               }
  443.                          }
  444.                         if(s1num==2)
  445.                         {
  446.                           month=ReadSet1302(0x89);
  447.                                 write_com(0x80+7);        //月光标
  448.                                  if(add==0)
  449.                         {
  450.                           delay(3);
  451.                           if(add==0)
  452.                            {  while(!add);
  453.                               turn_val(month,1,0x89,2);
  454.                             }
  455.                         }
  456.                         if(dec==0)
  457.                         {
  458.                            delay(3);
  459.                            if(dec==0)
  460.                            {  while(!dec);
  461.                               turn_val(month,0,0x89,2);
  462.                            }
  463.                         }
  464.                         }
  465.                         if(s1num==3)
  466.                         {        day=ReadSet1302(0x87);
  467.                                 write_com(0x80+10);//日光标
  468.                                 if(add==0)
  469.                           {
  470.                           delay(3);
  471.                           if(add==0)
  472.                            { while(!add);
  473.                          turn_val(day,1,0x87,3);
  474.                             }
  475.                         }
  476.                         if(dec==0)
  477.                         {
  478.                            delay(3);
  479.                            if(dec==0)
  480.                            { while(!dec);
  481.                              turn_val(day,0,0x87,3);                                //写入日寄存器
  482.                            }
  483.                         }
  484.                         }
  485.                         if(s1num==4)
  486.                         {  week=ReadSet1302(0x8b);
  487.                                 write_com(0x80+14);        //星期光标
  488.                                   if(add==0)
  489.                              {
  490.                           delay(3);
  491.                           if(add==0)
  492.                            { while(!add);
  493.                              turn_val(week,1,0x8b,4);
  494.                             }
  495.                         }
  496.                         if(dec==0)
  497.                         {
  498.                            delay(3);
  499.                            if(dec==0)
  500.                            { while(!dec);
  501.                      turn_val(week,0,0x8b,4);
  502.                            }
  503.                         }
  504.                         }
  505.                         if(s1num==5)
  506.                         {        hour=ReadSet1302(0x85);
  507.                                 write_com(0x80+0x40+2);        //时光标
  508.                                  if(add==0)
  509.                         {
  510.                           delay(3);
  511.                           if(add==0)
  512.                            { while(!add);
  513.                  turn_val(hour,1,0x85,5);
  514.                             }
  515.                         }
  516.                         if(dec==0)
  517.                         {
  518.                            delay(3);
  519.                            if(dec==0)
  520.                            { while(!dec);
  521.                          turn_val(hour,0,0x85,5);
  522.                            }
  523.                         }
  524.                         }
  525.                         if(s1num==6)//调时间分
  526.                         {  minute=ReadSet1302(0x83);
  527.                                 write_com(0x80+0x40+5);
  528.                                 if(add==0)
  529.                         {
  530.                           delay(5);
  531.                           if(add==0)
  532.                            { while(!add);
  533.                          turn_val(minute,1,0x83,6);                                //写入分寄存器   
  534.                             }
  535.                         }
  536.                         if(dec==0)
  537.                         {
  538.                            delay(3);
  539.                            if(dec==0)
  540.                            { while(!dec);
  541.                          turn_val(minute,0,0x83,6);                                //写入分寄存器
  542.                            }
  543.                         }
  544.                         }
  545.                         if(s1num==7)//调时间秒
  546.                         {        second=ReadSet1302(0x81);
  547.                                 write_com(0x80+0x40+8);//秒光标
  548.                                 if(add==0)
  549.                         {
  550.                           delay(3);
  551.                           if(add==0)
  552.                            { while(!add);
  553.                  if(second==0x60)
  554.                     second=0x00;
  555.                                  turn_val(second,1,0x81,7);       
  556.                             }
  557.                         }
  558.                         if(dec==0)
  559.                         {
  560.                            delay(3);
  561.                            if(dec==0)
  562.                            { while(!dec);
  563.                          turn_val(second,0,0x81,7);                               
  564.                            }
  565.                         }
  566.                         }
  567.             

  568.                         if(s1num==8)
  569.                         {        miao=ReadSet1302(0x81);
  570.                                 second=miao;
  571.                                 WriteSet1302(0x80,second&0x7f);
  572.                                 s1num=0;//s1num清零//
  573.                                 write_com(0x0c);//光标不闪烁//
  574.                                 break;
  575.                         }
  576.                 }
  577.         }
  578.         }

  579.   if(ct==0)
  580.      {
  581.        delay(5);
  582.            if(ct==0)
  583.            {
  584.              while(!ct);          
  585.                   s1num++;
  586.        write_com(0xc9);
  587.            write_date(' ');//显示符号位
  588.            write_com(0xca);
  589.            write_date(' ');//显示百位
  590.            write_com(0xcb);
  591.            write_date('C');//显示十位        
  592.            write_com(0xcc);
  593.            write_date('-');//显示个位        
  594.            write_com(0xcd);
  595.            write_date('S');//显示小数点        
  596.            write_com(0xce);
  597.            write_date('E');//显示小数位
  598.            write_com(0xcf);
  599.            write_date('T');
  600.          DisplaySecond(szdata1[7]);           
  601.      DisplayMinute(szdata1[6]);        
  602.      DisplayHour(szdata1[5]);            
  603.      DisplayDay(szdata1[3]);               
  604.      DisplayMonth(szdata1[2]);            
  605.      DisplayYear(szdata1[1]);         
  606.          DisplayWeek(szdata1[4]);
  607.                 while(1)
  608.             {

  609.                     if(ct==0)
  610.              {
  611.                 delay(5);
  612.                     if(ct==0)
  613.                       {
  614.                                      while(!ct);
  615.                          s1num++;
  616.                           }
  617.                  }

  618.                 rd=0;
  619.                         miao=ReadSet1302(0x81);
  620.                         second=miao;
  621.                         WriteSet1302(0x80,miao|0x80);
  622.                     write_com(0x0f);//光标闪射
  623.                        
  624.                         if(s1num==1)
  625.                         {        year=0x00;                 
  626.                                 write_com(0x80+4);        //年光标

  627.                             if(add==0)
  628.                              {
  629.                                delay(3);
  630.                                if(add==0)
  631.                                  {         while(!add);
  632.                                turn_val11(year,1,0x8d,1);                       
  633.                
  634.                                  }
  635.                               }
  636.                     if(dec==0)
  637.                          {
  638.                                 delay(3);
  639.                                 if(dec==0)
  640.                                  {        while(!dec);
  641.                                    turn_val11(year,0,0x8d,1);                                     
  642.                                  }
  643.                               }
  644.                          }
  645.                         if(s1num==2)
  646.                         {
  647.                           month=0x00;       
  648.                                 write_com(0x80+7);        //月光标
  649.                                  if(add==0)
  650.                         {
  651.                           delay(3);
  652.                           if(add==0)
  653.                            {  while(!add);
  654.                               turn_val11(month,1,0x89,2);
  655.                             }
  656.                         }
  657.                         if(dec==0)
  658.                         {
  659.                            delay(3);
  660.                            if(dec==0)
  661.                            {  while(!dec);
  662.                               turn_val11(month,0,0x89,2);
  663.                            }
  664.                         }
  665.                         }
  666.                         if(s1num==3)
  667.                         {        day=0x00;       
  668.                                 write_com(0x80+10);//日光标
  669.                                 if(add==0)
  670.                           {
  671.                           delay(3);
  672.                           if(add==0)
  673.                            { while(!add);
  674.                          turn_val11(day,1,0x87,3);
  675.                             }
  676.                         }
  677.                         if(dec==0)
  678.                         {
  679.                            delay(3);
  680.                            if(dec==0)
  681.                            { while(!dec);
  682.                              turn_val11(day,0,0x87,3);                                //写入日寄存器
  683.                            }
  684.                         }
  685.                         }
  686.                         if(s1num==4)
  687.                         {  week=0x00;       
  688.                                 write_com(0x80+14);        //星期光标
  689.                                   if(add==0)
  690.                              {
  691.                           delay(3);
  692.                           if(add==0)
  693.                            { while(!add);
  694.                              turn_val11(week,1,0x8b,4);
  695.                             }
  696.                         }
  697.                         if(dec==0)
  698.                         {
  699.                            delay(3);
  700.                            if(dec==0)
  701.                            { while(!dec);
  702.                      turn_val11(week,0,0x8b,4);
  703.                            }
  704.                         }
  705.                         }
  706.                         if(s1num==5)
  707.                         {        hour=0x00;       
  708.                                 write_com(0x80+0x40+2);        //时光标
  709.                                  if(add==0)
  710.                         {
  711.                           delay(3);
  712.                           if(add==0)
  713.                            { while(!add);
  714.                  turn_val11(hour,1,0x85,5);
  715.                             }
  716.                         }
  717.                         if(dec==0)
  718.                         {
  719.                            delay(3);
  720.                            if(dec==0)
  721.                            { while(!dec);
  722.                          turn_val11(hour,0,0x85,5);
  723.                            }
  724.                         }
  725.                         }
  726.                         if(s1num==6)//调时间分
  727.                         {  minute=0x00;       
  728.                                 write_com(0x80+0x40+5);
  729.                                 if(add==0)
  730.                         {
  731.                           delay(5);
  732.                           if(add==0)
  733.                            { while(!add);
  734.                          turn_val11(minute,1,0x83,6);                                //写入分寄存器   
  735.                             }
  736.                         }
  737.                         if(dec==0)
  738.                         {
  739.                            delay(3);
  740.                            if(dec==0)
  741.                            { while(!dec);
  742.                          turn_val11(minute,0,0x83,6);                                //写入分寄存器
  743.                            }
  744.                         }
  745.                         }
  746.                         if(s1num==7)//调时间秒
  747.                         {        second=0x00;       
  748.                                 write_com(0x80+0x40+8);//秒光标
  749.                                 if(add==0)
  750.                         {
  751.                           delay(3);
  752.                           if(add==0)
  753.                            { while(!add);
  754.                  if(second==0x60)
  755.                     second=0x00;
  756.                                  turn_val11(second,1,0x81,7);       
  757.                             }
  758.                         }
  759.                         if(dec==0)
  760.                         {
  761.                            delay(3);
  762.                            if(dec==0)
  763.                            { while(!dec);
  764.                          turn_val11(second,0,0x81,7);                               
  765.                            }
  766.                         }
  767.                         }
  768.             

  769.                         if(s1num==8)
  770.                         {        miao=ReadSet1302(0x81);       
  771.                                 second=miao;
  772.                                 WriteSet1302(0x80,second&0x7f);
  773.                                 s1num=0;//s1num清零//
  774.                                 write_com(0x0c);//光标不闪烁//
  775.                                 break;
  776.                         }
  777.                 }
  778.         }
  779.         }
  780. }

  781. void Timer0_init()
  782. {
  783.       js=0;
  784.           TMOD=0x01;                                  //T0为定时器方式1
  785.       TH0=0x4c;
  786.           TL0=0x00;                       
  787.      //IT1=1;
  788.           ET0=1;//EX1=1;
  789.           EA=1;       
  790. }

  791. void timer0() interrupt 1 using 1       
  792. {
  793.             TF0=0;
  794.                  //TH0=0x4c;
  795.                 //TL0=0x00;
  796.                 TH0=0xb3;
  797.                 TL0=0x4c;
  798.                 js++;
  799.                 if(js==1)
  800.                   { js=0;
  801.                     djs11++;
  802.                         //led1=~led1;
  803.                         if(djs11>59)
  804.                           {
  805.                             djs11=0;
  806.                                 dsmin=dsmin+1;
  807.                                 if(dsmin>59)
  808.                                  {
  809.                                    dsmin=0;
  810.                                    dshour=dshour+1;
  811.                                    if(dshour>24) dshour=0;
  812.                                  }
  813.                         }
  814.                    }
  815. }
  816. void miaobiao()
  817. {                int i,j;

  818.             write_com(0x80);write_date(' ');
  819.                         write_com(0x81);write_date(' ');
  820.                         write_com(0x82);write_date(' ');
  821.                         write_com(0x83);write_date(' ');
  822.                         write_com(0x84);write_date(' ');
  823.                         write_com(0x85);write_date(' ');
  824.                         write_com(0x86);write_date(' ');
  825.                         write_com(0x87);write_date(' ');
  826.                     write_com(0x88);write_date(' ');
  827.                         write_com(0x89);write_date(' ');
  828.                         write_com(0x8a);write_date(' ');
  829.                         write_com(0x8b);write_date(' ');
  830.                         write_com(0x8c);write_date(' ');
  831.                         write_com(0x8d);write_date(' ');
  832.                         write_com(0x8e);write_date(' ');
  833.                         write_com(0x8f);write_date(' ');
  834.                         write_com(0xc0);write_date(' ');
  835.                         write_com(0xc1);write_date(' ');
  836.                         write_com(0xc2);write_date(' ');
  837.                         write_com(0xc3);write_date(' ');
  838.                         write_com(0xc4);write_date(' ');
  839.                         write_com(0xc5);write_date(' ');
  840.                         write_com(0xc6);write_date(' ');
  841.                         write_com(0xc7);write_date(' ');
  842.                     write_com(0xc8);write_date(' ');
  843.                         write_com(0xc9);write_date(' ');
  844.                         write_com(0xca);write_date(' ');
  845.                         write_com(0xcb);write_date(' ');
  846.                         write_com(0xcc);write_date(' ');
  847.                         write_com(0xcd);write_date(' ');
  848.                         write_com(0xce);write_date(' ');
  849.                         write_com(0xcf);write_date(' ');
  850.                    while(1)
  851.                     {        if(add==0)
  852.                               {
  853.                                   delayms(30);
  854.                                     if(add==0)
  855.                                           {
  856.                                             TR0=1;
  857.                                           }

  858.                                   }
  859.                                 if(dec==0)
  860.                               {
  861.                                   delayms(30);
  862.                                     if(dec==0)
  863.                                           {
  864.                                             TR0=0;
  865.                                           }
  866.                                           }
  867.                                 if(set==0)
  868.                               {
  869.                                   delayms(30);
  870.                                     if(set==0)
  871.                                           {
  872.                                             djs11=0;
  873.                                                 TR0=0;
  874.                                                                                                 dsmin=0;
  875.                                                 dshour=0;
  876.                                           }
  877.                                           }
  878.                                    if(djs==0)
  879.                               {
  880.                                   delayms(30);
  881.                                     if(djs==0)
  882.                                           {
  883.                                                 yx();
  884.                                           }
  885.                                           }
  886.                         write_com(0xc4);
  887.                                                  i=dshour/10;
  888.              j=dshour%10;   
  889.              write_date(0x30+i);  
  890.              write_date(0x30+j);

  891.                          write_date(':');  
  892.                          i=dsmin/10;
  893.              j=dsmin%10;   
  894.              write_date(0x30+i);  
  895.              write_date(0x30+j);
  896.                          write_date(':');   

  897.                                                   i=djs11/10;
  898.              j=djs11%10;
  899.              write_date(0x30+i);  
  900.              write_date(0x30+j);
  901.                         }
  902. }
  903. void delay_18B20(unsigned int i)//延时1微秒
  904. {
  905.         while(i--);
  906. }
  907. void ds1820rst()/*ds1820复位*/
  908. {  unsigned char x=0;
  909.          DQ = 1;          //DQ复位
  910.          delay_18B20(4);  //延时
  911.          DQ = 0;          //DQ拉低
  912.          delay_18B20(100); //精确延时大于480us
  913.          DQ = 1;          //拉高
  914.          delay_18B20(40);         
  915.    }  
  916.   
  917.    uchar ds1820rd()/*读数据*/
  918.   { unsigned char i=0;
  919.          unsigned char dat = 0;
  920.          for (i=8;i>0;i--)
  921.          {   DQ = 0; //给脉冲信号
  922.                   dat>>=1;
  923.                   DQ = 1; //给脉冲信号
  924.                   if(DQ)
  925.                   dat|=0x80;
  926.                   delay_18B20(10);
  927.          }
  928.         return(dat);
  929.   }

  930.   void ds1820wr(uchar wdata)/*写数据*/
  931.   {unsigned char i=0;
  932.     for (i=8; i>0; i--)
  933.    { DQ = 0;
  934.      DQ = wdata&0x01;
  935.      delay_18B20(10);
  936.      DQ = 1;
  937.      wdata>>=1;
  938.    }
  939. }
  940. read_temp()/*读取温度值并转换*/
  941. {uchar a,b;
  942.   ds1820rst();   
  943.   ds1820wr(0xcc);//*跳过读序列号*/
  944.   ds1820wr(0x44);//*启动温度转换*/
  945.   ds1820rst();   
  946.   ds1820wr(0xcc);//*跳过读序列号*/
  947.   ds1820wr(0xbe);//*读取温度*/
  948.   a=ds1820rd();
  949.   b=ds1820rd();
  950.   tvalue=b;
  951.   tvalue<<=8;
  952.   tvalue=tvalue|a;
  953.     if(tvalue<0x0fff)
  954.    tflag=0;
  955.     else
  956.    {tvalue=~tvalue+1;
  957.          tflag=1;
  958.    }
  959.   tvalue=tvalue*(0.625);//温度值扩大10倍,精确到1位小数
  960.         return(tvalue);
  961.   }
  962. void ds1820disp()//温度值显示
  963.         { uchar flagdat;
  964.           disdata[0]=tvalue/1000+0x30;//百位数
  965.      disdata[1]=tvalue%1000/100+0x30;//十位数
  966.      disdata[2]=tvalue%100/10+0x30;//个位数
  967.      disdata[3]=tvalue%10+0x30;//小数位
  968.    
  969.      if(tflag==0)
  970.             flagdat=0x20;//正温度不显示符号
  971.      else
  972.        flagdat=0x2d;//负温度显示负号:-

  973.      if(disdata[0]==0x30)
  974.            {disdata[0]=0x20;//如果百位为0,不显示
  975.                  if(disdata[1]==0x30)
  976.                   {disdata[1]=0x20;//如果百位为0,十位为0也不显示
  977.                   }
  978.                 }

  979.            write_com(0xc9);
  980.            write_date(flagdat);//显示符号位
  981.            write_com(0xca);
  982.            write_date(disdata[0]);//显示百位
  983.            write_com(0xcb);
  984.            write_date(disdata[1]);//显示十位        
  985.            write_com(0xcc);
  986.            write_date(disdata[2]);//显示个位        
  987.            write_com(0xcd);
  988.            write_date(0x2e);//显示小数点        
  989.            write_com(0xce);
  990.            write_date(disdata[3]);//显示小数位
  991.            write_com(0xcf);
  992.            write_date('C');
  993.    }

  994. void yx()
  995. {
  996. init();
  997. while(1)
  998.         {
  999.          read_date();
  1000.          read_temp();//读取温度
  1001.          ds1820disp();//显示
  1002.          key_scan();
  1003.          if(add==0)
  1004.                              {
  1005.                                   delayms(30);
  1006.                                     if(add==0)
  1007.                                           {
  1008.                                              speaker=1;
  1009.                                           }

  1010.                                   }
  1011.                                 if(dec==0)
  1012.                               {
  1013.                                   delayms(30);
  1014.                                     if(dec==0)
  1015.                                           {
  1016.                                              speaker=1;
  1017.                                           }
  1018.                                           }
  1019.          if(djs==0)
  1020.           {
  1021.            delay(5);
  1022.             if(djs==0)
  1023.                   {
  1024.                    miaobiao();                 
  1025.                   }       
  1026.                 }
  1027.         }

  1028. }

  1029. void main()
  1030. {
  1031.         init();
  1032.         Timer0_init();
  1033. //        Init_DS1302();       //将1302初始化
  1034.      speaker=1;
  1035.      szdata1[1]=0x00;
  1036.          szdata1[2]=0x00;
  1037.          szdata1[3]=0x00;
  1038.          szdata1[4]=0x00;
  1039.          szdata1[5]=0x00;
  1040.          szdata1[6]=0x00;
  1041.          szdata1[7]=0x00;
  1042.         yx();
  1043. }
复制代码

所有资料51hei提供下载:
基于51单片机的多功能时钟温度计.7z (621.59 KB, 下载次数: 135)
回复

使用道具 举报

ID:864440 发表于 2020-12-23 11:55 | 显示全部楼层
感谢分享但是我使用之后LCD不能显示内容不知道是为什么
回复

使用道具 举报

ID:870180 发表于 2021-1-1 11:31 | 显示全部楼层

苟富贵.C(333): warning C280: 'newaddr': unreferenced local variable                                                                            出现了这个错误
回复

使用道具 举报

ID:870180 发表于 2021-1-1 11:32 | 显示全部楼层
苟富贵.C(333): warning C280: 'newaddr': unreferenced local variable      
回复

使用道具 举报

ID:519743 发表于 2021-1-4 10:35 | 显示全部楼层
楼主 实力很强啊  向楼主看齐1
回复

使用道具 举报

ID:859852 发表于 2021-1-4 13:10 来自手机 | 显示全部楼层
sbit ct =p2^3   sbit set=p2^3。怎么p2^3口定义了两次  
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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