资讯详情

基于stc89c52单片机的数字温度传感器电路与代码(注释详细)

#include

#include

sbit RS = P2^0; //定义端口

sbit RW = P2^1;

sbit EN = P2^2;

sbit DQ = P2^3; //定义总线I/O管脚

void SendByte(unsigned char dat);

void zf_1602(unsigned char x,unsigned char y,unsigned dat);

void Delay4us() //延时4us

{

;

}

void Delay(unsigned char j)//循环15us

{

unsigned char i;

while(j--)

{

i = 5;

while (--i);

}

}

bit d18b20_qs() //18b20 起始

{

bit dat;

DQ = 1; //DQ复位

Delay4us();

DQ = 0; ///拉低总线

Delay(35); //这里延时大概 525us

DQ = 1; ///拉高总线

Delay(2);///这里延迟 30us

dat = DQ; //读回值(0)b20存在 1:是没有)

Delay(2);

return dat; //返回值

}

void d18b20_x(unsigned char dat) //写 8 位 数 据

{

unsigned char i;

for(i=0;i<8;i ) //8位计数器

{

DQ = 0; ///拉低总线

DQ = dat & 0x01; ///取最低位赋值给总线

Delay(3); //延时45us

DQ = 1; ///拉过总线准备写下数据(或总线复位)

dat >>= 1; //数据右移一位

}

}

unsigned char d18b20_d() //读 8 位 数 据

{

unsigned char i,dat=0;

for(i=0;i<8;i ) //8位计数器

{

DQ = 0; ///拉低总线

dat >>= 1; //数据右移一位

DQ = 1; ///拉过总线(准备读取数据)

if(DQ) //判断是否正确 1 如果是,将数据赋值给变量的高位

dat |= 0x80;

Delay(4);

}

return dat; ///返回读取数据数据

}

unsigned int wd() ///读取温度函数

{

unsigned char i = 0; //低8位数据

unsigned char j = 0; //高8位数据

unsigned int k = 0; ///无符号16整形用于存储和读取 16位温度数据(j和i组合后的数据)

d18b20_qs(); //初始化

d18b20_x(0xCC); ///跳过序列号(因为18b20可以在总线挂很多个,这个序列号和网卡MAC地址类似)

d18b20_x(0x44); //打开温度转换

Delay(200); ///打开温度转换需要时间。在这里延迟

d18b20_qs(); //初始化

d18b20_x(0xCC); ///跳过序列号(因为18b20可以在总线挂很多个,这个序列号和网卡MAC地址类似)

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

i = d18b20_d(); //读低8位

j = d18b20_d(); //读高8位

k = j;

k <<= 8;

k = k i;

return k; ///返回读取的16位数据

}

void zh(unsigned int i)//1602显示缓存写入函数

{

unsigned char x,z;

x = i & 0x0f; //取出小数

i >>=4;

switch(x) ///小数位转换

{

case 0: z=0;break;

case 1: z=1;break;

case 2: z=1;break;

case 3: z=2;break;

case 4: z=3;break;

case 5: z=3;break;

case 6: z=4;break;

case 7: z=4;break;

case 8: z=5;break;

case 9: z=6;break;

case 10: z=6;break;

case 11: z=7;break;

case 12: z=8;break;

case 13: z=8;break;

case 14: z=9;break;

case 15: z=9;break;

}

z = z 48; //转换成ascii码

zf_1602(5,1,z); ///写1602缓存

z = i & 0xff; ///取出整数

x = z/10; //取出十位

x= x 48; //转换成ascii码

zf_1602(2,1,x); ///写1602缓存

x = z; ///取出位置

x= x 48; //转换成ascii码

zf_1602(3,1,x); //写入1602缓存

}

void Delayus(unsigned char t) // us级别延时

{

while(--t);

}

void Delayms(unsigned char t)// ms级别延时

{

while(t--)

{

//大致延迟1mS

Delayus(245);

Delayus(245);

}

}

bit m_1602() ///判断1602是否忙

{

P0 = 0xFF; //准备阅读

RS = 0;

RW = 1;

EN = 0;

_nop_();

EN = 1; //产生高电平

return (bit)(P0 & 0x80);

}

void x_1602(bit i,unsigned char j) //参数一写(0) 1.写数据),参数二是写入的8位数据

{

while(m_1602())

{

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

}

RS = i;

RW = 0;

EN = 1;

P0 = j;

_nop_();

EN = 0; //产生下降边

}

void qp_1602() ///清屏函数

{

x_1602(0,0x01); //第一个参数是:写入类型(0) 1.写数据),第一个参数是:写入的数据

Delayms(5);

}

//显示字符

void zf_1602(unsigned char x,unsigned char y,unsigned dat) //参数一是显示列,参数二是显示线,参数三是显示列据

{

if(y==0)

{

x_1602(0,(0x80+x)); //第一行

}

else

{

x_1602(0,(0xc0+x)); //第二行

}

x_1602(1,dat); //写入数据

}

void zfc_1602(unsigned char x,unsigned char y,unsigned char *dat)

{

if(y==0)

{

x_1602(0,(0x80+x)); //第一行

}

else

{

x_1602(0,(0xc0+x)); //第二行

}

while(*dat) //&:取地址 *:取值

{

x_1602(1,*dat);

dat ++;

}

}

void csh_1602()  //初始化1602

{

x_1602(0,0x38); //显示模式设置

Delayms(5);

x_1602(0,0x38);

Delayms(5);

x_1602(0,0x38);

Delayms(5);

x_1602(0,0x38);

x_1602(0,0x08); //显示关闭.

x_1602(0,0x01); //显示清屏

x_1602(0,0x06); //显示光标移动设置

Delayms(5);

x_1602(0,0x0c);  //显示开及光标设置

}

void Lcd_User_Chr(void) // 1602 自定义字符(摄氏度的小点)    自定义字符

{

x_1602(0,0x48); //"01 001 000"  第1行地址

x_1602(1,0x03); //"XXX 00001" 第1行数据

x_1602(0,0x49); //"01 001 001"  第2行地址

x_1602(1,0x03); //"XXX 11011" 第2行数据

x_1602(0,0x4a); //"01 001 010"  第3行地址

x_1602(1,0x00); //"XXX 11101" 第3行数据

x_1602(0,0x4b); //"01 001 011"  第4行地址

x_1602(1,0x00); //"XXX 11001" 第4行数据

x_1602(0,0x4c); //"01 001 100"  第5行地址

x_1602(1,0x00); //"XXX 11101" 第5行数据

x_1602(0,0x4d); //"01 001 101"  第6行地址

x_1602(1,0x00); //"XXX 11011" 第6行数据

x_1602(0,0x4e); //"01 001 110"  第7行地址

x_1602(1,0x00); //"XXX 00001" 第7行数据

x_1602(0,0x4f); //"01 001 111"  第8行地址

x_1602(1,0x00); //"XXX 00000" 第8行数据

}

void main()

{

unsigned char i;

csh_1602();

qp_1602();

Lcd_User_Chr();

zf_1602(4,1,'.');

zf_1602(6,1,0x01); //摄氏度的点

zf_1602(7,1,'C'); //大写的C

zfc_1602(1,0,"www.51hei.com");

while(1)

{

zh(wd());

for(i=0;i<10;i++)

Delayms(200);

}

}

标签: cdz传感器传感器温度报警电路传感器zh30104传感器qs30

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台