51单片机简单的温度获取并显示c程序

合集下载

51单片机的液晶显示温度计程序

51单片机的液晶显示温度计程序

51单片机的液晶显示温度计程序51单片机的液晶显示温度计程序#include<reg51.h>#include <intrins.h>sbit RST = P2^0;sbit CLK = P2^1;sbit DQ = P2^2;sbit TSOR = P2^3;sbit ALERT =P2^4;sbit RS = P2^7;sbit RW = P2^6;sbit EN = P2^5;/*------------------------------------------全局变量-------------------------------------------------------*/static unsigned char temp1,temp2; //温度值的整数部分、小数部分static unsigned char pos,posset; //数字电位器电位值、设定值static unsigned char min,sec; //分钟、秒static unsigned char count; //Timer0中断计数static unsigned char minset; //设定的分钟数static unsigned char status1,status2; //状态标志bit stop,timeover; //定时停止、结束static char line0[] =" 00:00 ";static char line1[] =" . CW";/*-------------------------------------------------------------------------------------------------------------*/void InitInterupt();void KeyboardDelay();/*-------------------------------------------LCD驱动函数------------------------------------------------*/void DelayL();void DelayS();void WriteCommand(unsigned char c);void WriteData(unsigned char c);void ShowChar(unsigned char pos,unsigned char c); void ShowString(unsigned char line,char *ptr);void InitLcd();/*----------------------------------------------键盘-程序--------------------------------------------------*/unsigned char GetKey();/*---------------------------------------------数字温度计驱动-------------------------------------------*/void ChangePos(bit sel,unsigned char pos1,unsigned char pos2);/*------------------------------------------温度传感器驱动----------------------------------------------*/void Delay15();void Delay60();void Delay100ms();void Write0TS();void Write1TS();bit ReadTS();void ResetTS();void WriteByteTS(unsigned char byte); unsigned char ReadByteTS();void InitTS();void GetTempTS();/*-------------------------------------------------主程序---------------------------------------------------*/void main (void) {char code str1[] =" Hello World! ";char code str2[] =" 2002-10-20 "; unsigned char i; SP=0x50;ALERT=0; //报警灯灭TSOR=1; //1-wire总线释放DelayL();InitLcd(); //初始化LCDDelayL();ShowString(0,str1); //启动画面ShowString(1,str2);for(i=0;i<15;i++)Delay100ms();InitInterupt(); //初始化中断设置minset=10; //缺省定时10分钟posset=0; //缺省电位器值0min=minset; //初始化数据pos=posset;sec=0;count=0;P1=0xF0;status1=0;status2=0;stop=1;timeover=0; ChangePos(0,255-pos,255-pos); //设置电位器InitTS(); //初始化温度计while(1) //循环显示温度值{GetTempTS();line1[0]=0x20;i=temp1;if(i>39) //超过40摄氏度,告警灯亮ALERT=1;if(i>99) //超过100摄氏度,显示温度的百位{line1[0]=0x31;i-=100;}line1[1]=i/10+0x30; //显示温度的十位line1[2]=i%10+0x30; //显示个位line1[4]=temp2+0x30; //显示小数位if(timeover) //若定时结束,则电位器缓慢复0{for(;pos>0;pos--){ChangePos(0,255-pos,255-pos);_nop_();_nop_();}timeover=0;posset=0;}if(pos>posset) //若按键修改电位器位置{for(;pos>posset;pos--) //则缓变到设定值{ChangePos(0,255-pos,255-pos);_nop_();_nop_();}ChangePos(0,255-pos,255-pos);}else if(pos<posset){for(;pos<posset;pos++){ChangePos(0,255-pos,255-pos);_nop_();_nop_();}ChangePos(0,255-pos,255-pos);}i=pos;line1[9]=0x20; //显示电位器等级值if(i>99){line1[9]=i/100+0x30;i=i%100;}line1[10]=i/10+0x30;line1[11]=i%10+0x30;ShowString(1,line1);line0[5]=min/10+0x30; //显示时间line0[6]=min%10+0x30;line0[8]=sec/10+0x30;line0[9]=sec%10+0x30;ShowString(0,line0);Delay100ms();}}void InitInterupt(){TMOD=0x21; //初始化中断设置TL1=0xFD;TH1=0xFD;PX0=1;EA=1;ES=1;PCON=0;TR1=1;SCON=0x50;TL0=0x00; //定时0.05mTH0=0x4C;ET0=1; EX0=1;IT0=1;}void KeyboardDelay() //按键中断延时{unsigned char i,j;i=0x40;j=0xFF;while(i--)while(j--);}/*--------------------------------------------中断处理-----------------------------------------------------*/Int0_process() interrupt 0 using 0{unsigned char key;unsigned char keycode[]= "TP";unsigned char step[3]={1,2,5};EA=0;key=GetKey(); //获得按键值switch(key){case 0:stop=!stop;min=minset;sec=0;break;case 1:case 2:case 3:if(stop){minset+=step[key-1];if(minset>60)minset=0;min=minset;}break;case 5:case 6:case 7:if(stop){minset-=step[key-5]; if(minset>60) minset=0;min=minset;}break;case 9:case 10:case 11:posset+=step[key-9];break;case 13:case 14:case 15:posset-=step[key-13];break;default:break;}TR0=!stop;KeyboardDelay();P1=0xF0;EA=1;}Timer0_process() interrupt 1 using 0{EA=0;TR0=0;TL0=0x00;TH0=0x4C;count++;if(count==20) //如果到累计定时到达1s {if(sec==0) //定时处理{if(min==0) //总定时到,则置结束标志timeover=1;else{min--;sec=59;}}elsesec--;count=0;}TR0=1;EA=1;}/*--------------------------------------LCD驱动子程序--------------------------------------------------*/void DelayL(){unsigned char i,j;i=0xF0;j=0xFF;while(i--)while(j--);}void DelayS(){unsigned char i;i=0x1F;while(i--);}void WriteCommand(unsigned char c) {DelayS();EN=0;RS=0;RW=0;_nop_();EN=1;P0=c;EN=0;}void WriteData(unsigned char c){DelayS();EN=0;RS=1;RW=0;_nop_();EN=1;P0=c;EN=0;RS=0;}void ShowChar(unsigned char pos,unsigned char c) {unsigned char p;if(pos>=0x10)p=pos+0xB0;elsep=pos+0x80;WriteCommand(p);WriteData(c);}void ShowString(unsigned char line,char *ptr){unsigned char l,i;l=line<<4;for(i=0;i<16;i++)ShowChar(l++,*(ptr+i));} void InitLcd(){DelayL();WriteCommand(0x38);WriteCommand(0x38);WriteCommand(0x06);WriteCommand(0x0C);WriteCommand(0x01);WriteCommand(0x80);}/*---------------------------------------------键盘子程序-------------------------------------------------*/ unsigned char GetKey(){unsigned k,t,i,j;k=P1;k=k&0xF0;i=0;while((k&0x10)&&i<4) {i++;k=k>>1;}k=0x01;j=0;while(j<4){P1=0xFF^k;_nop_();t=P1;t=t^0xFF;t=t&0xF0;if(t)break;j++;k=k<<1;}k=j*4+i;return k;}/*-----------------------------------------数字温度计驱动子程序--------------------------------------*/void ChangePos(bit sel,unsigned char pos1,unsigned char pos2){ unsigned char i;RST=0;DQ=0;CLK=0;RST=1;DQ=sel;_nop_();CLK=1;_nop_();CLK=0;for(i=0;i<8;i++) {if(pos1&0x80)DQ=1;elseDQ=0;_nop_();CLK=1;_nop_();CLK=0;pos1=pos1<<1; }for(i=0;i<8;i++) {if(pos2&0x80)DQ=1;elseDQ=0;_nop_();CLK=1;_nop_();CLK=0;pos2=pos2<<1;}RST=0;}/*------------------------------------------温度传感器子程序-------------------------------------------*/void Delay100ms() //延时100ms {unsigned char i,j,k;for(i=0;i<8;i++)for(j=0;j<25;j++)for(k=0;k<250;k++);}void Delay15() //延时15us{unsigned char i;for(i=0;i<8;i++);}void Delay60() //延时60us{unsigned char i;for(i=0;i<30;i++);}void Write0TS() //写bit 0 {TSOR=1;TSOR=0;Delay15();Delay15();Delay15();Delay15();TSOR=1;_nop_();_nop_();}void Write1TS() //写bit 1 {TSOR=1;TSOR=0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();TSOR=1;_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();Delay15();Delay15();Delay15(); }bit ReadTS() {bit b;TSOR=1;TSOR=0; _nop_();_nop_();_nop_();_nop_();TSOR=1;_nop_();_nop_();_nop_();_nop_();_nop_();b=TSOR;Delay15();Delay15();Delay15();_nop_();_nop_();return b;}void ResetTS() //复位{unsigned char i; TSOR=1;TSOR=0;for(i=0;i<8;i++)Delay60();TSOR=1;while(TSOR);for(i=0;i<8;i++)Delay60();}void WriteByteTS(unsigned char byte) //写一个字节(byte){unsigned char i;for(i=0;i<8;i++){if(byte&0x01)Write1TS();elseWrite0TS();byte=byte>>1;}}unsigned char ReadByteTS() //读一个字节(byte){unsigned char i,j;bit b;j=0;for(i=0;i<8;i++){b=ReadTS();if(b)j+=1;j=_cror_(j,1);}return j;}void InitTS() //初始化温度转换{ResetTS();WriteByteTS(0xCC);WriteByteTS(0x4E);WriteByteTS(0x64);WriteByteTS(0x8A);WriteByteTS(0x1F);}void GetTempTS() //获取温度{ResetTS();WriteByteTS(0xCC);WriteByteTS(0x44);Delay100ms();ResetTS();WriteByteTS(0xCC);WriteByteTS(0xBE);temp2=ReadByteTS();temp1=ReadByteTS();ReadByteTS();ReadByteTS();ReadByteTS();ReadByteTS();ReadByteTS();ReadByteTS();ReadByteTS();temp1=temp1<<4;temp1+=(temp2&0xF0)>>4;temp2=(temp2&0x0F)?5:0;}液晶显示温度计程序。

