DS18B20用LCD1602显示Proteus仿真

2025-08-22

/****************************** DIY-18B20-LCD1602

******************************/ #include __CONFIG(0xFF32);

//芯片配置字,看门狗关,上电延时开,掉电检测关,低压编程关,加密,4M晶体HS振荡

#define uchar unsigned char //给unsigned char起别名 uchar #define uint unsigned int

#define DQ RA4 //定义18B20数据端口

#define DQ_DIR TRISA4 //定义18B20D口方向寄存器 #define DQ_HIGH() DQ_DIR =1 //设置数据口为输入 #define DQ_LOW() DQ = 0; DQ_DIR = 0 //设置数据口为输出

unsigned char temp1 = 0 ; //采集到的温度高8位 unsigned char temp2 = 0; //采集到的温度低8位 unsigned char D[]={%unsigned char T[10];

/*********************函数延时部分********************************/ void delayms(uint ms) {

uchar i; while(ms--) {

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

} }

/*延时时间为:(10个固定周期2.5US)+(次数*【1.5US(5+1个周期)】=总延时时间) 即就是(10+6N)*T=time */

void delay(unsigned char t) //跳入这个循环需要3个指令周期

{ //跳出这个循环需要3个指令周期

while(t>0) //while第一次判断语句要消耗3个指令周期,之后需要5个

t--; //t=t-1,消耗1个指令周期

} //也就是说t=0时需要10个指令周期

void delay10us(void) //4Mhz下一个指令周期NOP为1Us {

NOP();NOP();NOP();NOP();NOP();NOP(); }

void delay40us(void) //延时42us {

delay10us();delay10us();delay10us();delay10us(); }

/*******************18B20部分********************************/

void reset(void) { char presence = 1; DQ_HIGH(); NOP();NOP(); while (presence) { DQ_LOW() ; //主机拉至低电平 delay(100); //延时610us DQ_HIGH(); //释放总线等电阻拉高总线,并保持15~60us delay40us(); //延时42us if (DQ == 1) presence = 1; //没有接收到应答信号,继续复位 else presence = 0; //接收到应答信号 delay(100); //延时610us } }

void write_byte(uchar data) { uchar i; uchar temp; DQ_HIGH(); NOP();NOP();

for (i = 8;i > 0;i--) { temp = data & 0x01; //最低位移出 DQ_LOW();

NOP();NOP();NOP();NOP();NOP(); //从高拉至低电平,产生写时间隙5us if (temp == 1)

DQ_HIGH(); //如果写1,拉高电平 delay40us(); //延时42us DQ_HIGH(); NOP();NOP(); data = data >> 1; } }

uchar read_byte(void) { uchar i; uchar data = 0; uchar j; for (i = 8;i > 0;i--) { data >>= 1; DQ_HIGH(); NOP();NOP(); DQ_LOW(); NOP();NOP();NOP();NOP();NOP();NOP(); DQ_HIGH(); NOP();NOP();NOP();NOP();NOP(); j = DQ; if (j)

data=data |0x80;

delay(10); } return (data); }

void get_temp(void) {

float temp,m=0,n=0; unsigned char x; // m=0;

// unsigned long temper1; unsigned char temper; unsigned char lsb,msb;

//右移一位 //读出温度 //6us //拉至高电平 //4us //延时70us reset();

write_byte(0xCC); write_byte(0x44); delayms(100); reset();

write_byte(0xCC); write_byte(0xBE); temp1=read_byte(); temp2=read_byte();

lsb=temp1&0x0f; //temp1的低4位为小数部分 msb=(temp1>>4)|(temp2<<4);//temp1的高4位和temp2拼成整数部分 T[0]=msb/10+0x30; T[1]=msb+0x30; T[2]='.';

// temp=(temp2*256+temp1)*0.0625*10000; // temper=(unsigned char)temp; // T[0]=temper/100000+0x30;;

// T[1]=temper0000/10000+0x30; // T[2]='.';

// T[3]=temper000/1000+0x30; // T[4]=temper00/100+0x30; // T[5]=temper0/10+0x30; // T[6]=temper+0x30; if(lsb&0x08) m=m+0.5; if(lsb&0x04) m=m+0.25; if(lsb&0x02) m=m+0.125; if(lsb&0x01) m=m+0.0625; n=m*10000;

x=(unsigned char)n; T[3]=x/1000+0x30;

T[4]=x00/100+0x30; T[5]=x0/10+0x30; T[6]=x+0x30; T[7]=0xdf; T[8]=0x43; T[9]='\\0'; }

/******************************LCD1602部分**********************************/ #define rs RC0 #define rw RC1 #define ep RC2 #define LCD PORTD

void Busy_Check(void) //测试忙碌状态

{

uchar LCD_Status; rs=0; rw=1; ep=1; NOP(); NOP(); NOP(); NOP(); while(1) {

LCD_Status=PORTD; LCD_Status&=0x80; if(LCD_Status==0); break; } ep=0; }

void lcd_wcmd(uchar cmd) //写入指令数据到lcd {

Busy_Check(); TRISD=0x00; rs=0; rw=0; ep=0; NOP(); NOP(); LCD=cmd; NOP(); NOP(); NOP(); NOP(); ep=1; NOP(); NOP(); NOP(); NOP(); ep=0; }

void lcd_wdat(uchar dat) //写入字符显示数据到lcd {

Busy_Check(); TRISD=0x00; rs=1;


DS18B20用LCD1602显示Proteus仿真.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:油包水型冷霜设计配方

相关阅读
本类排行
× 游客快捷下载通道(下载后可以自由复制和排版)

下载本文档需要支付 7

支付方式:

开通VIP包月会员 特价:29元/月

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:xuecool-com QQ:370150219