51单片机测温程序
基于51单片机的温度检测系统

单片机C语言课题设计报告设计题目:温度检测指导老师:设计人:学号:班级:设计时间:摘要本课题以51单片机为核心实现智能化温度测量。
利用18B20温度传感器获取温度信号,将需要测量的温度信号自动转化为数字信号,利用单总线和单片机交换数据,最终单片机将信号转换成LCD可以识别的信息显示输出。
基于STC90C516RD+的单片机的智能温度检测系统,设计采用18B20温度传感器,其分辨率可编程设计。
本课题设计应用于温度变化缓慢的空间,综合考虑,以降低灵敏度来提高显示精度。
设计使用12位分辨率,因其最高4位代表温度极性,故实际使用为11位半,而温度测量范围为-55℃~+125℃,则其分辨力为0.0625℃。
设计使用LCD1602显示器,可显示16*2个英文字符,显示器显示实时温度和过温警告信息,传感器异常信息设。
计使用蜂鸣器做警报发生器,当温度超过设定值时播放《卡农》,当传感器异常时播放嘟嘟音。
目录一、设计功能 (3)二、系统设计 (3)三、器件选择 (3)3.1温度信号采集模块 (3)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 液晶显示器1602LCD (9)3.2.1引脚功能说明 (9)3.2.2 1602LCD的指令说明及时序 (10)3.2.3 1602LCD的一般初始化过程 (10)四、软件设计 (11)4.1 1602LCD程序设计流程图 (11)4.2 DS18B20程序设计流程图 (12)4.3 主程序设计流程图 (13)五、设计总结 (14)六、参考文献 (14)七、硬件原理图及仿真 (15)7.1系统硬件原理图 (15)7.2开机滚动显示界面 (16)7.3临界温度设置界面 (16)7.4传感器异常警告界面 (16)八、程序清单 (17)温度DS18B20 LCD 显示过温函数功能模块传感器异常函数功能模块D 0D 1D 2D 3D 4D 5D 6D 7R WR SE ND0D1D2D3D4D5D6D7D 7D 6D 5D 4D 3D 2D 1D 0E N R W R S XT AL218XT AL119ALE 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/TXD 11P3.2/INT012P3.3/INT113P3.4/T014P3.7/RD17P3.6/WR 16P3.5/T115U180C51X1CRYST ALC122pFC222pFGNDV C CG N DR110kC31uFV C CVCCGND234567891RP1RESPACK-8VCC0.0DQ 2VCC 3GND 1U2DS18B20R24.7K D 714D 613D 512D 411D 310D 29D 18D 07E6R W 5R S 4V S S1V D D 2V E E3LCD1LM016LLS2SOUNDERMUC一、设计功能·由单片机、温度传感器以及液晶显示器等构成高精度温度监测系统。
基于51单片机的测温数字温度计的最小系统

●第一章设计目的——————————————3 ●第二章设计内容————————————— 3 ●第三章分析———————————————7 ●第四章示例程序——————————————7 ●第五章总结———————————————13一、设计目的:利用51单片机和ds18b20等元件设计一个实时的测量温度和报警的小系统。
系统可以通过数码管显示实时的温度值,显示的温度的精度是0.01℃。
然后,还可以利用按键进行最高温度值和最低温度值的设定,当温度超过设定的最高温度值的时候,蜂鸣器会响,并且会有一个led灯亮起;当温度值低于设定的最低温度值的时候,蜂鸣器会响,但是led灯不会亮。
二、设计内容:温度计电路设计总体设计方框图如图1所示,控制器采用单片机8051,温度传感器采用DS18B20,显示部分是一个四位一体的数码管,设置电路部分是3个按键和3个用于指示的led灯,报警电路部分是一个led灯和一个蜂鸣器。
图11、 温度传感器DS18B20与8051单片机连接非常简单,只需将DS18B20信号线与单片机一位I/O 线相连,且一位I/O 线可连接多个DS18B20,以实现单点或多点温度测量。
温度计仿真电路部分如图2所示。
图2单片机复位 时钟震荡主 控制 器数码管显示温度传感器报警电路设置电路Ds18b20需要严格的协议以确保数据的完整性。
协议包括集中单线信号类型:复位脉冲.存在脉冲.写0.写1.读0和读1。
所有这些信号,处存在脉冲外,都是由总线控制器发出的。
和ds18b20间的任何通讯都是需要以初始化序列开始,初始化序列见图3,一个复位脉冲跟着一个存在脉冲表明ds18b20已经准备好发送和接收数据。
图3Ds18b20的读写时序图如图4所示,Ds18b20的几个常用的功能命令如下: CCH 跳过ROM指令44H 温度转换指令BEH 读SRAM4EH 写SRAM三、分析:1.程序一开始测得温度并储存,然后对按键1进行判断,若按键1未按下则直接跳到第四步;2.若按键1按下,则开始设置最高温度,然后再判断按键2(3)是否按下,若按下,则对应设置十(个)位。
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单片机热敏电阻测温查表程序汇总

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单片机的Pt100的温度计程序

