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;}液晶显示温度计程序。
51单片机测并温显示
要求:测当前温度,并在数码管上显示晶振:11.0592MH程序如下:#include <reg52.h>#define uchar unsigned char#define uint unsigned intsbit DS=P2^2; //define interfaceuint temp; // variable of temperatureuchar flag1; // sign of the result positive or negativesbit dula=P2^6;sbit wela=P2^7;unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; unsigned char code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};void delay(uint count) //delay{uint i;while(count){i=200;while(i>0)i--;count--;}}void dsreset(void) //send reset and initialization command{uint i;DS=0;i=103;while(i>0)i--;DS=1;i=4;while(i>0)i--;}bit tmpreadbit(void) //read a bit{uint i;bit dat;DS=0;i++; //i++ for delayDS=1;i++;i++;dat=DS;i=8;while(i>0)i--;return (dat);}uchar tmpread(void) //read a byte date{uchar i,j,dat;dat=0;for(i=1;i<=8;i++){j=tmpreadbit();dat=(j<<7)|(dat>>1); //读出的数据最低位在最前面,这样刚好一个字节在DAT里}return(dat);}void tmpwritebyte(uchar dat) //write a byte to ds18b20{uint i;uchar j;bit testb;for(j=1;j<=8;j++){testb=dat&0x01;dat=dat>>1;if(testb) //write 1{DS=0;i++;i++;DS=1;i=8;while(i>0)i--;}else{DS=0; //write 0i=8;while(i>0)i--;DS=1;i++;i++;}}}void tmpchange(void) //DS18B20 begin change{dsreset();delay(1);tmpwritebyte(0xcc); // address all drivers on bustmpwritebyte(0x44); // initiates a single temperature conversion }uint tmp() //get the temperature{float tt;uchar a,b;dsreset();delay(1);tmpwritebyte(0xcc);tmpwritebyte(0xbe);a=tmpread();b=tmpread();temp=b;temp<<=8; //two byte compose a int variable temp=temp|a;tt=temp*0.0625;temp=tt*10+0.5;return temp;}void display(uint temp) //显示程序{uchar A1,A2,A2t,A3;A1=temp/100;A2t=temp%100;A2=A2t/10;A3=A2t%10;dula=0;P0=table[A1]; //显示百位dula=1;dula=0;wela=0;P0=0x7e;wela=1;wela=0;delay(1);dula=0;P0=table1[A2]; //显示十位dula=1;dula=0;wela=0;P0=0x7d;wela=1;wela=0;delay(1);P0=table[A3]; //显示个位dula=1;dula=0;P0=0x7b;wela=1;wela=0;delay(1);}void main(){uchar a;do{tmpchange();for(a=10;a>0;a--){display(tmp());}} while(1);}。
51单片机设计数字温度计(流程图+源码+实物图片)
DS18B20获取温度程序流程图DS18B20的读字节,写字节,获取温度的程序流程图如图所示结束DS18B20初始化程序流程图写0x44启动DS18B20延时500 s_____ 、一DS18B20 初始化写0xcc跳过读RCMDS18B20获取温度程序流程图DS18B20读字节程序流程图图3-4 DS18B20程序流程图DS18B20写字节程序流程图显示程序设计显示电路是由四位一体的数码管来实现的。
由于单片机的I/O 口有限,所以数码管采用动态扫描的方式来进行显示。
程序流程图如图所示。
图显示程序流程图按键程序设计按键是用来设定上下限报警温度的。
具体的程序流程图如图所示N附 1 源程序代码******************************************************************* 程序名 ; 基于 DS18B20 的测温系统* 功 能: 实时测量温度,超过上下限报警,报警温度可手动调整。
K1 是用来 * 进入上下限调节模式的,当按一下 K1 进入上限调节模式,再按一下进入下限 * 调节模式。
在正常模式下,按一下K2 进入查看上限温度模式,显示 1s 左右自动* 退出;按一下 K3 进入查看下限温度模式,显示 1s 左右自动退出;按一下 K4 消除 * 按键音,再按一下启动按键音。
在调节上下限温度模式下, K2 是实现加 1 功能, * K1 是实现减 1 功能, K3 是用来设定上下限温度正负的。
* 编程者: ZPZ * 编程时间: 2009/10/2*******************************************************************bit s=0;〃s 是调整上下限温度时温度闪烁的标志位, s=0不显示200ms , s=1 显示 1s 左右bit s1=0; void display1(uint z); #include"ds18b20.h" //s1 标志位用于上下限查看时的显示//声明 display1 ()函数//将 ds18b20.h 头文件包含到主程序#include"keyscan.h" #include"display.h"/***********************//将 keyscan.h 头文件包含到主程序 //将 display.h 头文件包含到主程序 主函数 ************************/#include<AT89X52.h> #include<intrins.h>// 将 AT89X52.h 头文件包含到主程序 //将 intrins.h 头文件包含到主程序(调用其中的 函数延时)_nop_() 空操作#define uint unsigned int #define uchar unsigned char uchar max=0x00,min=0x00;//变量类型宏定义,用 //变量类型宏定义,用//max 是上限报警温度, uint 表示无符号整形( 16 位) uchar 表示无符号字符型( 8 位)min 是下限报警温度void main(){beer=1;led=1; timer1_init(0); get_temperature(1);while(1){keyscan();get_temperature(0);//获取温度函数//关闭蜂鸣器// 关闭LED 灯//初始化定时器1(未启动定时器1)// 首次启动DS18B20 获取温度(DS18B20 上点后自动将EEPROM 中的上下限温度复制到TH 和TL 寄存器)//主循环//按键扫描函数keyscan(); // 按键扫描函数display(temp,temp_d*0.625);// 显示函数 alarm(); //报警函数 keyscan();// 按键扫描函数}}/******************************************************************** * 程序名 ; __ds18b20_h__ * 功 能: DS18B20 的 c51 编程头文件 * 编程者: ZPZ * 编程时间: 2009/10/2* 说 明:用到的全局变量是:无符号字符型变量temp ( 测得的温度整数部分 ),temp_d* ( 测得的温度小数部分 ),标志位 f (测量温度的标志位‘ 0'表示“正温度”‘ 1'表 * 示“负温度”),标志位 f_max (上限温度的标志位‘ 0'表示“正温度”、‘ 1'表 * 示“负温度”),标志位f_min (下限温度的标志位‘ 0'表示“正温度”、‘ 1'表* 示“负温度”),标志位 w ( 报警标志位‘ 1'启动报警‘ 0'关闭报警 ) 。
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单片机的温度测量装置,它通过传感器感知环境的温度,并使用单片机将温度值转换为数字形式,并显示在液晶屏上。
本文将详细介绍数字温度计的设计原理、硬件连接、软件编程以及应用领域。
概述:数字温度计基于51单片机的设计理念,其基本原理是通过传感器将温度转换为电信号,然后通过ADC(模数转换器)将电信号转换为数字信号,最后使用单片机将数字信号转换为温度值。
同时,数字温度计还将温度值显示在液晶屏上,方便用户直观地了解环境温度。
正文内容:1. 硬件连接:1.1 使用温度传感器感知环境温度:常用的温度传感器有NTC热敏电阻和DS18B20数字温度传感器。
通过将传感器连接到51单片机的引脚上,可以实现对环境温度的感知。
1.2 连接ADC进行模数转换:ADC是将模拟信号转换为数字信号的关键部件。
通过将51单片机的引脚连接到ADC芯片的输入端,可以将模拟的温度信号转换为数字信号。
1.3 连接液晶屏显示温度值:通过将51单片机的引脚连接到液晶屏的控制引脚和数据引脚,可以将温度值以数字形式显示在液晶屏上。
2. 软件编程:2.1 初始化引脚和ADC:在软件编程中,需要初始化51单片机的引脚设置和ADC的工作模式。
通过设置引脚为输入或输出,以及设置ADC的参考电压和工作模式,可以确保硬件正常工作。
2.2 温度测量算法:根据传感器的工作原理和电压-温度特性曲线,可以编写相应的算法将ADC测得的电压值转换为温度值。
例如,对于NTC热敏电阻,可以使用Steinhart-Hart公式进行温度计算。
2.3 温度值显示:将温度值以数字形式显示在液晶屏上。
通过设置液晶屏的控制引脚和数据引脚,可以控制液晶屏的显示内容,并将温度值以数字形式显示在屏幕上。
3. 基于51单片机的数字温度计应用:3.1 家庭温度监测:数字温度计可以安装在家庭中的不同区域,实时监测室内温度,并通过数字显示提供直观的温度信息。
这对于家庭的舒适性和节能都有重要意义。
基于51单片机的12864显示温度(ds18b20)
#ifndef __LCD12864_H#define __LCD12864_H//---包含头文件---//#include<reg51.h>//---重定义关键词---//#ifndef uchar#define uchar unsigned char#endif#ifndef uint#define uint unsigned int#endif//---如果使用画图模式定义这个---//#define LCD12864_PICTURE//---定义使用的IO口---//#define LCD12864_DATAPORT P1 //数据IO口sbit LCD12864_RS = P2^6; //(数据命令)寄存器选择输入sbit LCD12864_RW = P2^5; //液晶读/写控制sbit LCD12864_EN = P2^7; //液晶使能控制sbit LCD12864_PSB = P3^2; //串/并方式控制sbit LCD12864_RST = P3^4; //复位端//---声明全局函数---//void LCD12864_Delay1ms(uint c);uchar LCD12864_Busy(void);void LCD12864_WriteCmd(uchar cmd);void LCD12864_WriteData(uchar dat);void LCD12864_Init();void LCD12864_ClearScreen(void);void LCD12864_SetWindow(uchar x, uchar y);void LCD12864_DrowPic(uchar *a);void LCD12864_DrowPoint(uchar x, uchar y);#endif#ifndef __TEMP_H_#define __TEMP_H_#include<reg51.h>//---重定义关键词---//#ifndef uchar#define uchar unsigned char#endif#ifndef uint#define uint unsigned int#endif//--定义使用的IO口--//sbit DSPORT=P3^3;//--声明全局函数--//void Delay1ms(uint );uchar Ds18b20Init();void Ds18b20WriteByte(uchar com);uchar Ds18b20ReadByte();void Ds18b20ChangTemp();void Ds18b20ReadTempCom();int Ds18b20ReadTemp();#endif#include"lcd12864.h"/****************************************************************************** ** 函数名: LCD12864_Delay1ms* 函数功能: 延时1MS* 输入: c* 输出: 无******************************************************************************* /void LCD12864_Delay1ms(uint c)uchar a,b;for(; c>0; c--){for(b=199; b>0; b--){for(a=1; a>0; a--);}}}/****************************************************************************** ** 函数名: LCD12864_Busy* 函数功能: 检测LCD是否忙* 输入: 无* 输出: 1或0(1表示不忙,0表示忙)******************************************************************************* /uchar LCD12864_Busy(void){uchar i = 0;LCD12864_RS = 0; //选择命令LCD12864_RW = 1; //选择读取LCD12864_EN = 1;LCD12864_Delay1ms(1);while((LCD12864_DA TAPORT & 0x80) == 0x80) //检测读取到的值{i++;if(i > 100){LCD12864_EN = 0;return 0; //超过等待时间返回0表示失败}}LCD12864_EN = 0;return 1;}/****************************************************************************** ** 函数名: LCD12864_WriteCmd* 函数功能: 写命令* 输入: cmd* 输出: 无******************************************************************************* /void LCD12864_WriteCmd(uchar cmd){uchar i;i = 0;while( LCD12864_Busy() == 0){LCD12864_Delay1ms(1);i++;if( i>100){return; //超过等待退出}}LCD12864_RS = 0; //选择命令LCD12864_RW = 0; //选择写入LCD12864_EN = 0; //初始化使能端LCD12864_DATAPORT = cmd; //放置数据LCD12864_EN = 1; //写时序LCD12864_Delay1ms(1);LCD12864_EN = 0;}/****************************************************************************** ** 函数名: LCD12864_WriteData* 函数功能: 写数据* 输入: dat* 输出: 无******************************************************************************* /void LCD12864_WriteData(uchar dat){uchar i;i = 0;while( LCD12864_Busy() == 0){LCD12864_Delay1ms(1);i++;if( i>100){return; //超过等待退出}}LCD12864_RS = 1; //选择数据LCD12864_RW = 0; //选择写入LCD12864_EN = 0; //初始化使能端LCD12864_DATAPORT = dat; //放置数据LCD12864_EN = 1; //写时序LCD12864_Delay1ms(1);LCD12864_EN = 0;}/****************************************************************************** ** 函数名: LCD12864_ReadData* 函数功能: 读取数据* 输入: 无* 输出: 读取到的8位数据******************************************************************************* /#ifdef LCD12864_PICTUREuchar LCD12864_ReadData(void){uchar i, readValue;i = 0;while( LCD12864_Busy() == 0){LCD12864_Delay1ms(1);i++;if( i>100){return 0; //超过等待退出}}LCD12864_RS = 1; //选择命令LCD12864_RW = 1;LCD12864_EN = 0;LCD12864_Delay1ms(1); //等待LCD12864_EN = 1;LCD12864_Delay1ms(1);readValue = LCD12864_DA TAPORT;LCD12864_EN = 0;return readValue;}#endif/****************************************************************************** ** 函数名: LCD12864_Init* 函数功能: 初始化LCD12864* 输入: 无* 输出: 无******************************************************************************* /void LCD12864_Init(){LCD12864_PSB = 1; //选择并行输入LCD12864_RST = 1; //复位LCD12864_WriteCmd(0x30); //选择基本指令操作LCD12864_WriteCmd(0x0c); //显示开,关光标LCD12864_WriteCmd(0x01); //清除LCD12864的显示内容}/****************************************************************************** ** 函数名: LCD12864_ClearScreen* 函数功能: 在画图模式下,LCD12864的01H命令不能清屏,所以要自己写一* * 屏函数* 输入: 无* 输出: 无******************************************************************************* /#ifdef LCD12864_PICTUREvoid LCD12864_ClearScreen(void){uchar i,j;LCD12864_WriteCmd(0x34); //开启拓展指令集for(i=0;i<32;i++) //因为LCD有纵坐标32格所以写三十二次{LCD12864_WriteCmd(0x80+i); //先写入纵坐标Y的值LCD12864_WriteCmd(0x80); //再写入横坐标X的值for(j=0;j<32;j++) //横坐标有16位,每位写入两个字节的的数据,也{ //就写入32次以为当写入两个字节之后横坐标会自LCD12864_WriteData(0x00); //动加1,所以就不用再次写入地址了。
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单片机温度计程序
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程序
//液晶显示温度#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单片机温度显示 LCD显示加串口接受温度
*
* 函数名 * 函数功能
: LcdDisplay() : LCD 显示读取到的温度
* 输入
:v
* 输出
:无
*******************************************************************************
/
void LcdDisplay(int temp) {
while(!TI);
//等待发送数据完成
TI=0;
//清除发送完成标志位
tp=temp;//因为数据处理有小数点所以将温度赋给一个浮点型变量
//如果温度是正的那么,那么正数的原码就是补码它本身
temp=tp*0.0625*100+0.5; //留两个小数点就*100,+0.5 是四舍五入,因为 C 语言浮点数转换为整型的时候把 小数点
//写地址 80 表示初始地址
LcdWriteData('.');
//显示 ‘.’
SBUF = '.';//将接收到的数据放入到发送寄存器
while (!TI);
//等待发送数据完成
TI = 0;
LcdWriteCom(0x86);
//写地址 80 表示初始地址
LcdWriteData('0'+datas[3]); //显示小数点
//写入时序 //保持时间
void LcdWriteCom(uchar com) //写入命令
{ LCD1602_E = 0; //使能清零 LCD1602_RS = 0; //选择写入命令 LCD1602_RW = 0; //选择写入
LCD1602_DATAPINS = com; 四位不用改
基于51单片机的数字温度计实时监测方案探究
基于51单片机的数字温度计实时监测方案探究数字温度计是一种能够实时监测环境温度的仪器。
本方案通过使用51单片机,将温度传感器与单片机相连接,以实现对环境温度的实时监测。
以下是本方案的详细内容。
一、硬件设计1. 硬件器材准备:准备一个51单片机开发板,一个温度传感器(如DS18B20)、若干杜邦线、一个电阻和一个LCD液晶显示屏。
2. 连接电路:将温度传感器的Vcc引脚连接到单片机的VCC引脚,将GND引脚连接到单片机的GND引脚。
将传感器的DATA引脚连接到单片机的一个IO引脚,并通过一个4.7kΩ的上拉电阻连接到VCC引脚。
将LCD显示屏的引脚连接到单片机相应的IO引脚和电源引脚。
3. 编写单片机程序:使用C语言编写单片机程序,通过读取传感器数据并将结果显示到LCD屏幕上。
程序中需要包括初始化函数、温度读取函数以及数据显示函数。
二、软件设计1. 初始化函数:在初始化函数中设置单片机的工作模式、引脚功能和相关参数,如为LCD显示屏设置数据总线引脚和控制引脚等。
2. 温度读取函数:通过单片机的IO口读取传感器数据。
使用51单片机的串行通信功能与温度传感器进行通信,并读取传感器发送的数据。
根据传感器的规格说明书,将接收到的数据转换为温度值。
3. 数据显示函数:将读取到的温度值显示到LCD屏幕上。
先清除LCD屏幕上的内容,然后使用LCD屏幕上的光标控制函数将温度值显示到特定位置。
可以选择在LCD屏幕上显示华氏度或摄氏度。
三、实时监测方案1. 循环读取温度值:在主函数中,使用一个无限循环来实现连续地读取温度值。
在每次循环中调用温度读取函数,读取传感器当前的温度值。
2. 设置温度报警:根据实际需求,在主函数中添加一个判断语句,当温度值超过或低于某个阈值时,触发温度报警。
可以通过LED灯、蜂鸣器等外设来实现报警。
3. 数据保存和上传:根据需求,可以将读取的实时温度值保存到相应的存储介质中,如SD卡或EEPROM。
基于51单片机的数字温度计设计
基于51单片机的数字温度计设计数字温度计是一种广泛使用的电子测量设备,通过传感器将温度转化为数字信号,并显示出来。
本文将介绍基于51单片机的数字温度计的设计。
该设计将使得使用者能够准确、方便地测量温度,并实时显示在液晶显示屏上。
1. 硬件设计:- 传感器选择:在设计数字温度计时,我们可以选择使用NTC(负温度系数)热敏电阻或者DS18B20数字温度传感器作为温度传感器。
这里我们选择DS18B20。
- 信号转换:DS18B20传感器是一种数字传感器,需要通过单总线协议与51单片机进行通信。
因此,我们需要使用DS18B20专用的驱动电路,将模拟信号转换为数字信号。
- 51单片机的选择:根据设计要求选择合适的51单片机,如STC89C52、AT89S52等型号。
单片机应具备足够的IO口来与传感器和液晶显示屏进行通信,并具备足够的计算和存储能力。
- 显示屏选择:为了实时显示温度,我们可以选择使用1602型字符液晶显示屏。
该显示屏能够显示2行16个字符,足够满足我们的需求。
通过与51单片机的IO口连接,我们可以将温度数据显示在屏幕上。
2. 软件设计:- 采集温度数据:通过51单片机与DS18B20传感器进行通信,采集传感器传输的数字温度数据。
通过解析传感器发送的数据,我们可以获得当前的温度数值。
- 数据处理:获得温度数据后,我们需要对其进行处理。
例如,可以进行单位转换,从摄氏度到华氏度或者开尔文度。
同时,根据用户需求,我们还可以对数据进行滤波、校准等处理。
- 显示数据:通过与液晶显示屏的连接,我们可以将温度数据显示在屏幕上。
可以使用51单片机内部的LCD模块库来控制液晶显示屏,显示温度数据以及相应的单位信息。
- 用户交互:可以设置一些按键,通过与51单片机的IO口连接,来实现用户与数字温度计的交互。
例如,可以设置一个按钮来进行温度单位的切换,或者设置一个按钮来启动数据保存等功能。
3. 功能拓展:- 数据存储:除了实时显示当前温度,我们还可以考虑增加数据存储功能。
51单片机显示温度程序
{ 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单片机之18b20温度液晶显示演示程序
/////////////////////////////////////////////////// //温度液晶显示演示程序//LCD数据线:P0口//LCD控制线:RS P05 RW P06 E P07 BUSY P27//18B20端口DQ :P23/////////////////////////////////////////////////// #include <AT89X52.h>#define Lcd_Data P2 //定义LCD数据端口sbit RS = P0 ^ 5; //定义连接端口sbit RW = P0 ^ 6;sbit E = P0 ^ 7;sbit Busy = P2 ^ 7;unsigned char code Temp[] = {"Temperature: "}; unsigned char code num[] = {"0123456789"};sbit DQ = P3 ^ 7; //定义18B20端口DQ/////////////////////////////////////////////////// void Delay(unsigned int time)//延时函数{while( time-- );}/////////////////////////////////////////////////// ////////////////// LCD ///////////////// /////////////////////////////////////////////////// void Read_Busy(void)//读忙信号判断{do{Lcd_Data = 0xff;RS = 0;RW = 1;E = 0;Delay(10);E = 1;}while(Busy);}/*************************************************/ void Write_Comm(unsigned char lcdcomm) //写指令函数{Lcd_Data = lcdcomm;RS = 0;RW = 0;E = 0;Read_Busy();E = 1;}/*************************************************/ void Write_Data(unsigned char lcddata)//写数据函数{Lcd_Data = lcddata;RS = 1;RW = 0;E = 0;Read_Busy();E = 1;}/*************************************************/ void Init_LCD(void)//初始化LCD{Delay(400); //稍微延时,等待LCM进入工作状态Write_Comm(0x01);//清显示// Write_Comm(0x02);//光标归位Write_Comm(0x38);//8位2行5*8Write_Comm(0x06);//文字不动,光标右移Write_Comm(0x0c);//显示开/关,光标开闪烁开// Write_Comm(0x18);//左移}////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////// 18B20 //////////////////// /////////////////////////////////////////////////// void Init_18B20(void)//初始化18B20{unsigned char x = 0;DQ = 1; //DQ复位Delay(10); //稍做延时DQ = 0; //单片机将DQ拉低Delay(80); //笥?480usDQ = 1; //拉高总线Delay(10);x = DQ; //稍做延时后如果x=0则初始化成功 x=1则初始化失败Delay(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(15);}return (dat);}/*************************************************/ void WriteOneChar(unsigned char dat)//写一个字节{unsigned char i = 0;for (i = 8; i > 0; i--){DQ = 0;DQ = dat&0x01;Delay(5);DQ = 1;dat>>=1;}}///////////////////////////////////////////////////void Read_Display(void)//读取并显示温度{unsigned int a = 0, b = 0, c = 0, t = 0;unsigned char i;float tt = 0;Init_18B20();WriteOneChar(0xCC); // 跳过读序号列号的操作WriteOneChar(0x44); // 启动温度转换Init_18B20();WriteOneChar(0xCC); //跳过读序号列号的操作WriteOneChar(0xBE); //读取温度寄存器a = ReadOneChar();b = ReadOneChar();t = b;t <<= 8;t = t | a;tt = t * 0.0625;t = tt * 10 + 0.5; //放大10倍输出并四舍五入a = t / 100; //十位b = t / 10 - a * 10; //个位c = t - a * 100 - b * 10; //小数位Write_Comm(0x01);//清显示Write_Comm(0x80);//写首地址for(i=0;i<16;i++){Write_Data( Temp[i] );//显示Temperature:字样}Write_Comm(0xc5);Write_Data( num[a] );Write_Data( num[b] );Write_Data( '.' );Write_Data( num[c] );Write_Data( ' ' );Write_Data( '`' );Write_Data( 'C' );}/////////////////////////////////////////////////// void main(void){Init_LCD();//初始化液晶while(1){Read_Display();Delay(50000);}}///////////////////////////////////////////////////。
C51单片机 温度计 C语言程序
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);
基于51单片机的lcd1602显示温度_源程序_18b20测温
{
tmp[0]=' ';
tmp[1]='-';
tmp[2]=tp[2];
tmp[3]='\0';
}
else
{
tmp[0]='-';
tmp[1]=tp[1];
tmp[2]=tp[2];
tmp[3]='\0';
}
}
else
{
tp[0]=(temp/100)%10+'0';
tp[1]=(temp/10)%10+'0';
得到的结果正确.....
2、LCD的清屏时间----1.64ms;
*/
#include<reg51.h>
#include"LCD1602.h"
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchartmp[4]={0,0,0,0};
#define uchar unsigned char
#define uint unsigned int
//===========延时子函数========================
void delay(uint x)
{uinti,j;
for(i=x;i>0;i--)
for(j=0;j<2;j++);
void Ds18b20_Write(uchardat)
{
uchar i;
51单片机LCD1602液晶显示测温系统
目录第一部分设计任务1.1设计题目及求要求 (3)1.2.1 方案一 (3)1.2.4 方案分析 (3)第二部分设计方案2.1总体设计方案说明 (3)2.2 实物电路图 (4)第三部分电路设计与器件选择3.1 DS18B20工作原理和功能说明 (4)3.2 LCD1602工作原理和功能说明 (16)第四部分 4.1实验程序 (28)第五部分 5.1课程设计总结(心得体会) (34)第六部分 6.1参考文献 (34)1.1设计题目及求要求用电子元器件和单片机通过编写程序做成能实时显示温度的仪器。
1.2.1 方案用通用型1602液晶显示器和DS18B20温度传感器组成温度显示仪,并编写程序用51单片机来控制和连接1602液晶显示器和DS18B20温度传感器。
1.2.2 方案分析1602液晶显示器能显示ASCII码字符,数字、大小写字母、和各种符号。
而且其体积小、功耗低、显示操作简单,显示值清晰,正常温度范围为-20~+60。
DS18B20温度传感器采用单总线协议,与单片机接口仅需用一个I/O接口无需任何外部元件,直接将环境温度转化成数字信号,从而大大简化了传感器于微处理机的接口。
DS18B20温度传感器支持多点组网功能,多个DS18B20可以并联在唯一的三线上,其测试范围在-50~+125.C。
测试结果直接输出数字温度信号,以“一位总线”串行传送给CPU,同时可传送CRC效验码,具有极强的抗干扰纠错能力。
电源板极性接反时,芯片不会因发热而烧毁。
且它具有微型化、低功耗、高新能、抗干扰能力强、一赔微处理器等优点。
考虑到1602液晶显示器和DS18B20温度传感器有诸多优点,顾用二者来完成实验。
2.1总体设计方案说明2.2实物电路图3.1DS18B20的工作原理① DS18B20数字温度传感器概述DS18B20数字温度传感器是DALLAS公司生产的1-Wire,即单总线器件,具有线路简单,体积小的特点。
因此用它来组成一个测温系统,具有线路简单,在一根通信线,可以挂很多这样的数字温度计,十分方便。
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();}}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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;}液晶显示温度计程序。