首页 » 技术SOS » 消费电子 » 显示技术 » 如何设计LCD显示数字体温计?

如何设计LCD显示数字体温计?

菜鸟
2007-12-26 14:25:50     悬赏20分
需要电路图和设计方案使用51单片机和DS18B20
分享
关键词: LCD, 51单片机  
菜鸟
2008-01-10 15:30:56
1楼

以下是一个用51单片机和DS18B20测温度的程序 电路图很简单用单片机的P1,P2,P3的任一个管脚连DS18B20的第2脚(数据脚),DS18B20的第2脚连一个4.7K的上拉电阻即可 //DS18B20 电子档: DS18B20-en.pdf //器件出厂默认为12bits 温度数据 R0=R1=1 //转换温度需时为 750mS //LSB 的低半字节为小数部分的温度数据 //MSB 的低半字节及LSB 的高半字节则构成温度的有效数据 //MSB 的高半字节表示当前测得的温度的正与负 //数据的读写都是先进行低位[LSB] //所以,串行口发送或接收数据时,都是作右移处理成bit //温度转换配置 R0=R1=1为12bit,R0=R1=0为9bit //电子商务网 http://sky9218.nease.net //显示上有闪动!!! 后期程序已经改善此问题 //编译此程序,请直接加载到老K中 #include #include #define uchar unsigned char #define uint unsigned int uchar tp_dis1,tp_dis2,tp_dis3,tp_dis4;//定义显示缓冲变量 // 5 uchar code dis[13]={0X3f,0X03,0X6d,0X67,0X53,0X76,0X7e,0X23,0X7f,0X73,0x40,0x5b,0x1c}; // --- //4-| |-0 //LED段码 0 1 2 3 4 5 6 7 8 9 -(10) H L // -6- 脚位图 //注意:LED数码管段码生成软件的字段跟常规数码管的字段位置不同!!! //3-| |-1 // --- .-7 sbit P3_7=P3^7; // 2 sbit P3_6=P3^6; sbit P3_5=P3^5; sbit P3_4=P3^4; sbit P3_3=P3^3; sbit P3_2=P3^2; sbit P3_1=P3^1; sbit P3_0=P3^0; sbit P1_7=P1^7; sbit P1_6=P1^6; sbit P1_5=P1^5; sbit P1_4=P1^4; sbit P1_3=P1^3; sbit P1_2=P1^2; sbit P1_1=P1^1; sbit P1_0=P1^0; sbit ser_595=P3^0; sbit sck_595=P3^1; sbit rck_595=P3^2; uchar ser_dat; //595数据变量 uchar ser_dig; //595数码位变量 uchar flag595; //595位标志变量 ////////////////////////////////////////////////////////////////////// // 74HC595 显示驱动 // ////////////////////////////////////////////////////////////////////// void sle_dis(void) //取显示位数据及位字符码 { if (flag595==4) //取第一位 { ser_dat=0x80|(dis[tp_dis1]); ser_dig=0x01; } else if (flag595==3) //取第二位 { ser_dat=dis[tp_dis2]; //ser_dat=0x80|(dis[tp_dis2]); //时钟显示用 ser_dig=0x02; } else if (flag595==2) //取第三位 { ser_dat=dis[tp_dis3]; //ser_dat=0x80|(dis[tp_dis3]); //时钟显示用 ser_dig=0x04; } else if (flag595==1) //取第四位 { ser_dat=dis[tp_dis4]; ser_dig=0x08; } } ////////////////////////////////////////////////////////////////////// // 延时 // ////////////////////////////////////////////////////////////////////// void delay (uint us) //一进一出[不计uS值]产生延时为16uS[12MHz crystal] { while (us--); //执行一次占用 9uS [12MHz crystal] } ////////////////////////////////////////////////////////////////////// // 74HC595 显示驱动 // ////////////////////////////////////////////////////////////////////// void dis_pro (uchar a) //595数据输出 正常[写位] 曲线 2005-9-1 { uchar i; bit read; for (i=8;i0;--i) //写8位 { read= a&0x80; //提取最高位 a0;--i) //四位显示 { sle_dis(); //位选择 dis_pro(ser_dig); //先送位码 dis_pro(ser_dat); //后送段码 rck_595 = 1; //锁存一位 --flag595; rck_595 = 0; delay(250); //数码管位显示延时2.266mS,改善亮度 } } ////////////////////////////////////////////////////////////////////// // DS18B20 初始化 // ////////////////////////////////////////////////////////////////////// sbit dq=P3^7; //1820连接的IO口 正常检测 曲线 2005-9-1 bit ds18b20_ok,fg_18B20; //1820存在标志 void init_18b20 (void) //初始化 本函数已可以检测到18B20-050901 { dq=1; dq=0; //拉低总线 delay(53); //延时 ***0.000404S _nop_(); //***0.000897uS _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); dq=1; //***0.000904S 释放总线前,拉低总线500uS delay(9); //延时100uS ***0.000905uS _nop_(); //***0.001002uS _nop_(); _nop_(); if(dq==0) //1820存在否 ***0.001005uS 释放总线后产生100uS延时 { ds18b20_ok=1; //检测到1820 if (fg_18B20==1) //DS18B20上电检测标志[显示0;--i) //***0.768687S { dq=0; //读时周期开始 ***0.768688S ***读第二位0.769651S a=1; //***1==0.768689S for (j=1;j0;--j) //***0.7686961S {_nop_();} //每执行一次产生3uS延时[12MHz crystal] dq=1; //***0.768700S if (dq==1) //***1==0.768701S 由拉低总线到读总线产生13uS延时 {a |= 0x8000;} //***0.768703S for (j=16;j0;--j) //***0.768705S {_nop_();} dq=1; } //***1==0.768754S 读完一次需时66uS //***读完第二位0.769717S return (a); //***0.770671S 读完16位数据需时0.001089S } ////////////////////////////////////////////////////////////////////// // DS18B20 写数据 // ////////////////////////////////////////////////////////////////////// void write (uchar wrt) { uchar i,d; for (i=8;i0;--i) //***0.001239S { dq=0; //***0.001248S _nop_(); //***0.001249S dq=wrt & 0x0001; //赋延时初值 ***0.001251S wrt=1; //***0.001252S d=50; //***0.001250S while (--d); //***1==0.001251S 2==0.001253S 执行一次占用 2uS dq=1; //***0.001351S 由do到这行产生60uS延时 } //***0.001394S 产生61uS延时 } //***0.001864S ////////////////////////////////////////////////////////////////////// // 小于1度的小数位显示转换 // ////////////////////////////////////////////////////////////////////// uchar td; void tp_decimal (void) //正常转换 曲线 2005-9-3 { if (td=8) {tp_dis1=5;} //当小数温度值大于或等于0.5时,小数位显示5 } ////////////////////////////////////////////////////////////////////// // 温度数据提取及显示转换 // // 经测试能正常分离温度数据 // // 对读温度缓冲单直接赋值检验结果[tp_tem=0xfe66;] // ////////////////////////////////////////////////////////////////////// uchar ti,t; uint ta; bit tp_fg; void get_tp (uint us) //正常 曲线 2005-9-3 { tp_fg=us & 0xf800; //***0.770620S 提取温度标志 if (tp_fg==0) //***0.770625S 测得温度为0度以上[转换] { ta=us & 0x07ff; //提取温度数据 ti=ta4; //提取整数温度值 td=ta & 0x000f; //提取小数温度值 } else if (tp_fg==1) //测得温度为0度以下[转换] { ta=~us; ta=ta+1; ta=ta & 0x07ff; //提取温度数据 ti=ta4; //提取整数温度值 td=ta & 0x000f; //提取小数温度值 } tp_dis1=td; tp_decimal(); //调用小数位温度转换 tp_dis2=ti%10; //转换个位 t=ti/10; tp_dis3=t%10; //转换十位 if (tp_fg==0) { tp_dis4=ti/100; //转换百位,正温度 } else if (tp_fg==1) { tp_dis4=10; //转换百位,负温度[显示负号] } } ////////////////////////////////////////////////////////////////////// // 测温度 // ////////////////////////////////////////////////////////////////////// uint tp_tem; uchar tp_dec,tp_int; //小数位温度值,整数位温度值 void tp_test(void) //正常 曲线 2005-9-3 { uchar i,j; EA=0; init_18b20(); //***0.000406S if (ds18b20_ok==0) {init_18b20();} write(0xcc); //跳过ROM ***0.001236S write(0x44); //转换温度 ***0.001866S for (i=25;i0;--i) //***1==0.002496S; 2==0.772791S; 3==1.543086S { for (j=3;j0;--j) //***0.002497S {display();} //***0.002498S //调用一次显示程序占时 2.543 mS } //***0.033059S init_18b20(); //***1==0.766597S; 2==1.536892S; 3==2.307187S //转换温延时764.1mS [连续点亮] if (ds18b20_ok==0) {init_18b20();} write(0xcc); //***0.767425S write(0xbe); //读暂存器 ***0.768055S tp_tem=read_word(); //读16bit温度 ***0.768685S init_18b20(); //***0.769786S if (ds18b20_ok==0) {init_18b20();} get_tp(tp_tem); //调用温度分离函数 ***0.770614S } ////////////////////////////////////////////////////////////////////// // DS18B20测温 // ////////////////////////////////////////////////////////////////////// void main(void) { tp_dec=0; //小数温度值清0 tp_int=0; //整数温度值清0 tp_dis1=10; //清零 tp_dis2=10; //清零 tp_dis3=10; //清零 tp_dis4=10; //清零 P3=0xf8; //1111 1000 fg_18B20=1; //DS18B20上电检测标志[显示