基于51单片机的Pt100的温度计程序#include#include#define uchar unsigned char#define uint unsigned int#define ADC0801 XBYTE[0x7fff]#define disp_dat P1#define LED_n P2sbit INTR=P3^2;const uchar tab[]={0xc0,0xf9,0xa4,0xb0,//0~30x99,0x92,0x82,0xf8,//4~70x80,0x90,0xff,0x86 //8、9、mie};const uchar tab_dot[]={0x40,0x79,0x24,0x30,//0.~3.0x19,0x12,0x02,0x78,//4.~7.0x00,0x10, 0xff,0x86//8.、9.、mie、E};uchar T[4]={1,0,4,5};uchar tem[11]={10,10,20,13,11,11,15,21,18,29,11};uchar T_num=20,sam_n=0;/************************函数声明***********************/ void delay(int n); //延时函数void init_T0(void); //定时器T0初始化void disp_seg(uchar n,uchar d_dat); //显示函数uchar AD_dat(void); //AD转换函数uchar median(uchar *dat,uchar num_d); //中值滤波函数float account_res(void); //电阻值计算函数float temperature(void); //计算温度函数void adj_t(void); //调整显示数据函数void disp(void); //温度显示程序void renovate(void); //更新显示数据/*********************主程序*********************/main(){init_T0(); //初始化T0while(1){disp(); //调用显示函数renovate(); //更新显示数据};}/*****************温度显示函数*****************/void disp(void)uchar i;for(i=0;i<4;i++){disp_seg(i,T[i]);}}/***************更新显示数据函数***************/void renovate(void){if(sam_n==11) //去完11个采样值{sam_n=0; //清零采样计数器adj_t(); //调用数据调整程序}}/******************延时函数********************/void delay(int n){int i,j;for (i=0;i<n;i++)< bdsfid="120" p=""></n;i++)<> for (j=0;j<1000;j++);}/****************定时器T0初始化****************/ void init_T0(void){TMOD=0x01; //工作方式1TH0=0x4c; //定时50msTL0=0x00;ET0=1; //允许定时器T0中断EA=1; //开总中断TR0=1; //启动定时器T0}/*******************显示函数*******************/void disp_seg(uchar n,uchar d_dat){LED_n=0xff; //清位控制状态disp_dat=0xff; //清显示数据LED_n=~(0x01<<="">if(n==2)disp_dat=tab_dot[d_dat]; //送带小数点显示数据else disp_dat=tab[d_dat]; //送无小数点显示数据delay(1); /********************AD转换函数*********************/ uchar AD_dat(void){uchar temp;ADC0801=0; //启动AD转换while (INTR); //等待转换结束temp=ADC0801; //读取转换值}/*******************中值滤波函数*********************/ uchar median(uchar *dat,uchar num_d) //需要排序的数组{uchar i,j,temp;for (i=0;i{if (dat[i]>dat[i+1]){temp=dat[i];dat[i]=dat[i+1];dat[i+1]=temp;}}return(dat[(num_d-1)/2]); //取中值并返回}/*******************电阻值计算函数*********************/ float account_res(void){uchar temp;float temp_r;temp=median(tem,11); //利用中值法求取中间值temp_r=((float)temp)*150/255+100;return(temp_r);}/*****************计算温度函数*******************/float temperature(void){float temp1,T_out;temp1=account_res(); //计算Pt100阻值temp2=(uchar)temp1; //取Pt100阻值高位if(temp2<100)T_out=777; //若阻值在小于0℃之间else if(temp2<139)T_out=2.558*temp1-256.02; //若阻值在0~100℃之间else if(temp2<177)T_out=2.637*temp1-267.01; //若阻值在100~200℃之间else if(temp2<214)T_out=2.721*temp1-281.9; //若阻值在200~300℃之间else if(temp2<250)T_out=2.81*temp1-300.94; //若阻值在300~400℃之间else if(temp2>250)T_out=777; //若阻值在大于400℃之间return(T_out);}/*******************调整显示数据函数*******************/void adj_t(void){float temp_v;uint value;temp_v=10*temperature(); //利用计算温度值value=(uint)temp_v;if(value==7770) //超出测量范围{T[0]=11; //显示'E'T[1]=11; //显示'E'T[2]=11; //显示'E'T[3]=11; //显示'E'}else{T[0]=value/1000; //待显示百位T[1]=(value%1000)/100; //待显示十位T[2]=(value%1000)%100; //待显示个位T[3]=(value%1000)%100%10; //待显示小数if(T[0]==0x00){T[0]=10;if(T[1]==0)T[1]=10;}}}/*******************定时T0中断程序*****************/ void senddat_T0(void) interrupt 1{TH0=0x4c; //重载定时器初值TL0=0x00;if(--T_num==0){tem[sam_n]=AD_dat(); //读取温度值存入缓冲区sam_n++; //温度采样个数加1T_num=20; //恢复计数值}}。
基于51单片机的温度检测系统程序及仿真概要

