求助1602显示18B20

2019-07-16 05:05发布

之前做了一个数码管显示的,想放液晶上看看,结果就悲剧了。
STC89C52+DS18B20+1602难道就坑死我了?
请大家帮忙检查一下那里有错误,为什么显示一直是0000
tica, Arial, sans-serif">#include <REG52.H>
#include <intrins.h>

typedef unsigned char uchar;
typedef unsigned int uint;
uchar  a,b,c,d; //定义变量
uchar k;

sbit lcden=P3^4;
sbit lcdrs=P3^5;

sbit dula=P2^6;
sbit wela=P2^7;
sbit DATA=P2^2; //DS18B20接入口


//uchar table2[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09};
uint disdata[4]={0,0,0,0};




// 毫秒延时

void delay(uint tt)
{

uchar i;

while(tt--)

for(i=110;i>0;i--);
}

//短延时

//系统初始化


//按键扫描


//温度检测
void Init_DS18B20()
  //传感器初始化
{

uchar x=0;

DATA = 1;    //DQ复位

delay(10);  //稍做延时

DATA = 0;    //单片机将DQ拉低

delay(80); //精确延时 大于 480us    //450

DATA = 1;    //拉高总线

delay(20);

x=DATA;      //稍做延时后 如果x=0则初始化成功 x=1则初始化失败

delay(30);
}

//读一个字节
ReadOneChar(void)
{

uchar i=0;

uchar dat = 0;

for (i=8;i>0;i--)

{
  
DATA = 0; // 给脉冲信号
  
dat>>=1;
  
DATA = 1; // 给脉冲信号
  
if(DATA)
   
dat|=0x80;
  
delay(8);

}

return(dat);
}

//写一个字节
void WriteOneChar(unsigned char dat)
{

uchar i=0;

for (i=8; i>0; i--)

{
  
DATA = 0;
  
DATA = dat&0x01;
  
delay(10);
  
DATA = 1;
  
dat>>=1;

}

delay(8);
}

//读取温度
int ReadTemperature(void)
{

uchar a=0;

uchar b=0;

int t=0;

float tt=0;

Init_DS18B20();

WriteOneChar(0xCC); // 跳过读序号列号的操作

WriteOneChar(0x44); // 启动温度转换

Init_DS18B20();

WriteOneChar(0xCC); //跳过读序号列号的操作

WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度

a=ReadOneChar();//低位

b=ReadOneChar();//高位

t=b;

t<<=8;

t=t|a;

tt=t*0.0625;

t= tt*10+0.5;

return(t);
}

void init_com(void)
{
     TMOD = 0x20;
     PCON = 0x00;
     SCON = 0x50;
     TH1 = 0xFd;
     TL1 = 0xFd;
     TR1 = 1;
}

void write_com(uchar com)
{


lcdrs=0;

P0=com;

delay(5);

lcden=1;

delay(5);

lcden=0;

}

void write_data(uchar dat)
{

lcdrs=1;

P0=dat;

delay(5);

lcden=1;

delay(5);

lcden=0;
}
void init()
{

dula=0;

wela=0;

lcden=0;

write_com(0x38);

write_com(0x0c);

write_com(0x06);

write_com(0x01);

}

