51单片机18B20数码管显示出现问题!,求助

2019-07-16 02:11发布

本帖最后由 deasonata 于 2013-3-9 19:55 编辑
  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #define        displaytime 100                                 //等待扫描数码管显示次数
  4. #define delayT 30
  5. unsigned char code LED[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
  6. sbit DQ=P3^7;
  7. sbit D0=P3^0;
  8. sbit D1=P3^1;
  9. /***********************
  10.         延时
  11. ********************* */
  12. void delay(us)
  13. {
  14.         for(;us>0;us--);
  15. }
  16. void Delay500us()                                        //Delay500us()
  17. {
  18.         unsigned char i;

  19.         _nop_();
  20.         i = 247;
  21.         while (--i);
  22. }
  23. void Delay60us()                                        //Delay60us()
  24. {
  25.         unsigned char i;

  26.         _nop_();
  27.         i = 27;
  28.         while (--i);
  29. }
  30. void Delay10us()                                        //Delay10us()
  31. {
  32.         unsigned char i;

  33.         _nop_();
  34.         i = 2;
  35.         while (--i);
  36. }
  37. void Delay6us()                                                //Delay6us()
  38. {
  39.         _nop_();
  40.         _nop_();
  41. }

  42. /***********************
  43.        按位读取
  44. ********************* */
  45. char Read_byte()
  46. {
  47.         char i,date=0;

  48.         for(i=8;i>0;i--)
  49.         {
  50.                 date>>=1;                                         //右移一位
  51.                 DQ=0;                                                 //拉低总线
  52.                 Delay6us();                                         //延时6us
  53.                 DQ=1;                                                 //释放总线
  54.                 Delay6us();                                         //延时6us
  55.                 if(DQ==1)                                                
  56.                         date=(0x80|date);                 //数据最高位写入1
  57.                 Delay60us();                                 //延时60us
  58. //                date>>=1;                                         //右移一位
  59.         }
  60.         return date;
  61. }

  62. /***********************
  63.        按位写入
  64. ********************* */
  65. void Write_byte(char date)
  66. {
  67.         char i;
  68.         
  69.         for(i=8;i>0;i--)                                
  70.         {
  71.                 DQ=0;                                                //拉低总线
  72.                 Delay10us();                                //延迟10us
  73.                 DQ=date&0x01;                                //总线发送最低位
  74.                 Delay60us();                                //延迟60us
  75.                 DQ=1;                                                //释放总线
  76.                 date>>=1;                                        //数据右移一位
  77.         }        
  78. }

  79. /***********************
  80.         复位
  81. ********************* */
  82. void Reset(void)
  83. {        
  84.         char present;
  85.         while(present)
  86.         {                                                                //总线高电平,开始复位。低电平结束复位
  87.                 DQ=0;                                                  //拉低总线
  88.                 Delay500us();                                //延迟500us
  89.                 DQ=1;                                                //拉高总线
  90.                 Delay60us();
  91.                 if(DQ==0)
  92.                         present=0;
  93.                 else
  94.                         present=1;
  95.         }
  96.         Delay500us();                                        //延迟500毫秒

  97. }

  98. /***********************
  99.        数码管显示
  100. ********************* */
  101. void Led_display(char temp)
  102. {
  103.         D0=1;
  104.         P2=LED[temp/10];
  105.         
  106.         delay(delayT);
  107.         D0=0;
  108.         P2=0xff;
  109.         delay(delayT);
  110.         
  111.         D1=1;
  112.         P2=LED[temp%10];

  113.         delay(delayT);
  114.         D1=0;
  115.         P2=0xff;
  116.         delay(delayT);
  117. }

  118. /***********************
  119.        温度转换
  120. ********************* */
  121. char Temp_change(char temp)
  122. {
  123.         char i,th,tl;

  124.         Reset();                                                //复位
  125.         Write_byte(0xcc);                                //跳过ROM指令
  126.         Write_byte(0x44);                                //温度转换指令
  127.         for(i=displaytime;i>0;i--)        
  128.                 Led_display(temp);                        //等待温度转换时间,数码管显示
  129.         Write_byte(0xcc);                                //跳过ROM指令
  130.         Write_byte(0xbe);                                //读取温度
  131.         tl=Read_byte();                                        //读低八位
  132.         th=Read_byte();                                        //读高八位
  133.         tl>>=4;                                                        //低位去小数点
  134.         th<<=4;                                                        //去符号位,留下最高符号位
  135.         if(th&0x80==0x80)                                //判断符号位
  136.                 temp=-1;                                        //最高位是1,负数
  137.         else
  138.                 temp=1;                                                //否则就是正数
  139.         th&=0x7f;                                                //取出最高位的符号位
  140.         temp=temp*(th+tl);                                 //高位低位相加,乘以符号
  141.         return temp;                                        //返回温度数据
  142. }

  143. /***********************
  144.         初始化
  145. ********************* */
  146. void Init(void)
  147. {
  148.         D0=0;
  149.         D1=0;        
  150. }

  151. /***********************
  152.         主函数
  153. ********************* */
  154. void main()
  155. {        
  156.         char temp=0;

  157.         Init();
  158.         while(1)
  159.         {
  160.                 temp=Temp_change(temp);
  161.                 Led_display(temp);
  162.         }
  163. }
复制代码数码管显示部分单独测试过,没有问题,但是就是温度显示不出。!求高手解答

附:原理图和代码部分
DS18B20.zip 下载积分: 积分 -1 分
48.47 KB, 下载次数: 25, 下载积分: 积分 -1 分
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
胡海松
1楼-- · 2019-07-16 04:34
收藏啦
dzxs
2楼-- · 2019-07-16 09:32
akusar
3楼-- · 2019-07-16 15:25
deasonata
4楼-- · 2019-07-16 16:10
胡海松 发表于 2013-3-9 19:33
收藏啦

这个是有问题的程序。。。。=,=
丁一凡
5楼-- · 2019-07-16 16:49
 精彩回答 2  元偷偷看……

一周热门 更多>