C51单片机数字温度计汇编程序及说明书

C51单片机数字温度计汇编程序及说明书

1绪论1.1选题背景随着人们生活水平的不断提高,单片机控制无疑是人们追求的目标之一,它所给人带来的方便也是不可否定的,其中数字温度计就是一个典型的例子,但人们对它的要求越来越高,要为现代人工作、科研、生活提供更好的更方便的设施就需要从单片机技术入手,一切向着数字化控制,智能化控制方向发展。

温度测量在物理实验、医疗卫生、食品生产等领域,尤其在热学试验(如:物体的比热容、汽化热、热功当量、压强温度系数等教学实验)中,有特别重要的意义。

现在所使用的温度计通常都是精度为1℃和0.1℃的水银、煤油或酒精温度计。

这些温度计的刻度间隔通常都很密,不容易准确分辨,读数困难,而且他们的热容量还比较大,达到热平衡所需的时间较长,因此很难读准,并且使用非常不方便。

本设计所介绍的数字温度计与传统的温度计相比,具有读数方便,测温范围广,测温准确等优点,其输出温度采用数字显示,主要用于对测温比较准确的场所,或科研实验室使用。

因此本课题就尝试通过编程与芯片的结合来解决传统数字温度计的弊端,设计出新型数字温度计。

1.2课题现状分析及研究意义温度传感器的发展现状:温度传感器使用范围广,数量多,居各种传感器之首,其发展大致经历了以下3个阶段:①传统的分立式温度传感器(含敏感元件)——热电偶传感器,主要是能够进行非电量和电量之间转换。

②模拟集成温度传感器/控制器。

集成传感器是采用硅半导体集成工艺制成的,因此亦称硅传感器或单片集成温度传感器。

③智能温度传感器。

它是微电子技术、计算机技术和自动测试技术(ATE_)的结晶。

智能温度传感器内部包含温度传感器、A/D传感器、信号处理器、存储器(或寄存器)和接口电路。

本课题的研究可以应用领域生产、生活等很多领域。

对于家用电器从洗衣机、微波炉到音响等等到处都可以用到温度控制器来方便大家的日常生活。

开发此产品后也可方便应用安装在小至家庭大到工厂车间,小至一个芯片大到一个机械设备。

例如在家庭客厅卧室等必要地方显示室温,可防止家里食物是否变质及早采取措施。

基于51的温度控制系统设计C语言源程序

基于51的温度控制系统设计C语言源程序

/*********************************************************//*程序名称:温度监控系统*//*程序功能:利用89C52单片机和DS18B20温度传感器实现环境*//* 温度的实时测量和高、低温报警*//*程序版本:v1.0 *//*作者:*//*编写时间:*//*********************************************************/#include 〈reg52。

h>#include 〈intrins.h〉//含_nop_()延时函数//定义数据类型#define uchar unsigned char#define uint unsigned int//定义端口#define LED P0 //段码输出口sbit DQ = P3^2;//传感器数据口sbit SMG_q = P1^0;//定义数码管阳级控制脚(千位)sbit SMG_b = P1^1;//定义数码管阳级控制脚(百位)sbit SMG_s = P1^2; //定义数码管阳级控制脚(十位)sbit SMG_g = P1^3;//定义数码管阳级控制脚(个位)sbit buzzer = P1^5;//蜂鸣器sbit led_low = P2^6; //低温指示灯sbit led_high = P2^7;//高温指示灯sbit led_ok = P2^5; //温度正常指示灯sbit led_work = P2^4;//工作指示灯sbit set = P3^7;//设置按键sbit add = P3^4;//加一按键sbit dec = P3^5;//减一按键//定义变量和常量int count = 0;//按键次数寄存器int h;//主函数用循环计数器uint temp; //温度值uchar r; //温度值整数形式uchar high = 35,low = 20; //上下限初值//共阳LED段码表"0" ”1”"2”"3" "4””5" "6””7”"8" ”9””不亮" ”—"uchar code LED_code[12] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; uchar code LED_code1[] = {0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};uchar code ditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};//小数部分转换码表uchar data temp_data[2]= {0x00,0x00};//存储从传感器读出的温度值uchar data dp[5]= {0x00,0x00,0x00,0x00,0x00};//显示单元数据,共4个数据和一个运算//子函数声明void ds_reset();//DS18B20初始化函数void ds_write(uchar ds_wrdata);//DS18B20写数据函数uchar ds_read(); //DS18B20读数据函数read_temp(); //读取温度函数void change_temp(uint tem);//温度数据处理void xianshi(int horl);//温度显示转换void display(); //数码管显示函数void keyscan(); //按键查询函数void warn_led();//超限报警void delay(uint t);//延时函数,单次25us/********************主函数*********************/void main(){LED=0x00; //初始化显示端口led1=0;led2=0;led3=0;led4=0;for(h=0;h<4;h++){dp[h]=8;}while(1) //循环执行显示和温度读取{uchar i;for(i=0;i〈200;i++){warn_led(); //指示灯控制display(); //显示keyscan(); //按键扫描}change_temp(read_temp());//温度数据读取和处理}}/***********************************************//*函数名称:ds_reset()*//*函数功能:DS18B20初始化*//*入口参数:无*//*输出参数:无*//*调用函数:delay();_nop_(); *//*全局变量:无*//*局部变量:presence *//***********************************************/void ds_reset(void){char presence=1;while(presence){while(presence){DQ=1;//传感器数据段先置高电平_nop_();_nop_();//适当延时DQ=0; //传感器数据段从高电平拉到低电平delay(50); //延时DQ=1; //再置高电平delay(6);//延时presence=DQ; //初始化成功,继续下一步}delay(45); //延时presence=~DQ;}DQ=1; //拉高电平led_work=0; //开工作指示灯}/***********************************************//*函数名称:ds_write() *//*函数功能:向DS18B20写数据*//*入口参数:ds_wrdata *//*输出参数:无*//*调用函数:delay();_nop_(); *//*全局变量:无*//*局部变量:ds_wrdata *//***********************************************/ void ds_write(uchar ds_wrdata){uchar i;for(i=8;i〉0;i——){DQ=1;_nop_();_nop_();DQ=0;_nop_();_nop_();_nop_();_nop_();DQ=ds_wrdata&0x01; //最低位移出delay(6);ds_wrdata=ds_wrdata/2;//右移1位}DQ=1;delay(1);}/***********************************************/ /*函数名称:ds_read()*//*函数功能:从DS18B20读数据*//*入口参数:无*//*输出参数:value *//*调用函数:delay();_nop_();*//*全局变量:*//*局部变量:i;value; *//***********************************************/uchar ds_read(void){uchar i;uchar value=0;for(i=8;i>0;i-—){DQ=1;_nop_();_nop_();value〉>=1;DQ=0;_nop_();_nop_();_nop_();_nop_();DQ=1;_nop_();_nop_();_nop_();_nop_();if(DQ)value|=0x80;delay(6);}DQ=1;return(value);}/***********************************************/ /*函数名称:read_temp()*//*函数功能:读温度数据数据*//*入口参数:无*//*输出参数:yemp *//*调用函数:ds_reset();ds_write();ds_read();*//* delay(); *//*全局变量:temp *//*局部变量:temp_data[];*//***********************************************/ read_temp(){ds_reset();//传感器初始化delay(200);ds_write(0xcc);//发跳过读取序列号命令ds_write(0x44); //发温度转换命令ds_reset();delay(1);ds_write(0xcc);ds_write(0xbe);//读18B20中存储器temp_data[0]=ds_read();//读温度值的低字节命令temp_data[1]=ds_read(); //读温度值的高字节temp=temp_data[1];temp<〈=8;temp=temp|temp_data[0]; //两字节合成一个整型变量return temp;//返回温度值}/***********************************************/ /*函数名称:chang_temp() *//*函数功能:将温度传感器中独到的数据进行转换*//*入口参数:tem *//*输出参数:dp[]*//*调用函数:无*//*全局变量:dp[];ditab[];r; *//*局部变量:tem *//***********************************************/void change_temp(uint tem){uchar n=0;if(tem>6348) // 温度值正负判断{tem=65536—tem; // 负温度求补码n=1; //标志位置1}dp[4]=tem&0x0f; // 取小数部分的值dp[0]=ditab[dp[4]];// 存入小数部分显示值dp[4]=tem〉〉4;// 取中间八位,即整数部分的值dp[3]=dp[4]/100; // 取百位数据dp[1]=dp[4]%100;// 取后两位数据dp[2]=dp[1]/10;// 取十位数据dp[1]=dp[1]%10;// 个位r=dp[1]+dp[2]*10+dp[3]*100;//实际温度值(十进制)if(!dp[3])//符号位显示判断{dp[3]=0x0a; //最高位为0时不显示if(!dp[2]){dp[2]=0x0a;//次高位为0时不显示}}if(n){dp[3]=0x0b;//负温度时最高位显示"—”}}/***********************************************//*函数名称:xianshi() *//*函数功能:温度数据转换成显示所需LED段码*//*入口参数:horl *//*输出参数:dp[] *//*调用函数:无*//*全局变量:dp[]; *//*局部变量:n; *//***********************************************/ void xianshi(int horl){int n=0;if(horl〉128) //负数补码转换{horl=256—horl;n=1;}dp[3]=horl/100;dp[3]=dp[3]&0x0f; //百位dp[2]=horl%100/10; //十位dp[1]=horl%10;//个位dp[0]=0; //小数位if(!dp[3])//高位为零不显示{dp[3]=0x0a;if(!dp[2]){dp[2]=0x0a;}}if(n) //负数最高位显示“—"{dp[3]=0x0b;}}/***********************************************/ /*函数名称:display()*//*函数功能:数码管显示*//*入口参数:无*//*输出参数:无*//*调用函数:delay() *//*全局变量:dp[];LED_code[];LED_code1[];*//*led1;led2;led3;led4; *//*局部变量:j;*//***********************************************/ void display(){int j;for(j=0;j<4;j++) //4位LED扫描控制{switch(j){case 0:LED=LED_code[dp[0]];led4=1;delay(450);led4=0;break;//小数位case 1:LED=LED_code1[dp[1]];led3=1;delay(450);led3=0;break;//个位case 2:LED=LED_code[dp[2]];led2=1;delay(450);led2=0;break;//十位case 3:LED=LED_code[dp[3]];led1=1;delay(450);led1=0;break; //百位}}}/***********************************************/ /*函数名称:keyscan() *//*函数功能:按键查询*//*入口参数:无*//*输出参数:无*//*调用函数:delay();display();xianshi();*//*全局变量:count;high;low; *//*局部变量:无*//***********************************************/ void keyscan(){if(set==0) //set键按下{while(1){delay(500);//延时去抖动if(set==0)//重新判断set键是否按下{count++;while(!set)//按键弹起继续显示前面内容display();}if(count==1)//set按下一次执行此段{xianshi(high);//转换上限温度为段码并显示display();if(add==0) //add键是否按下{while(!add)//弹起时上限温度加一并显示display();high+=1;}if(dec==0)//dec键是否按下{while(!dec) //弹起时上限温度减一并显示display();high—=1;}}if(count==2)//set键按下两次执行此段{xianshi(low);//转换下限温度为段码并显示display();if(add==0) //add键是否按下{while(!add)//弹起时下限温度加一并显示display();low+=1;}//dec键是否按下if(dec==0){while(!dec)//弹起时下限温度减一并显示display();low—=1;}}if(count>=3)//set键按下三次回到温度显示状态{count=0;break;}}}}/***********************************************//*函数名称:warn_led() *//*函数功能:工作情况指示灯控制*//*入口参数:无*//*输出参数:无*//*调用函数:无*//*全局变量:high;low;r; *//*局部变量:无*//***********************************************/ void warn_led(){if(r〉high)//温度高于上限温度{led_low=1;//“低温”指示灯灭led_high=0;//“高温"指示灯亮led_ok =1;//“正常"指示灯灭buzzer = 0; //蜂鸣器发声}else if(r〈low)//温度低于下限温度{led_low=0;//“低温"指示灯亮led_high=1;//“高温”指示灯灭led_ok =1; //“正常”指示灯灭buzzer = 0; //蜂鸣器发声}else //温度正常{led_low=1; //“低温”指示灯灭led_high=1;//“高温”指示灯灭led_ok =0; //“正常"指示灯亮buzzer = 1; //蜂鸣器不发声}}/***********************************************/ /*函数名称:delay() *//*函数功能:延时函数,单次25us左右延时*//*入口参数:t; *//*输出参数:无*//*调用函数:无*//*全局变量:无*//*局部变量:t;*//***********************************************/void delay(uint t){for (;t〉0;t—-);}/*******************程序结束********************/。