基于51单片机的温度检测系统程序及仿真概要
1. 系统概述
本系统采用51单片机作为控制核心,通过外接温度传感器进行温度检测,并在数码管上显示当前温度值。
同时,当温度超过设定阈值时,通过蜂鸣器进行警示。
2. 系统硬件设计
本系统采用DS18B20温度传感器作为温度检测模块,通过单总线连接到51单片机的
P2.0口,同时将P2.1口连接到蜂鸣器。
数码管采用共阳极数码管,通过P0口进行控制。
系统程序采用C语言编写,在主函数中进行如下操作:
(1) 初始化DS18B20,设置温度传感器工作模式。
(2) 读取温度传感器输出的温度值,进行温度判断。
(3) 将温度值转换为数码管显示的格式并显示在数码管上。
(4) 如果温度超过设定阈值,触发蜂鸣器进行警示。
(5) 循环执行以上操作。
4. 系统仿真
5. 总结
本系统基于51单片机实现了温度检测功能,并且能够进行数码管显示以及蜂鸣器警示,具有一定的实用价值。
本系统的设计和仿真过程对于初学者来说都是一个非常好的练手项目,也有助于掌握单片机的基本编程技能和原理知识。
基于51单片机的温度测量

我的程序是分模块写的:1,main.c#include<reg52.h>#include"1602.h"#include"ds18b20.h"#define uint unsigned int#define uchar unsigned charsbit speaker=P2^4;sbit red=P2^5;sbit green=P2^6;sbit key1=P3^0;sbit key2=P3^1;uint tem;int htem,ltem;uchar mode;uchar code t3[]={" high temp: . C"}; uchar code t4[]={" low temp: . C "};void display(uint dat,uchar add){uchar bai,shi ,ge;bai=dat/100;shi=dat%100/10;ge=dat%10;writelcd_cmd(add);writelcd_dat(bai+0x30);writelcd_dat(shi+0x30);writelcd_cmd(add+3);writelcd_dat(ge+0x30);}void keyscan(){ uchar i,j;writelcd_cmd(0x80);for(i=0;i<16;i++){writelcd_dat(t3[i]);}writelcd_cmd(0xc0);for(j=0;j<16;j++){writelcd_dat(t4[j]);}while(mode!=0){display(htem,0x8b);display(ltem,0xca);while(mode!=0){switch(mode){case 1:writelcd_cmd(0xc0+13);writelcd_cmd(0x0f);break;case 2:writelcd_cmd(0xc0+11);writelcd_cmd(0x0f);break;case 3:writelcd_cmd(0xc0+10);writelcd_cmd(0x0f);break;case 4:writelcd_cmd(0x80+14);writelcd_cmd(0x0f);break;case 5:writelcd_cmd(0x80+12);writelcd_cmd(0x0f);break;case 6:writelcd_cmd(0x80+11);writelcd_cmd(0x0f);break;default:mode=0;break;}if(key1==0){delay(10);if(key1==0){while(key1==0);switch(mode){case1:ltem=ltem+1;if(ltem>999)ltem=999;if(ltem>=htem)ltem=htem-1;display(ltem,0xca);writelcd_c md(0xc0+13);break;case2:ltem=ltem+10;if(ltem>999)ltem=999;if(ltem>=htem)ltem=htem-1;display(ltem,0xca);writelcd_ cmd(0xc0+11);break;case3:ltem=ltem+100;if(ltem>999)ltem=999;if(ltem>=htem)ltem=htem-1;display(ltem,0xca);writelcd _cmd(0xc0+10);break;case4:htem=htem+1;if(htem>999)htem=999;if(htem<=ltem)htem=ltem+1;display(htem,0x8b);writelc d_cmd(0xc0+14);break;case5:htem=htem+10;if(htem>999)htem=999;if(htem<=ltem)htem=ltem+1;display(htem,0x8b);writel cd_cmd(0xc0+12);break;case6:htem=htem+100;if(htem>999)htem=999;if(htem<=ltem)htem=ltem+1;display(htem,0x8b);write lcd_cmd(0xc0+11);break;default:break;}}if(key2==0){delay(10);if(key2==0){while(key2==0);switch(mode){case1:ltem=ltem-1;if(ltem<0)ltem=0;if(ltem>=htem)ltem=htem-1;display(ltem,0xca);writelcd_cmd(0x c0+13);break;case2:ltem=ltem-10;if(ltem<0)ltem=0;if(ltem>=htem)ltem=htem-1;display(ltem,0xca);writelcd_cmd(0 xc0+11);break;case3:ltem=ltem-100;if(ltem<0)ltem=0;if(ltem>=htem)ltem=htem-1;display(ltem,0xca);writelcd_cmd( 0xc0+10);break;case4:htem=htem-1;if(ltem<0)htem=0;if(htem<=ltem)htem=ltem+1;display(htem,0x8b);writelcd_cmd (0xc0+14);break;case5:htem=htem-10;if(ltem<0)htem=0;if(htem<=ltem)htem=ltem+1;display(htem,0x8b);writelcd_cm d(0xc0+12);break;case6:htem=htem-100;if(ltem<0)htem=0;if(htem<=ltem)htem=ltem+1;display(htem,0x8b);writelcd_c md(0xc0+11);break;default:break;}}}}}lcd_init();}void init(){lcd_init();speaker=1;red=0;green=0;mode=0;htem=360;ltem=270;EX0=1;ET0=1;TMOD=0X01;IT0=1;TH0=0XFD;TL0=0X81;}void main(){init();while(1){if(mode!=0){keyscan();}else if(mode==0){delay(100);tmpchange();tem=tmp();if(tem<=ltem){red=0;green=1;TR0=1;}else if(tem>=htem){green=0;red=1;TR0=1;}else{TR0=0;red=0;green=0;}delay(10);display(tem,0xca);delay(100);TR0=0;}}}void exter()interrupt 0{mode++;mode=mode%7;}void timer0()interrupt 1{TH0=0XFD;TL0=0X81;speaker=~speaker;}2、1602.c#include<reg52.h>#define uint unsigned int#define uchar unsigned charsbit rs=P2^0;sbit rw=P2^1;sbit en=P2^2;uchar code t1[]={" Thermometer: "};uchar code t2[]={" Temp Now: . C "};void delay(uint ms){uint i,j;for(i=ms;i>0;i--)for(j=110;j>0;j--);}void writelcd_cmd(uchar cmd)//向1602液晶显示器里写入命令的函数{en=0;rs=0;rw=0;delay(1);P0=cmd;en=1;delay(1);en=0;}void writelcd_dat(uchar dat)//向1602液晶显示器里写入数据的函数{en=0;rs=1;rw=0;P0=dat;en=1;delay(1);en=0;}void lcd_init() //初始化1602液晶显示器的函数{uchar i,j;writelcd_cmd(0x38);delay(5);writelcd_cmd(0x38);delay(5);writelcd_cmd(0x38);writelcd_cmd(0x08);writelcd_cmd(0x01);writelcd_cmd(0x06);writelcd_cmd(0x0c);writelcd_cmd(0x80);for(i=0;i<16;i++){writelcd_dat(t1[i]);}writelcd_cmd(0xc0);for(j=0;j<16;j++){writelcd_dat(t2[j]);}}3、ds18b20.c#include <reg52.h>#include"1602.h"#define uchar unsigned char#define uint unsigned intsbit DS=P2^3;void dsreset(){uint i;i=103;while(i>0)i--; //延时大约480us~960us DS=1;i=4;while(i>0)i--; //延时大约60us~240us}bit tmpreadbit() //18b20读一位数据{uint i;bit dat;DS=0;i++; //拉低大约1us左右DS=1;i++;i++;dat=DS; //读回数据i=8;while(i>0)i--; //延时45us左右return (dat);}uchar tmpread() //18b20读一个字节函数{uchar i,j,dat;dat=0;for(i=1;i<=8;i++){j=tmpreadbit();dat=(j<<7)|(dat>>1);}return(dat);}void tmpwrite1() //向18b20写入1{ uint i;DS=0;i++;i++; //延时15us左右DS=1;i=8;while(i>0)i--;}void tmpwrite0() //向18b20写入0{ uint i;DS=0;i=8;while(i>0)i--; //延时60us左右DS=1;i++;i++;}void tmpwritebyte(uchar dat)//18b20写一个字节函数{uchar j;bit testb;for(j=1;j<=8;j++){testb=dat&0x01;dat=dat>>1;if(testb){tmpwrite1();}else{tmpwrite0();}}}void tmpchange() //18b20温度转换函数{ //18b20执行序列:dsreset(); //1、初始化delay(1); //tmpwritebyte(0xcc); //2、rom操作指令tmpwritebyte(0x44); //3、18b20功能操作指令}uint tmp(){uint temp;float tt;uchar a,b;dsreset();delay(1);tmpwritebyte(0xcc);tmpwritebyte(0xbe);a=tmpread();b=tmpread();temp=b;temp<<=8;temp=temp|a;tt=temp*0.0625;temp=tt*10+0.5; //加0.5四舍五入return temp;}头文件如下:1、1602.h#ifndef __1602_H__#define __1602_H__void delay(unsigned int ms);void writelcd_cmd(unsigned char cmd); void writelcd_dat(unsigned char dat); void lcd_init();#endif2、ds18b20.h#ifndef __DS18B20_H__#define __DS18B20_H__void dsreset();bit tmpreadbit();unsigned char tmpread();void tmpwritebyte(unsigned char dat); void tmpchange();unsigned int tmp();#endif。
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单片机的温度检测系统程序及仿真

