数字温度计C程序
基于单片机的数字温度计设计_课程设计(仿真+C程序))

基于单片机的数字温度计设计_课程设计(仿真+C程序))前言科技发展到今天,人们的生活中涌现出各种各样的科技产品,各种各样的电子产品更是花样百出、遍及人们生活中的每一部分,现在人们更是感觉到了科技给人们带来的巨大发展,科学技术作为第一生产力在人类社会的发展中起了很大的推动作用,人类从原始向先进的发展都伴随着科学的发展。
当今微型计算机技术发展形成两大分支,一是以微处理器(Micro Processor Unit)为核心所构成的通用微机系统,主要用于科学计算、数据处理、图形图像处理、数据库管理、人工智能、数字模拟与仿真等领域。
另一分支是为控制器( Micro Controller Unit),俗称单片机。
单片机主要用于工业测控,如家用电器、计算机外围设备、工业智能化仪表、机器人、生产过程的自动控制、农业、化工、军事、航空航天等领域。
单片机是一种集成在电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计时器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的计算机系统。
单片机也被称为微控制器(Microcontroller Unit),常用英文字母的缩写MCU 表示单片机,它最早是被用在工业控制领域。
单片机由芯片内仅有CPU的专用处理器发展而来。
最早的设计理念是通过将大量外围设备和CPU集成在一个芯片中,使计算机系统更小,更容易集成进复杂的而对体积要求严格的控制设备当中。
INTEL的Z80是最早按照这种思想设计出的处理器,从此以后,单片机和专用处理器的发展便分道扬镳。
随着时代的进步和发展,单片机技术已经普及到我们生活、工作、科研、各个领域,已经成为一种比较成熟的技术。
摘要:单片机具有体积小、功耗低、控制功能强、扩展灵活、微型化和使用方便等优点,广泛应用于仪器仪表中,结合不同类型的传感器,可实现诸如电压、功率、频率、湿度、温度、流量、速度、厚度、角度、长度、硬度、元素、压力等物理量的测量。
基于51单片机的18B20温度计C程序

本程序为本人用单片机80c51与18b20做实验时写的,其中有些是汉语拼音,便于咱们中国同胞们理解.仅供参考#include <reg52.h>#define uint unsigned int#define uchar unsigned charuchar tab[]="0123456789WD:C";sbit ds=P2^6;sbit rs=P3^4;sbit rw=P3^5;sbit en=P3^6;uchar s,g,shu;/***延时2tus***/yanshi(uchar t){while(--t){;}}/***延时tms** */delay(uint t){uchar a,b;for(a=t;a>0;a--)for(b=110;b>0;b--);}/***18B20初始化***/chushi(){ds=0;yanshi(250); //延时500usds=1;yanshi(2);}/***等待应答***/yingda(){while(ds);while(~ds);yanshi(2);}/***写一个字节***/w_dat(uchar dat){uchar i;for(i=0;i<8;i++){dat=dat>>1;ds=0;yanshi(8);ds=CY;yanshi(30);ds=1;}}/***读一个字节***/ uchar du_dat(){uchar i,dat;for(i=0;i<8;i++){ dat=dat>>1;ds=0;yanshi(1);ds=1;if(ds==1){dat=dat|0x80;}yanshi(30);}return dat;}/***启动温度转换***/ zhuanhuan(){chushi();yingda();delay(1);w_dat(0xcc);w_dat(0x44);}/***读取温度***/uchar du_wendu(){uchar a,b,dat;chushi();yingda();delay(1);w_dat(0xcc);w_dat(0xbe);a=du_dat(); //低位字节;b=du_dat(); //高位字节;dat=(b<<4)|(a>>4);return dat;}////////////////////////////// 1602液晶/////////////////////////////w_ml(uchar com){rs=0;P0=com;delay(5);en=1;delay(5);en=0;}chushihua(){rw=0;en=0;w_ml(0x38);w_ml(0x0c);w_ml(0x06);w_ml(0x01); }w_1602(uchar date){rs=1;P0=date;delay(5);en=1;delay(5);en=0;}xianshi(){w_ml(0x80);w_1602(tab[10]);w_1602(tab[11]);w_1602(tab[12]);w_1602(tab[s]);w_1602(tab[g]);w_1602(tab[13]);}/***************//** 主函数**//**************/main(){chushihua();while(1){delay(1);zhuanhuan();delay(10);shu=du_wendu();s=shu/10;g=shu%10;xianshi();}}。
温度测量、报警系统 C程序

