找回密码
 立即注册

QQ登录

只需一步,快速开始

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

简单的单片机时钟和温度出现乱码,哪位大佬帮帮忙看看哪里错了?

[复制链接]
ID:432054 发表于 2018-11-23 20:38 | 显示全部楼层 |阅读模式
这是用1062,DS18B20显示一个简单的时钟和温度。下载程序成功后,当时间跑了一分多后,开始乱码。
  1. #include<reg52.h>
  2. #include <intrins.H>
  3. #include <math.H>
  4. #define uchar unsigned char
  5. #define uint unsigned int
  6. sbit dula=P2^6;
  7. sbit wela=P2^7;
  8. sbit rs=P3^5;
  9. sbit lcden=P3^4;
  10. sbit s1=P3^0;
  11. sbit s2=P3^1;
  12. sbit s3=P3^2;
  13. sbit rd=P3^7;
  14. sbit ds = P2^2;//ζè′«¸DÆ÷DÅoÅÏß
  15. uchar why,s1num;
  16. char shi,fen,miao;
  17. //-----------------------------------------------??
  18. uchar code table[]="wendu:";
  19. uchar code table1[]="00:00:00";

  20. void delay(uint z)
  21. {
  22.     uint x,y;
  23.           for(x=z;x>0;x--);
  24.             for(y=110;y>0;y--);
  25. }

  26. void write_com(uchar com)
  27. {
  28.     rs=0;
  29.           lcden=0;
  30.           P0=com;
  31.           delay(5);
  32.           lcden=1;
  33.           delay(5);
  34.           lcden=0;         
  35. }

  36. void write_data(uchar date)
  37. {
  38.     rs=1;
  39.           lcden=0;
  40.           P0=date;
  41.           delay(5);
  42.           lcden=1;
  43.           delay(5);
  44.           lcden=0;         
  45. }

  46. void init()
  47. {
  48.           uchar num;
  49.           dula=0;
  50.           wela=0;
  51.     lcden=0;
  52.           write_com(0x38);
  53.           write_com(0x0c);
  54.           write_com(0x06);
  55.           write_com(0x01);
  56.           write_com(0x80);
  57.           for(num=0;num<6;num++)
  58.             {
  59.          write_data(table[num]);
  60.                                  delay(20);
  61.       }
  62.                         write_com(0x80+0x40);
  63.           for(num=0;num<8;num++)
  64.             {
  65.          write_data(table1[num]);
  66.                                  delay(20);
  67.       }
  68.                 TMOD=0x01;
  69.                 TH0=(65536-50000)/256;
  70.                 TL0=(65536-50000)%256;
  71.                 EA=1;
  72.                 ET0=1;
  73.                 TR0=1;
  74.                
  75. }
  76. void write_string(uchar * str, uchar length)
  77. {
  78.      uchar i;
  79.     for(i = 0; i < length; i++)
  80.      {
  81.          write_data(str[i]);
  82.      }
  83. }

  84. //-----------------------------------------------........................................................................ê±¼ä
  85. void write_sfm(uchar add,uchar date)
  86. {
  87.           uchar shi,ge;
  88.           shi=date/10;
  89.           ge=date%10;
  90.     write_com(0x80+0x40+add);
  91.           write_data(0x30+shi);
  92.           write_data(0x30+ge);
  93. }

  94. void keyscan()
  95. {
  96.      rd=0;
  97.      if(s1==0)
  98.                  {
  99.          delay(5);
  100.                            if(s1==0)
  101.                                  {
  102.                                            s1num++;//????
  103.                                            while(!s1);//??s1??
  104.                                            if(s1num==1)
  105.                                                  {
  106.              TR0=0;
  107.                                            write_com(0x80+0x40+6);//????
  108.                                            write_com(0x0f);
  109.                                            }
  110.                                                   if(s1num==2)
  111.                                                  {
  112.                                            write_com(0x80+0x40+3);//????
  113.                                            }
  114.                                                   if(s1num==3)
  115.                                                  {
  116.                                            write_com(0x80+0x40+0);//????
  117.                                            }
  118.                                                   if(s1num==4)
  119.                                                  {
  120.                                                  s1num=0;
  121.                                                  write_com(0x0c);
  122.                                            TR0=1;//?????,????,?????
  123.                                           
  124.                                            }
  125.          }
  126.                                  
  127.      }
  128.                  if(s1num!=0)
  129.                                  {
  130.              if(s2==0)
  131.                                                  {
  132.                delay(5);
  133.                                                          if(s2==0)
  134.                                                          {
  135.                                                                   while(!s2);//????
  136.                   if(s1num==1)//?????????
  137.                                                                         {
  138.                     miao++;
  139.                                                                                 if(miao==60)
  140.                                                                                   miao=0;   
  141.                                                                                 write_sfm(6,miao);
  142.                                                                                 write_com(0x80+0x40+6);
  143.                                                                                                                                                         
  144.                   }
  145.                                                                         if(s1num==2)//...?
  146.                                                                         {
  147.                     fen++;
  148.                                                                                 if(fen==60)
  149.                                                                                         fen=0;
  150.                                                                                 write_sfm(3,fen);
  151.                                                                                 write_com(0x80+0x40+3);
  152.                   }
  153.                                                                         if(s1num==3)//...?
  154.                                                                         {
  155.                     shi++;
  156.                                                                                 if(shi==24)
  157.                                                                                         shi=0;
  158.                                                                                 write_sfm(0,shi);
  159.                                                                                 write_com(0x80+0x40+0);
  160.                   }
  161.                }
  162.              }
  163.                                                         if(s3==0)
  164.                                                         {
  165.                 delay(5);
  166.                                                                 if(s3==0)
  167.                                                                 {
  168.                   while(!s3);
  169.                                                                         if(s1num==1)//?????????
  170.                                                                         {
  171.                     miao--;        
  172.                                                                                 if(miao==-1)
  173.                                                                                         miao=59;
  174.                     write_sfm(6,miao);
  175.                                                                                 write_com(0x80+0x40+6);                                                                                
  176.                   }
  177.                                                                         if(s1num==2)//...?
  178.                                                                         {
  179.                     fen--;
  180.                                                                                 if(fen==-1)
  181.                                                                                         fen=59;
  182.                                                                                 write_sfm(3,fen);
  183.                                                                                 write_com(0x80+0x40+3);
  184.                   }
  185.                                                                         if(s1num==3)//...?
  186.                                                                         {
  187.                     shi--;
  188.                                                                                 if(shi==-1)
  189.                                                                                         shi=23;
  190.                                                                                 write_sfm(0,shi);
  191.                                                                                 write_com(0x80+0x40+0);
  192.                   }
  193.                 }
  194.                                                                
  195.               }                                                               
  196.          }
  197. }


  198. void timer0() interrupt 1
  199. {
  200.     TH0=(65536-50000)/256;
  201.                 TL0=(65536-50000)%256;
  202.          why++;
  203.                     if(why==20)
  204.                 {
  205.         why=0;
  206.         miao++;
  207.         if(miao==60)
  208.                                 {
  209.           miao=0;
  210.                                         fen++;
  211.                                         if(fen==60)
  212.                                         {
  213.             fen=0;
  214.                                                 shi++;
  215.                                                 if(shi==24)
  216.                                                 {
  217.               shi=0;
  218.             }
  219.                                                 write_sfm(0,shi);
  220.           }
  221.                            write_sfm(3,fen);
  222.         }        
  223.         write_sfm(6,miao);                                
  224.     }
  225.          
  226. }
  227. //.........................................................................................................
  228. //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++릏
  229. void dsInit()//DS18B20¸′룬3õê¼»ˉoˉêy
  230. {
  231.    
  232.     unsigned int i;  
  233.     ds = 0;
  234.     i = 100;  
  235.      while(i>0) i--;
  236.     ds = 1;   
  237.     i = 4;
  238.      while(i>0) i--;
  239. }

  240. void dsWait()
  241. {
  242.       unsigned int i;
  243.       while(ds);  
  244.       while(~ds);
  245.       i = 4;
  246.       while(i > 0) i--;
  247. }


  248. bit readBit()
  249. {
  250.     unsigned int i;
  251.     bit b;
  252.     ds = 0;
  253.     i++;   
  254.     ds = 1;
  255.    i++; i++;  
  256.     b = ds;
  257.     i = 8;
  258.     while(i>0) i--;
  259.     return b;
  260. }

  261. unsigned char readByte()
  262. {
  263.     unsigned int i;
  264.     unsigned char j, dat;
  265.    dat = 0;
  266.     for(i=0; i<8; i++)
  267.     {
  268.         j = readBit();
  269.       
  270.         dat = (j << 7) | (dat >> 1);
  271.     }
  272.     return dat;
  273. }


  274. void writeByte(unsigned char dat)
  275. {
  276.     unsigned int i;
  277.     unsigned char j;
  278.     bit b;
  279.     for(j = 0; j < 8; j++)
  280.     {
  281.         b = dat & 0x01;
  282.         dat >>= 1;
  283.    
  284.         if(b)   
  285.         {
  286.            ds = 0;          i++; i++;  
  287.             ds = 1;   
  288.             i = 8; while(i>0) i--;  
  289.         }
  290.         else  
  291.         {
  292.             ds = 0;
  293.           i = 8; while(i>0) i--;  
  294.             ds = 1;
  295.            i++; i++;
  296.         }
  297.    }
  298. }


  299. void sendChangeCmd()//¿aê¼»ñè¡Î¶è2¢×a»»
  300. {
  301.     dsInit();   
  302.     dsWait();   
  303.     delay(1);   
  304.     writeByte(0xcc);
  305.     writeByte(0x44);
  306. }

  307. void sendReadCmd()
  308. {
  309.     dsInit();
  310.     dsWait();
  311.     delay(1);
  312.     writeByte(0xcc);
  313.     writeByte(0xbe);
  314. }


  315. int getTmpValue()
  316. {
  317.     unsigned int tmpvalue;
  318.     int value;
  319.     float t;
  320.     unsigned char low, high;
  321.     sendReadCmd();
  322.    
  323.     low = readByte(); //¶á¸ß°Ëλ
  324.     high = readByte();//¶áμíËÄλ
  325.    
  326.     tmpvalue = high;
  327.     tmpvalue <<= 8;//ὸö×Ö½ú×éoÏÎaò»¸ö×Ö
  328.     tmpvalue |= low;
  329.     value = tmpvalue;
  330.    
  331.   \
  332.     t = value * 0.0625;//ζèÔú¼Ä′æÆ÷ÖDλ12룬·Ö±æÂêÎa0.0625¡ã
  333.    
  334.     value = t * 100 + (value > 0 ? 0.5 : -0.5); //μ±value>0ê±£¬value=t*100+0.5--------
  335.     return value;//valueêÇÕûDÎ
  336. }

  337. void display(int v)
  338. {
  339.     unsigned char count;
  340.     unsigned char datas[] = {0, 0, 0, 0, 0};
  341.     unsigned int tmp = abs(v);
  342.     datas[0] = tmp / 10000;
  343.     datas[1] = tmp % 10000 / 1000;
  344.     datas[2] = tmp % 1000 / 100;
  345.     datas[3] = tmp % 100 / 10;
  346.     datas[4] = tmp % 10;
  347.     write_com(0x80+6);
  348.     if(v < 0)
  349.     {
  350.         write_string("- ", 2);//"-"êÇ×Ö·û′®
  351.    }
  352.     else
  353.     {
  354.        write_string("+ ", 2);
  355.     }
  356.     if(datas[0] != 0)
  357.     {
  358.         write_data('0'+datas[0]);
  359.     }
  360.     for(count = 1; count != 5; count++)
  361.     {
  362.         write_data('0'+datas[count]);
  363.         if(count == 2)
  364.         {
  365.             write_data('.');
  366.         }
  367.     }
  368. }

  369. void main()
  370. {
  371.           uchar table[] = "wendu: ";
  372.     sendChangeCmd();//ζè×a»»oˉêy
  373.     init();
  374.           while(1)
  375.     {
  376.         delay(1000); //750ms
  377.         write_com(0x80);
  378.         display(getTmpValue());
  379.         sendChangeCmd();
  380.                         
  381.                            keyscan();
  382.     }
  383.           while(1);

  384. }  