//****************************************//**用DS18B20进行测量,lcd1602显示**//****************************************#include "reg51.h"#include "intrins.h"#define uchar unsigned char#define uint unsigned intuchar code table1 []={"ID: "}; //欢迎显示,包括空格在内<=16 uchar code table2 []={"Name: "};//欢迎显示,包括空格在内<=16 uchar code str1 []={" Temperature "};uchar code str2 []={" "};//************管脚定义************************sbit lcd_rs = P3^0; //液晶数据命令选择端sbit lcd_en = P3^1; //液晶使能sbit DQ = P3^6; //液晶使能//************参数定义************************uint tvalue;//温度值uchar tflag;//温度正负标志uchar data disdata[5];//************子函数定义************************void delay(uchar z); //delay延时子程序void init_lcd(); //LCD1602初始化函数void write_com(uchar com); //LCD1602写指令函数void write_data(uchar date); //LCD1602写数据函数void lcd1602_display(uchar *q,uchar *p);//LCD1602显示函数void welcome(); //LCD1602显示欢迎函数void delay_DS18B20(uint i); //delay_DS18B20函数void Init_DS18B20_display(); //DS18B20初始化显示void Init_DS18B20(); //DS18B20初始化uchar ReadOneByte(); //DS18B20读一字节void WriteOneByte(uchar dat); //DS18B20写一字节Read_Temperature(); //DS18B20读取温度值并转换void DS18B20_display(); //DS18B20温度显示//************主函数************************void main(){ welcome();delay(2000);Init_DS18B20_display();while(1){Read_Temperature();DS18B20_display();}}//************delay延时子程序************************void delay(uchar z){uchar x,y;for(x=0;x<z;x++)for(y=0;y<114;y++);}//************LCD1602初始化函数************************void init_lcd(){write_com(0x38); //设置16*2显示,5*7点阵,8位数据接口write_com(0x08); //写一个字符后地址指针加1write_com(0x01); //显示清零,数据指针清零write_com(0x06); //写一个字符后地址指针加1write_com(0x0c); //关显示,光标不显示不闪烁}//************LCD1602写指令函数************************void write_com(uchar com){delay(5);lcd_rs = 0; // 选择写指令lcd_en = 0; // 将使能端置0P2 = com; // 将要写的命令送到数据总线上delay(5); // 延时5ms,待数据稳定lcd_en = 1; // 由于初始化已将lcd_en置为0,使能端给一个高脉冲,delay(5); // 延时5ms,待数据稳定lcd_en = 0; // 将使能端置0以完成脉冲}//************LCD1602写数据函数************************void write_data(uchar date){delay(5);lcd_rs = 1; // 选择写数据lcd_en = 0; // 将使能端置0P2 = date; // 将要写的数据送到数据总线上delay(5); // 延时5ms,待数据稳定lcd_en = 1; // 由于初始化已将lcd_en置为0,使能端给一个高脉冲,delay(5); // 延时5ms,待数据稳定lcd_en = 0; // 将使能端置0以完成脉冲}//************LCD1602显示函数******************void lcd1602_display(uchar *q,uchar *p){write_com(0x80); // 现将数据指针定位到第一行第一个字处while(*q!='\0'){write_data(*q);q++;delay(1);}write_com(0xc0); // 现将数据指针定位到第二行第一个字处while(*p!='\0'){write_data(*p);p++;delay(1);}}//************LCD1602显示欢迎函数****************** void welcome(){init_lcd();lcd1602_display(table1,table2);delay(5000);}//************DS18B20初始化显示**************void Init_DS18B20_display(){init_lcd();lcd1602_display(str1,str2);}//************LCD1602显示函数****************** void delay_DS18B20(uint i){while(i--);}//************DS18B20初始化******************void Init_DS18B20(){DQ = 1; //DQ复位delay_DS18B20(4); //延时DQ = 0; //DQ拉低delay_DS18B20(100); //精确延时大于480usDQ = 1; //拉高delay_DS18B20(40);}//************DS18B20读一字节****************** uchar ReadOneByte(){uchar i,dat = 0;for(i=8;i>0;i--){DQ = 0; //给脉冲信号dat>>=1;DQ = 1; //给脉冲信号if(DQ) dat|=0x80;delay_DS18B20(10);}return (dat);}//************DS18B20写一字节******************void WriteOneByte(uchar dat){uchar i;for(i=8;i>0;i--){DQ = 0;DQ = dat&0x01;delay_DS18B20(10);DQ = 1;dat>>=1;}}//************DS18B20读取温度值并转换****************** Read_Temperature(){uchar a,b;Init_DS18B20();WriteOneByte(0xcc); //跳过读序列号WriteOneByte(0x44); //启动温度转换Init_DS18B20();WriteOneByte(0xcc); //跳过读序列号WriteOneByte(0xbe); //读取温度a = ReadOneByte();b = ReadOneByte();tvalue=b;tvalue<<=8;tvalue=tvalue|a;if(tvalue<0xfff)tflag = 0;else{tvalue = ~tvalue+1;tflag = 1;}tvalue = tvalue*(0.625); //温度值扩大10倍,精确到1位小数return (tvalue);}//************DS18B20温度显示******************void DS18B20_display(){uchar flagdat;disdata[0]=tvalue/1000+0x30; //百位数disdata[1]=tvalue%1000/100+0x30;//十位数disdata[2]=tvalue%100/10+0x30; //个位数disdata[3]=tvalue%10+0x30; //小数位if(tflag == 0)flagdat = 0x20; //正温度不显示符号elseflagdat = 0x2d; //负温度显示负号if(disdata[0] == 0x30){disdata[0] =0x20; //如果百位为0,不显示if(disdata[1] == 0x30){disdata[1] =0x20;//如果百位为0,十位为0也不显示}}write_com(0xc4);write_data(flagdat); //显示符号位write_com(0xc5);write_data(disdata[0]);//显示百位write_com(0xc6);write_data(disdata[1]);//显示十位write_com(0xc7);write_data(disdata[2]);//显示个位write_com(0xc8);write_data(0x2e); //显示小数点write_com(0xc9);write_data(disdata[3]);//显示小数位}欢迎您的下载,资料仅供参考!致力为企业和个人提供合同协议,策划案计划书,学习资料等等打造全网一站式需求。
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(); //调用键盘函数}}//程序很棒,仅供参考,不明白处可留言。
基于51单片机的心率体温检测程序 (2)