程序名称:DS18B20温度测量、报警系统简要说明:DS18B20温度计,温度测量范围0~99.9摄氏度可设置上限报警温度、下限报警温度即高于上限值或者低于下限值时蜂鸣器报警默认上限报警温度为38℃、默认下限报警温度为5℃报警值可设置范围:最低上限报警值等于当前下限报警值最高下限报警值等于当前上限报警值将下限报警值调为0时为关闭下限报警功能编写:最后更新:09/04/16晚于寝室******************************************************************/ #include <AT89X52.h>#include "DS18B20.h"#define uint unsigned int#define uchar unsigned char //宏定义#define SET P3_1 //定义调整键#define DEC P3_2 //定义减少键#define ADD P3_3 //定义增加键#define BEEP P3_7 //定义蜂鸣器bit shanshuo_st; //闪烁间隔标志bit beep_st; //蜂鸣器间隔标志sbit DIAN = P2^7; //小数点uchar x=0; //计数器signed char m; //温度值全局变量uchar n; //温度值全局变量uchar set_st=0; //状态标志signed char shangxian=38; //上限报警温度,默认值为38signed char xiaxian=5; //下限报警温度,默认值为38ucharcode LEDData[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x ff};/*****延时子程序*****/void Delay(uint num){while( --num );}/*****初始化定时器0*****/void InitTimer(void){TMOD=0x1;TH0=0x3c;TL0=0xb0; //50ms(晶振12M)}/*****定时器0中断服务程序*****/void timer0(void) interrupt 1{TH0=0x3c;TL0=0xb0;x++;}/*****外部中断0服务程序*****/void int0(void) interrupt 0{EX0=0; //关外部中断0if(DEC==0&&set_st==1){shangxian--;if(shangxian<xiaxian)shangxian=xiaxian; }else if(DEC==0&&set_st==2){xiaxian--;if(xiaxian<0)xiaxian=0;}}/*****外部中断1服务程序*****/void int1(void) interrupt 2{EX1=0; //关外部中断1if(ADD==0&&set_st==1){shangxian++;if(shangxian>99)shangxian=99;}else if(ADD==0&&set_st==2){xiaxian++;if(xiaxian>shangxian)xiaxian=shangxian; }}/*****读取温度*****/void check_wendu(void){uint a,b,c;c=ReadTemperature()-5; //获取温度值并减去DS18B20的温漂误差 a=c/100; //计算得到十位数字b=c/10-a*10; //计算得到个位数字m=c/10; //计算得到整数位n=c-a*100-b*10; //计算得到小数位if(m<0){m=0;n=0;} //设置温度显示上限if(m>99){m=99;n=9;} //设置温度显示上限}/*****显示开机初始化等待画面*****/Disp_init(){P2 = 0xbf; //显示-P1 = 0xf7;Delay(200);P1 = 0xfb;Delay(200);P1 = 0xfd;Delay(200);P1 = 0xfe;Delay(200);P1 = 0xff; //关闭显示}/*****显示温度子程序*****/Disp_Temperature() //显示温度{P2 =0xc6; //显示CP1 = 0xf7;Delay(300);P2 =LEDData[n]; //显示个位P1 = 0xfb;Delay(300);P2 =LEDData[m%10]; //显示十位DIAN = 0; //显示小数点P1 = 0xfd;Delay(300);P2 =LEDData[m/10]; //显示百位P1 = 0xfe;Delay(300);P1 = 0xff; //关闭显示}/*****显示报警温度子程序*****/Disp_alarm(uchar baojing){P2 =0xc6; //显示CP1 = 0xf7;Delay(200);P2 =LEDData[baojing%10]; //显示十位P1 = 0xfb;Delay(200);P2 =LEDData[baojing/10]; //显示百位P1 = 0xfd;Delay(200);if(set_st==1)P2 =0x89;else if(set_st==2)P2 =0xc7; //上限H、下限L标示P1 = 0xfe;Delay(200);P1 = 0xff; //关闭显示}/*****报警子程序*****/void Alarm(){if(x>=10){beep_st=~beep_st;x=0;}if((m>=shangxian&&beep_st==1)||(m<xiaxian&&beep_st==1))BEEP=0; else BEEP=1;}/*****主函数*****/void main(void){uint z;InitTimer(); //初始化定时器EA=1; //全局中断开关TR0=1;ET0=1; //开启定时器0IT0=1;IT1=1;check_wendu();check_wendu();for(z=0;z<300;z++){Disp_init();}while(1){if(SET==0){Delay(2000);do{}while(SET==0);set_st++;x=0;shanshuo_st=1;if(set_st>2)set_st=0;}if(set_st==0){EX0=0; //关闭外部中断0EX1=0; //关闭外部中断1check_wendu();Disp_Temperature();Alarm(); //报警检测}else if(set_st==1){BEEP=1; //关闭蜂鸣器EX0=1; //开启外部中断0EX1=1; //开启外部中断1if(x>=10){shanshuo_st=~shanshuo_st;x=0;} if(shanshuo_st) {Disp_alarm(shangxian);} }else if(set_st==2){BEEP=1; //关闭蜂鸣器EX0=1; //开启外部中断0EX1=1; //开启外部中断1if(x>=10){shanshuo_st=~shanshuo_st;x=0;} if(shanshuo_st) {Disp_alarm(xiaxian);} }}}/*****END*****/DS18B20.h:#include <AT89X52.h>#define DQ P3_6 //定义DS18B20总线I/O/*****延时子程序*****/void Delay_DS18B20(int num){while(num--) ;}/*****初始化DS18B20*****/void Init_DS18B20(void){unsigned char x=0;DQ = 1; //DQ复位Delay_DS18B20(8); //稍做延时DQ = 0; //单片机将DQ拉低Delay_DS18B20(80); //精确延时,大于480usDQ = 1; //拉高总线Delay_DS18B20(14);x = DQ; //稍做延时后,如果x=0则初始化成功,x=1则初始化失败Delay_DS18B20(20);}/*****读一个字节*****/unsigned char ReadOneChar(void){unsigned char i=0;unsigned char dat = 0;for (i=8;i>0;i--){DQ = 0; // 给脉冲信号dat>>=1;DQ = 1; // 给脉冲信号if(DQ)dat|=0x80;Delay_DS18B20(4);}return(dat);}/*****写一个字节*****/void WriteOneChar(unsigned char dat){unsigned char i=0;for (i=8; i>0; i--){DQ = 0;DQ = dat&0x01;Delay_DS18B20(5);DQ = 1;dat>>=1;}}/*****读取温度*****/unsigned int ReadTemperature(void){unsigned char a=0;unsigned char b=0;unsigned int t=0;float tt=0;Init_DS18B20();WriteOneChar(0xCC); //跳过读序号列号的操作 WriteOneChar(0x44); //启动温度转换Init_DS18B20();WriteOneChar(0xCC); //跳过读序号列号的操作 WriteOneChar(0xBE); //读取温度寄存器a=ReadOneChar(); //读低8位b=ReadOneChar(); //读高8位t=b;t<<=8;t=t|a;tt=t*0.0625;t= tt*10+0.5; //放大10倍输出并四舍五入 return(t);}/*****END*****/。
C51DS18B20数字温度计C语言