高工
2008-03-20 09:40:07
2楼

1.温度传感器。这个是关键部件。 2.放大电路 3.数模转换器A/D 4.数字显示部分:通常是LCD显示屏组件 5.电源部分

菜鸟
2010-07-17 13:57:11
3楼

⒈ 基本要求: (www.krchc.com) ⑴ 系统前端部分归一化输出,即0 ~+50 ℃线性对应0 ~ 5 V; ⑵ 系统前端部分应具有输出保护电路,使其输出电压不超过5V; ⑶ 系统每秒采集一次温度,经滤波、计算等处理后实时显示温度值,测量精度为±0.1℃; ⑷ 系统每分钟用语音报告一次所测温度当前值; ⑸ 系统可在0~50℃的范围内任意设预警温度值(默认值设定为37.0℃),当所测温度超过预警温度值时,系统立即报警,预警值的设定应可随时更改。 调试方法——以水温代替人的体温,用一根水银温度计与所制作的体温计探头(捆绑)同时接触被测热水的同一点。被测热水存放于一只容器中,另备一只热水壶与一只冰水壶(保温壶内放适量冰块),以便用添加热水或添加冷水的方法随时改变被测水温。 (http://www.jy417.cn/index.asp)

高工
2022-10-13 21:03:49
4楼

温度传感器

高工
2022-10-13 23:14:17
5楼

温度传感器,信号放大器,显示器