基于51单片机的心率体温检测程序引言心率体温检测在医疗行业中具有重要的意义。
传统的心率体温检测设备通常较为复杂且体积较大,而近年来,随着51单片机技术的不断进步,通过单片机来实现心率体温检测变得更加简便和便携。
本文将介绍一种基于51单片机的心率体温检测程序。
心率检测原理心率检测的原理是通过测量心脏搏动的频率来推测心率。
常用的方法是将一个光传感器放置在皮肤上,通过光的反射来检测血液的流动情况。
当血液流动时,反射的光强度会发生变化。
通过测量光传感器的输出电压变化,可以计算出心率。
体温检测原理体温检测的原理是通过测量人体的温度来推测体温。
常见的方法是使用温度传感器,将其放置在人体的腋下或口腔内。
传感器会感应到人体的温度变化,并将温度转化为电信号。
通过测量传感器的输出电压或电流,可以获得人体的体温。
设备列表•51单片机开发板•光传感器•温度传感器•LCD显示屏•连接线硬件连接1.将光传感器连接到51单片机的模拟输入引脚。
2.将温度传感器连接到51单片机的模拟输入引脚。
3.将LCD显示屏连接到51单片机的数字输出引脚。
软件实现1.配置51单片机的模拟输入引脚和数字输出引脚。
2.在主程序中循环执行以下动作:–读取光传感器的输出电压,并计算出心率。
–读取温度传感器的输出电压或电流,并计算出体温。
–将心率和体温值显示在LCD屏幕上。
以下是伪代码示例:#include <reg51.h>sbit LightSensor = P1^0;sbit TempSensor = P1^1;sbit LCD_RS = P2^0;sbit LCD_RW = P2^1;sbit LCD_EN = P2^2;void ReadLightSensor(){// 读取光传感器的输出电压}void ReadTempSensor(){// 读取温度传感器的输出电压或电流}void DisplayData(){// 在LCD屏幕上显示心率和体温值}void main(){while(1){ReadLightSensor();ReadTempSensor();DisplayData();}}总结基于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进行测量,lcd1602显示**//****************************************#include "reg51.h"#include "intrins.h"#define uchar unsigned char#define uint unsigned intuchar code table1 []={"ID: "}; //欢迎显示,包括空格在内<=16 uchar code table2 []={"Name: "};//欢迎显示,包括空格在内<=16 uchar code str1 []={" Temperature "};uchar code str2 []={" "};//************管脚定义************************sbit lcd_rs = P3^0; //液晶数据命令选择端sbit lcd_en = P3^1; //液晶使能sbit DQ = P3^6; //液晶使能//************参数定义************************uint tvalue;//温度值uchar tflag;//温度正负标志uchar data disdata[5];//************子函数定义************************void delay(uchar z); //delay延时子程序void init_lcd(); //LCD1602初始化函数void write_com(uchar com); //LCD1602写指令函数void write_data(uchar date); //LCD1602写数据函数void lcd1602_display(uchar *q,uchar *p);//LCD1602显示函数void welcome(); //LCD1602显示欢迎函数void delay_DS18B20(uint i); //delay_DS18B20函数void Init_DS18B20_display(); //DS18B20初始化显示void Init_DS18B20(); //DS18B20初始化uchar ReadOneByte(); //DS18B20读一字节void WriteOneByte(uchar dat); //DS18B20写一字节Read_Temperature(); //DS18B20读取温度值并转换void DS18B20_display(); //DS18B20温度显示//************主函数************************void main(){ welcome();delay(2000);Init_DS18B20_display();while(1){Read_Temperature();DS18B20_display();}}//************delay延时子程序************************void delay(uchar z){uchar x,y;for(x=0;x<z;x++)for(y=0;y<114;y++);}//************LCD1602初始化函数************************void init_lcd(){write_com(0x38); //设置16*2显示,5*7点阵,8位数据接口write_com(0x08); //写一个字符后地址指针加1write_com(0x01); //显示清零,数据指针清零write_com(0x06); //写一个字符后地址指针加1write_com(0x0c); //关显示,光标不显示不闪烁}//************LCD1602写指令函数************************void write_com(uchar com){delay(5);lcd_rs = 0; // 选择写指令lcd_en = 0; // 将使能端置0P2 = com; // 将要写的命令送到数据总线上delay(5); // 延时5ms,待数据稳定lcd_en = 1; // 由于初始化已将lcd_en置为0,使能端给一个高脉冲,delay(5); // 延时5ms,待数据稳定lcd_en = 0; // 将使能端置0以完成脉冲}//************LCD1602写数据函数************************void write_data(uchar date){delay(5);lcd_rs = 1; // 选择写数据lcd_en = 0; // 将使能端置0P2 = date; // 将要写的数据送到数据总线上delay(5); // 延时5ms,待数据稳定lcd_en = 1; // 由于初始化已将lcd_en置为0,使能端给一个高脉冲,delay(5); // 延时5ms,待数据稳定lcd_en = 0; // 将使能端置0以完成脉冲}//************LCD1602显示函数******************void lcd1602_display(uchar *q,uchar *p){write_com(0x80); // 现将数据指针定位到第一行第一个字处while(*q!='\0'){write_data(*q);q++;delay(1);}write_com(0xc0); // 现将数据指针定位到第二行第一个字处while(*p!='\0'){write_data(*p);p++;delay(1);}}//************LCD1602显示欢迎函数****************** void welcome(){init_lcd();lcd1602_display(table1,table2);delay(5000);}//************DS18B20初始化显示**************void Init_DS18B20_display(){init_lcd();lcd1602_display(str1,str2);}//************LCD1602显示函数****************** void delay_DS18B20(uint i){while(i--);}//************DS18B20初始化******************void Init_DS18B20(){DQ = 1; //DQ复位delay_DS18B20(4); //延时DQ = 0; //DQ拉低delay_DS18B20(100); //精确延时大于480usDQ = 1; //拉高delay_DS18B20(40);}//************DS18B20读一字节****************** uchar ReadOneByte(){uchar i,dat = 0;for(i=8;i>0;i--){DQ = 0; //给脉冲信号dat>>=1;DQ = 1; //给脉冲信号if(DQ) dat|=0x80;delay_DS18B20(10);}return (dat);}//************DS18B20写一字节******************void WriteOneByte(uchar dat){uchar i;for(i=8;i>0;i--){DQ = 0;DQ = dat&0x01;delay_DS18B20(10);DQ = 1;dat>>=1;}}//************DS18B20读取温度值并转换****************** Read_Temperature(){uchar a,b;Init_DS18B20();WriteOneByte(0xcc); //跳过读序列号WriteOneByte(0x44); //启动温度转换Init_DS18B20();WriteOneByte(0xcc); //跳过读序列号WriteOneByte(0xbe); //读取温度a = ReadOneByte();b = ReadOneByte();tvalue=b;tvalue<<=8;tvalue=tvalue|a;if(tvalue<0xfff)tflag = 0;else{tvalue = ~tvalue+1;tflag = 1;}tvalue = tvalue*(0.625); //温度值扩大10倍,精确到1位小数return (tvalue);}//************DS18B20温度显示******************void DS18B20_display(){uchar flagdat;disdata[0]=tvalue/1000+0x30; //百位数disdata[1]=tvalue%1000/100+0x30;//十位数disdata[2]=tvalue%100/10+0x30; //个位数disdata[3]=tvalue%10+0x30; //小数位if(tflag == 0)flagdat = 0x20; //正温度不显示符号elseflagdat = 0x2d; //负温度显示负号if(disdata[0] == 0x30){disdata[0] =0x20; //如果百位为0,不显示if(disdata[1] == 0x30){disdata[1] =0x20;//如果百位为0,十位为0也不显示}}write_com(0xc4);write_data(flagdat); //显示符号位write_com(0xc5);write_data(disdata[0]);//显示百位write_com(0xc6);write_data(disdata[1]);//显示十位write_com(0xc7);write_data(disdata[2]);//显示个位write_com(0xc8);write_data(0x2e); //显示小数点write_com(0xc9);write_data(disdata[3]);//显示小数位}欢迎您的下载,资料仅供参考!致力为企业和个人提供合同协议,策划案计划书,学习资料等等打造全网一站式需求。
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单片机热敏电阻测温程序