基于51单片机的温度检测系统_单片机C语言课题设计报告

基于51单片机的温度检测系统_单片机C语言课题设计报告

单片机C语言课题设计报告设计题目:温度检测电气系2011级通信技术一班级通信技术一班通才达识,信手拈来通才达识,信手拈来1摘要本课题以51单片机为核心实现智能化温度测量。

利用18B20温度传感器获取温度信号,将需要测量的温度信号自动转化为数字信号,利用单总线和单片机交换数据,最终单片机将信号转换成LCD 可以识别的信息显示输出。

基于STC90C516RD+STC90C516RD+的单片机的智能温度检测系统,的单片机的智能温度检测系统,设计采用18B20温度传感器,其分辨率可编程设计。

本课题设计应用于温度变化缓慢的空间,综合考虑,以降低灵敏度来提高显示精度。

设计使用12位分辨率,因其最高4位代表温度极性,故实际使用为11位半,位半,而温度测量范围为而温度测量范围为而温度测量范围为-55-55-55℃~℃~℃~+125+125+125℃,℃,则其分辨力为0.06250.0625℃。

℃。

设计使用LCD1602显示器,可显示16*2个英文字符,显示器显示实时温度和过温警告信息,和过温警告信息,传感器异常信息设。

传感器异常信息设。

传感器异常信息设。

计使用蜂鸣器做警报发生器,计使用蜂鸣器做警报发生器,计使用蜂鸣器做警报发生器,当温度超过当温度超过设定值时播放《卡农》,当传感器异常时播放嘟嘟音。

单片机C 语言课题设计报告语言课题设计报告电动世界,气定乾坤2目录一、设计功能一、设计功能................................. ................................. 3 二、系统设计二、系统设计................................. .................................3 三、器件选择三、器件选择................................. .................................3 3.1温度信号采集模块 (3)3.1.1 DS18B20 3.1.1 DS18B20 数字式温度传感器数字式温度传感器..................... 4 3.1.2 DS18B20特性 .................................. 4 3.1.3 DS18B20结构 .................................. 5 3.1.4 DS18B20测温原理 .............................. 6 3.1.5 DS18B20的读写功能 ............................ 6 3.2 3.2 液晶显示器液晶显示器1602LCD................................. 9 3.2.1引脚功能说明 ................................. 10 3.2.2 1602LCD 的指令说明及时序 ..................... 10 3.2.3 1602LCD 的一般初始化过程 (10)四、软件设计四、软件设计................................ ................................11 4.1 1602LCD 程序设计流程图 ........................... 11 4.2 DS18B20程序设计流程图 ............................ 12 4.3 4.3 主程序设计流程图主程序设计流程图................................. 13 五、设计总结五、设计总结................................. ................................. 2 六、参考文献六、参考文献................................. ................................. 2 七、硬件原理图及仿真七、硬件原理图及仿真......................... .........................3 7.1系统硬件原理图 ..................................... 3 7.2开机滚动显示界面 ................................... 4 7.3临界温度设置界面 ................................... 4 7.4传感器异常警告界面 (4)电气系2011级通信技术一班级通信技术一班通才达识,信手拈来通才达识,信手拈来3温度温度DS18B20 LCD 显示显示过温函数功能模块能模块传感器异常函数功能模块数功能模块D0D1D2D3D4D5D6D7XT XTAL2AL218XT XTAL1AL119ALE 30EA31PSEN29RST 9P0.0/AD039P0.1/AD138P0.2/AD237P0.3/AD336P0.4/AD435P0.5/AD534P0.6/AD633P0.7/AD732P2.7/A1528P2.0/A821P2.1/A922P2.2/A1023P2.3/A1124P2.4/A1225P2.5/A1326P2.6/A1427P1.01P1.12P1.23P1.34P1.45P1.56P1.67P1.78P3.0/RXD 10P3.1/TXD11P3.2/INT012P3.3/INT113P3.4/T014P3.7/RD17P3.6/WR 16P3.5/T115U180C51X1CRYST CRYSTAL ALC122pFC222pFGNDR110kC31uFVCCGND234567891RP1RESPACK-8VCC0.0DQ 2VCC 3GND 1U2DS18B20R24.7K LCD1LM016LLS2SOUNDERMUC八、程序清单八、程序清单................................. .................................5 一、设计功能·由单片机、温度传感器以及液晶显示器等构成高精度温度监测系统。

基于51单片机的温度检测系统程序及仿真概要

基于51单片机的温度检测系统程序及仿真概要

基于51单片机的温度检测系统程序及仿真概要
1. 系统概述
本系统采用51单片机作为控制核心,通过外接温度传感器进行温度检测,并在数码管上显示当前温度值。

同时,当温度超过设定阈值时,通过蜂鸣器进行警示。

2. 系统硬件设计
本系统采用DS18B20温度传感器作为温度检测模块,通过单总线连接到51单片机的
P2.0口,同时将P2.1口连接到蜂鸣器。

数码管采用共阳极数码管,通过P0口进行控制。

系统程序采用C语言编写,在主函数中进行如下操作:
(1) 初始化DS18B20,设置温度传感器工作模式。

(2) 读取温度传感器输出的温度值,进行温度判断。

(3) 将温度值转换为数码管显示的格式并显示在数码管上。

(4) 如果温度超过设定阈值,触发蜂鸣器进行警示。

(5) 循环执行以上操作。

4. 系统仿真
5. 总结
本系统基于51单片机实现了温度检测功能,并且能够进行数码管显示以及蜂鸣器警示,具有一定的实用价值。

本系统的设计和仿真过程对于初学者来说都是一个非常好的练手项目,也有助于掌握单片机的基本编程技能和原理知识。

51单片机的温度和时间显示源程序

51单片机的温度和时间显示源程序
}
}
uintget_tem()
{
uchartem_L,tem_H;
DS18B20_init();
delay(1);
temwritebyte(0xcc); //写跳过ROM指令;
temwritebyte(0xbe); //读数据
tem_L=temreadbyte();
tem_H=temreadbyte();
write_1602dat('E');
break;
case 3:write_1602dat('W'); //星期数据为3时显示
write_1602dat('E');
write_1602dat('D');
break;
case 4:write_1602dat('T'); //星期数据为4是显示
write_1602dat('H');
tem=tem_H<<8|tem_L;
f_tem=tem*0.0625;
tem=f_tem;//*10+0.5;****好啊家0.5缩小误差;
return (tem);
}
/********液晶写入指令函数与写入数据函数,以后可调用**************/
write_1602com(ucharcom) //****液晶写入指令函数****
dat=0;
for(i=0;i<8;i++)
{
j=temreadbit() ;
dat=;
}
return(dat);
}
voidtemwritebyte(ucharinstru)

