找回密码
 立即注册

QQ登录

只需一步,快速开始

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

头一次接触单片机1602显示屏出了故障,帮一下新手菜鸟吧

[复制链接]
回帖奖励 20 黑币 回复本帖可获得 4 黑币奖励! 每人限 1 次(中奖概率 40%)
跳转到指定楼层
楼主
我是按照每个元件的原理图装的线路,之前也检查了下午也没有发现错误。那些百度到的方法也试过了,也没用。程序在仿真的时候没有问题。
程序
  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.          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++;//调节年
  385.                                     if(year==100)year=0;
  386.                                     LCD_WRITE_NYR(0,year);//将调节后的年送入液晶显示
  387.                                     LCD_WRITE_COM(0x80+1);//光标回到指定处
  388.                                                 break;
  389.                                 
  390.                            case 2:  month++;//调节月
  391.                                     if(month==13)month=0;
  392.                                     LCD_WRITE_NYR(3,month);//将调节后的月送入液晶显示
  393.                                     LCD_WRITE_COM(0x80+4);//光标回到指定处
  394.                                                 break;
  395.                           
  396.                            case 3:  day++;//调节日
  397.                                 if(day==32)day=0;
  398.                                     LCD_WRITE_NYR(6,day);//将调节后的日送入液晶显示
  399.                                     LCD_WRITE_COM(0x80+7);//光标回到指定处
  400.                                             break;

  401.                            case 4:  week++;
  402.                                     if(week==8)week=0;
  403.                                     LCD_WRITE_WEEK(week);//将调节后的星期送入液晶显示
  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);//将调节后的小时送入液晶显示
  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);//将调节后的小时送入液晶显示
  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);//将调节后的小时送入液晶显示
  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);//将调节后的小时送入液晶显示
  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);//将调节后的小时送入液晶显示
  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);//将调节后的小时送入液晶显示
  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);//将调节后的小时送入液晶显示
  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);//将调节后的分送入液晶显示
  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);//将调节后的秒送入液晶显示
  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--;//调节年
  491.                                     if(year==-1)year=99;
  492.                                             LCD_WRITE_NYR(0,year);
  493.                                             LCD_WRITE_COM(0x80+1);
  494.                                             break;

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

  500.                           case 3:  day--;//调节日
  501.                                             if(day==-1)day=31;
  502.                                             LCD_WRITE_NYR(6,day);
  503.                                             LCD_WRITE_COM(0x80+7);
  504.                                             break;
  505.                           case 4:   week--;//调节星期
  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);//将调节后的小时送入液晶显示
  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);//将调节后的小时送入液晶显示
  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);//将调节后的小时送入液晶显示
  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);//将调节后的小时送入液晶显示
  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);//将调节后的小时送入液晶显示
  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);//将调节后的小时送入液晶显示
  562.                                     LCD_WRITE_COM(0x80+15);//光标回到指定处
  563.                                             break;
  564.                                         }                                                
  565.                                                 
  566.                                                 
  567.                                                 
  568. /***********************************************************************************************/
  569.                           case 7:   hour--;//调节时
  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--;//调节分
  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--;//调节秒
  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;//边沿触发
  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稳定
  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:写一个字节
  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:读一个字节
  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;                                //读温度的整数部分
  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, 下载次数: 22)

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

51hei图片_20200626090529.jpg (65.33 KB, 下载次数: 67)

51hei图片_20200626090529.jpg
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:767762 发表于 2020-6-26 16:23 | 只看该作者

仿真效果图
回复

使用道具 举报

板凳
ID:213173 发表于 2020-6-27 09:05 | 只看该作者

这是典型的LCD1602初始化失败的现象。程序能够正常仿真,不能用于实际电路最大可能是LCD1602驱动程序的时序有问题。看楼主程序中的延时函数有疑点。
void delay(unsigned char z)
{
   unsigned char x,y;
   for(x=z;x>0;x--)
      for(y=110;y>0;y--);
}
从表面看似乎这是1ms延时程序,实际由于数据类型使用unsigned char,delay(5);的延时只有577us,要把延时函数中数据类型改为unsigned int 才能近似1ms。MCU处理不同数据类型耗时也不同!
回复

使用道具 举报

地板
ID:790246 发表于 2020-6-27 10:08 | 只看该作者
这程序和你的单片机硬件不匹配吧
回复

使用道具 举报

5#
ID:682755 发表于 2020-6-27 10:24 | 只看该作者
会不会是单片机的引脚没接对,实物的引脚和仿真的不一样的要吧程序里的
sbit LCD_E=P1^7;         //液晶使能端
sbit LCD_RS=P1^5;       //液晶数据命令选择端
sbit LCD_RW=P1^6;        //液晶读写选择端
引脚该为单片机实物上面的引脚
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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