久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1751|回復: 4
打印 上一主題 下一主題
收起左側

頭一次接觸單片機1602顯示屏出了故障,幫一下新手菜鳥吧

[復制鏈接]
回帖獎勵 20 黑幣 回復本帖可獲得 4 黑幣獎勵! 每人限 1 次(中獎概率 40%)
跳轉到指定樓層
樓主
ID:767762 發(fā)表于 2020-6-26 09:15 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
我是按照每個元件的原理圖裝的線路,之前也檢查了下午也沒有發(fā)現(xiàn)錯誤。那些百度到的方法也試過了,也沒用。程序在仿真的時候沒有問題。
程序
  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數(shù)據(jù)信號
  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;       //液晶數(shù)據(jù)命令選擇端
  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數(shù)據(jù),將數(shù)據(jù)送入液晶顯示        
  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延時函數(shù)
  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);                       //經(jīng)本人試驗證明1602初始化不清屏也可實現(xiàn)

  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讀數(shù)據(jù)
  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);//將調節(jié)后的秒寫入DS1302
  339.                          WRITE_1302(0x82,(minute/10*16)+minute%10);//將調節(jié)后的分寫入DS1302
  340.                          WRITE_1302(0x84,(hour/10*16)+hour%10);//將調節(jié)后的時寫入DS1302
  341.                                      WRITE_1302(0x8a,(week/10*16)+week%10);//將調節(jié)后的星期寫入DS1302
  342.                          WRITE_1302(0x86,(day/10*16)+day%10);//將調節(jié)后的日寫入DS1302
  343.                          WRITE_1302(0x88,(month/10*16)+month%10);//將調節(jié)后的月寫入DS1302
  344.                                      WRITE_1302(0x8c,(year/10*16)+year%10);//將調節(jié)后的年寫入DS1302
  345.                                      WRITE_1302(WRITE_PROTECT,0x80);      //開寫保護
  346.                                      flag=0;                              //時間修改完畢,允許液晶從DS1302讀數(shù)據(jù)
  347.                                          TR0=1;        
  348.                                          break;
  349.                  
  350.                }  

  351.           }
  352.    }
  353.          if(num==0&&key33==1)
  354.          { if(key1==0)//確認增大鍵按下
  355.           {
  356.                     delay(20);
  357.                   if(key1==0)//增大鍵確實按下
  358.                   {while(!key1);
  359.               if(ts==0)ts++;
  360.               else ts--;
  361.                         }
  362.                 }
  363.                 if(key2==0)//確認增大鍵按下
  364.           {
  365.                     delay(20);
  366.                   if(key2==0)//增大鍵確實按下
  367.                   {while(!key2);
  368. tsecond=tmsecond=0;
  369.                         }
  370.                 }
  371.         }
  372.          if(num!=0)
  373.    {
  374.              if(key1==0)//確認增大鍵按下
  375.           {
  376.                     delay(20);
  377.                   if(key1==0)//增大鍵確實按下
  378.                   {
  379.                                 
  380.                                 speakerr(mt);
  381.                           while(!key1);
  382.                         switch(num)
  383.                         {
  384.                            case 1:        year++;//調節(jié)年
  385.                                     if(year==100)year=0;
  386.                                     LCD_WRITE_NYR(0,year);//將調節(jié)后的年送入液晶顯示
  387.                                     LCD_WRITE_COM(0x80+1);//光標回到指定處
  388.                                                 break;
  389.                                 
  390.                            case 2:  month++;//調節(jié)月
  391.                                     if(month==13)month=0;
  392.                                     LCD_WRITE_NYR(3,month);//將調節(jié)后的月送入液晶顯示
  393.                                     LCD_WRITE_COM(0x80+4);//光標回到指定處
  394.                                                 break;
  395.                           
  396.                            case 3:  day++;//調節(jié)日
  397.                                 if(day==32)day=0;
  398.                                     LCD_WRITE_NYR(6,day);//將調節(jié)后的日送入液晶顯示
  399.                                     LCD_WRITE_COM(0x80+7);//光標回到指定處
  400.                                             break;

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

  471.                            case 9:  second++;
  472.                                     if(second==60)second=0;
  473.                                     LCD_WRITE_SFM(6,second);//將調節(jié)后的秒送入液晶顯示
  474.                                     LCD_WRITE_COM(0x80+0x40+7);//光標回到指定處
  475.                                                       break;
  476.                                 default:break;                                         
  477.                         }         
  478.                         
  479.                   }
  480.           }
  481.           if(key2==0)//確認減小鍵按下
  482.           {
  483.                     delay(20);
  484.                   if(key2==0)//減小鍵確實按下
  485.                   {
  486.                                 speakerr(mt);
  487.                           while(!key2);
  488.                         switch(num)
  489.                         {
  490.                           case 1:  year--;//調節(jié)年
  491.                                     if(year==-1)year=99;
  492.                                             LCD_WRITE_NYR(0,year);
  493.                                             LCD_WRITE_COM(0x80+1);
  494.                                             break;

  495.                           case 2:  month--;//調節(jié)月
  496.                                             if(month==-1)month=12;
  497.                                             LCD_WRITE_NYR(3,month);
  498.                                             LCD_WRITE_COM(0x80+4);
  499.                                             break;

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


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

  574.                           case 8:   minute--;//調節(jié)分
  575.                                              if(minute==-1)minute=59;
  576.                                              LCD_WRITE_SFM(3,minute);
  577.                                              LCD_WRITE_COM(0x80+0x40+4);
  578.                                              break;

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

  589.                
  590.    }


  591. }
  592. /*******************************蜂鳴器部分******************************************/

  593. /*-----------定時器0初始化-------------------------*/
  594. void INITIAL_TEMER0()
  595. {
  596.    TMOD=0x01;
  597.    TH0=(65536-20000)/256;   
  598.    TL0=(65536-20000)%256;   //晶振頻率12MHZ 定時20ms作右
  599.          
  600.    EA=1;         
  601.    ET0=1;        
  602.    TR0=1;
  603.    EX0=1;//開外部中斷0
  604.    IT0=1;//邊沿觸發(fā)
  605. }
  606. /*-------------------------------------------*/
  607. void timer0()interrupt 1
  608. {
  609.    TH0=(65536-10000)/256;   
  610.    TL0=(65536-10000)%256;          //重裝

  611.         
  612.         
  613.         count++;
  614.                 if(ts==1) tmsecond++;
  615.                  if(tmsecond==100)
  616.                  {
  617.                          tmsecond=0;tsecond++;
  618.                          if(tsecond==60)tsecond=0;
  619.                  }        
  620.    if(count==100)           //1秒到
  621.    {

  622.     count=0;
  623.     beep=0;                           //蜂鳴器響
  624.     delay(5);
  625.     beep=1;                          //蜂鳴器滅
  626.    }
  627.    if(tem>=30)
  628.          {
  629.                  beep=0;
  630.          }         
  631. }  
  632. /*****************************18b20部分**********************************************/
  633. void DelayUs(uint time)
  634. {
  635.         while(time--);
  636. }

  637. /**************************************
  638. **Function Name:void Init_Ds18b20(void)
  639. **Description:DS18B20的初始化
  640. **Input :None
  641. **Output:None
  642. **Return: None
  643. **************************************/
  644. void Init_Ds18b20(void)
  645. {
  646.         uchar ready;
  647.         DQ=1;                        //首先DQ是高電平
  648.         DelayUs(15);                //延時,等DQ穩(wěn)定
  649.         DQ=0;                        //拉低
  650.         DelayUs(75);        //延時大概600US
  651.         DQ=1;                        //拉高(釋放)
  652.         DelayUs(15);                //15US左右
  653.         ready=DQ;                        //開始采樣
  654.         DelayUs(7);                //延時                (這個延時在仿真時很重要)
  655.         //return ready;                //返回0, 說明總線上有器件響應
  656.                                         //返回1, 說明總線上沒有器件響應
  657. }

  658. /**************************************
  659. **Fuction Name:void WriteByte(uchar date)
  660. **Description:寫一個字節(jié)
  661. **Input:Write Data Byte
  662. **Output:None
  663. **Return: None
  664. **************************************/
  665. void WriteByte(uint date)
  666. {
  667.         uint i;
  668.         for(i=0;i<8;i++)
  669.         {
  670.                 DQ=0;                                
  671.                 DQ=date&0x01;
  672.                 DelayUs(7);
  673.                 DQ=1;
  674.                 date>>=1;        
  675.         }
  676.         DelayUs(7);        
  677. }

  678. /**************************************
  679. **Function Name:uchar ReadByte(void)
  680. **Description:讀一個字節(jié)
  681. **Input:None
  682. **Output:Read Data Byte
  683. **Return: Read Data Byte
  684. **************************************/
  685. uint ReadByte(void)
  686. {
  687.         uint i,value;
  688.         for(i=0;i<8;i++)
  689.         {
  690.                 DQ=0;
  691.                 value>>=1;
  692.                 DQ=1;
  693.                 if(DQ)
  694.                 {
  695.                         value|=0x80;        
  696.                 }
  697.                 DelayUs(7);        
  698.         }
  699.         return value;
  700. }

  701. /**************************************
  702. **Function Name:uchar ReadTemperature(void)
  703. **Description:讀出溫度值
  704. **Input:None
  705. **Output:Read Temperature
  706. **Return: Read Temperature
  707. **************************************/
  708. uint ReadTemperature(void)
  709. {
  710.         uint a,b;
  711.         Init_Ds18b20();                        //初始化
  712.         WriteByte(0xcc);                //跳過ROM
  713.         WriteByte(0x44);                //啟動轉換
  714.         DelayUs(35);
  715.         
  716.         Init_Ds18b20();                //初始化
  717.         WriteByte(0xcc);        //跳過ROM
  718.         WriteByte(0xbe);
  719.         DelayUs(35);        //準備讀取
  720.         a=ReadByte();
  721.         b=ReadByte();
  722.         b<<=4;                                //讀溫度的整數(shù)部分
  723.         b+=(a&0xf0)>>4;
  724.         return b;
  725.                                 
  726. }



  727. void delay4(uint a)
  728. {
  729. for( ; a>0; a--);
  730. }
  731. void speakerr(uint a)
  732. {
  733.         for(;a>0;a--)
  734.                 {
  735.                         
  736.                         beep=~beep;
  737.                   beep=~beep;
  738.                 }        
  739. }

  740. /****************************外部中斷1************************************************************/
  741. void int_0() interrupt 0 using 2
  742. {      

  743. key33++;
  744. if(key33==3)key33=0;

  745.         
  746.         
  747.                                 beep=~beep;
  748.                     beep=~beep;
  749. }
復制代碼

{UFSPOBFS}{9Y8%Q@O_IP[5.png (101.53 KB, 下載次數(shù): 55)

{UFSPOBFS}{9Y8%Q@O_IP[5.png

51hei圖片_20200626090529.jpg (65.33 KB, 下載次數(shù): 96)

51hei圖片_20200626090529.jpg
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:767762 發(fā)表于 2020-6-26 16:23 | 只看該作者

仿真效果圖
回復

使用道具 舉報

板凳
ID:213173 發(fā)表于 2020-6-27 09:05 | 只看該作者

這是典型的LCD1602初始化失敗的現(xiàn)象。程序能夠正常仿真,不能用于實際電路最大可能是LCD1602驅動程序的時序有問題。看樓主程序中的延時函數(shù)有疑點。
void delay(unsigned char z)
{
   unsigned char x,y;
   for(x=z;x>0;x--)
      for(y=110;y>0;y--);
}
從表面看似乎這是1ms延時程序,實際由于數(shù)據(jù)類型使用unsigned char,delay(5);的延時只有577us,要把延時函數(shù)中數(shù)據(jù)類型改為unsigned int 才能近似1ms。MCU處理不同數(shù)據(jù)類型耗時也不同!
回復

使用道具 舉報

地板
ID:790246 發(fā)表于 2020-6-27 10:08 | 只看該作者
這程序和你的單片機硬件不匹配吧
回復

使用道具 舉報

5#
ID:682755 發(fā)表于 2020-6-27 10:24 | 只看該作者
會不會是單片機的引腳沒接對,實物的引腳和仿真的不一樣的要吧程序里的
sbit LCD_E=P1^7;         //液晶使能端
sbit LCD_RS=P1^5;       //液晶數(shù)據(jù)命令選擇端
sbit LCD_RW=P1^6;        //液晶讀寫選擇端
引腳該為單片機實物上面的引腳
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 一区二区亚洲 | 黄色毛片在线播放 | 国产黄色在线观看 | 国产精品国产a级 | 亚洲a视 | 91精品久久久久久久久中文字幕 | 国产视频一区二区 | 亚洲国产精品久久久久婷婷老年 | 精品福利视频一区二区三区 | 国产精品国产a级 | 午夜精品在线观看 | 成人精品视频99在线观看免费 | 欧美日韩亚洲三区 | 成人精品国产一区二区4080 | 精品视频网 | 成人精品一区 | 综合久久99 | 国产精品3区 | 精品欧美一区二区三区久久久 | 国产精品久久久久久久久久软件 | 日韩电影在线 | 91精品国产综合久久久久久首页 | 久久精品亚洲精品 | 一区二区日本 | 久久久久国产一区二区三区 | 欧美又大粗又爽又黄大片视频 | 国产91综合 | 在线视频亚洲 | 中文字幕一区二区三区日韩精品 | 国产成人午夜精品影院游乐网 | 91精品国产麻豆 | www.99热| 色.com| 久久里面有精品 | 亚洲人在线播放 | 国产1区2区在线观看 | 亚洲欧美综合精品久久成人 | 国产高清精品一区二区三区 | 成人综合视频在线 | 久久精品欧美一区二区三区不卡 | av在线一区二区三区 |