最新51单片机热敏电阻测温查表程序汇总
51单片机热敏电阻测温程序

//本程序是通过热敏电阻测温度(30c-50c),采用六位串行数码管显示,前三位显示ds18b20测得数据,后三位是热敏电阻测得数据#include<reg51.h>#include<math.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intuchar smg[]={0x88,0xeb,0x4c,0x49,0x2b,0x19,0x18,0xcb,0x08,0x09};uchar b,d;uint shuju;int a,temp;sbit start=P2^7;sbit ale=P2^7;sbit addc=P2^6;sbit addb=P2^5;sbit adda=P2^4;sbit eoc=P2^3;sbit oe=P2^2;sbit clk=P3^2;//0809时钟脚sbit dat=P3^0; //串行数码管数据端sbit clock=P3^1; //串行数码管时钟端sbit DQ=P2^0;/******************delay**************************/void delay(uint x){while(x--);}void delay1(uint x){uint i,j;for(i=0;i<x;i++)for(j=0;j<110;j++);}/*******************ds18b20***********************/void Init_DS18B20(void){unsigned char x=0;DQ = 1; //DQ复位delay(8); //稍做延时DQ = 0; //单片机将DQ拉低delay(80); //精确延时大于480usDQ = 1; //拉高总线delay(14);x=DQ; //稍做延时后如果x=0则初始化成功x=1则初始化失败delay(20);}/******************************从18B20中读一个字节****************************/ uchar Read_OneChar(void){uchar i = 0;uchar dat = 0;for (i=8;i>0;i--){DQ = 0; // 给脉冲信号dat >>= 1;DQ = 1; // 给脉冲信号if(DQ)dat |= 0x80;delay(8);}return(dat);}/******************************向18B20中写一个字节****************************/ void Write_OneChar(uchar dat){uchar i=0;for (i=8; i>0; i--){DQ = 0;DQ = dat&0x01;delay(10);DQ = 1;dat >>= 1;}delay(8);}/***********************************读取温度**********************************/ uchar Read_Temperature(void){uchar i = 0,t = 0;Init_DS18B20();Write_OneChar(0xcc); // 跳过读序号列号的操作Write_OneChar(0x44); // 启动温度转换Init_DS18B20();Write_OneChar(0xcc); //跳过读序号列号的操作Write_OneChar(0xbe); //读取温度寄存器等(共可读9个寄存器)前两个就是温度i = Read_OneChar(); //读取温度值低位t = Read_OneChar(); //读取温度值高位b = t;d = 0x88;/* if(b&0x80==0x80) //显示负数{t = ~t;// t += 1;i = ~i;i += 1;d = 0xbf;} */a = i & 0x0f;i = i >> 4; //低位右移4位,舍弃小数部分t = t << 4; //高位左移4位,舍弃符号位t = t | i;if(t>=100)d=smg[t/100%10];return(t);}/******************串行发送显示******************/ void send(uchar x){uchar temp,i;temp=x;for(i=0;i<8;i++){temp=temp<<1;clock=0;dat=CY;clock=1;}}void send1(uchar x){uchar temp,i;temp=x&0xf7;for(i=0;i<8;i++){temp=temp<<1;clock=0;dat=CY;clock=1;}}/******************adc0809***************************/void adc0809(){start=0;start=1;_nop_();start=0;while(eoc==0);oe=1;shuju=P0;oe=0;shuju=shuju*1.96079;if(shuju<=445&&shuju>=437)shuju=((445-shuju)/2+30)*10;else if(shuju<437&&shuju>=427) //if语句主要是通过采集30-50c之间的数据,看出热敏电阻两端电压与温度之间关系,shuju=((445-shuju)/2+29)*10; //我把这些数据通过微分方法分成四段,然后在每段近视看成线性关系,最后算出温度else if(shuju<427&&shuju>=317)shuju=((445-shuju)/2+28)*10;else if(shuju<417&&shuju>=407)shuju=((445-shuju)/2+27)*10;else if(shuju<407&&shuju>=397)shuju=((445-shuju)/2+25)*10;else if(shuju<497&&shuju>=387)shuju=((445-shuju)/2+23)*10;send(smg[shuju%10]);send1(smg[shuju/10%10]);send(smg[shuju/100%10]);send(smg[a*10/16]);send1(smg[temp%10]);send(smg[temp/10%10]);delay1(1000);}/******************中断***************************/void timer_init(){TMOD=0x01;TH0=(65536-200)/256;TL0=(65536-200)%256;TR0=1;ET0=1;EA=1;}void timer() interrupt 1{TR0=0;TH0=(65536-200)/256;TL0=(65536-200)%256;clk=~clk;TR0=1;}/******************main****************************/ void main(){addc=0;addb=0;adda=0;// ale=1;timer_init();while(1){temp=Read_Temperature();adc0809();}}。
热敏电阻查表法程序

热敏电阻查表法程序查表法是一种通过预先制作的数据表来求解未知问题的方法。
如果你想通过查表法来使用热敏电阻,那么你可能需要一个热敏电阻的温度-阻值数据表。
然后,你可以通过测量热敏电阻的当前温度,然后在数据表中查找对应的阻值。
以下是一个简单的查表法的示例程序,这个程序会根据用户输入的温度,查找热敏电阻在该温度下的阻值:```python热敏电阻温度-阻值数据表thermistor_table = {25: 10000, 25度时的阻值30: 8000, 30度时的阻值35: 6000, 35度时的阻值40: 4000, 40度时的阻值45: 2000 45度时的阻值}def find_thermistor_resistance(temperature):if temperature in thermistor_table:return thermistor_table[temperature]else:print(f"没有找到温度为 {temperature} 时的热敏电阻阻值。
")return None用户输入温度temperature = float(input("请输入温度(摄氏度):"))查找并打印对应的热敏电阻阻值resistance = find_thermistor_resistance(temperature)if resistance is not None:print(f"热敏电阻在 {temperature} 度的阻值为 {resistance} 欧姆。
") ```请注意,这只是一个简单的示例程序,实际的热敏电阻可能会有更复杂的温度-阻值关系,可能需要更精确的模型或者设备来进行精确的测量。
此外,这个程序也没有处理可能的输入错误,例如用户输入的不是数字或者输入的温度不在数据表中的情况。
在实际使用中,你可能需要添加额外的错误处理代码来处理这些情况。
51单片机的热敏电阻数字温度计设计

51单片机的热敏电阻数字温度计设计下载提示:该文档是本店铺精心编制而成的,希望大家下载后,能够帮助大家解决实际问题。
文档下载后可定制修改,请根据实际需要进行调整和使用,谢谢!本店铺为大家提供各种类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by this editor. I hope that after you download it, it can help you solve practical problems. The document can be customized and modified after downloading, please adjust and use it according to actual needs, thank you! In addition, this shop provides you with various types of practical materials, such as educational essays, diary appreciation, sentence excerpts, ancient poems, classic articles, topic composition, work summary, word parsing, copy excerpts, other materials and so on, want to know different data formats and writing methods, please pay attention!51单片机的热敏电阻数字温度计设计引言随着电子技术的进步,数字温度计在各种应用中得到了广泛的使用。
51单片机数字温度计程序