C51--DS18B20数字温度计--C语言#include;#include;#define uint unsigned int#define uchar unsigned charsbit DQ=P2^6;sbit lcdrs=P1^0;sbit lcdrw=P1^1;sbit lcden=P1^2;void disp(uint a);void init(void);void delay(uint i);uchar ds18b20_init(void);void write_byte(uchar byte);uchar read_byte(void);uint read_ds18b20(void);void delay50us(void);void delayms(uint a);void lcd1602_wr_com(uchar com);void lcd1602_wr_data(uchar dat);void lcd_init(void);uchar code str[]="temperature"; void main(void){init();while(1){disp(read_ds18b20());delayms(50);}}void init(void)uchar i;lcd_init();lcd1602_wr_com(0x80+0x02); //显示的地址for(i=0;i;>;=1; //右移一位DQ=1;}delay(4);}uchar read_byte(void){uchar i,temp;for(i=0;i;>;=1; //右移一位DQ=1; //主机释放信号线_nop_();if(DQ)temp|=0x80; //将读出数据放在最高位,如果是0,信号线会设备继续拉低,1则为高delay(4);}return temp; //返回读出的一字节数据}uint read_ds18b20(void)uchar numh,numl;uint value;if(ds18b20_init()==0) //判断设置是否正常,0为正常{write_byte(0xcc); //跳过ROM序列号读取write_byte(0x44); //启动温度转换if(ds18b20_init()==0) //再次初始化{write_byte(0xcc);//跳过ROM序列号读取write_byte(0xbe);//读温度寄存器numl=read_byte();//读低位数据numh=read_byte();//读高位数据value=numh;value=value;0;i--)for(j=122;j>;0;j--);}void lcd1602_wr_com(uchar com){lcdrs=0;P0=com;delayms(2);lcden=1;delay50us();lcden=0;}void lcd1602_wr_data(uchar dat){lcdrs=1;P0=dat;delayms(2);lcden=1;delay50us();lcden=0;}void lcd_init(void){lcden=0;lcdrw=0;lcd1602_wr_com(0x38); //显示模式设置lcd1602_wr_com(0x0c); //开显示,不显示光标lcd1602_wr_com(0x06); //写字符后地址指针加1,整屏显示不移动lcd1602_wr_com(0x01); //清屏}。
C51单片机数字温度计汇编程序及说明书

1绪论1.1选题背景随着人们生活水平的不断提高,单片机控制无疑是人们追求的目标之一,它所给人带来的方便也是不可否定的,其中数字温度计就是一个典型的例子,但人们对它的要求越来越高,要为现代人工作、科研、生活提供更好的更方便的设施就需要从单片机技术入手,一切向着数字化控制,智能化控制方向发展。
温度测量在物理实验、医疗卫生、食品生产等领域,尤其在热学试验(如:物体的比热容、汽化热、热功当量、压强温度系数等教学实验)中,有特别重要的意义。
现在所使用的温度计通常都是精度为1℃和0.1℃的水银、煤油或酒精温度计。
这些温度计的刻度间隔通常都很密,不容易准确分辨,读数困难,而且他们的热容量还比较大,达到热平衡所需的时间较长,因此很难读准,并且使用非常不方便。
本设计所介绍的数字温度计与传统的温度计相比,具有读数方便,测温范围广,测温准确等优点,其输出温度采用数字显示,主要用于对测温比较准确的场所,或科研实验室使用。
因此本课题就尝试通过编程与芯片的结合来解决传统数字温度计的弊端,设计出新型数字温度计。
1.2课题现状分析及研究意义温度传感器的发展现状:温度传感器使用范围广,数量多,居各种传感器之首,其发展大致经历了以下3个阶段:①传统的分立式温度传感器(含敏感元件)——热电偶传感器,主要是能够进行非电量和电量之间转换。
②模拟集成温度传感器/控制器。
集成传感器是采用硅半导体集成工艺制成的,因此亦称硅传感器或单片集成温度传感器。
③智能温度传感器。
它是微电子技术、计算机技术和自动测试技术(ATE_)的结晶。
智能温度传感器内部包含温度传感器、A/D传感器、信号处理器、存储器(或寄存器)和接口电路。
本课题的研究可以应用领域生产、生活等很多领域。
对于家用电器从洗衣机、微波炉到音响等等到处都可以用到温度控制器来方便大家的日常生活。
开发此产品后也可方便应用安装在小至家庭大到工厂车间,小至一个芯片大到一个机械设备。
例如在家庭客厅卧室等必要地方显示室温,可防止家里食物是否变质及早采取措施。
转基于DS18B20数字温度计C语言程序设计