void display(int x)
{

disdata[0]=x/1000+0x30;

disdata[1]=x%1000/100+0x30;

disdata[2]=x%100/10+0x30;

disdata[3]=x%10+0x30;

write_com(0x80);

write_data(disdata[0]);

delay(200);


write_data(disdata[1]);

delay(200);


write_data(disdata[2]);

delay(200);

write_data(disdata[3]);

delay(200);
}
/*-------------------------------------------------------------------*/
//主函数
void main()
{


init();

init_com();
    while(1)
    {

int  temp;

temp = ReadTemperature();//读温度

display(temp);
    }
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
A670521546
1楼-- · 2019-07-16 06:15
  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #define uint unsigned int
  4. #define uchar unsigned char

  5. sbit DQ=P3^5;  //连接DS18B20
  6. sbit en=P2^0;   //连接1602 E脚
  7. sbit rs=P2^2;   //连接1602 RS脚
  8. sbit rw=P2^1;  //连接1602 的R/W脚,可选择是否编译

  9. uchar code table[]="TEMP IS";
  10. uchar tplsb,tpmsb; // 温度值低位、高位字节
  11. uint temp;

  12. void delay(uint z)
  13. {
  14. uint x,y;
  15. for(x=z;x>0;x--)
  16. for(y=110;y>0;y--);
  17. }
  18. /*******************产生复位脉冲初始化DS18B20**************/
  19. void reset(void)
  20. {
  21. uint i;
  22. DQ=0;
  23. i=100;
  24. while(i--);
  25. DQ=1;// 产生上升沿
  26. i=4;
  27. while(i--);
  28. }
  29. /********************* 等待应答脉冲*********************/
  30. void wait(void)
  31. {
  32. uint i;
  33. while(DQ);
  34. while(~DQ); // 检测到应答脉冲
  35. i=4;
  36. while(i--);
  37. }
  38. bit readbit(void)
  39. {
  40. uint i;
  41. bit b;
  42. DQ=0;
  43. i++;
  44. DQ=1;
  45. i++;i++;// 延时15us以上,读时隙下降沿后15us,DS18B20输出数据才有效
  46. b=DQ;
  47. i=10;
  48. while(i--);
  49. return (b);
  50. }
  51. /******************* 读取数据的一个字节**************************/
  52. uchar readbyte(void)
  53. {
  54. uchar i,j,b;
  55. b=0;
  56. for(i=0;i<8;i++)
  57. {
  58. j=readbit();
  59. b=(j<<7)|(b>>1);
  60. }
  61. return(b);
  62. }
  63. /******************写数据的一个字节,满足写1和写0的时隙要求************/
  64. void writebyte(uchar b)
  65. {
  66. uint i;
  67. uchar j;
  68. bit btmp;
  69. for(j=0;j<8;j++)
  70. {
  71. btmp=b&0x01;
  72. b=b>>1; // 取下一位(由低位向高位)
  73. if(btmp)
  74. {
  75. DQ=0;
  76. i++;i++;
  77. DQ=1;
  78. i=10;
  79. while(i--);// 整个写1时隙不低于60us
  80. }
  81. else
  82. {
  83. DQ=0;
  84. i=10;
  85. while(i--); // 保持低在60us到120us之间
  86. DQ=1;
  87. i++;i++;
  88. }
  89. }
  90. }
  91. /************************* 启动温度转换********************/
  92. void convert(void)
  93. {
  94. reset();// 产生复位脉冲,初始化DS18B20
  95. wait();//等待DS18B20给出应答脉冲
  96. writebyte(0xcc);// skip rom 命令
  97. writebyte(0x44);// convert T 命令
  98. }
  99. /********************* 读取温度值****************************/
  100. uint readtemp(void)
  101. {
  102. float tt;
  103. reset();
  104. wait();
  105. delay(1);
  106. writebyte(0xcc);// skip rom 命令
  107. writebyte(0xbe);// read scratchpad 命令
  108. tplsb=readbyte();// 温度值低位字节(其中低4位为二进制的"小数"部分)
  109. tpmsb=readbyte();// 高位值高位字节(其中高5位为符号位)
  110. temp=tpmsb;
  111. temp<<=8;
  112. temp=temp|tplsb;
  113. tt=temp*0.0625;
  114. temp=tt*10+0.5;
  115. return (temp);
  116. }

  117. unsigned char ChangeDat(unsigned char dat)
  118. {
  119.         unsigned char a;
  120.         a        |=        ((dat&0x01)<<7)|
  121.                         ((dat&0x02)<<5)|
  122.                         ((dat&0x04)<<3)|
  123.                         ((dat&0x08)<<1)|
  124.                         ((dat&0x10)>>1)|
  125.                         ((dat&0x20)>>3)|
  126.                         ((dat&0x40)>>5)|
  127.                         ((dat&0x80)>>7);
  128.         return a;
  129. }

  130. void write1602_com(uint com)
  131. {
  132. uchar com_change;
  133. com_change=ChangeDat(com);
  134. rs=0;
  135. rw=0;
  136. P1=com_change;
  137. delay(5);
  138. en=1;
  139. delay(5);
  140. en=0;
  141. }
  142. void write1602_date(uchar date)
  143. {
  144. uchar dat_change;
  145. dat_change=ChangeDat(date);
  146. rs=1;
  147. rw=0;
  148. P1=dat_change;
  149. delay(5);
  150. en=1;
  151. delay(5);
  152. en=0;
  153. }
  154. void init1602(void) //1602初始化
  155. {
  156. write1602_com(0x38);
  157. delay(50);
  158. write1602_com(0x38);
  159. delay(5);
  160. write1602_com(0x38);
  161. delay(5);
  162. write1602_com(0x38);
  163. write1602_com(0x0c);
  164. write1602_com(0x06);
  165. write1602_com(0x01);
  166. }
  167. void display(uint temp)
  168. {
  169. uchar a1,a2,a3,a4;
  170. a1=temp/100;
  171. a2=temp%100;
  172. a3=a2/10;
  173. a4=a2%10;
  174. write1602_com(0x80+0x09);//第一行第9个位置显示温度的十位、个位和小数点后一位
  175. write1602_date(a1+0x30);
  176. delay(1);
  177. write1602_date(a3+0x30);
  178. delay(1);
  179. write1602_date(a4+0x30);
  180. delay(1);
  181. }
  182. void display1()
  183. {
  184. uchar num;
  185. write1602_com(0x80);  //在第一行开头显示“TEMP IS”
  186. for(num=0;num<7;num++)
  187. {
  188. write1602_date(table[num]);
  189. delay(5);
  190. }
  191. }
  192. void main()
  193. {
  194. uchar x;
  195. init1602();
  196. convert();
  197. delay(1000);// 启动温度转换,需要750ms
  198. readtemp(); // 读取温度
  199. while(1)
  200. {
  201. display1();
  202. convert();
  203. x=readtemp();
  204. display(x);
  205. }
  206. }
复制代码
wsyd641
2楼-- · 2019-07-16 11:41
不好意思,挣E币下载用!
oyl
3楼-- · 2019-07-16 13:07
 精彩回答 2  元偷偷看……
brains
4楼-- · 2019-07-16 15:54
学习了谢谢
liuzhaoxin1020
5楼-- · 2019-07-16 20:02
不错的文件,值得收藏

一周热门 更多>