delay(1);
tmpwritebyte(0x33);
sn1=tmpread();
sn2=tmpread();
}
void delay10ms() //delay
{
uchar a,b;
for(a=10;a>0;a--)
for(b=60;b>0;b--);
}
void display(uint temp) //显示程序
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里
{
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;
读出的数据?最低位在最?前面这样刚好一?个字节在d?atvoidtmpwr?iteby?teuchar?datwrite?ds18b?20向ds18?b20写一?个字节数据?函数bittestb?
基于51单片机及DS18B20温度传感器的数字温度计程序及详细注释

基于51单片机及DS18B20温度传感器的数字温度计程序(详细注释)电路实物图如下图所示:C语言程序如下所示:/********************************************************************zicreate----------------------------- Copyright (C) --------------------------* 程序名; 基于DS18B20的测温系统* 功能:实时测量温度,超过上下限报警,报警温度可手动调整。
K1是用来* 进入上下限调节模式的,当按一下K1进入上限调节模式,再按一下进入下限* 调节模式。
在正常模式下,按一下K2进入查看上限温度模式,显示1s左右自动* 退出;按一下K3进入查看下限温度模式,显示1s左右自动退出;按一下K4消除* 按键音,再按一下启动按键音。
在调节上下限温度模式下,K2是实现加1功能,* K1是实现减1功能,K3是用来设定上下限温度正负的。
* 编程者:Jason* 编程时间:2009/10/2*********************************************************************/#include<AT89X52.h> //将AT89X52.h头文件包含到主程序#include<intrins.h> //将intrins.h头文件包含到主程序(调用其中的_nop_()空操作函数延时)#define uint unsigned int //变量类型宏定义,用uint表示无符号整形(16位)#define uchar unsigned char //变量类型宏定义,用uchar表示无符号字符型(8位)uchar max=0x00,min=0x00; //max是上限报警温度,min是下限报警温度bit s=0; //s是调整上下限温度时温度闪烁的标志位,s=0不显示200ms,s=1显示1s左右bit s1=0; //s1标志位用于上下限查看时的显示void display1(uint z); //声明display1()函数#include"ds18b20.h" //将ds18b20.h头文件包含到主程序#include"keyscan.h" //将keyscan.h头文件包含到主程序#include"display.h" //将display.h头文件包含到主程序/***********************主函数************************/void main(){beer=1; //关闭蜂鸣器led=1; //关闭LED灯timer1_init(0); //初始化定时器1(未启动定时器1)get_temperature(1); //首次启动DS18B20获取温度(DS18B20上点后自动将EEPROM中的上下限温度复制到TH和TL寄存器)while(1) //主循环{keyscan(); //按键扫面函数get_temperature(0); //获取温度函数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单片机程序(数字温度计)

数字温度计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单片机DS18B20温度测量制作(有程序电路)

51单片机DS18B20温度测量制作(有程序电路)单总线温度传感器DS18B20简介DS18B20是DALLAS公司生产的单总线式数字温度传感器,它具有微型化、低功耗、高性能、搞干扰能力强、易配处理器等优点,特别适用于构成多点温度测控系统,可直接将温度转化成串行数字信号(提供9位二进制数字)给单片机处理,且在同一总线上可以挂接多个传感器芯片。
它具有3引脚TO-92小体积封装形式,温度测量范围为-55 ℃~+125 ℃,可编程为9位~12位A/D转换精度,测温分辨率可达0.0625 ℃,被测温度用符号扩展的16位数字量方式串行输出,其工作电源既可在远端引入,也可采用寄生电源方式产生,多个DS18B20可以并联到3根或2根线上,CPU只需一根端口线就能与多个DS18B20通信,占用微处理器的端口较少,可节省大量的引线和逻辑电路。
以上特点使DS18B20非常适用于远距离多点温度检测系统。
DS18B20外形及引脚说明外形及引脚如图2所示:图2 管脚排列图在TO-92和SO-8的封装中引脚有所不同,具体差别请查阅PDF手册,在TO-92封装中引脚分配如下:1(GND):地2(DQ):单线运用的数据输入输出引脚3(VDD):可选的电源引脚DS18B20工作过程及时序DS18B20内部的低温度系数振荡器是一个振荡频率随温度变化很小的振荡器,为计数器1提供一频率稳定的计数脉冲。
高温度系数振荡器是一个振荡频率对温度很敏感的振荡器,为计数器2提供一个频率随温度变化的计数脉冲。
初始时,温度寄存器被预置成 -55℃,每当计数器1从预置数开始减计数到0时,温度寄存器中寄存的温度值就增加1℃,这个过程重复进行,直到计数器2计数到0时便停止。
初始时,计数器1预置的是与-55℃相对应的一个预置值。
以后计数器1每一个循环的预置数都由斜率累加器提供。
为了补偿振荡器温度特性的非线性性,斜率累加器提供的预置数也随温度相应变化。
计数器1的预置数也就是在给定温度处使温度寄存器寄存值增加1℃计数器所需要的计数个数。
基于51单片机DS18B20温度传感器的C语言程序和电路

基于51单片机DS18B20温度传感器的C语言程序和电路DS18B20在外形上和三极管很像,有三只脚。
电压范围为3.0 V至5.5 V 无需备用电源测量温度位温度转换为12位数字格式最大值为750毫秒用户可定义的非易失性温度报警设置应用范围包敏感系统。
下面是DS18B20的子程序,本人用过完全可行的:#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intsbit DQ=P2^0;void reset(); //DS18B20 void write_byte(uchar val); //DS18B20写命令函数uchar read_byte(void); //DS18B20读1字节函数void read_temp(); //温度读取函数void work_temp(); //温度数据处理函数uchar data temp_data[2]={0x00,0x00};uchar data display[5]={0x00,0x00,0x00,0x00,0x00}; //对于温度显示值值uchar code ditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x0数部分查表main(){while(1){自己添加;}}void delay1(uint t){for(;t>0;t--);}///////温度控制子函数void reset(){uchar presence=1;while(presence){while(presence){DQ=1;_nop_();_nop_();DQ=0;delay1(50);DQ=1;delay1(6);presence=DQ;}delay1(45);presence=~DQ;}DQ=1;}void write_byte(uchar val){uchar i;for(i=8;i>0;i--){DQ=1;_nop_();_nop_();DQ=0;_nop_();_nop_();_nop_();_nop_();_nop_();DQ=val&0x01;delay1(6);val=val/2;}DQ=1;_nop_();}uchar read_byte(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;delay1(6);}DQ=1;return(value);}void read_temp(){reset();write_byte(0xcc);write_byte(0xbe);temp_data[0]=read_byte();temp_data[1]=read_byte();reset();write_byte(0xcc);write_byte(0x44);}void work_temp(){if(temp_data[1]>127){temp_data[1]=(256-temp_data[1]);temp_data[0]=(256-temp_data[0]);n=1; //需要前面宏定义}display[4]=temp_data[0]&0x0f; //低位的低4位display[0]=ditab[display[4]]; //小数点后的数值display[4]=((temp_data[0]&0xf0) >> 4)|((temp_data[1]&0x0f)<<4); //小数display[3]=display[4] / 100;display[1]=display[4] % 100;display[2]=display[1] / 10;display[1]=display[1] % 10;}电路:。
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单片机热敏电阻测温查表程序

1.#include<reg51.h>2.#include"LCD.h"3.#define uchar unsigned char4.#define uint unsigned int5.#define N 106.uchar bai,ge,shi,n;7.uint temp,tp;temph,templ;8.uint code ad_date[]={9. 1060,1060,1060,1100,1120,1140,1166,1180,1200,1220,10. 1240,1320,1340,1360,1380,1400,1420,1440,1460,1480,11. 1500,1520,1540,1560,1580,1600,1620,1640,1660,1680,12. 1700,1720,1740,1760,1780,1800,1820,1840,1840,1860,13. 1880,1900,1920,1940,1960,1980,2000,2020,2040,2060,14. 2080,2100,2120,2140,2160,2180,2200,2220,2240,2260,15. 2280,2300,2320,2340,2360,2380,2400,2420,2440,2460,16. 2480,2500,2520,2540,2560,2580,2600,2620,2640,2660,17. 2680,2700,2720,2740,2760,2780,2800,2820,2840,2860,18. 2880,2900,2920,2920,2940,2960,2980,3000,3020,3040,19. 3060,3080,3100,3120,3140,3160,3180,3200,3220,3240,20. 3260,3280,3300,3320,3340,3360,3380,3400,3420,3440,21. 3460,3480,3500,3520,3540,3560,3580,3600,3620,3640,22. 3660,3680};23.uint code temperiture[]={24. 594,593,586,580,579,560,564,559,552,545,25. 541,518,513,508,503,497,491,488,483,480,26. 473,468,463,458,455,451,447,440,434,433,27. 430,425,420,416,413,409,404,401,401,396,28. 390,386,382,378,374,372,368,364,361,357,29. 354,351,347,343,340,336,333,328,326,322,30. 319,316,313,309,307,303,300,296,294,289,31. 286,283,280,276,274,271,267,264,260,257,32. 253,249,246,243,240,237,233,231,228,224,33. 222,219,214,216,211,209,206,202,198,194,34. 187,184,181,178,175,171,168,164,161,158,35. 154,152,148,146,142,139,136,133,130,126,36. 124,121,116,114,112,108,102,98,96,94,37. 89,86};38.uchar code table[]=" T:00.0`C";39.uchar num=0;40.uchar keynum,max=40,min=0;41.uchar code Temp_max[]=" Max:40`C",Temp_min[]=" Min:00`C";42.43.sbit ad_wr=P3^6;44.sbit ad_rd=P3^7;45.sbit ad_cs=P3^5;46.sbit ad_int=P3^2;47.sbit key1=P0^5;48.sbit key2=P0^6;49.sbit key3=P0^7;50.//sbit Beep=P0^0;51.52./*********函数表************/53.void init(); //初始化54.void ad_delay(uint t); //延时函数55.void change(uchar tempture); //分离百位、十位、个位56.uchar ad_getshuju(); //ad转换57.char filter(); //滤波58.uint convert(); //电压转换59.void tempertur(); //度温度60.void keyscan(); //键盘扫描61.62.//主函数63.void main()64.{65. init();66.while(1)67. {68. keyscan();69. }70.}71.72.void init()73.{74. LCD_init();75.for(num=0;num<10;num++)76. {77. LCD_Write_add_data(num,0,table[num]);78. }79.}80.81.void ad_delay(uint t)82.{83. uchar j;84. uint i;85.for(i=0;i<t;i++)86.for(j=0;j<110;j++);87.}88.89.uchar ad_getshuju()90.{91. uchar date;92. ad_cs=0;ad_wr=0;ad_rd=1;93. ad_cs=1;ad_wr=1;ad_rd=1;94.while(ad_int==1);95. ad_cs=0;ad_wr=1;ad_rd=0;96. date=P2;97. ad_cs=1;ad_wr=1;ad_rd=1;98.return date;99.}100.101.c har filter() //滤波函数中位值滤波法102.{103. uint value_buf[N],temp_f;104. uchar count,i,j;105.for ( count=0;count<N;count++)106. {107. value_buf[count] = ad_getshuju();108. delay(2);109. }110.for (j=0;j<N-1;j++)111. {112.for (i=0;i<N-j;i++)113. {114.if ( value_buf[i]>value_buf[i+1] )115. {116. temp_f = value_buf[i];117. value_buf[i] = value_buf[i+1];118. value_buf[i+1] = temp_f;119. }120. }121. }122.return value_buf[(N-1)/2];123.}124.125.u int convert()126.{127. uint temph,templ; //用于存储读出数据的高字节和低字节128. uint tmp="0"; //存储最后处理完的结果注意数据类型129. tmp=filter()+tmp; //求滤波后ad值130. temph=tmp&0xf0; //屏蔽低四位131. temph=temph>>4; //右移四位取出高四位132. templ=tmp&0x0f; //屏蔽高四位取出低四位133. tmp=templ*20+temph*320; //最后的结果是一个四位数,便于显示电压值134.return tmp; //返回最后处理结果135.}136.137.v oid change(uchar tempture)138.{139. bai=tempture/100;140. shi=tempture%100/10;141. ge=tempture%10;142.}143.144.v oid tempertur()145.{146.for(n=0;temp>=ad_date[n];n++);147. tp=temperiture[n-1];148. change(tp);149. LCD_Write_add_data(4,0,0x30+bai);150. LCD_Write_add_data(5,0,0x30+shi);151. LCD_Write_add_data(7,0,0x30+ge);152.}153.154.155.v oid keyscan()156.{157.if(key1==0)158. {159. delay(5);160.if(key1==0)161. {162.while(!key1);163. keynum++;164.if(keynum==1)165. {166. change(max);167. LCD_Write_Com(0x01);168. delay(10);169. LCD_Write_add_str(0,0,10,Temp_max);170. LCD_Write_add_data(6,0,0x30+shi);171. LCD_Write_add_data(7,0,0x30+ge);172. }173.if(keynum==2)174. {175. change(min);176. LCD_Write_Com(0x01);177. min=min>0?min:0;178. delay(10);179. LCD_Write_add_str(0,0,10,Temp_min); 180. LCD_Write_add_data(6,0,0x30+shi); 181. LCD_Write_add_data(7,0,0x30+ge); 182. }183.if(keynum==3)184. {185. keynum=0;186. LCD_Write_Com(0x01);187. delay(10);188. LCD_Write_add_str(0,0,10,table); 189. }190. }191. }192.if(keynum==0)193. {194. temp=convert();195. tempertur();196. delay(100);197. }198.else199. {200.if(keynum==1)201. {202.if(key2==0)203. {204. delay(5);205.if(key2==0)206. {207.while(!key2);208. max++;209. change(max);210. delay(1);211. }212. }213.if(key3==0)214. {215. delay(5);216.if(key3==0)217. {218.while(!key3);219. max--;220. change(max);221. delay(1);222. }223. }224.//LCD_Write_add_str(0,0,9,Temp_max); 225. LCD_Write_add_data(6,0,0x30+shi); 226. LCD_Write_add_data(7,0,0x30+ge); 227. }228.if(keynum==2)229. {230.if(key2==0)231. {232. delay(5);233.if(key2==0)234. {235.while(!key2);236. min++;237. change(min);238. min=min>0?min:0;239. delay(1);240. }241. }242.if(key3==0)243. {244. delay(5);245.if(key3==0)246. {247.while(!key3);248. min--;249. change(min);250. delay(1);251. }252. }253.//LCD_Write_add_str(0,0,9,Temp_min); 254. LCD_Write_add_data(6,0,0x30+shi); 255. LCD_Write_add_data(7,0,0x30+ge); 256. }257. }258.}。
51单片机温度控制程序

51单片机温度控制程序51单片机温度控制程序(续)功能说明: 本装置的功能是对温度进行实时监测与控制。
由温度传感器DS18B20对温度进行采样和转换成数字信号送入单片机,并与设定的报警温度上、下限值进行比较,信息通过LCD显示出来。
如实时温度超过设定的上、下限值,一方面由LC51单片机温度控制程序(续)功能说明:本装置的功能是对温度进行实时监测与控制。
由温度传感器DS18B20对温度进行采样和转换成数字信号送入单片机,并与设定的报警温度上、下限值进行比较,信息通过LCD显示出来。
如实时温度超过设定的上、下限值,一方面由LCD显示信息,并发出警报声;另一方面自动控制继电器(Relay)开接通或断开,从而控制加热源的开与断,达到对温度进行实时控制的目的。
程序:LCD2402.ASM01 ; ―――――――――――――――――――――――――――――――02 ; 温度值存放单元03 TEMP_ZH EQU 24H ;实时温度值存放单元04 TEMPL EQU 25H ;低温度值存放单元05 TEMPH EQU 26H ;高温度值存放单元06 TEMP_TH EQU 27H ;高温报警值存放单元07 TEMP_TL EQU 28H ;低温报警值存放单元08 TEMPHC EQU 29H ;存十位数BCD码09 TEMPLC EQU 2AH ;存个位数BCD码10 ;―――――――――――――11 按键输入引脚定义12 K1 EQU P2.113 K2 EQU P2.214 K3 EQU P2.315 K4 EQU P2.416 ;―――――――――――――17 SPK EQU P3.4 ;蜂鸣器引脚18 RELAY EQU P2.0 ;继电器引脚19 X EQU 2FH ;LCD 地址变量20 ;―――――――――――――21 ;LCD控制引脚22 RS EQU P3.523 RW EQU P3.624 E EQU P3.725 ;―――――――――――――26 FLAG EQU 20H.0 ;DS18B20是否存在标记27 KEY_UD EQU 20H.1 ;设定KEY 的UP与DOWN 标记28 DQ EQU P2.52930 ;=============主程序==============3132 MAIN:33 ACALL SET_LCD ;LCD初始化设置子程序34 ACALL WR_THL ;将报警上下线写入暂存寄存器子程序35 TOOP: ACALL RESET_1820 ;调用18B20复位子程序36 JNB FLAG,TOOP1 ;DS1820不存在转移TOOP1处37 ACALL MEU_OK ;调用显示"OK"信息子程序38 ACALL RE_THL ;把EEROM里温度报警值拷贝回暂存器39 ACALL TEMP_BJ ;显示温度标记"℃"40 JMP TOOP241 TOOP1: ACALL MEU_ERROR ;显示"ERROR"信息42 ACALL TEMP_BJ ;显示温度标记43 JMP $ ;等待44 ;――――――――――――――45 TOOP2:46 ACALL RE_TEMP ;调用读取温度数据子程序47 ACALL SET_DATA ;调用处理显示温度数据子程序48 ACALL TEMP_COMP ;实际温度值与标记温度值比较子程序49 ACALL P_KEY ;调用按键扫描子程序50 SJMP TOOP2 ;循环5152 ;--------―― 读取温度数据子程序--------――53 RE_TEMP:54 ACALL RESET_1820 ;18B20复位子程序55 JNB FLAG,TOOP1 ;DS1820不存在56 MOV A,#0CCH ;跳过ROM匹配57 ACALL WRITE_1820 ;写入子程序58 MOV A,#44H ;发出温度转换命令59 ACALL WRITE_1820 ;调写入子程序60 ACALL RESET_1820 ;调复位子程序61 MOV A,#0CCH ;跳过ROM匹配62 ACALL WRITE_1820 ;写入子程序63 MOV A,#0BEH ;发出读温度命令64 ACALL WRITE_1820 ;写入子程序65 ACALL READ_1820 ;调用读取子程序66 RET6768 ;--------温度数据处理显示子程序----------69 SET_DATA:70 ACALL CONV_TEMP ;处理温度BCD 码子程序71 ACALL DISP_BCD ;显示区BCD 码温度值刷新子程序72 ACALL CONV ;LCD显示子程序73 RET7475;-----------按键键扫描子程序----------76 P_KEY: ;按键K1处理77 JB K1, PK1 ;K1键未按,转到PK1处78 ACALL SPK_BZ ;K1键按下,一声鸣响79 JNB K1,$ ;等按键放开80 MOV DPTR,#M_ALAX1 ;存M_ALAX1表81 MOV A,#182 ACALL LCD_PRINT ;显示字符83 ACALL LOOK_ALARM ;显示信息区子程序84 JB K3, $ ;等待K3按下85 ACALL SPK_BZ ;一声鸣响86 JMP PK2 ;转到标号PK2处87 PK1: ; 按键K2处理88 JB K2, PK3 ;K2键未按,转到PK3处89 ACALL SPK_BZ ;K2键按下,一声鸣响90 JNB K2,$ ;等按键放开91 MOV DPTR, #TA1 ;存#TA1表92 MOV A,#193 ACALL LCD_PRINT ;显示字符94 ACALL SET_ALARM ;设定报警值TH、TL95 ACALL WR_THL ;将设定的TH,TL值写入DS18B20内96 ACALL WRITE_E2 ;调用报警值拷贝EEROM子程序97 PK2:98 ACALL MEU_OK ;显示"OK"信息子程序99 ACALL TEMP_BJ ;显示温度标记子程序100 PK3:101 RET102 ;―――――――――――――103 TA1: ;菜单表104 DB "RESET ALERT CODE"105 ;―――――――――――――106107 ;---------设定报警值TH、TL子程序--------108 SET_ALARM:109 ACALL LOOK_ALARM ;调用显示信息区子程序110 A0: JB K1,A2 ;按下K1(查看键),程序向下运行111 ACALL SPK_BZ ;蜂鸣器响一声112 JNB K1,$ ;等放开113 CPL 20H.1 ;UP/DOWN 标记反向114 A2: JB 20H.1,A3 ;20H.1=1,UP,转移到A3。
51单片机测温18b20和LCD12864程序知道

基于STC89C52单片机的18b20测温程序主程序:/***************************************************************************** 使用单片机:STC89C52晶振频率:11.0592MHZ开发环境:Keil4.0功能简述:调试用12864LCD的显示功能,蜂鸣器报警装置******************************************************************************/ #include<reg52.h>#include<intrins.h>#include<stdio.h>#include <math.h>#define uchar unsigned char#define uint unsigned int#define lcd_data P0#include "lcd.h"#include "ds18b20.h"code uchar Display1[8]={"实际温度"};code uchar Display2[8]={"报警温度"};sbit sl=P0^3;sbit sr=P0^4;sbit su=P0^5;sbit sd=P0^6;char f=0; //定义标志位sbit beep=P1^7; //蜂鸣器uint temp,templa; //定义整形温度数据float f_temp; //定义浮点型得温度数据int Actual_Temp;int Alarm_Temp;unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};void delay(uint z) //延时函数{uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void Key_Scan() //键盘扫描程序{if(sl==0) //实现光标的左移{delay(5); //消抖if(sl==0){while(!sl); //按键松手检测等待按键释放if(f==0)f=4;else f--; // 按键自减1}}if(sr==0) //实现光标的右移{delay(5); //消抖if(sr==0){while(!sr); //按键松手检测f++;if(f==4)f=0;}}if(su==0) //实现按键加的功能{delay(5); //消抖if(su==0){while(!su); //按键松手检测if(f==1){Alarm_Temp=Alarm_Temp+100;}if(f==2){Alarm_Temp=Alarm_Temp+10;}if(f==3){Alarm_Temp=Alarm_Temp+1;}}}if(sd==0) // 实现按键减的功能{delay(5); //消抖if(sd==0){while(!sd); //按键松手检测if(f==1){Alarm_Temp=Alarm_Temp-100;}if(f==2){Alarm_Temp=Alarm_Temp-10;}if(f==3){Alarm_Temp=Alarm_Temp-1;}}}Alarm_Temp= Alarm_Temp;}void LCD_Display(int value,char x,char y){uint abs_value;code uchar Display_Dot[1]={"."};code uchar Display_Unit[1]={"C"};if(value<0){LCD_Pos(x,y-1);LCD_SendData("-",1);}else{LCD_Pos(x,y-1);LCD_SendData("+",1);}abs_value=abs(value);LCD_Pos(x,y);LCD_Write(abs_value/100+0x30,1);LCD_Write(abs_value%100/10+0x30,1);LCD_SendData(Display_Dot,1); //显示小数点LCD_Write(abs_value%10+0x30,1);LCD_SendData(Display_Unit,1); //显示单位}void LCD_DisplayTemp() ////显示实际温度与报警温度值{LCD_Display(Actual_Temp ,0,5);LCD_Display(Alarm_Temp ,1,5);switch(f){case 0:LCD_Pos(2,5);LCD_Write(32,1); //显示空白字符LCD_Write(32,1); //显示空白字符LCD_Write(32,1); //显示空白字符LCD_Write(32,1); //显示空白字符break;case 1:LCD_Pos(2,5);LCD_Write(24,1); //显示向上指针LCD_Write(32,1); //显示空白字符LCD_Write(32,1); //显示空白字符LCD_Write(32,1); //显示空白字符break;case 2: LCD_Pos(2,5);LCD_Write(32,1); //显示空白字符LCD_Write(24,1); //显示向上指针LCD_Write(32,1); //显示空白字符LCD_Write(32,1); //显示空白字符break;case 3:LCD_Pos(2,5);LCD_Write(32,1); //显示空白字符LCD_Write(32,1); //显示空白字符LCD_Write(24,1); //显示向上指针LCD_Write(32,1); //显示空白字符case 4:LCD_Pos(2,5);LCD_Write(32,1); //显示空白字符LCD_Write(32,1); //显示空白字符LCD_Write(32,1); //显示向上指针LCD_Write(24,1); //显示空白字符}}void DS18B20_TempChange(void) //DS18B20 开始获取温度并转换{DS18B20_Reset();delay(1);DS18B20_WriteByte(0xcc); // 写跳过读ROM指令DS18B20_WriteByte(0x44); // 写温度转换指令}void DS18B20_GetTemp() // 从DS18B20读取寄存器中存储的温度数据{uchar a,b;DS18B20_Reset();delay(1);DS18B20_WriteByte(0xcc);DS18B20_WriteByte(0xbe);a=DS18B20_Read(); //读低8位b=DS18B20_Read(); //读高8位temp=b;temp<<=8; //两个字节组合为1个字temp=temp|a;if(temp&0x80==0x80) temp=-(~temp+1); //判断实测温度的正负f_temp=temp*0.0625; //温度在寄存器中为12位分辨率位0.0625°temp=f_temp*10+0.5; //乘以10表示小数点后面只取1位,加0.5是四舍五入 f_temp=f_temp+0.05;Actual_Temp=temp; //temp是整型}void Beep_Warn() //蜂鸣器报警{if(Actual_Temp>Alarm_Temp)beep=0; //蜂鸣器响elsebeep=1; //蜂鸣器不响}void main(){ uint i;LCD_init(); //初始化LCDLCD_Clear(); //LCD清屏LCD_Pos(0,0); //设置显示位置为第一行的第一个字符LCD_SendData(Display1,8); //显示:实际温度LCD_Pos(1,0); //设置显示位置为第二行的第一个字符LCD_SendData(Display2,8); //显示报警温度while(1){ DS18B20_TempChange( );for(i=0;i<10;i++){Beep_Warn ();DS18B20_GetTemp();LCD_DisplayTemp(); //调用显示函数}Key_Scan(); //调用键盘函数}}//程序很棒,仅供参考,不明白处可留言。
单片机rt与ntc查表

单片机rt与ntc查表引言单片机是一种集成了微处理器、存储器和其他功能模块的芯片,被广泛应用于嵌入式系统中。
而NTC(Negative Temperature Coefficient)则是一种负温度系数热敏电阻,其电阻值随温度的变化而变化。
在单片机应用中,我们经常需要使用NTC来测量温度,并通过查询表格来获取准确的温度数值。
单片机的基本原理单片机是一种集成了微处理器、存储器和其他功能模块的芯片。
它通过内部的运算单元、控制单元和存储器来实现各种功能。
单片机可以通过输入端口接收外部信号,并通过输出端口控制外部设备。
在温度测量应用中,我们可以使用单片机的模拟输入端口来接收NTC的电阻值,并通过查询表格来获取对应的温度值。
NTC的基本原理NTC是一种负温度系数热敏电阻,其电阻值随温度的变化而变化。
NTC的工作原理是基于半导体材料的温度特性。
当温度升高时,半导体材料中的载流子浓度增加,电阻值减小;当温度降低时,载流子浓度减小,电阻值增加。
NTC的电阻-温度特性通常可以通过查表的方式得到。
查询NTC温度表格的方法为了获取NTC的准确温度数值,我们需要查询NTC温度表格。
下面是查询NTC温度表格的方法:1.确定NTC的额定电阻值和温度系数。
2.根据NTC的额定电阻值和温度系数,在NTC温度表格中找到对应的行。
3.在找到的行中,根据NTC的实际电阻值找到对应的列。
4.在交汇的单元格中,即可得到NTC的温度数值。
下面是一个示例NTC温度表格:电阻值(Ω)-40℃-30℃-20℃-10℃0℃10℃20℃30℃40℃10 100 200 300 400 500 600 700 800 900 20 90 180 270 360 450 540 630 720 810 30 80 160 240 320 400 480 560 640 720 40 70 140 210 280 350 420 490 560 630假设我们的NTC的额定电阻值为30Ω,温度系数为-10℃/Ω。
pic18单片机热敏电阻测温查表程序

//;*************************************************1.//;* heat.c **2.//;*************************************************3.//;* 本程序为热敏电阻输入处理模块程序4.//;* 将温度值在LCD特定位置显示5.//;* 占用I/O RA1,RB5,RB4,RB36.//;* 使用RAM7.//;* 程序包括:8.//;* - tempdeal 热敏电阻输入处理子程序9.//;* - heattab 温度值校准表10.//;*11.//;* 入口参数无12.//;* 出口参数 TempH,TempL (温度值)13.//;*************************************************14.#include <pic18.h> // ;定义所用单片机的头文件15.#define TSRCLK TRISD516.#define TRCLK TRISD417.#define TSER TRISD318.#define SRCLK RD519.#define RCLK RD420.#define SER RD321.22.23.void preled(void)24.{25. TSRCLK=0;26. TRCLK=0;27. TSER=0;28. SRCLK=0;29. RCLK=0;30. SER=0;31.}32.void moniled (unsigned char led_data)33.{34. //MONILED; 入口参数LED_DATA,需要为35. //;芯片全部在时钟上升沿完成动作,故需在低电平期间完成数据的变化。
先发送高位36. unsigned char i;37. for(i=8;i!=0;i--)38. {39. if(led_data&0x80)40. SER=1;41. else42. SER=0;43. led_data<=1;44. asm("nop");45. SRCLK=1;46. asm("nop");47. SRCLK=0;48. }49. RCLK=0;50. asm("nop");51. RCLK=1;52. RCLK=0;53.}54.55.void delay(unsigned int i)56.{57. while(i)58. {59. NOP();60. --i;61. }62. }63.64.void iniheat458()65.{66. TRISA1=1;//RA1输入67. ADCON1=0;68. ADCON0=0;69. ADCS0=1;//设置转换时钟70. CHS0=1;//设置通道为RA171. PCFG2=1;//0100,设置各通道属性及参考电压为VDD,VSS72. ADON=1;//使能AD73.}74.75.unsigned char tempdeal()76.{77. const char heattab[255]={78. 0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,79. 6,6,6,7,7,7,8,8,8,9,9,0xa,0xa,0xb,0xb,0xc,0xc,80. 0xd,0xd,0xe,0xe,0xf,0xf,0xf,0x10,0x10,0x10,81. 0x11,0x11,0x12,0x12,0x12,0x13,0x13,0x14,0x14,0x14,82. 0x15,0x15,0x15,0x16,0x16,0x16,0x17,0x17,0x18,0x18,83. 0x19,0x19,0x1a,0x1a,0x1b,0x1b,0x1c,0x1c,0x1c,84. 0x1d,0x1d,0x1d,0x1e,0x1e,0x1f,0x1f,0x20,0x20,85. 0x21,0x21,0x22,0x22,0x23,0x23,0x24,0x24,0x25,0x25,86. 0x26,0x26,0x27,0x28,0x29,0x29,0x2a,0x2a,0x2b,0x2b,87. 0x2c,0x2d,0x2e,0x2f,0x30,0x3288. };89. unsigned char temp;90. GODONE=1;91. while(GODONE);92. ADRESH-=0x3A;93. temp=heattab[(ADRESH)];94. return temp;95.}96.97.void main()98.{99. const char ledtab[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F }; //定义依次显示"0"~"9"的数组元素100. unsigned char temp,temph,templ;101.102. preled();103. iniheat458();104. while(1)105. {106. temp=tempdeal();107. temph=temp/10;108. templ=temp%10;109. moniled(ledtab[templ]);110. moniled(ledtab[temph]);111. delay(65535);//延时1S112. delay(65535);113. }114.}115.。
51单片机热敏电阻测温查表程序

51单片机热敏电阻测温查表程序(总7页)--本页仅作为文档封面,使用时请直接删除即可----内页可以根据需求调整合适字体及大小--1.#include<>2.#include""3.#define uchar unsigned char4.#define uint unsigned int5.#define N 106.uchar bai,ge,shi,n;7.uint temp,tp;temph,templ;8.uint code ad_date[]={9. 1060,1060,1060,1100,1120,1140,1166,1180,1200,1220,10. 1240,1320,1340,1360,1380,1400,1420,1440,1460,1480,11. 1500,1520,1540,1560,1580,1600,1620,1640,1660,1680,12. 1700,1720,1740,1760,1780,1800,1820,1840,1840,1860,13. 1880,1900,1920,1940,1960,1980,2000,2020,2040,2060,14. 2080,2100,2120,2140,2160,2180,2200,2220,2240,2260,15. 2280,2300,2320,2340,2360,2380,2400,2420,2440,2460,16. 2480,2500,2520,2540,2560,2580,2600,2620,2640,2660,17. 2680,2700,2720,2740,2760,2780,2800,2820,2840,2860,18. 2880,2900,2920,2920,2940,2960,2980,3000,3020,3040,19. 3060,3080,3100,3120,3140,3160,3180,3200,3220,3240,20. 3260,3280,3300,3320,3340,3360,3380,3400,3420,3440,21. 3460,3480,3500,3520,3540,3560,3580,3600,3620,3640,22. 3660,3680};23.uint code temperiture[]={24. 594,593,586,580,579,560,564,559,552,545,25. 541,518,513,508,503,497,491,488,483,480,26. 473,468,463,458,455,451,447,440,434,433,27. 430,425,420,416,413,409,404,401,401,396,28. 390,386,382,378,374,372,368,364,361,357,29. 354,351,347,343,340,336,333,328,326,322,30. 319,316,313,309,307,303,300,296,294,289,31. 286,283,280,276,274,271,267,264,260,257,32. 253,249,246,243,240,237,233,231,228,224,33. 222,219,214,216,211,209,206,202,198,194,34. 187,184,181,178,175,171,168,164,161,158,35. 154,152,148,146,142,139,136,133,130,126,36. 124,121,116,114,112,108,102,98,96,94,37. 89,86};38.uchar code table[]=" T:`C";39.uchar num=0;40.uchar keynum,max=40,min=0;41.uchar code Temp_max[]=" Max:40`C",Temp_min[]=" Min:00`C";42.43.sbit ad_wr=P3^6;44.sbit ad_rd=P3^7;45.sbit ad_cs=P3^5;46.sbit ad_int=P3^2;47.sbit key1=P0^5;48.sbit key2=P0^6;49.sbit key3=P0^7;50.//sbit Beep=P0^0;51.52./*********函数表************/53.void init(); //初始化54.void ad_delay(uint t); //延时函数55.void change(uchar tempture); //分离百位、十位、个位56.uchar ad_getshuju(); //ad转换57.char filter(); //滤波58.uint convert(); //电压转换59.void tempertur(); //度温度60.void keyscan(); //键盘扫描61.62.//主函数63.void main()64.{65. init();66.while(1)67. {68. keyscan();69. }70.}71.72.void init()73.{74. LCD_init();75.for(num=0;num<10;num++)76. {77. LCD_Write_add_data(num,0,table[num]);78. }79.}80.81.void ad_delay(uint t)82.{83. uchar j;84. uint i;85.for(i=0;i<t;i++)86.for(j=0;j<110;j++);87.}88.89.uchar ad_getshuju()90.{91. uchar date;92. ad_cs=0;ad_wr=0;ad_rd=1;93. ad_cs=1;ad_wr=1;ad_rd=1;94.while(ad_int==1);95. ad_cs=0;ad_wr=1;ad_rd=0;96. date=P2;97. ad_cs=1;ad_wr=1;ad_rd=1;98.return date;99.}100.101.char filter() //滤波函数中位值滤波法102.{103. uint value_buf[N],temp_f;104. uchar count,i,j;105.for ( count=0;count<N;count++)106. {107. value_buf[count] = ad_getshuju();108. delay(2);109. }110.for (j=0;j<N-1;j++)111. {112.for (i=0;i<N-j;i++)113. {114.if ( value_buf[i]>value_buf[i+1] )115. {116. temp_f = value_buf[i];117. value_buf[i] = value_buf[i+1];118. value_buf[i+1] = temp_f;119. }120. }121. }122.return value_buf[(N-1)/2];123.}124.125.uint convert()126.{127. uint temph,templ; //用于存储读出数据的高字节和低字节128. uint tmp="0"; //存储最后处理完的结果注意数据类型129. tmp=filter()+tmp; //求滤波后ad值130. temph=tmp&0xf0; //屏蔽低四位131. temph=temph>>4; //右移四位取出高四位132. templ=tmp&0x0f; //屏蔽高四位取出低四位133. tmp=templ*20+temph*320; //最后的结果是一个四位数,便于显示电压值134.return tmp; //返回最后处理结果135.}136.137.void change(uchar tempture)138.{139. bai=tempture/100;140. shi=tempture%100/10;141. ge=tempture%10;142.}143.144.void tempertur()145.{146.for(n=0;temp>=ad_date[n];n++);147. tp=temperiture[n-1];148. change(tp);149. LCD_Write_add_data(4,0,0x30+bai);150. LCD_Write_add_data(5,0,0x30+shi);151. LCD_Write_add_data(7,0,0x30+ge);152.}153.154.155.void keyscan()156.{157.if(key1==0)158. {159. delay(5);160.if(key1==0)161. {162.while(!key1);163. keynum++;164.if(keynum==1)165. {166. change(max);167. LCD_Write_Com(0x01);168. delay(10);169. LCD_Write_add_str(0,0,10,Temp_max);170. LCD_Write_add_data(6,0,0x30+shi);171. LCD_Write_add_data(7,0,0x30+ge);172. }173.if(keynum==2)174. {175. change(min);176. LCD_Write_Com(0x01);177. min=min>0min:0;178. delay(10);179. LCD_Write_add_str(0,0,10,Temp_min); 180. LCD_Write_add_data(6,0,0x30+shi); 181. LCD_Write_add_data(7,0,0x30+ge); 182. }183.if(keynum==3)184. {185. keynum=0;186. LCD_Write_Com(0x01);187. delay(10);188. LCD_Write_add_str(0,0,10,table); 189. }190. }191. }192.if(keynum==0)193. {194. temp=convert();195. tempertur();196. delay(100);197. }198.else199. {200.if(keynum==1)201. {202.if(key2==0)203. {204. delay(5);205.if(key2==0)206. {207.while(!key2);208. max++;209. change(max);210. delay(1);211. }212. }213.if(key3==0)214. {215. delay(5);216.if(key3==0)217. {218.while(!key3);219. max--;220. change(max);221. delay(1);222. }223. }224.//LCD_Write_add_str(0,0,9,Temp_max); 225. LCD_Write_add_data(6,0,0x30+shi); 226. LCD_Write_add_data(7,0,0x30+ge); 227. }228.if(keynum==2)229. {230.if(key2==0)231. {232. delay(5);233.if(key2==0)234. {235.while(!key2);236. min++;237. change(min);238. min=min>0min:0;239. delay(1);240. }241. }242.if(key3==0)243. {244. delay(5);245.if(key3==0)246. {247.while(!key3);248. min--;249. change(min);250. delay(1);251. }252. }253.//LCD_Write_add_str(0,0,9,Temp_min); 254. LCD_Write_add_data(6,0,0x30+shi); 255. LCD_Write_add_data(7,0,0x30+ge); 256. }257. }258.}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
51单片机热敏电阻测温查表程序1.#include<reg51.h>2.#include"LCD.h"3.#define uchar unsigned char4.#define uint unsigned int5.#define N 106.uchar bai,ge,shi,n;7.uint temp,tp;temph,templ;8.uint code ad_date[]={9. 1060,1060,1060,1100,1120,1140,1166,1180,1200,1220,10. 1240,1320,1340,1360,1380,1400,1420,1440,1460,1480,11. 1500,1520,1540,1560,1580,1600,1620,1640,1660,1680,12. 1700,1720,1740,1760,1780,1800,1820,1840,1840,1860,13. 1880,1900,1920,1940,1960,1980,2000,2020,2040,2060,14. 2080,2100,2120,2140,2160,2180,2200,2220,2240,2260,15. 2280,2300,2320,2340,2360,2380,2400,2420,2440,2460,16. 2480,2500,2520,2540,2560,2580,2600,2620,2640,2660,17. 2680,2700,2720,2740,2760,2780,2800,2820,2840,2860,18. 2880,2900,2920,2920,2940,2960,2980,3000,3020,3040,19. 3060,3080,3100,3120,3140,3160,3180,3200,3220,3240,20. 3260,3280,3300,3320,3340,3360,3380,3400,3420,3440,21. 3460,3480,3500,3520,3540,3560,3580,3600,3620,3640,22. 3660,3680};23.uint code temperiture[]={24. 594,593,586,580,579,560,564,559,552,545,25. 541,518,513,508,503,497,491,488,483,480,26. 473,468,463,458,455,451,447,440,434,433,27. 430,425,420,416,413,409,404,401,401,396,28. 390,386,382,378,374,372,368,364,361,357,29. 354,351,347,343,340,336,333,328,326,322,30. 319,316,313,309,307,303,300,296,294,289,31. 286,283,280,276,274,271,267,264,260,257,32. 253,249,246,243,240,237,233,231,228,224,33. 222,219,214,216,211,209,206,202,198,194,34. 187,184,181,178,175,171,168,164,161,158,35. 154,152,148,146,142,139,136,133,130,126,36. 124,121,116,114,112,108,102,98,96,94,37. 89,86};38.uchar code table[]=" T:00.0`C";39.uchar num=0;40.uchar keynum,max=40,min=0;41.uchar code Temp_max[]=" Max:40`C",Temp_min[]=" Min:00`C";42.43.sbit ad_wr=P3^6;44.sbit ad_rd=P3^7;45.sbit ad_cs=P3^5;46.sbit ad_int=P3^2;47.sbit key1=P0^5;48.sbit key2=P0^6;49.sbit key3=P0^7;50.//sbit Beep=P0^0;51.52./*********函数表************/53.void init(); //初始化54.void ad_delay(uint t); //延时函数55.void change(uchar tempture); //分离百位、十位、个位56.uchar ad_getshuju(); //ad转换57.char filter(); //滤波58.uint convert(); //电压转换59.void tempertur(); //度温度60.void keyscan(); //键盘扫描61.62.//主函数63.void main()64.{65. init();66.while(1)67. {68. keyscan();69. }70.}71.72.void init()73.{74. LCD_init();75.for(num=0;num<10;num++)76. {77. LCD_Write_add_data(num,0,table[num]);78. }79.}80.81.void ad_delay(uint t)82.{83. uchar j;84. uint i;85.for(i=0;i<t;i++)86.for(j=0;j<110;j++);87.}88.89.uchar ad_getshuju()90.{91. uchar date;92. ad_cs=0;ad_wr=0;ad_rd=1;93. ad_cs=1;ad_wr=1;ad_rd=1;94.while(ad_int==1);95. ad_cs=0;ad_wr=1;ad_rd=0;96. date=P2;97. ad_cs=1;ad_wr=1;ad_rd=1;98.return date;99.}100.101.c har filter() //滤波函数中位值滤波法102.{103. uint value_buf[N],temp_f;104. uchar count,i,j;105.for ( count=0;count<N;count++)106. {107. value_buf[count] = ad_getshuju();108. delay(2);109. }110.for (j=0;j<N-1;j++)111. {112.for (i=0;i<N-j;i++)113. {114.if ( value_buf[i]>value_buf[i+1] )115. {116. temp_f = value_buf[i];117. value_buf[i] = value_buf[i+1];118. value_buf[i+1] = temp_f;119. }120. }121. }122.return value_buf[(N-1)/2];123.}124.125.u int convert()126.{127. uint temph,templ; //用于存储读出数据的高字节和低字节128. uint tmp="0"; //存储最后处理完的结果注意数据类型129. tmp=filter()+tmp; //求滤波后ad值130. temph=tmp&0xf0; //屏蔽低四位131. temph=temph>>4; //右移四位取出高四位132. templ=tmp&0x0f; //屏蔽高四位取出低四位133. tmp=templ*20+temph*320; //最后的结果是一个四位数,便于显示电压值134.return tmp; //返回最后处理结果135.}136.137.v oid change(uchar tempture)138.{139. bai=tempture/100;140. shi=tempture%100/10;141. ge=tempture%10;142.}143.144.v oid tempertur()145.{146.for(n=0;temp>=ad_date[n];n++);147. tp=temperiture[n-1];148. change(tp);149. LCD_Write_add_data(4,0,0x30+bai);150. LCD_Write_add_data(5,0,0x30+shi);151. LCD_Write_add_data(7,0,0x30+ge);152.}153.154.155.v oid keyscan()156.{157.if(key1==0)158. {159. delay(5);160.if(key1==0)161. {162.while(!key1);163. keynum++;164.if(keynum==1)165. {166. change(max);167. LCD_Write_Com(0x01);168. delay(10);169. LCD_Write_add_str(0,0,10,Temp_max);170. LCD_Write_add_data(6,0,0x30+shi);171. LCD_Write_add_data(7,0,0x30+ge);172. }173.if(keynum==2)174. {175. change(min);176. LCD_Write_Com(0x01);177. min=min>0?min:0;178. delay(10);179. LCD_Write_add_str(0,0,10,Temp_min); 180. LCD_Write_add_data(6,0,0x30+shi); 181. LCD_Write_add_data(7,0,0x30+ge); 182. }183.if(keynum==3)184. {185. keynum=0;186. LCD_Write_Com(0x01);187. delay(10);188. LCD_Write_add_str(0,0,10,table); 189. }190. }191. }192.if(keynum==0)193. {194. temp=convert();195. tempertur();196. delay(100);197. }198.else199. {200.if(keynum==1)201. {202.if(key2==0)203. {204. delay(5);205.if(key2==0)206. {207.while(!key2);208. max++;209. change(max);210. delay(1);211. }212. }213.if(key3==0)214. {215. delay(5);216.if(key3==0)217. {218.while(!key3);219. max--;220. change(max);221. delay(1);222. }223. }224.//LCD_Write_add_str(0,0,9,Temp_max); 225. LCD_Write_add_data(6,0,0x30+shi); 226. LCD_Write_add_data(7,0,0x30+ge); 227. }228.if(keynum==2)229. {230.if(key2==0)231. {232. delay(5);233.if(key2==0)234. {235.while(!key2);236. min++;237. change(min);238. min=min>0?min:0;239. delay(1);240. }241. }242.if(key3==0)243. {244. delay(5);245.if(key3==0)246. {247.while(!key3);248. min--;249. change(min);250. delay(1);251. }252. }253.//LCD_Write_add_str(0,0,9,Temp_min); 254. LCD_Write_add_data(6,0,0x30+shi); 255. LCD_Write_add_data(7,0,0x30+ge); 256. }257. }258.}。