51单片机程序(数字温度计)

51单片机程序(数字温度计)

数字温度计1、LCD.c#include <reg51.h>#include<LCD.h>unsigned char code number_X[]={ //宽x高=8x16,纵向字节倒序0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00, //00x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00, //10x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00, //20x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00, //30x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00, //40x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00, //50x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00, //60x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00, //70x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00, //80x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00, //90x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // .0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x00, //-0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //nop 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00, //:0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00};void LCD_WriteCommandE1(unsigned char com) {while(CRADD1 & 0x80);CWADD1 = com;}void LCD_WriteDataE1(unsigned char dat)while(CRADD1 & 0x80);DWADD1 = dat;}void LCD_WriteCommandE2(unsigned char com) {while(CRADD2 & 0x80);CWADD2 = com;}void LCD_WriteDataE2(unsigned char dat){while(CRADD2 & 0x80);DWADD2 = dat;}void LCD_Init(){LCD_WriteCommandE1(0xe2);LCD_WriteCommandE2(0xe2);LCD_WriteCommandE1(0xa4);LCD_WriteCommandE2(0xa4);LCD_WriteCommandE1(0xa9);LCD_WriteCommandE2(0xa9);LCD_WriteCommandE1(0xa0);LCD_WriteCommandE2(0xa0);LCD_WriteCommandE1(0xc0);LCD_WriteCommandE2(0xc0);LCD_WriteCommandE1(0xaf);LCD_WriteCommandE2(0xaf);}void LCD_Clear(void){unsigned char i,j;for(i=0;i<4;i++){LCD_WriteCommandE1(i+0xb8);LCD_WriteCommandE2(i+0xb8);LCD_WriteCommandE1(0x00);LCD_WriteCommandE2(0x00);for(j=0;j<0x50;j++){LCD_WriteDataE1(0x00);LCD_WriteDataE2(0x00);}}void display_cn(unsigned char lin,unsigned int col,unsigned int len,unsigned char *p) {unsigned int seg,i,j;unsigned char a,L,n;switch(lin){case 0: n=0xba;break;case 1: n=0xb8;break;}for(i=0;i<len;i++){for(j=0;j<2;j++){L=col;LCD_WriteCommandE1(n+j);LCD_WriteCommandE2(n+j);for(seg=0;seg<16;seg++){if (L < 61){a = L;LCD_WriteCommandE1(a);LCD_WriteDataE1(*p++);}else{a = L-61;LCD_WriteCommandE2(a);LCD_WriteDataE2(*p++);}L++;}}col=col+16;}}void display_number(unsigned char lin,unsigned int col,unsigned char num){unsigned int seg,i,j;unsigned char a,L,n,k;switch(lin){case 0: n=0xba;break;case 1: n=0xb8;break;}k=num*16;for(j=0;j<2;j++){L=col;LCD_WriteCommandE1(n+j);LCD_WriteCommandE2(n+j);for(seg=0;seg<8;seg++){if (L < 61){a = L;LCD_WriteCommandE1(a);LCD_WriteDataE1(number_X[k++]);}else{a = L-61;LCD_WriteCommandE2(a);LCD_WriteDataE2(number_X[k++]);}L++;}}}void display_unsigned_int(unsigned char lin,unsigned int col,unsigned int dat) {unsigned int seg;unsigned char k[4];k[3]=dat%10;k[2]=((dat/10)%10);k[1]=((dat/100)%10);k[0]=((dat/1000)%10);if(k[0]==0) {k[0]=12;}if((k[0]==12)&&(k[1]==0)){ k[0]=12;k[1]=12;}if((k[0]==12)&&(k[1]==12)&&(k[2]==0)){k[0]=12;k[1]=12;k[2]=12;}for(seg=0;seg<4;seg++){display_number(lin,col,k[seg]);col=col+10;}}void display_signed_int(unsigned char lin,unsigned int col,signed int dat){unsigned int seg;unsigned char k[5],a;k[0]=12;if(dat<0){dat=(~dat)+1;k[0]=11;}k[4]=dat%10;k[3]=((dat/10)%10);k[2]=((dat/100)%10);k[1]=((dat/1000)%10);a=k[0];if(k[1]==0) {k[0]=12;k[1]=a;}if((k[1]==a)&&(k[2]==0)){ k[0]=12;k[1]=12;k[2]=a;}if((k[1]==12)&&(k[2]==a)&&(k[3]==0)){k[0]=12;k[1]=12;k[2]=12;k[3]=a;}for(seg=0;seg<5;seg++){display_number(lin,col,k[seg]);col=col+10;}}void display_unsigned_char(unsigned char lin,unsigned int col,unsigned char dat) {unsigned int seg;unsigned char k[3];k[1]=dat%10;k[0]=((dat/10)%10);for(seg=0;seg<2;seg++){display_number(lin,col,k[seg]);col=col+10;}}2、LCD.h#include <reg51.h>#include <absacc.h>#ifndef __LCD__#define __LCD__#define CWADD1 XBYTE[0x8000]#define DWADD1 XBYTE[0x8001]#define CRADD1 XBYTE[0x8002]#define DRADD1 XBYTE[0x8003]#define CWADD2 XBYTE[0x8004]#define DWADD2 XBYTE[0x8005]#define CRADD2 XBYTE[0x8006]#define DRADD2 XBYTE[0x8007]extern void LCD_Init();extern void display_cn(unsigned char lin,unsigned int col,unsigned int len,unsigned char *p);extern void display_signed_int(unsigned char lin,unsigned int col,signed int dat);extern void display_unsigned_int(unsigned char lin,unsigned int col,unsigned int dat);extern void display_unsigned_char(unsigned char lin,unsigned int col,unsigned char dat);extern void LCD_Clear(void);#endif3、DS18B20.c#include <reg51.h>#include "string.h"#include "intrins.h"#include "DS18B20.h"sbit DQ=P1^0;void delay(unsigned int uSeconds){for(;uSeconds>0;uSeconds--);}unsigned char ow_reset(void){unsigned char xdata presence;DQ = 0;delay(48);DQ = 1;delay(7);presence = DQ;delay(48);return(presence);}unsigned char read_byte(void){unsigned char i;unsigned char value = 0;for (i=8;i>0;i--){value>>=1;DQ = 0; // pull DQ low to start read timeslotDQ = 1; // then rlease DQ_nop_();_nop_();_nop_();_nop_();_nop_(); // read DQ data at 1 to 15us,here delay 6us;if(DQ)value|=0x80;delay(7); // wait for rest of timeslot,72us }return(value);}void write_byte(char val){unsigned char i;for (i=8; i>0; i--) // writes byte, one bit at a time{DQ = 0; // pull DQ low to start timeslotDQ = val&0x01;delay(7); // hold value for remainder of timeslot,here 72us DQ = 1;val=val/2;}delay(5);}float Read_Temperature(void){unsigned char Hdata,Ldata,b;int a;bit flag;float x,y,z;ow_reset();write_byte(0xCC); // Skip ROMwrite_byte(0xBE); // Read Scratch Paddelay(100);Ldata=read_byte(); // Low byte firstHdata=read_byte(); // High byte afterow_reset();write_byte(0xCC); //Skip ROMwrite_byte(0x44); // Start Conversiona=Hdata*256+Ldata;x=(float)(Ldata&0x0f);x=x/16;if(a<0)flag=1;else flag=0;b=a>>4;z=(float)(b);if(flag==1){b=~b+1;z=(float)(b);z=0-z;}y=z+x;return y;}4、DS18B20.h#ifndef __DS18B20__#define __DS18B20__extern float Read_Temperature(void); #endif5、main.c#include <reg51.h>#include<LCD.h>#include<main.h>#include "DS18B20.h"void wait(unsigned int x){unsigned int i;i=0;for(i=0;i<x;i++);}void main(void){float F;signed int a;LCD_Init();LCD_Clear();display_cn(0,20,5,szwdj);display_cn(1,0,3,wdz);while(1){F=Read_Temperature( );a=(signed int)F;display_signed_int(1,40,a);wait(5000);}}6、main.h#ifndef MAIN_H__#define MAIN_H__// 中文字模库16x16点阵code unsigned char szwdj[]={ //纵向字节倒序。

51单片机温度采集与显示设计

51单片机温度采集与显示设计

51单片机温度采集与显示设计前言在现代科技快速发展的时代,物联网技术已经深入各行各业,其广泛应用促使了传感器技术的日益普及。

而温度传感器作为一种常用的传感器类型,广泛应用于环境监测、工业自动化以及生活中的智能家居等领域。

本文将介绍如何利用51单片机进行温度采集与显示的设计。

一、硬件设计1.1 温度传感器选择在温度传感器的选择方面,我们可以根据不同的应用需求选择不同类型的传感器。

例如,当我们需要测量较高温度范围时,可以选择热电偶传感器;而当需要测量精度较高的低温范围时,可以选择PT100温度传感器。

根据具体应用需求选择合适的温度传感器非常重要。

1.2 电路设计对于51单片机温度采集与显示设计,我们需要设计一个简单的电路来连接温度传感器和单片机。

电路主要包括温度传感器、AD转换芯片以及显示模块。

具体电路连接关系如下图所示:(图略)二、软件设计2.1 单片机编程环境搭建在进行51单片机编程之前,我们需要搭建相应的编程环境。

常用的51单片机编程软件有Keil MDK等,我们根据实际情况选择适合自己的编程软件,并进行相应的安装和配置。

