51单片机热敏电阻测温程序
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单片机的温度检测系统_单片机C语言课题设计报告

单片机C语言课题设计报告设计题目:温度检测电气系2011级通信技术一班级通信技术一班通才达识,信手拈来通才达识,信手拈来1摘要本课题以51单片机为核心实现智能化温度测量。
利用18B20温度传感器获取温度信号,将需要测量的温度信号自动转化为数字信号,利用单总线和单片机交换数据,最终单片机将信号转换成LCD 可以识别的信息显示输出。
基于STC90C516RD+STC90C516RD+的单片机的智能温度检测系统,的单片机的智能温度检测系统,设计采用18B20温度传感器,其分辨率可编程设计。
本课题设计应用于温度变化缓慢的空间,综合考虑,以降低灵敏度来提高显示精度。
设计使用12位分辨率,因其最高4位代表温度极性,故实际使用为11位半,位半,而温度测量范围为而温度测量范围为而温度测量范围为-55-55-55℃~℃~℃~+125+125+125℃,℃,则其分辨力为0.06250.0625℃。
℃。
设计使用LCD1602显示器,可显示16*2个英文字符,显示器显示实时温度和过温警告信息,和过温警告信息,传感器异常信息设。
传感器异常信息设。
传感器异常信息设。
计使用蜂鸣器做警报发生器,计使用蜂鸣器做警报发生器,计使用蜂鸣器做警报发生器,当温度超过当温度超过设定值时播放《卡农》,当传感器异常时播放嘟嘟音。
单片机C 语言课题设计报告语言课题设计报告电动世界,气定乾坤2目录一、设计功能一、设计功能................................. ................................. 3 二、系统设计二、系统设计................................. .................................3 三、器件选择三、器件选择................................. .................................3 3.1温度信号采集模块 (3)3.1.1 DS18B20 3.1.1 DS18B20 数字式温度传感器数字式温度传感器..................... 4 3.1.2 DS18B20特性 .................................. 4 3.1.3 DS18B20结构 .................................. 5 3.1.4 DS18B20测温原理 .............................. 6 3.1.5 DS18B20的读写功能 ............................ 6 3.2 3.2 液晶显示器液晶显示器1602LCD................................. 9 3.2.1引脚功能说明 ................................. 10 3.2.2 1602LCD 的指令说明及时序 ..................... 10 3.2.3 1602LCD 的一般初始化过程 (10)四、软件设计四、软件设计................................ ................................11 4.1 1602LCD 程序设计流程图 ........................... 11 4.2 DS18B20程序设计流程图 ............................ 12 4.3 4.3 主程序设计流程图主程序设计流程图................................. 13 五、设计总结五、设计总结................................. ................................. 2 六、参考文献六、参考文献................................. ................................. 2 七、硬件原理图及仿真七、硬件原理图及仿真......................... .........................3 7.1系统硬件原理图 ..................................... 3 7.2开机滚动显示界面 ................................... 4 7.3临界温度设置界面 ................................... 4 7.4传感器异常警告界面 (4)电气系2011级通信技术一班级通信技术一班通才达识,信手拈来通才达识,信手拈来3温度温度DS18B20 LCD 显示显示过温函数功能模块能模块传感器异常函数功能模块数功能模块D0D1D2D3D4D5D6D7XT XTAL2AL218XT XTAL1AL119ALE 30EA31PSEN29RST 9P0.0/AD039P0.1/AD138P0.2/AD237P0.3/AD336P0.4/AD435P0.5/AD534P0.6/AD633P0.7/AD732P2.7/A1528P2.0/A821P2.1/A922P2.2/A1023P2.3/A1124P2.4/A1225P2.5/A1326P2.6/A1427P1.01P1.12P1.23P1.34P1.45P1.56P1.67P1.78P3.0/RXD 10P3.1/TXD11P3.2/INT012P3.3/INT113P3.4/T014P3.7/RD17P3.6/WR 16P3.5/T115U180C51X1CRYST CRYSTAL ALC122pFC222pFGNDR110kC31uFVCCGND234567891RP1RESPACK-8VCC0.0DQ 2VCC 3GND 1U2DS18B20R24.7K LCD1LM016LLS2SOUNDERMUC八、程序清单八、程序清单................................. .................................5 一、设计功能·由单片机、温度传感器以及液晶显示器等构成高精度温度监测系统。
最新51单片机热敏电阻测温查表程序汇总

51单片机热敏电阻测温查表程序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. 传感器选择,首先,我们需要选择合适的温度传感器。
常用的温度传感器包括NTC热敏电阻和DS18B20数字温度传感器等。
这些传感器可以通过模拟或数字接口与51单片机连接。
2. 电路设计,根据选定的传感器,设计相应的电路,包括传感器与单片机的连接电路和电源电路。
需要注意的是,传感器的输出信号可能需要经过放大、滤波等处理,以确保精准的温度测量。
3. 程序设计,利用C语言或汇编语言编写单片机的程序,实现对传感器采集到的温度数据的读取、处理和显示。
在程序设计中,需要考虑温度数据的精度、稳定性以及显示方式(比如LCD显示、数码管显示或者通过串口输出等)。
4. 校准和测试,设计完成后,需要进行校准和测试。
校准过程中,可以将传感器测得的温度与标准温度计测得的温度进行对比,以确定系统的准确性。
测试过程中,可以模拟不同温度环境下的测量情况,验证系统的稳定性和灵敏度。
5. 系统优化,根据测试结果,对系统进行优化,包括电路的调
整和程序的修改,以提高系统的性能和稳定性。
总之,基于51单片机的温度检测设计涉及到传感器选择、电路设计、程序设计、校准测试和系统优化等多个方面,需要综合考虑硬件和软件的设计要求,以实现一个稳定、精准的温度检测系统。
基于51单片机的温度检测系统程序及仿真概要

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

数字温度计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[]={ //纵向字节倒序。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//本程序是通过热敏电阻测温度(30c-50c),采用六位串行数码管显示,前三位显示ds18b20测得数据,后三位是热敏电阻测得数据
#include<reg51.h>
#include<math.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar 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); //精确延时大于480us
DQ = 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();
}
}。