看了好多天单片机,找了好多资料想自己利用实验板上的DS18B20做个温度计(最近温度实在是太热了)。
在网上找了好多关于这个的程序,结果发现对我的板子来说就这个好用,温度三十度不算高,因为我把它放到风扇下面了,现在和大家分享一下吧,不过里面我自己也改了一点点。
希望高手不要见笑,红色的部分是我改的或者是后加上的。
如果还有什么更好的建议或意见请记得给我留言哦……#include <reg52.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intsbit PS2=P2^6; //数码管十位,位选sbit PS1=P2^7; //数码管个位,段选sbit P_L=P1^0; //测量指示sbit DQ=P2^2; //DS18B20数据接口void delay(uint); //延时函数void DS18B20_init(void); //DS18B20初始化void get_temper(void); //读取温度程序void DS18B20_write(uchar in_data); //DS18B20写数据函数uchar DS18B20_read(void); ////读取数据程序uchar htd(uchar a); //进制转换函数void display(void); //显示函数uchar temp; //温度寄存器bit DS18B20; // 18B20存在标志,1---存在0---不存在uchar tab[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //字段转换表void main(void){uint a;while(1){get_temper(); //测量温度for(a=0;a<200;a++) ;//显示,兼有延时的作用display();}}/****************************DS18B20读取温度函数**************************//*函数原型:void get_temper(void)/*函数功能:DS18B20读取温度/*输入参数:无/*输出参数:无/*调用模块:/*建立时间:2005/11/14/*作者:站长/**********************************************************************/void get_temper(void){uchar k,T_sign,T_L,T_H;DS18B20_init(); //DS18B20初始化if(DS18B20) //判断DS1820是否存在?若DS18B20不存在则返回{DS18B20_write(0xcc); // 跳过ROM匹配DS18B20_write(0x44); //发出温度转换命令DS18B20_init(); //DS18B20初始化if(DS18B20) //判断DS1820是否存在?若DS18B20不存在则返回{DS18B20_write(0xcc); //跳过ROM匹配DS18B20_write(0xbe); //发出读温度命令T_L=DS18B20_read(); //数据读出T_H=DS18B20_read();k=T_H&0xf8;if(k==0xf8)T_sign=1; //温度是负数elseT_sign=0; //温度是正数T_H=T_H&0x07;temp=(T_H*256+T_L)*0.0625; //温度转换常数}}}/****************************DS18B20写数据函数**************************//*函数原型:void DS18B20_write(uchar in_data)/*函数功能:DS18B20写数据/*输入参数:要发送写入的数据/*输出参数:无/*调用模块:_cror_()/*建立时间:2005/11/14/*作者:站长/**********************************************************************/void DS18B20_write(uchar in_data) //写DS18B20的子程序(有具体的时序要求){uchar i,out_data,k;out_data=in_data;for(i=1;i<9;i++) //串行发送数据{DQ=0;DQ=1;_nop_();_nop_();k=out_data&0x01;if(k==0x01) //判断数据写1{DQ=1;}else //写0{DQ=0;}delay(4); //延时62usDQ=1;out_data=_cror_(out_data,1); //循环右移1位}}/**************************DS18B20读函数**************************/ /*函数原型:void DS18B20_read()/*函数功能:DS18B20读数据/*输入参数:无/*输出参数:读到的一字节内容/*调用模块:delay()/*建立时间:2005/11/14/*作者:站长/******************************************************************/uchar DS18B20_read(){uchar i,in_data,k;in_data=0;for(i=1;i<9;i++) //串行发送数据{DQ=0;DQ=1;_nop_();_nop_();k=DQ; //读DQ端if(k==1) //读到的数据是1{in_data=in_data|0x01;}else{in_data=in_data|0x00;}delay(3); //延时51usDQ=1;in_data=_cror_(in_data,1); //循环左移1位}return(in_data);}/**************************DS18B20初始化函数**************************/ /*函数原型:void DS18B20_init(void)/*函数功能:DS18B20初始化/*输入参数:无/*输出参数:无/*调用模块:delay()/*建立时间:2005/11/14/*作者:站长/******************************************************************/void DS18B20_init(void){uchar a;DQ=1; //主机发出复位低脉冲DQ=0;delay(44); //延时540USDQ=1;for(a=0;a<0x36&&DQ==1;a++){ //等待DS18B20回应a++;a--;}if(DQ)DS18B20=0; //18B20不存在else{DS18B20=1; // 18B20存在delay(120); //复位成功!延时240US}}/**************************数码管显示函数**************************//*函数原型:void display(void)/*函数功能:数码管显示/*输入参数:无/*输出参数:无/*调用模块:delay()/*建立时间:2005/11/14/*作者:站长/******************************************************************/void display(void){PS1=1;P0=0x01;PS1=0;PS2=1;P0=tab[htd(temp)>>4]; //转换成十进制输出PS2=0;delay(200);PS1=1;P0=0x02;PS1=0;PS2=1;P0=tab[htd(temp)&0x0f]; //转换成十进制输出PS2=0;delay(200);P_L=~DS18B20;}/*********************原显示函数***********************************void display(void){P0=tab[htd(temp)>>4]; //转换成十进制输出PS2=1;PS1=0;delay(200);P0=tab[htd(temp)&0x0f]; //转换成十进制输出PS1=1;PS2=0;delay(200);P_L=~DS18B20;}*******************************************************//**************************十六进制转十进制函数**************************//*函数原型:uchar htd(uchar a)/*函数功能:十六进制转十进制/*输入参数:要转换的数据/*输出参数:转换后的数据/*调用模块:无/*建立时间:2005/11/14/*作者:站长/******************************************************************/uchar htd(uchar a){uchar b,c;b=a%10;c=b;a=a/10;b=a%10;c=c|b<<4;return c;}/*******************************延时函数*********************************/ /*函数原型:delay(unsigned int delay_time)/*函数功能:延时函数/*输入参数:delay_time (输入要延时的时间)/*输出参数:无/*调用模块:无/*建立时间:2005/10/21/*作者:站长/**********************************************************************/ void delay(unsigned int delay_time) //延时子程序{for(;delay_time>0;delay_time--){}}。
基于单片机的数字温度计c程序(Microcontroller based digital thermometer C program)