//本程序是通过热敏电阻测温度(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();}}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
uinti,numone,numtwo,temp;
ucharqian,bai,shi,ge,xiaoshu;
sbitdq=P2^2;
sbitdula=P2^6;
sbitwela=P2^7;
uchar code list[]={
0x3f , 0x06 , 0x5b , 0x4f , 0x66 ,
0x6d ,0x7d , 0x07 , 0x7f , 0x6f ,
0x77 , 0x7c , 0x39 , 0x5e , 0x79 , 0x71,0x80 };
unsigned char code listone[] = {0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};
void delay(uint z)
{
uintx,y;
for(x=100;x>0;x--)
for(y=z;y>0;y--);
}
voiddelayone(unsigned char i)
{
while(--i);
}
/****************************************** 此延时函数针对的是12Mhz的晶振
delay(0):延时518us 误差:518-2*256=6
delay(1):延时7us (原帖写"5us"是错的)delay(10):延时25us 误差:25-20=5
delay(20):延时45us 误差:45-40=5
delay(100):延时205us 误差:205-200=5
delay(200):延时405us 误差:405-400=5*/ voidshuma(uchar temp)
{
shi=temp/100;
ge=temp%100/10;
xiaoshu=temp%10;
dula=1;
P0=list[shi];
dula=0;
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
delay(1);
dula=1;
P0=listone[ge];
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delay(1);
/* dula=1;
P0=list[16];
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delay(1);
*/
dula=1;
P0=list[xiaoshu];
dula=0;
P0=0xff;
wela=1;
P0=0xfb;
wela=0;
delay(1);
}
voidtempinit()
{
dq=1;
_nop_();
// delayone(1);
dq=0;
for(i=0;i<200;i++);
delayone(250);
dq=1;
i=0;
while((dq==0)&&(i<350))
i++;
delay(1);
// delayone(100);
}
void write(uchar date) {
uint j;
for(i=0;i<8;i++)
{
dq=1;
_nop_();
dq=0;
_nop_();
dq=date&0x01; // for(j=0;j<2;i++);
delayone(20);
dq=1;
date=date>>1;
// for(j=0;j<20;i++);
delayone(1);
}
}
uchar read()
{
ucharmation;
for(i=0;i<8;i++)
{
dq=1;
_nop_();
dq=0;
mation=mation>>1;
dq=1;
// for(i=0;i<2;i++);
delayone(1);
if(dq==1)
mation|=0x80;
else
mation|=0x00;
// for(i=0;i<3;i++);
delayone(10);
}
return(mation);
}
uchargettemp()
{
uchar TH,TL;
floattt;
tempinit();
write(0xcc);
write(0x44);
delay(1);
tempinit();
write(0xcc);
write(0xbe);
TL=read();
TH=read();
temp=TH;
temp<<=8;
temp=temp|(TL);
tt=temp*0.0625;
temp=tt*10+0.5;
return temp;
}
void main()
{
while(1)
{
shuma(gettemp());
}
}。