[国产单片机] 液晶1602显示18b20采集的温度程序——找错误

[复制链接]
1516|2
 楼主| 守一不移 发表于 2014-5-14 22:11 | 显示全部楼层 |阅读模式
  1. #include<stc12.h>
  2. #include<intrins.h>
  3. #define uint unsigned int
  4. #define uchar unsigned char
  5. uchar code digit[10]={"0123456789"};                          //定义字符数组显示数字
  6. unsigned char code Temp[]={"Temp:"};             //说明显示的是温度
  7. unsigned char code Cent[]={"Cent"};              //温度单位

  8. sbit DS=P1^1;
  9. sbit rs=P1^0;
  10. sbit rw=P1^1;
  11. sbit en=P1^2;
  12. uchar TH,TL,TN,TD;


  13. void delay(uint sum)                //延时函数
  14. {
  15.         uint i;
  16.         for(i=sum;i>0;i--)
  17.         _nop_();
  18. }

  19. void begin(void)                        //初始化
  20. {
  21.         uint i=4;
  22.         DS=0;
  23.         delay(720);
  24.         DS=1;
  25.         while(i>0) i--;
  26. }

  27. void write(uchar dat)                //写数据
  28. {
  29.         uint i=0;
  30.         uchar j;
  31.         bit testb;
  32.         for(j=1;j<=8;j++)
  33.         {
  34.                 testb=dat&0x01;
  35.                 dat=dat>>1;
  36.                 if(testb)
  37.                 {
  38.                         DS=0;
  39.                         i++;i++;
  40.                         DS=1;
  41.                         delay(50);
  42.                 }
  43.                 else
  44.                 {
  45.                         DS=0;
  46.                         delay(60);
  47.                         DS=1;
  48.                         i++;i++;
  49.                 }
  50.         }
  51. }

  52. bit readbit(void)      //读取一位
  53. {
  54.         uint i;
  55.         bit dat;
  56.         DS=0;
  57.         i++;
  58.         DS=1;
  59.         i++;i++;
  60.         dat=DS;
  61.         delay(50);
  62.         return(dat);        
  63. }

  64. uchar read(void)             //读取一个字节
  65. {
  66.         uint i;
  67.         uchar j,dat=0;
  68.         for(i=1;i<=8;i++)
  69.         {
  70.                 j=readbit();
  71.             dat=(j<<7)|(dat>>1);  
  72.         }
  73.         return(dat);
  74. }

  75. void wenduchange()           //温度转换
  76. {
  77.         begin();
  78.         delay(1);
  79.         write(0xcc);
  80.         write(0x44);
  81.         delay(100);
  82. }

  83. wendu()                 //读取温度数值
  84. {
  85. //        float tempp;
  86.         begin();
  87.         delay(1);
  88.         write(0xcc);
  89.         write(0xbe);
  90. //        TL=read();
  91. //        TH=read();
  92. //        temp=TH;
  93. //        temp<<=8;
  94. //        temp=temp|TL;
  95. //        tempp=temp*0.0625;
  96. //         temp=tempp*10+0.5;
  97. //        return temp;         
  98. }

  99. void write_date(uchar date)                           //对液晶写入数据
  100. {
  101.         rs=1;
  102.         rw=0;
  103.         P0=date;
  104.         delay(1000);
  105.         en=1;
  106.         delay(1000);
  107.         en=0;
  108. }

  109. void write_com(uint com)                        //对液晶写入指令
  110. {
  111.         rs=0;
  112.         rw=0;
  113.         P0=com;
  114.         delay(1000);
  115.         en=1;
  116.         delay(1000);
  117.         en=0;
  118. }

  119. void init()                                           //1602初始化
  120. {
  121.         en=0;
  122.         write_com(0x38);
  123.         write_com(0x0e);
  124.         write_com(0x06);
  125.         write_com(0x01);
  126. //        write_com(0x80+0x10);
  127. }

  128. void display_symbol(void)                   //显示温度字符
  129. {
  130.         uint num;
  131.         write_com(0x80);
  132.         for(num=0;num<4;num++)
  133.         {
  134.                 write_date(Temp[num]);        
  135.         }
  136. }

  137. void display_cent(void)                        //显示温度单位
  138. {
  139.         uint num;
  140.         write_com(0x80+0x0b);
  141.         for(num=0;num<4;num++)
  142.         {
  143.                 write_date(Cent[num]);
  144.         }
  145. }

  146. void display_dot()                   //显示温度小数点
  147. {
  148.         write_com(0x80+0x08);
  149.         write_date('.');
  150. }

  151. void display_temp1(uchar x)                  //显示温度整数部分
  152. {
  153.         uchar j,k,l;
  154.         j=x/100;
  155.         k=(x%100)/10;
  156.         l=x%10;
  157.         write_com(0x80+0x05);
  158.         write_date(digit[j]);
  159.         write_date(digit[k]);
  160.         write_date(digit[l]);
  161.         delay(50000);        
  162. }

  163. void display_temp2(uchar x)                   //显示温度小数部分
  164. {
  165.         write_com(0x80+0x09);
  166.         write_date(digit[x]);
  167.         delay(1000);        
  168. }

  169. void main()
  170. {
  171. //        uchar TH,TL,TN,TD;
  172.         init();
  173.         delay(5000);
  174.         display_symbol();
  175.         display_dot();
  176.         display_cent();
  177.         while(1)
  178.         {
  179.                  wenduchange();
  180.                 wendu();
  181.                 TL=read();
  182.                 TH=read();
  183.                 TN=TH*16+TL/16;
  184.                 TD=(TL%16)*10/16;
  185.                 display_temp1(TN);    //显示温度的整数部分
  186.                    display_temp2(TD);    //显示温度的小数部分
  187.                    delay(1000);
  188.         }

  189. }
温度显示为255,9而且不变,不知道原因在哪?求解
wangch_sh 发表于 2014-8-29 15:03 | 显示全部楼层
时序问题
一往直前 发表于 2014-8-31 21:28 | 显示全部楼层
错了啊、时序自己检查,你这种写法很有问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

3

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部