基于单片机的数字温度计c程序(Microcontroller based digitalthermometer C program)#包括<< reg52。
”#包括<<信息。
”#定义unsigned char函数# unsigned int定义单元#定义delaynop() { _nop_();_nop_();_nop_();_nop_();}公司^ DQ=P2 2;普通双= P2 ^ 6;/ /定义锁存器锁存端普通焊接= P2 ^ 7;普通RS = P3 ^ 5;/ /定义1602液晶RS端公司lcden = P3 ^ 4;/ /定义1602液晶lcden端P3 ^了S1 = 0;//定义按键--功能键公司^ S2 = P3 1;/ /定义按键--增加键P3 ^了S3 = 2;//定义按键--减小键P3 ^了S4 = 6;//闹钟查看键P3 ^了RD = 7;普通哔= P2 ^ 3;/ /定义蜂鸣器端函数代码temp_disp_title [ ] = {“当前温度:“};函数current_temp_display_buffer [ ] = {“临时”};函数代码alarm_temp [ ] = {“报警温度高低”};函数alarm_hi_lo_str [ ] = {“嗨:Lo:“};函数temp_data [ 2 ] = { 0x00,0x00 };函数temp_alarm [ 2 ] = { 0x00,0x00 };函数显示[ 5 ] = { 0x00,0x00,0x00,0x00,0x00 };函数显示[ 3 ] = { 0x00,0x00,0x00 };函数代码df_table [ ] = { 0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9 };函数,= 0;//当前读取的温度整数部分函数temp_value [ ] = { 0x00,0x00 };//从DS18B20读取的温度值函数display_digit [ ] = { 0,0,0,0 };//待显示的各温度数位点ds18b20_is_ok = 1;//传感器正常标志/ / ------------------------------------- 延时/ / 1/ / ------------------------------------- 无效的极限(个X){我的函数;当(x)为(i=0;i < 200;i +);}/ / ------------------------------------- 延时/ / 2/ / ------------------------------------- 虚空Delay(个X){(x);}/ / ------------------------------------/ /忙检查/ / ------------------------------------无效write_com(UCHAR COM)/液晶写命令函数{RS=0;lcden = 0;P0 = COM;极限(5);lcden = 1;极限(5);lcden = 0;}write_lcd_data(void函数日期)/液晶写数据函数{RS=1;lcden = 0;P0 =日期;极限(5);lcden = 1;极限(5);lcden = 0;}/ / -----------------------------/ /设置液晶显示位置/ / --------------------------------- 无效set_disp_pos(uchar Pos){write_com(POS | 0x80);}/ / -----------------------------/ /液晶初始化/ / ---------------------------------无效initialize_lcd(){函数数;RD = 0;//软件将矩阵按键第4列一端置低用以分解出独立按键班杜拉= 0;//关闭两锁存器锁存端,防止操作液晶时数码管会出乱码维拉= 0;lcden = 0;write_com(0X38);/ /初始化1602液晶write_com(0x0c);write_com(0x06);write_com(0x01);write_com(0x80);/ /设置显示初始坐标对于(num = 0;数<14;数+ +)/显示年月日星期{write_lcd_data(temp_disp_title [民]);极限(5);}}/ / -------------------------------------/ /函数功能:初始化DS18B20/ /出口参数:现状——DS18B20是否复位成功的标志/ / -------------------------------------init_ds18b20()函数{函数的状态;/ /储存DS18B20是否存在的标志,状态= 0,表示存在;状态= 1,表示不存在DQ=1;Delay(8);/ / / / 6微秒略微延时约先将数据线拉高DQ=0;Delay(90);//再将数据线从高拉低,要求保持480 ~ 960us600 /略微延时约微秒以向DS18B20发出一持续480 ~ 960us的低电平复位脉冲DQ=1;Delay(8);//释放数据线(将数据线拉高)/延时约30us(释放总线后需等待15 ~ 60us让DS18B20输出存在脉冲)状态= DQ;Delay(100);To detect whether the output of the microcontroller / presence pulse (DQ=0 said there was enough long time delay) / /, waiting for the existence of output pulse.DQ=1; / / data lines pulledReturn status; / / return test success}//-------------------------------------/ / function: read a byteExport parameters: dat--- / / read data//-------------------------------------Uchar, ReadOneByte (){Uchar, I, dat=0;DQ=1; (_nop_); / / the first data line up / / wait for a machine cycleFor (i=0; i<8; i++){DQ=0; / / SCM from DS18B20 according to the reading, the data line from high low start read timingDat>>=1;(_nop_); / / wait for a machine cycleDQ=1; / / data line "artificial" pull up, ready for the detection of DS18B20 MCU output level_nop_ (_nop_); (); / / delay of about 6us, so that the host sampling in 15USIf (DQ dat|=0x80); / / if the read data is 1, will be 1 in DAT, if the 0 will remain the original value unchanged.Delay (30); / / 3us delay, there must be more than 1US of the recovery period between two read timingDQ=1; / / data lines pulled, ready for the next data read}Return dat;}//-------------------------------------/ / function: write a byteEntrance parameters: dat--- / / data to be written//-------------------------------------Void WriteOneByte (uchar DAT){Uchar i;For (i=0; i<8; i++){DQ=0; / / data line from high low start write timingDQ=dat & 0x01; / / use and operation to remove a write binary data,/ / and sent to a data line for DS18B20 samplingDelay (5); / / delay of about 30us, sampling from the data line during DS18B20 about 15~60us in the low postDQ=1; / / release the data line.Dat>>=1; / / dat in the 1 bit binary data.}}//-------------------------------------/ / function: read the temperature valueEntrance parameters: / ///-------------------------------------Void, Read_Temperature (){If (Init_DS18B20) (//DS18B20 = = 1) faultDS18B20_IS_OK=0;Else{WriteOneByte (0xCC); / / read serial number column number operation skipWriteOneByte (0x44); / / convert temperature(Init_DS18B20); / / initialize DS18B20WriteOneByte (0xCC); / / read serial number column number operation skipWriteOneByte (0xBE); / / read the temperature register, the first two are low and high temperatureTemp_Value[0]=ReadOneByte (8); / / low temperatureTemp_Value[1]=ReadOneByte (high temperature); / / 8DS18B20_IS_OK=1;}}//-------------------------------------/ / function: display the current temperature in LCD/ / entrance parameters://-------------------------------------Void, Display_Temperature (){Uchar i;/ / delay value and negative identificationUchar, t=150, ng=0;5 all 1 / / high (0xF8) is negative, negative counter plus 1, and set the negative signIf ((Temp_Value[1] & 0xF8) ==0xF8){Temp_Value[1]=~Temp_Value[1];Temp_Value[0]=~Temp_Value[0]+1;If (Temp_Value[0]==0x00 Temp_Value[1]++); / / plus 1 if the low byte is 00 bits that carry, then added to the high byteNg=1; / / the 1 negative sign}Display_Digit[0]=df_Table[Temp_Value[0] & 0x0F]; / / find the decimal part temperature/ / get the temperature (high byte integer part of the lower 3 and the low byte in the high 4 bit unsigned)CurrentT= ((Temp_Value[0] & 0xF0) (>>4) | (Temp_Value[1] & 0x07) <<4);/ / integer part is decomposed into 3 bit digital to displayDisplay_Digit[3]=CurrentT/100; / / 100 digit[CurrentT/100];Display_Digit[2]=CurrentT%100/10; / / tenDisplay_Digit[1]=CurrentT%10; / / A/ / LCD display refresh bufferCurrent_Temp_Display_Buffer[11]=Display_Digit[0]+'0'; / / the first'0' will be converted into the integer 48, then add the digital front,Gets the ASCII character of the corresponding numberCurrent_Temp_Display_Buffer[10]='.';Current_Temp_Display_Buffer[9]=Display_Digit[1]+'0'; / / ACurrent_Temp_Display_Buffer[8]=Display_Digit[2]+'0'; / / tenCurrent_Temp_Display_Buffer[7]=Display_Digit[3]+'0'; / / 100Not to display 0 / / highIf (Display_Digit[3]==0) Current_Temp_Display_Buffer[7]='';For the 0 time and high / high 0 times, do not show highIf (Display_Digit[2]==0 and Display_Digit[3]==0)Current_Temp_Display_Buffer[8]='';/ / negative symbols are displayed in the right position If (NG){If (Current_Temp_Display_Buffer[8]=='')Current_Temp_Display_Buffer[8]='-';Else if (Current_Temp_Display_Buffer[7]=='')Current_Temp_Display_Buffer[7]='-';ElseCurrent_Temp_Display_Buffer[6]='-';}/ / in the first row show titleSet_Disp_Pos (0x00);For (i=0; i<16; i++){Write_LCD_Data (Temp_Disp_Title[i]);}Set_Disp_Pos (0x40); / / in the second line shows the current temperatureFor (i=0; i<16; i++){Write_LCD_Data (Current_Temp_Display_Buffer[i]);}/ / temperature display symbols/ / Set_Disp_Pos (0x4D); Write_LCD_Data (0x00);Set_Disp_Pos (0x4D); Write_LCD_Data (0xdf);Set_Disp_Pos (0x4E); Write_LCD_Data ('C');}//-------------------------------------/ / function: the main function/ / entrance parameters://------------------------------------- Void, main (){Initialize_LCD ();Read_Temperature ();Delay (50000);Delay (50000);While (1){Read_Temperature ();If (DS18B20_IS_OK) Display_Temperature (); Delay1 (100);}}。
数字温度计的c语言程序