复制代码
     
回复

使用道具 举报

ID:358930 发表于 2018-11-24 08:01 | 显示全部楼层
一般是接触不良,如果是开发板就是跳线没断开相互干扰,看这个程序还定意了数码管脚,如是最小系统可更换端口试试,另这个液晶好像没有判忙。
回复

使用道具 举报

ID:432054 发表于 2018-11-24 12:30 | 显示全部楼层
冰冰洁洁 发表于 2018-11-24 08:01
一般是接触不良,如果是开发板就是跳线没断开相互干扰,看这个程序还定意了数码管脚,如是最小系统可更换端 ...

好的,谢谢
回复

使用道具 举报

ID:432054 发表于 2018-11-24 13:53 | 显示全部楼层
冰冰洁洁 发表于 2018-11-24 08:01
一般是接触不良,如果是开发板就是跳线没断开相互干扰,看这个程序还定意了数码管脚,如是最小系统可更换端 ...

要是加判忙的话该怎么加呢
回复

使用道具 举报

ID:358930 发表于 2018-11-24 18:21 来自手机 | 显示全部楼层
Heyshoop 发表于 2018-11-24 13:53
要是加判忙的话该怎么加呢

加在写指令和写数据的开始函数那儿,用来判断P0你定义的数据总线是否空闲,才执行写操作。例程很多,论坛找1602液晶就行,但是有的板子干扰严重,判忙可不用,但不稳定,就像你这个样。做实验还是最小系统板,一个实验一套接线方案干扰源最少,因为这样少走弯路,不会因为硬件问题,怀疑软件。反之也一样,实在找不到我再提供参考码给你。
回复

使用道具 举报

ID:432054 发表于 2018-11-27 18:46 | 显示全部楼层
冰冰洁洁 发表于 2018-11-24 18:21
加在写指令和写数据的开始函数那儿,用来判断P0你定义的数据总线是否空闲,才执行写操作。例程很多,论坛 ...

我找了,加在里面,程序运行后比之前运行的正确时间要长,之后还是乱码。那麻烦你给我提供一下参考码吧,谢谢了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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