2.2 代码编写在代码编写方面,我们可以利用C语言编写相应的程序来实现温度采集与显示的功能。

首先,我们需要初始化相应的引脚和寄存器,配置AD转换芯片以及显示模块。

接着,我们可以借助单片机的AD转换功能获取温度传感器的电压信号,并通过相应的算法将电压转换为温度数值。

最后,将获取到的温度数值通过显示模块展示出来。

三、实验结果与应用3.1 实验结果通过实验,我们成功地设计出了一个基于51单片机的温度采集与显示系统。

系统可以准确地采集温度传感器的信号,并将温度数值以数字形式显示在屏幕上。

通过对比实际温度和显示数值,可以发现系统具有较高的测量精度和稳定性。

3.2 应用前景基于51单片机的温度采集与显示系统可以广泛应用于各个领域。

在工业自动化中,可以用于实时监测设备的温度,并及时采取措施以防止设备过热。

MAX6675热电偶测温—51单片机C语言程序.c

MAX6675热电偶测温—51单片机C语言程序.c
//在51单片机中_nop_()等于空12个时钟周期【即一个机器周期】
CS=0;
for(i=0;i<16;i++)//16位数据读取
{
Temp_2<<=1;//向右移一位
_nop_();
SCK=1;//上升
if(SO==1){Temp_2=Temp_2|0x01;}
P0=table3[ge];
dula=1; dula=来自; wela=0; P0=0x7b;
wela=1;
wela=0;
delay(1);
dula=0;
P0=table3[xiao];
dula=1;
dula=0;
else Temp_2=Temp_2|0x00;
_nop_();
SCK=0;
_nop_();
}
CS=1; //读取完后对CS置1进行温度转换!MAX6675的转换时间是典型值:0.17s,最大值0.22s。
wela=0;
P0=0x77;
wela=1;
wela=0;
delay(1);
}
void main()//主程序
{
while(1)
{
for(j=250;j>0;j--)
{
if(j==250){wendu=Re_Convert();}
temp=temp/10;
shi =temp%10;//取十位数字
bai =temp/10;//去百位数字
//动态扫描显示各位数字
dula=0;
P0=table3[bai];
dula=1;

51单片机温度计程序

51单片机温度计程序
4)在倒计时状态复位情况下,可通过按动KADD或KSUB键进行时间的递增或递减调整,调整步长为10秒。当数值小于10以后,下调步长为1秒。
5)在计时状态停止时按动KFUN键可复位计时时间
6)按动KFUN键可启动或停止计时
7)在计时过程中按动KADD或KSUB键,可暂停计时和连续计时
8)倒顺计时的任意情况下按动KSET键,可退出计时回到正常的时钟状态
//uchar DB_tmp[5]; //存放从键盘输入的密码
uchar Disp[4];//显示寄存器
uchar Bset=0;//功能状态寄存器。
uchar error;//记录密码错误状态
uchar hold=50;//蜂鸣器保持时间。
uchar msecl,msec,second;//10毫秒,0.5秒,秒计时单元。
write_byte(0x44);//发出温度转换命令
delay(70);//800us
ow_reset();//p
for(i=32;i>0;i--);
write_byte(0xcc);
write_byte(0xbe);//发出读温度命令
for(i=2;i>0;i--);
5、单灯亮时,需要输入正确密码,亮起双灯才能修改密码
6、长按Kset键,系统锁定,红灯亮起
三、温度模块
可设定报警温度上限和下限。温度超限时,发出蜂鸣报警声。
1、在时间模块,通过长按set键进入温度模块。
2、在温度模块下,按动up键进入温度上限设置。按动down键,进入温度下限报警设置。
void delay(uchar i)
{
uchar j;

基于51单片机的1602液晶显示温度和时间的C程序

基于51单片机的1602液晶显示温度和时间的C程序

//液晶显示温度#include "AT89X52.H"#define Ddata P0sbit RS=P2^7; //命令数据控制端sbit RW=P2^6; //读写选择端sbit LCDE=P2^5; //液晶使能端sbit DQ=P2^0; //ds18b20与单片机连接口#define uchar unsigned char#define uint unsigned intunsigned char hour=0,min=0,sec=0; //定义初值unsigned int count=0;unsigned char line1[16]={" temp: "}; //16个字符unsigned char line2[16]={" time: 00:00:00"}; //16个字符unsigned char tab[]={'0','1','2','3','4','5','6','7','8','9'}; //数组uchar data disdata[5];uint tvalue; //温度值uchar tflag; //温度正负标志void time();/*************************lcd1602程序**************************/ void delay1ms(unsigned int ms)//延时1毫秒(不够精确的){unsigned int i,j;for(i=0;i<ms;i++)for(j=0;j<110;j++);}void delay5ms()//延时5毫秒(不够精确的){unsigned int i;for (i=0;i<1000;i++);}void delay50us(){register int i;for (i=0;i<20;i++);}void delay(){unsigned char m,n;for(m=255;m>0;m--)for(n=255;n>0;n--);}void wr_com(unsigned char comm) //********写控制字符程序E=1 RS=0RW=0 **********//{LCDE=0; //使能端RS=0; //********RS寄存器选择输入端,当RS=0;当进行写模块操作,指向指令寄存器。

基于51单片机——Ds18B20温度采集,LCD显示汇编程序(附带proteus仿真图)

基于51单片机——Ds18B20温度采集,LCD显示汇编程序(附带proteus仿真图)

TEMP_ZH EQU 24H ;实测温度值存放单元TEMPL EQU 25HTEMPH EQU 26HTEMP_TH EQU 27H ;高温报警值存放单元TEMP_TL EQU 28H ;低温报警值存放单元TEMPHC EQU 29H ;正、负温度值标记TEMPLC EQU 2AHTEMPFC EQU 2BHK1 EQU P1.4 ;查询按键K2 EQU P1.5 ;设置/调整键K3 EQU P1.6 ;调整键K4 EQU P1.7 ;确定键BEEP EQU P3.7 ;蜂鸣器RELAY EQU P1.3 ;指示灯LCD_X EQU 2FH ;LCD 字符显示位置LCD_RS EQU P2.0 ;LCD 寄存器选择信号 LCD_RW EQU P2.1 ;LCD 读写信号LCD_EN EQU P2.2 ;LCD 允许信号FLAG1 EQU 20H.0 ;DS18B20是否存在标志 KEY_UD EQU 20H.1 ;设定按键的增、减标志 DQ EQU P3.3 ;DS18B20数据信号ORG 0000HLJMP MAINORG 0030HMAIN: MOV SP,#60HMOV A,#00HMOV R0,#20H ;将20H~2FH 单元清零MOV R1,#10HCLEAR: MOV @R0,AINC R0DJNZ R1,CLEARLCALL SET_LCDLCALL RE_18B20START: LCALL RST ;调用18B20复位子程序JNB FLAG1,START1 ;DS1820不存在LCALL MENU_OK ;DS1820存在,调用显示正确信息子程序MOV TEMP_TH,#055H ;设置TH初值85度MOV TEMP_TL,#019H ;设置TL初值25度LCALL RE_18B20A ;调用暂存器操作子程序LCALL WRITE_E2 ;写入DS18B20LCALL TEMP_BJ ;显示温度标记JMP START2START1: LCALL MENU_ERROR ;调用显示出错信息子程序 LCALL TEMP_BJ ;显示温度标记SJMP $START2: LCALL RST ;调用DS18B20复位子程序JNB FLAG1,START1 ;DS18B20不存在MOV A,#0CCH ;跳过ROM匹配命令LCALL WRITEMOV A,#44H ;温度转换命令LCALL WRITELCALL RSTMOV A,#0CCH ;跳过ROM匹配LCALL WRITEMOV A,#0BEH ;读温度命令LCALL WRITELCALL READ ;调用DS18B20数据读取操作子程序LCALL CONVTEMP ;调用温度数据BCD 码处理子程序LCALL DISPBCD ;调用温度数据显示子程序LCALL CONV ;调用LCD显示处理子程序LCALL TEMP_COMP ;调用实测温度值与设定温度值比较子程序LCALL PROC_KEY ;调用键扫描子程序SJMP START2 ;循环;*************************** 键扫描子程序*****************************PROC_KEY:JB K1,PROC_K1LCALL BEEP_BLJNB K1,$MOV DPTR,#M_ALAX1MOV A,#1LCALL LCD_PRINTLCALL LOOK_ALARMJB K3,$LCALL BEEP_BLJMP PROC_K2PROC_K1: JB K2,PROC_ENDLCALL BEEP_BLJNB K2,$MOV DPTR,#RST_A1MOV A,#1LCALL LCD_PRINTLCALL SET_ALARMLCALL RE_18B20 ;将设定的TH,TL值写入DS18B20LCALL WRITE_E2PROC_K2: LCALL MENU_OKLCALL TEMP_BJPROC_END:RET;*************************** 设定温度报警值TH、TL ***************************SET_ALARM:LCALL LOOK_ALARMAS0: JB K1,AS00LCALL BEEP_BLJNB K1,$CPL 20H.1 ;UP/DOWN 标记AS00: JB 20H.1,ASZ01 ;20H.1=1,增加JMP ASJ01 ;20H.1=0,减小ASZ01: JB K2,ASZ02 ;TH值调整(增加)LCALL BEEP_BLINC TEMP_THMOV A,TEMP_THCJNE A,#120,ASZ011MOV TEMP_TH,#0ASZ011: LCALL LOOK_ALARMLCALL DELAYJMP ASZ01ASZ02: JB K3,ASZ03 ;TL值调整(增加) LCALL BEEP_BLINC TEMP_TLMOV A,TEMP_TLCJNE A,#99,ASZ021MOV TEMP_TL,#00HASZ021: LCALL LOOK_ALARMMOV R5,#10LCALL DELAYJMP ASZ02ASZ03: JB K4,AS0 ;确定调整LCALL BEEP_BLJNB K4,$RETASJ01: JB K2,ASJ02 ;TH值调整(减少) LCALL BEEP_BLDEC TEMP_THMOV A,TEMP_THCJNE A,#0FFH,ASJ011ASJ011: LCALL LOOK_ALARMMOV R5,#10LCALL DELAYJMP AS0ASJ02: JB K3,ASJ03 ;TL值调整(减少)LCALL BEEP_BLDEC TEMP_TLMOV A,TEMP_TLCJNE A,#0FFH,ASJ021JMP ASJ022ASJ021: LCALL LOOK_ALARM ;MOV R5,#10LCALL DELAYJMP AS0ASJ022: CPL 20H.1JMP ASZ01ASJ03: JMP ASZ03RETRST_A1: DB " SET ALERT CODE " ,0;*********************** 实测温度值与设定温度值比较子程序**********************TEMP_COMP:MOV A,TEMP_THSUBB A,TEMP_ZH ;减数>被减数,则JC CHULI1 ;借位标志位C=1,转 MOV A,TEMPFCCJNE A,#0BH,COMPSJMP CHULI2COMP: MOV A,TEMP_ZHSUBB A,TEMP_TL ;减数>被减数,则JC CHULI2 ;借位标志位C=1,转MOV DPTR,#BJ5LCALL TEMP_BJ3CLR RELAY ;点亮指示灯RETCHULI1: MOV DPTR,#BJ3LCALL TEMP_BJ3SETB RELAY ;熄灭指示灯LCALL BEEP_BL ;蜂鸣器响RETCHULI2: MOV DPTR,#BJ4LCALL TEMP_BJ3SETB RELAY ;熄灭指示灯LCALL BEEP_BL ;蜂鸣器响RET;-----------------------------------------TEMP_BJ3: MOV A,#0CEHLCALL WCOMMOV R1,#0MOV R0,#2BBJJ3: MOV A,R1MOVC A,@A+DPTRLCALL WDATAINC R1DJNZ R0,BBJJ3RETBJ3: DB ">H"BJ4: DB "<L"BJ5: DB " !";;**************************** 显示温度标记子程序***************************TEMP_BJ: MOV A,#0CBHLCALL WCOMMOV DPTR,#BJ1 ;指针指到显示消息MOV R1,#0MOV R0,#2BBJJ1: MOV A,R1MOVC A,@A+DPTRLCALL WDATAINC R1DJNZ R0,BBJJ1RETBJ1: DB 00H,"C";******************************** 显示正确信息子程序***************************MENU_OK: MOV DPTR,#M_OK1 ;指针指到显示消息MOV A,#1 ;显示在第一行LCALL LCD_PRINTMOV DPTR,#M_OK2 ;指针指到显示消息MOV A,#2 ;显示在第一行LCALL LCD_PRINTRETM_OK1: DB " DS18B20 OK ",0M_OK2: DB " TEMP: ",0;******************************** 显示出错信息子程序***************************MENU_ERROR:MOV DPTR,#M_ERROR1 ;指针指到显示消息MOV A,#1 ;显示在第一行LCALL LCD_PRINTMOV DPTR,#M_ERROR2 ;指针指到显示消息1MOV A,#2 ;显示在第一行LCALL LCD_PRINTRETM_ERROR1: DB " DS18B20 ERROR ",0M_ERROR2: DB " TEMP: ---- ",0;****************************DS18B20复位子程序*****************************RST: SETB DQNOPCLR DQMOV R0,#6BH ;主机发出延时复位低脉冲MOV R1,#04HTSR1: DJNZ R0,$MOV R0,#6BHDJNZ R1,TSR1SETB DQ ;拉高数据线NOPNOPNOPMOV R0,#32HTSR2: JNB DQ,TSR3 ;等待DS18B20回应DJNZ R0,TSR2JMP TSR4 ; 延时TSR3: SETB FLAG1 ; 置1标志位,表示DS1820存在JMP TSR5TSR4: CLR FLAG1 ; 清0标志位,表示DS1820不存在 JMP TSR7TSR5: MOV R0,#06BHTSR6: DJNZ R0,$ ; 时序要求延时一段时间TSR7: SETB DQRET;************************ DS18B20暂存器操作子程序***************************RE_18B20:JB FLAG1,RE_18B20ARETRE_18B20A:LCALL RSTMOV A,#0CCH ;跳过ROM匹配LCALL WRITEWR_SCRAPD:MOV A,#4EH ;写暂器LCALL WRITEMOV A,TEMP_TH ;TH(报警上限)LCALL WRITEMOV A,TEMP_TL ;TL(报警下限)LCALL WRITEMOV A,#7FH ;12位精度LCALL WRITERET;************************ 复制暂存器子程序*******************************WRITE_E2:LCALL RSTMOV A,#0CCH ;跳过ROM匹配LCALL WRITEMOV A,#48H ;把暂存器里的温度报警值拷贝到EEROMLCALL WRITERET;*********************** 重读EEROM子程序********************************READ_E2:LCALL RSTMOV A,#0CCH ;跳过ROM匹配LCALL WRITEMOV A,#0B8H ;把EEROM里的温度报警值拷贝回暂存器LCALL WRITERET;************************ 将自定义字符写入LCD的CGRAM中*********************STORE_DATA:MOV A,#40HLCALL WCOMMOV R2,#08HMOV DPTR,#D_DATAMOV R3,#00HS_DATA: MOV A,R3MOVC A,@A+DPTRLCALL WDATA ;写入数据INC R3DJNZ R2,S_DATARETD_DATA: DB 0CH,12H,12H,0CH,00H,00H,00H,00H;*********************** DS18B20数据写入操作子程序************************WRITE: MOV R2,#8 ;一共8位数据CLR CWR1: CLR DQ ;开始写入DS18B20总线要处于复位(低)状态MOV R3,#07DJNZ R3,$ ;总线复位保持16微妙以上RRC A ;把一个字节DATA 分成8个BIT 环移给CMOV DQ,C ;写入一位MOV R3,#3CHDJNZ R3,$ ;等待100微妙SETB DQ ;重新释放总线NOPDJNZ R2,WR1 ;写入下一位SETB DQRET;********************** DS18B20数据读取操作子程序**************************READ: MOV R4,#4 ;将温度低位、高位、TH、TL从DS18B20中读出MOV R1,#TEMPL ;存入25H、26H、27H、28H单元RE00: MOV R2,#8RE01: CLR CYSETB DQNOPNOPCLR DQ ;读前总线保持为低NOPNOPNOPSETB DQ ;开始读总线释放MOV R3,#09 ;延时18微妙DJNZ R3,$MOV C,DQ ;从DS18B20总线读得一位MOV R3,#3CHDJNZ R3,$ ;等待100微妙RRC A ;把读得的位值环移给ADJNZ R2,RE01 ;读下一位MOV @R1,AINC R1DJNZ R4,RE00RET;************************ 温度值BCD 码处理子程序*************************CONVTEMP: MOV A,TEMPH ;判温度是否零下ANL A,#08HJZ TEMPC1 ;温度零上转CLR CMOV A,TEMPL ;二进制数求补(双字节)CPL A ;取反加1ADD A,#01HMOV TEMPL,AMOV A,TEMPHCPL AADDC A,#00HMOV TEMPH,AMOV TEMPHC,#0BH ;负温度标志MOV TEMPFC,#0BHSJMP TEMPC11TEMPC1: MOV TEMPHC,#0AH ;正温度标志MOV TEMPFC,#0AHTEMPC11: MOV A,TEMPHCSWAP AMOV TEMPHC,AMOV A,TEMPLANL A,#0FH ;乘0.0625MOV DPTR,#TEMPDOTTABMOVC A,@A+DPTRMOV TEMPLC,A ;TEMPLC LOW=小数部分 BCDMOV A,TEMPL ;整数部分ANL A,#0F0H ;取出高四位SWAP AMOV TEMPL,AMOV A,TEMPH ;取出低四位ANL A,#0FHSWAP AORL A,TEMPL ;重新组合MOV TEMP_ZH,ALCALL HEX2BCD1MOV TEMPL,AANL A,#0F0HSWAP AORL A,TEMPHC ;TEMPHC LOW = 十位数BCDMOV TEMPHC,AMOV A,TEMPLANL A,#0FHSWAP A ;TEMPLC HI = 个位数BCDORL A,TEMPLCMOV TEMPLC,AMOV A,R4JZ TEMPC12ANL A,#0FHSWAP AMOV R4,AMOV A,TEMPHC ;TEMPHC HI = 百位数BCDANL A,#0FHORL A,R4MOV TEMPHC,ATEMPC12: RET;************************ 二-十进制转换子程序*****************************HEX2BCD1: MOV B,#064HDIV ABMOV R4,AMOV A,#0AHXCH A,BDIV ABSWAP AORL A,BRETTEMPDOTTAB: DB 00H,00H,01H,01H,02H,03H,03H,04H ; 小数部分码表DB 05H,05H,06H,06H,07H,08H,08H,09H;********************** 查询温度报警值子程序***************************LOOK_ALARM: MOV DPTR,#M_ALAX2 ;指针指到显示信息区MOV A,#2 ;显示在第二行LCALL LCD_PRINTMOV A,#0C6HLCALL TEMP_BJ1MOV A,TEMP_TH ;加载TH数据MOV LCD_X,#3 ;设置显示位置LCALL SHOW_DIG2H ;显示数据MOV A,#0CEHLCALL TEMP_BJ1MOV A,TEMP_TL ;加载TL数据MOV LCD_X,#12 ;设置显示位置LCALL SHOW_DIG2L ;显示数据RETM_ALAX1: DB " LOOK ALERT CODE",0M_ALAX2: DB "TH: TL: ",0TEMP_BJ1: LCALL WCOMMOV DPTR,#BJ2 ;指针指到显示信息区 MOV R1,#0MOV R0,#2BBJJ2: MOV A,R1MOVC A,@A+DPTRLCALL WDATADJNZ R0,BBJJ2RETBJ2: DB 00H,"C";************************** LCD显示子程序**********************************SHOW_DIG2H: MOV B,#100DIV ABADD A,#30HPUSH BMOV B,LCD_XLCALL LCDP2POP BMOV A,#0AHXCH A,BDIV ABADD A,#30HINC LCD_XPUSH BMOV B,LCD_XLCALL LCDP2INC LCD_XMOV A,BMOV B,LCD_XADD A,#30HLCALL LCDP2RETSHOW_DIG2L: MOV B,#100DIV ABMOV A,#0AHXCH A,BDIV ABADD A,#30HPUSH BMOV B,LCD_XLCALL LCDP2POP BINC LCD_XMOV A,BMOV B,LCD_XADD A,#30HLCALL LCDP2RET;************************ 显示区BCD 码温度值刷新子程序**********************DISPBCD: MOV A,TEMPLCANL A,#0FHMOV 70H,A ;小数位MOV A,TEMPLCSWAP AANL A,#0FHMOV 71H,A ;个位MOV A,TEMPHCANL A,#0FHMOV 72H,A ;十位MOV A,TEMPHCSWAP AANL A,#0FHMOV 73H,A ;百位DISPBCD2: RET;*************************** LCD 显示数据处理子程序*************************CONV: MOV A,73H ;加载百位数据MOV LCD_X,#6 ;设置位置CJNE A,#1,CONV1JMP CONV2CONV1: CJNE A,#0BH,CONV11MOV A,#"-" ;"-"号显示JMP CONV111CONV11: MOV A,#" " ;"+"号不显示CONV111: MOV B,LCD_XLCALL LCDP2JMP CONV3CONV2: LCALL SHOW_DIG2 ;显示数据CONV3: INC LCD_XMOV A,72H ;十位LCALL SHOW_DIG2INC LCD_XMOV A,71H ;个位LCALL SHOW_DIG2INC LCD_XMOV A,#'.'MOV B,LCD_XLCALL LCDP2MOV A,70H ;加载小数点位INC LCD_X ;设置显示位置LCALL SHOW_DIG2 ;显示数据RET;*************************** 第二行显示数字子程序*************************SHOW_DIG2:ADD A,#30HMOV B,LCD_XLCALL LCDP2RET;*************************** 第二行显示数字子程序*************************LCDP2: PUSH ACCMOV A,B ;设置显示地址ADD A,#0C0H ;设置LCD的第二行地址LCALL WCOM ;写入命令POP ACC ;由堆栈取出ALCALL WDATA ;写入数据RET;*************************** 对LCD 做初始化设置及测试*************************SET_LCD: CLR LCD_ENLCALL INIT_LCD ;初始化 LCDLCALL STORE_DATA ;将自定义字符存入LCD的CGRAM RET;****************************** LCD初始化***********************************INIT_LCD: MOV A,#38H ;2行显示,字形5*7点阵LCALL WCOMLCALL DELAY1MOV A,#38HLCALL WCOMLCALL DELAY1MOV A,#38HLCALL WCOMLCALL DELAY1MOV A,#0CH ;开显示,显示光标,光标不闪烁 LCALL WCOMLCALL DELAY1MOV A,#01H ;清除 LCD 显示屏LCALL WCOMLCALL DELAY1RET;***************************** 清除LCD的第一行字符**************************CLR_LINE1:MOV A,#80H ;设置 LCD 的第一行地址LCALL WCOMMOV R0,#24 ;设置计数值C1: MOV A,#' ' ;载入空格符至LCDLCALL WDATA ;输出字符至LCDDJNZ R0,C1 ;计数结束RET;************************* LCD的第一行或第二行显示字符**********************LCD_PRINT:CJNE A,#1,LINE2 ;判断是否为第一行LINE1: MOV A,#80H ;设置 LCD 的第一行地址LCALL WCOM ;写入命令LCALL CLR_LINE ;清除该行字符数据MOV A,#80H ;设置 LCD 的第一行地址LCALL WCOM ;写入命令JMP FILLLINE2: MOV A,#0C0H ;设置 LCD 的第二行地址LCALL WCOM ;写入命令LCALL CLR_LINE ;清除该行字符数据MOV A,#0C0H ;设置 LCD 的第二行地址LCALL WCOMFILL: CLR A ;填入字符MOVC A,@A+DPTR ;由消息区取出字符CJNE A,#0,LC1 ;判断是否为结束码RETLC1: LCALL WDATA ;写入数据INC DPTR ;指针加1JMP FILL ;继续填入字符RET;*************************** 清除1行LCD 的字符****************************CLR_LINE: MOV R0,#24CL1: MOV A,#' 'LCALL WDATADJNZ R0,CL1RETDE: MOV R7,#250DJNZ R7,$RET;**************************** LCD 间接控制方式命令写入*************************WCOM: MOV P0,A ;写入命令CLR LCD_RS ;RS=L,RW=L,D0-D7=指令码,E=高脉冲 CLR LCD_RWSETB LCD_ENLCALL DELAY1CLR LCD_ENRET;**************************** LCD 间接控制方式数据写入*************************WDATA: MOV P0,A ;写入数据SETB LCD_RSCLR LCD_RWSETB LCD_ENLCALL DELCALL DERET;************************** 在LCD的第一行显示字符**************************LCDP1: PUSH ACCMOV A,B ;设置显示地址ADD A,#80H ;设置LCD的第一行地址LCALL WCOM ;写入命令POP ACC ;由堆栈取出ALCALL WDATA ;写入数据RET;****************************** 声光报警子程序*******************************BEEP_BL: MOV R6,#100BL2: LCALL DEX1CPL BEEPCPL RELAYDJNZ R6,BL2MOV R5,#10RETDEX1: MOV R7,#180DE2: NOPDJNZ R7,DE2RET;****************************** 延时子程序*******************************DELAY: MOV R6,#50DL1: MOV R7,#100DJNZ R7,$DJNZ R6,DL1DJNZ R5,DELAYRETDELAY1: MOV R6,#25 ;延时5毫秒DL2: MOV R7,#100DJNZ R7,$DJNZ R6,DL2RETEND。

51单片机显示温度程序

51单片机显示温度程序
{ 0,0,0,0,1,1,0 }, // = 3
{ 1,0,0,1,1,0,0 }, // = 4
{ 0,1,0,0,1,0,0 }, // = 5
digitalWrite(g, HIGH);
digitalWrite(p, HIGH);
}
// 点亮对应数字的数码管
void lightSegments(int x) {
for (int i = 0; i < 7; i++) {
digitalWrite(segs[i], seven_seg_digits[x][i]);
digitalWrite(d4, LOW);
switch(x)
{
case 1:
digitalWrite(d1, HIGH);
break;
case 2:
digitalWrite(d2, HIGH);
break;
case 3:
digitalWrite(d3, HIGH);
break;
default:
digitalWrite(d4, HIGH);
break;
}
}
void dispDec(int x) //设定开启小数点
{
digitalWrite(p, LOW);
}
void clearLEDs() //清屏
{
#include <OneWire.h>
#include <DallasTemperature.h>
#include <MsTimer2.h>
// 定义DS18B20数据口连接arduino的2号IO上

基于51单片机数字温度计的设计与实现

基于51单片机数字温度计的设计与实现

基于51单片机数字温度计的设计与实现数字温度计是一种能够测量环境温度并显示数值的设备。

基于51单片机的数字温度计设计与实现是指利用51单片机作为核心,结合温度传感器和其他辅助电路,实现一个能够测量温度并通过数码管显示温度数值的系统。

本文将从硬件设计和软件实现两个方面介绍基于51单片机数字温度计的具体设计与实现过程。

一、硬件设计1. 温度传感器选取在设计数字温度计时,首先需要选取合适的温度传感器。

市面上常用的温度传感器有热敏电阻、功率型温度传感器(如PT100)、数字温度传感器(如DS18B20)等。

根据设计需求和成本考虑,我们选择使用DS18B20数字温度传感器。

2. 电路设计基于51单片机的数字温度计的电路设计主要包括单片机与温度传感器的连接、数码管显示电路和电源电路。

(1)单片机与温度传感器的连接在电路中将51单片机与DS18B20数字温度传感器相连接,可采用一线总线的方式。

通过引脚的连接,实现单片机对温度传感器的读取控制。

(2)数码管显示电路为了能够显示温度数值,我们需要设计一个数码管显示电路。

根据温度传感器测得的温度值,通过数字转换和数码管驱动,将温度数值显示在数码管上。

(3)电源电路电源电路采用稳压电源设计,保证整个系统的稳定供电。

根据实际需求选择合适的电源电压,并添加滤波电容和稳压芯片,以稳定电源输出。

3. PCB设计根据电路设计的原理图,进行PCB设计。

根据电路元件的布局和连线的走向,绘制PCB板的线路、元件和连接之间。

二、软件实现1. 单片机的编程语言选择对于基于51单片机的数字温度计的软件实现,我们可以选择汇编语言或者C语言进行编程。

汇编语言的效率高,但编写难度大;C语言的可读性好,开发效率高。

根据实际情况,我们选择使用C语言进行编程。

2. 温度传感器数据获取利用单片机的IO口与温度传感器相连,通过一线总线协议进行数据的读取。

根据温度传感器的通信规则,编写相应的代码实现数据的读取。

51单片机数码管显示温度程序

51单片机数码管显示温度程序

//项目:数码管温度显示器//编写:LGY//功能:数码管显示温度#include"reg52。

h”#include"intrins.h”#define uchar unsigned char#define uint unsigned int//******************位定义*******************************//sbit RX =P3^0;sbit TX =P3^1;sbit RX_TX_con =P3^2;//sbit Fre_check =P3^5;sbit DQ =P3^5;sbit SDA =P3^6;sbit SCL =P3^7;sbit LED_1 =P0^2;sbit LED_2 =P0^0;sbit LED_3 =P0^1;sbit LED_4 =P0^3;unsigned char a1,a2,a3,a4;unsigned int temper;unsigned char code displaycode[]={// 0 1 2 3 4 5 6 7 8 90x28,0xee,0x32,0xa2,0xe4, 0xa1,0x21, 0xea, 0x20, 0xa0,};unsigned char code displaycode1[]={// 0。

1。

2. 3。

4。

5. 6。

7. 8。

9。

0x08,0xce, 0x12,0x82,0xc4,0x81,0x01, 0xca, 0x00, 0x80, };void INT(){P0=0xff;P1=0xff;P2=0;P3=0;DQ=1;// Fre_check=1;}void Delay(uint x){uint a,b;for(a=x;a>0;a—-)for(b=110;b〉0;b-—);}/*void Delay1(uint x,uchar y){uint i;uchar j;for(i=x;i〉0;i--);for(j=y;j〉0;j-—);}void reset(){unsigned char st=1;Fre_check=1;//_nop_();//_nop_();while(st){Fre_check=0;Delay1(70,30);Fre_check=1;Delay1(4,4);if(Fre_check==1) st=1;else st=0;Delay1(50,10);}}void write_byte(unsigned char date){unsigned char temp,i;Fre_check=1;//_nop_();//_nop_();for(i=8;i>0;i--){temp=date&0x01;Fre_check=0;//Delay1(1);_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();if(temp==1) Fre_check=1;Delay1(2,2);Fre_check=1;date=date〉>1;}}unsigned char read_byte(){unsigned char i,date;static bit j;for(i=8;i>0;i—-){date=date〉>1;Fre_check=1;_nop_();_nop_();Fre_check=0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();Fre_check=1;_nop_();_nop_();_nop_();_nop_();j=Fre_check;if(j==1)date=date|0x08;Delay1(1,1);}return (date);}*/void delay1(int b){int s;for (s = 0;s 〈b;s++);}unsigned char ow_reset(void){unsigned char presence;DQ = 0;//pull DQ line lowdelay1(29);// leave it low for 480μsDQ = 1; // allow line to return highdelay1(3);// wait for presencepresence = DQ;// get presence signaldelay1(25); // wait for end of timeslotreturn(presence);// presence signal returned}// presence = 0,no part = 1unsigned char read_bit(void){unsigned char i;DQ = 0;// pull DQ low to start timeslotDQ = 1; // then return highfor (i = 0; i 〈3; i++);// delay 15μs fromstart of timeslot return(DQ); // return value of DQ line}void write_bit(char bitval){DQ = 0;// pull DQ low to start timeslotif(bitval==1)DQ =1; // return DQ high if write 1delay1(5);// hold value for remainder of timeslotDQ = 1;}// Delay provides 16μs per loop,plus 24μs//Therefore, delay(5) = 104μsunsigned char read_byte(void){unsigned char i;unsigned char value = 0;for (i = 0;i < 8;i++){if(read_bit())value=value|0x01〈〈i;// reads byte in,one byte at a time and then// shifts it leftdelay1(6); // wait for rest of timeslot}return(value);}void write_byte(char val){unsigned char i;unsigned char temp;for (i = 0;i < 8;i++)// writes byte,one bit at a time{temp = val〉>i; // shifts val right ‘i’ spacestemp &= 0x01; // copy that bit to tempwrite_bit(temp);// write bit in temp into}delay1(5);}void DisplayLed(uchar num1,uchar num2,uchar num3,uchar num4){LED_1=0;LED_2=1;LED_3=1;LED_4=1;P1=displaycode[num1];Delay(3);LED_1=1;LED_2=0;LED_3=1;LED_4=1;P1=displaycode1[num2];Delay(3);LED_1=1;LED_2=1;LED_3=0;LED_4=1;P1=displaycode[num3];Delay(3);LED_1=1;LED_2=1;LED_3=1;LED_4=0;P1=displaycode[num4];Delay(3);}void Get_tem(){unsigned char tem1,tem2,num;float aaa;int temper;ow_reset(); //复位write_byte(0xCC);//跳过ROMwrite_byte(0x44);//温度转换for(num=1000;num>0;num--)DisplayLed(a1,a2,a3,a4);ow_reset();write_byte(0xCC);write_byte(0xBE);tem1=read_byte();tem2=read_byte();aaa=(tem2*256+tem1)*6.25;temper=(int)aaa;a1=temper/1000;a2=temper%1000/100;a3=temper%100/10;a4=temper%10;}void main(){unsigned char num=0;INT();while(1){Get_tem();}}。

C51单片机 温度计 C语言程序

C51单片机 温度计 C语言程序
disp_buff[0][3]=min%10;
disp_buff[0][4]=sec/10;
disp_buff[0][5]=sec%10;
//
disp_buff[1][0]=f;/*符号位*/
disp_buff[1][1]=TMP/1000;//百位
disp_buff[1][2]=TMP/100%10; /*十位*/
uchar KeyBuff;
code unsigned char Tab1[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x40,0x79,0x24,0x30,0x19,0x12,0x02,
0x78,0x00,0x10,0xbf,0xff,0xc6};
{
unsigned int i;
unsigned char j;
bit testb;
for (j=1;j<=8;j++)
ቤተ መጻሕፍቲ ባይዱ
testb = dat & 0x01;
TL0=(unsigned char)(65536-4000);
Count4ms=Count4ms+1;
if (Count4ms==250)
{
Count4ms=0;
SecFlag=1;
}
P2_buff=Tab[disp_cnt];
if (KeyDownFlg)
}
//check data
hour=CheckData(hour,24);
min=CheckData(min,60);
sec=CheckData(sec,60);
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
temp=f_temp*10+0.5; //乘以10表示小数点后面只取1位,加0.5是四舍五入
f_temp=f_temp+0.05;
return temp; //temp是整型
}
////////////////////显示程序//////////////////////////
PCON = 0x00;
SCON = 0x50;
TH1 = 0xFd;
TL1 = 0xFd;
TR1 = 1;
}
void main()
{
uchar buff[4],i;
dula=0;
wela=0;
init_com();
while(1)
{
tempchange();
}
else
{
ds=0; //写 0
i=8;while(i&gt;0)i--;
ds=1;
i++;i++;
}
}
}
void tempchange(void) //DS18B20 开始获取温度并转换
{
dsreset();
delay(1);
tempwritebyte(0xcc); // 写跳过读ROM指令
delay(1);
}
void dis_temp(uint t)
{
uchar i;
i=t/100;
display(0,i);
i=t%100/10;
display(1,i+10);
i=t%100%10;
display(2,i);
}
void init_com(void)
{
TMOD = 0x20;
a=tempread(); //读低8位
b=tempread(); //读高8位
temp=b;
temp&lt;&lt;=8; //两个字节组合为1个字
temp=temp|a;
f_temp=temp*0.0625; //温度在寄存器中为12位 分辨率位0.0625°
dat=0;
for(i=1;i&lt;=8;i++)
{
j=tempreadbit();
dat=(j&lt;&lt;7)|(dat&gt;&gt;1); //读出的数据最低位在最前面,这样刚好一个字节在DAT里
}
return(dat);
}
void tempwritebyte(uchar dat) //向18B20写一个字节数据
tempwritebyte(0x44); // 写温度转换指令
}
uint get_temp() //读取寄存器中存储的温度数据
{
uchar a,b;
dsreset();
delay(1);
tempwritebyte(0xcc);
tempwritebyte(0xbe);
{
uint i;
bit dat;
ds=0;i++; //i++ 起延时作用
ds=1;i++;i++;
dat=ds;
i=8;while(i&gt;0)i--;
return (dat);
}
uchar tempread(void) //读1个字节
{
uchar i,j,dat;
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0xbf,0x86,
0xdb,0xcf,0xe6,0xed,
0xfd,0x87,0xff,0xef}; //不带小数点的编码
void delay(uint z)//延时函数
{
uint x,y;
for(x=z;x&gt;0;x--)
sbit ds=P2^2; //温度传感器信号线
sbit dula=P2^6; //数码管段选线
sbit wela=P2^7; //数码管位选线
uint temp;
float f_temp;
unsigned char code table[]={
0x3f,0x06,0x5b,0x4f,
ห้องสมุดไป่ตู้ #include &lt;reg52.h&gt;
#include &lt;stdio.h&gt;
#define uchar unsigned char
#define uint unsigned int
void display(uchar num,uchar dat)
{
uchar i;
dula=0;
P0=table[dat];
dula=1;
dula=0;
wela=0;
i=0XFF;
i=i&amp;(~((0X01)&lt;&lt;(num)));
P0=i;
wela=1;
wela=0;
{
uint i;
uchar j;
bit testb;
for(j=1;j&lt;=8;j++)
{
testb=dat&amp;0x01;
dat=dat&gt;&gt;1;
if(testb) //写 1
{
ds=0;
i++;i++;
ds=1;
i=8;while(i&gt;0)i--;
for(y=110;y&gt;0;y--);
}
void dsreset(void) //18B20复位,初始化函数
{
uint i;
ds=0;
i=103;
while(i&gt;0)i--;
ds=1;
i=4;
while(i&gt;0)i--;
}
bit tempreadbit(void) //读1位函数
for(i=10;i&gt;0;i--)
{
dis_temp(get_temp());}
sprintf(buff,&quot;%f&quot;,f_temp);
}
}
相关文档
最新文档