void Read_Temperature()
{
if(Init_DS18B20( )==1)
DS18B20_IS_OK=0; //DS18B20故障
Temp_Value[1]=ReadOneByte(); //温度高8位
Alarm_Temp_HL[0]=ReadOneByte();
Alarm_Temp_HL[1]=ReadOneByte();
DS18B20_IS_OK=1;
}
}
///设置报警值
void Set_Alarm_Temp_Value()
程序名称:在数码管上显示温度
*************************************************************************/
void Display_Temperture()
{
uchar i;
uchar t=150; //延时值
uint Time0_Count=0;
/*******************************************************************************************************************************/
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验内容:DS18b20温度传感器晶振:11.0592M实验连线:*/#include<absacc.h>#include <string.h>#include<reg51.H>unsigned char disp0, disp1, disp2, disp3;sbit DQ = P2^7;sbit led0=P2^0;sbit led1=P2^1;sbit led2=P2^2;sbit led3=P2^3;sbit led4=P2^4;sbit led5=P2^5;#define Com_Buf 0x45//命令缓冲单元#define Dat_Buf 0x46//数据缓冲单元#define Leng 0x47//读写字节长度存放单元#define Table 0x78//表首地址存放单元#define SoftRes 0xe2//液晶软件复位指令#define Disp_On 0xaf//液晶显示指令#define Page_Add 0xb8//液晶页面选择指令#define Col_Add 0x00//液晶列设置指令#define Colen 0x43//列地址长度存储单元#define dd 0xd0typedef unsigned char BYTE;#define Lcd_Bus P0 //MCU P1<------> LCM unsigned char code HK_HZ[12][16];unsigned char code HK_HZ1[11][32];sbit A0=P2^3; //Master chip enablesbit E1=P2^0; //Slave chip enablesbit E2=P2^1; //6800 mode Enable singlesbit RW=P2^2; //Data or Instrument Selectsbit Lcd_Rst=P2^4; //Lcm reset/*------------------延时子程序-----------------------------*/ void delay(unsigned int t)unsigned int i,j;for(i=0;i<t;i++)for(j=0;j<10;j++);}/*------------------写命令到LCD------------------------------*/ void write_com(unsigned char cmdcode){A0=0;Lcd_Bus=cmdcode;E1=0;E2=0;//delay(1);E1=1;//delay(1);E1=0;//delay(1);E2=1;//delay(1);E2=0;//delay(1);}/*-------------------写数据到LCD----------------------------*/void write_data(unsigned char Dispdata){A0=1;Lcd_Bus=Dispdata;E1=0;E2=0;//delay(1);E1=1;//delay(1);E1=0;//delay(1);E2=1;//delay(1);E2=0;//delay(1);}/*-------------------写数据到LCD----------------------------*/void write_data1(unsigned char Dispdata){A0=1;Lcd_Bus=Dispdata;E1=0;E2=0;E1=1;delay(1);E1=0;}/*-------------------写数据到LCD----------------------------*/void write_data2(unsigned char Dispdata){A0=1;Lcd_Bus=Dispdata;E1=0;E2=0;E2=1;delay(1);E2=0;}/*------------------清除内存---------------*/void Clr_Scr(){unsigned char j,k;for(k=0;k<4;k++){write_com(Page_Add+k);write_com(Col_Add+0);for(j=0;j<61;j++)write_data(0x00);}/*---------------------指定位置显示汉字16*16-----------------------*/void hz_disp16_1(unsigned char pag,unsigned char col, unsigned char code *hzk) {unsigned char j=0,i=0;for(j=0;j<2;j++){write_com(Page_Add+pag+j);write_com(Col_Add+col);for(i=0;i<16;i++) write_data1(hzk[16*j+i]);}}/*---------------------指定位置显示汉字------8*16---------------*/void hz_disp16_2(unsigned char pag,unsigned char col, unsigned char code *hzk) {unsigned char j=0,i=0;for(j=0;j<2;j++){write_com(Page_Add+pag+j);write_com(Col_Add+col);for(i=0;i<8;i++) write_data2(hzk[8*j+i]);}}/*------------------初始化LCD屏--------------------------*/void init_lcd(){Lcd_Rst=1;A0=0;RW=0;delay(100);write_com(SoftRes);//软复位write_com(Disp_On);//打开显示write_com(dd);}/*------------------------------温度信息显示------------------------*/void Msg(){// Clr_Scr();//E1=1;E2=0;hz_disp16_1(0,0,(BYTE *)&HK_HZ1[0][0]);hz_disp16_1(0,15,(BYTE *)&HK_HZ1[1][0]);hz_disp16_1(0,30,(BYTE *)&HK_HZ1[2][0]);hz_disp16_1(0,45,(BYTE *)&HK_HZ1[3][0]);E1=0;E2=1;hz_disp16_2(2,0,(BYTE *)&HK_HZ[disp0][0]); //salverhz_disp16_2(2,8,(BYTE *)&HK_HZ[disp1][0]);hz_disp16_2(2,16,(BYTE *)&HK_HZ[10][0]);hz_disp16_2(2,24,(BYTE *)&HK_HZ[disp2][0]);hz_disp16_2(2,32,(BYTE *)&HK_HZ[disp3][0]);hz_disp16_2(2,40,(BYTE *)&HK_HZ[11][0]);}/*------------------------------题号.姓名.学号信息显示------------------------*/ void Msg1(){Clr_Scr();{ ///*-- 文字: 张栋--*//*-- 宋体12; 宽x高=16x16 --*/E1=1;E2=0;hz_disp16_1(0,0,(BYTE *)&HK_HZ1[8][0]);hz_disp16_1(0,15,(BYTE *)&HK_HZ1[4][0]);hz_disp16_1(0,30,(BYTE *)&HK_HZ1[5][0]);/*-- 学号: 90408605 --*//*-- 宽x高=8x16 --*/E1=0;E2=1;hz_disp16_2(0,0,(BYTE *)&HK_HZ[9][0]);hz_disp16_2(0,8,(BYTE *)&HK_HZ[0][0]);hz_disp16_2(0,16,(BYTE *)&HK_HZ[4][0]);hz_disp16_2(0,24,(BYTE *)&HK_HZ[0][0]);hz_disp16_2(0,32,(BYTE *)&HK_HZ[8][0]);hz_disp16_2(0,40,(BYTE *)&HK_HZ[6][0]);hz_disp16_2(0,48,(BYTE *)&HK_HZ[0][0]);hz_disp16_2(0,56,(BYTE *)&HK_HZ[5][0]);/*-- 文字: 李凡凡--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/ E1=1;E2=0;hz_disp16_1(2,0,(BYTE *)&HK_HZ1[6][0]);hz_disp16_1(2,15,(BYTE *)&HK_HZ1[7][0]);hz_disp16_1(2,30,(BYTE *)&HK_HZ1[7][0]);/*-- 学号: 90402102 --*//*-- 宽x高=8x16 --*/E1=0;E2=1;hz_disp16_2(2,0,(BYTE *)&HK_HZ[9][0]);hz_disp16_2(2,8,(BYTE *)&HK_HZ[0][0]);hz_disp16_2(2,16,(BYTE *)&HK_HZ[4][0]);hz_disp16_2(2,24,(BYTE *)&HK_HZ[0][0]);hz_disp16_2(2,32,(BYTE *)&HK_HZ[2][0]);hz_disp16_2(2,40,(BYTE *)&HK_HZ[1][0]);hz_disp16_2(2,48,(BYTE *)&HK_HZ[0][0]);hz_disp16_2(2,56,(BYTE *)&HK_HZ[2][0]); delay(20000);}}/*DS18b20温度传感器读写程序(c51版)*/ void delayus(int us){int s;for ( s=0; s<us; s++);}void rst(void) //单线复位脉冲时序{DQ = 1;delayus(2); //大约在15us左右DQ = 0;delayus(30); //精确延时480~960usDQ = 1;delayus(8);}unsigned int read(void){int i=0;unsigned int u=0;for (i=0;i<16;i++){DQ = 0;u >>= 1;DQ = 1;if(DQ) u|= 0x8000;delayus(4);}return(u);}void write(unsigned char ku){int i = 0;for (i=0;i<8;i++){DQ = 0;DQ = ku&0x01;delayus(3);DQ = 1;ku >>= 1;}}void read0(void){int t0,t1,t2;unsigned int tp;unsigned int lsb;rst();write(0xCC);write(0x44);rst();write(0xCC);write(0xBE);tp = read();lsb = (unsigned int)(tp*6.25);t0 = lsb/1000;disp0 = t0; //第1位,最高位if(!t0) disp0 = 0x00;t2 = lsb%1000;t1 = t2/100;disp1 = t1; //第2位t1 = t2%100;t2 = t1/10;disp2 = t2; //第3位,最低位disp3 = t1%10; //第4位,最低位}/*-- ------- 主程序------- --*/void main(){Clr_Scr();init_lcd();read0();Msg1();delay(3000) ;delay(3000) ;delay(3000) ; //调用输出汉字页面的程序{Clr_Scr();init_lcd();while(1){read0();Msg();delay(3000) ;Clr_Scr(); //温度显示页面程序}}}unsigned char code HK_HZ[][16]={ //H16 W80xF8,0xFC,0x04,0xC4,0x24, // -0- 0xFC,0xF8,0x00,0x07,0x0F,0x09,0x08,0x08,0x0F,0x07,0x00,0x00,0x10,0x18,0xFC,0xFC, // -1-0x00,0x00,0x00,0x00,0x08,0x08,0x0F,0x0F,0x08,0x08,0x00,0x08,0x0C,0x84,0xC4,0x64, // -2-0x3C,0x18,0x00,0x0E,0x0F,0x09,0x08,0x08,0x0C,0x0C,0x00,0x08,0x0C,0x44,0x44,0x44, // -3-0xFC,0xB8,0x00,0x04,0x0C,0x08,0x08,0x08,0x0F,0x07,0x00,0xC0,0xE0,0xB0,0x98,0xFC, // -4-0xFC,0x80,0x00,0x00,0x00,0x00,0x08,0x0F,0x0F,0x08,0x7C,0x7C,0x44,0x44,0xC4, // -5-0xC4,0x84,0x00,0x04,0x0C,0x08,0x08,0x08,0x0F,0x07,0x00,0xF0,0xF8,0x4C,0x44,0x44, // -6-0xC0,0x80,0x00,0x07,0x0F,0x08,0x08,0x08,0x0F,0x07,0x00,0x0C,0x0C,0x04,0x84,0xC4, // -7-0x7C,0x3C,0x00,0x00,0x00,0x0F,0x0F,0x00,0x00,0x00,0x00,0xB8,0xFC,0x44,0x44,0x44, // -8-0xFC,0xB8,0x00,0x07,0x0F,0x08,0x08,0x08,0x0F,0x07,0x00,0x38,0x7C,0x44,0x44,0x44, // -9-0xFC,0xF8,0x00,0x00,0x08,0x08,0x08,0x0C,0x07,0x03,0x00,// 10 0x00,0x00,0x00,0x00,0x00, // -.-0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x0C,0x00,0x00,0x00,0xF0,0xF8,0x0C,0x04,0x04, // -C- 11 0x0C,0x18,0x00,0x03,0x07,0x0C,0x08,0x08,0x0C,0x06,0x00,} ;unsigned char code HK_HZ1[][16]={/*-- 文字: 当--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x40,0x42,0x44,0x58,0x40,0x40,0x7F,0x40,0x40,0x50,0x48,0xC6,0x00,0x00,0x00,0x00,0x40,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0xFF,0x00,0x00,0x00,//0/*-- 文字: 前--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x08,0x08,0xE8,0x29,0x2E,0x28,0xE8,0x08,0x08,0xC8,0x0C,0x0B,0xE8,0x08,0x08,0x00,0x00,0x00,0xFF,0x09,0x49,0x89,0x7F,0x00,0x00,0x0F,0x40,0x80,0x7F,0x00,0x00,0x00, //1/*-- 文字: 温--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x10,0x60,0x02,0x8C,0x00,0x00,0xFE,0x92,0x92,0x92,0x92,0x92,0xFE,0x00,0x00,0x00,0x04,0x04,0x7E,0x01,0x40,0x7E,0x42,0x42,0x7E,0x42,0x7E,0x42,0x42,0x7E,0x40,0x00,//2/*-- 文字: 度--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0xFC,0x24,0x24,0x24,0xFC,0x25,0x26,0x24,0xFC,0x24,0x24,0x24,0x04,0x00,0x40,0x30,0x8F,0x80,0x84,0x4C,0x55,0x25,0x25,0x25,0x55,0x4C,0x80,0x80,0x80,0x00,//3/*-- 文字: 张--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x02,0xE2,0x22,0x22,0x3E,0x80,0x80,0xFF,0x80,0xA0,0x90,0x88,0x86,0x80,0x80,0x00,0x00,0x43,0x82,0x42,0x3E,0x00,0x00,0xFF,0x40,0x21,0x06,0x08,0x10,0x20,0x40,0x00, //4/*-- 文字: 栋--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x10,0x10,0xD0,0xFF,0x90,0x08,0x88,0x68,0x18,0x0F,0xE8,0x08,0x08,0x08,0x08,0x00,0x04,0x03,0x00,0xFF,0x00,0x21,0x11,0x0D,0x41,0x81,0x7F,0x01,0x05,0x09,0x30,0x00, //5/*-- 文字: 李--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x80,0x84,0x44,0x44,0x24,0x14,0x0C,0xFF,0x0C,0x14,0x24,0x44,0x44,0x84,0x80,0x00,0x08,0x08,0x08,0x08,0x09,0x49,0x89,0x79,0x0D,0x0B,0x09,0x08,0x08,0x08,0x08,0x00,//6/*-- 文字: 凡--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x00,0x00,0xFE,0x02,0x22,0x42,0x82,0x02,0xFE,0x00,0x00,0x00,0x00,0x00,0x80,0x40,0x30,0x0C,0x03,0x00,0x00,0x00,0x01,0x00,0x3F,0x40,0x40,0x40,0x78,0x00, //7/*-- 文字: ①--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0xE0,0x18,0x04,0x02,0x02,0x21,0x11,0xF9,0x01,0x01,0x02,0x02,0x04,0x18,0xE0,0x00,0x03,0x0C,0x10,0x20,0x20,0x40,0x40,0x4F,0x40,0x40,0x20,0x20,0x10,0x0C,0x03,0x00,//8} ;。