pic18单片机热敏电阻测温查表程序

合集下载

课程设计报告-单片机通过热敏电阻测温

课程设计报告-单片机通过热敏电阻测温

课程设计报告- 单片机通过热敏电阻测温单片机通过热敏电阻测温一、前言近年来,随着科学技术和生产的不断发展,越来越多的参数需要通过温度测量来获得。

因此,温度一词在生产生活中出现的频率日益增加。

与之相对应的,温度测量也成为了生产生活中频繁使用的词语,同时它在各行各业中也发挥着重要的作用。

温度是表征物体冷热程度的物理量,温度测量则是工农业生产过程中一个很重要而普遍的参数。

温度的测量对保证产品质量、提高生产效率、节约能源、生产安全、促进国民经济的发展起到非常重要的作用。

由于温度测量的普遍性,温度传感器的数量在各种传感器中居首位。

而且随着科学技术和生产的不断发展,温度传感器的种类还是不断增加丰富来满足生产生活中的需要。

而作为一种具有功能强,体积小,功耗低,价格便宜,工作可靠,使用方便等特点的器件,单片机成为温度测量系统的首选部件。

近年年来随着计算机在社会领域的渗透和大规模集成电路的发展,单片机的应用正在不断地走向深入,越来越广泛地应用各个领域。

单片机温度测量师对温度进行有效的测量,并且能够在工业生产中得到了广泛的应用,尤其在电力工程、化工生产、机械制造、冶金工业等重要工业领域中,担负着重要的测量任务。

在日常生活中,也可以广泛实用于地热、空调器、电加热器等各种家庭室温测量及工业设备温度测量场合。

三、硬件设计如图所示,本设计包括最小系统、测温电路、数码管显示、下载口、蜂鸣器、键盘等部分。

本设计采用按键设置温度报警点通过测温电路采集温度信息,经过STC12C5410AD进行模数转换、处理并将实际温度值和设定温度值分别显示在共阴极数码显示管LED上。

3.1 温度采样部分如图3.1所示,测温电路利用热敏电阻将温度转化为电量,并将电压值输入STC12C5410AD进行模数转换。

STC12C5410AD将转换所得的数值输入数码管显示出来。

图3.1 温度采样电路3.2 温度显示部分LED数码管将STC12C5410AD处理的温度信息显示出来。

单片机的查表程序

单片机的查表程序

单片机的查表程序(共5页)--本页仅作为文档封面,使用时请直接删除即可----内页可以根据需求调整合适字体及大小--在单片机开发过程中.一些非线性的控制过程.最适合做一个表格来.时时改变系统的参数.达到控制的目的.最常的如产生正弦的的程.就是建一个大的数组时时改变输出的8位字节送给外部DA.由DA生成一个完整的正弦波.当然了.LED显示也是一个例子.通过建一个数组来实现段码的点亮点灭.下面就是一个LED表---digits[0]#define SEG_a 0x01#define SEG_b 0x02#define SEG_c 0x04#define SEG_d 0x08#define SEG_e 0x10#define SEG_f 0x20#define SEG_g 0x40#define SEG_dot 0x80unsigned char digits[10] = {(SEG_a|SEG_b|SEG_c|SEG_d|SEG_e|SEG_f), 过MCS-51指令系统中有专用的查表指令:MOVC A,@A+DP TR和MOV A,@A+PC.MOVC A,@A+DPTR指令,DPTR作为基址寄存器时,其值为16位而且可根据需要设计,故可用于在64K ROM范围内查表。

编写查表程序时,首先把表的首址送入DPTR中,再将要查找的数据序号(或下表值)送入A中,然后就可以使用该指令进行查表操作,并将结果送累加器A中。

MOVC A,@A+PC指令,PC作为基址寄存器时,其值由指令的位置确定,它只能设在查表指令操作码下的256个字节范围内。

编写查表程序时,首先把查表数据的序号送入A中,再把从查表指令到表的首地址间的偏移量与A值相加,然后使用该指令进行查表操作,并把结果送累加器A中。

下面是把内部RAM 30H-37H单元中的十六进制数依次转换为ASCII码,并存入内部RAM 60H-6FH单元之中。

用查表法编写程序。

PIC单片机温敏电阻测温课程设计资料

PIC单片机温敏电阻测温课程设计资料

一、设计目的、要求及方案选择1、设计目的随着社会的进步和工业技术的发展,人们越来越重视温度对产品的影响,许多产品对温度范围要求严格,目前市场上普遍存在的问题有温度信息传递不及时、精度不够的缺点,不利于工业控制者根据温度变化及时做出决定。

在这样的形式下,开发一种实时性高、精度高的温度采集系统就很有必要。

本课题用一种基于单片机的数据采集系统方案,该方案根据热敏电阻随温度变化而变化的特性,采用串联分压电路。

单片机采集热敏电阻的电压,通过A/D转换将模拟量电压信号转换成数字量电压信号,经过查表转换得到温度值,控制数码管实时显示温度值。

本系统中所器件是PIC16F877单片机、NTC热敏电阻和数码管。

2、设计要求热敏电阻温度测量系统设计任务要求:a、设计基于热敏电阻信号调理电路b、设计A/D转换电路c、设计数码管显示电路3、设计方案的选择本设计以PIC16F877单片机系统为核心,采用热敏电阻对温度进行检测;通过电容进行充放电进行A/D转换把温度信号调解转换为电压信号,计算出电阻,与PIC16F877单片机接口设置LED八段数码管实时显示温度值。

本设计包括热敏电阻选择、测量模块、数据传输模块、温度显示模块四个部分。

文中对每个部分功能、实现过程作详细介绍。

二、硬件系统各模块电路的设计1、单片机系统的设计PIC16F877单片机的基本功能区域的主要功能模块包括以下7部分1)程序存储器区域PIC16F877单片机带有Flash程序存储器结构,主要存放由用户预先编制好的程序和一些固定不变的数据。

程序存储器共有8K×14位程序单元空间,即0000H1FFFH,由程序计数器提供13条地址线进行单元选择,每个单元宽14位,能够存放一条PIC单片机系统指令。

在系统上电或其他复位情况下,程序计数器均从0000H地址单元开始工作。

如果遇到调用子程序或系统发生事件中断时,都将把当前程序断点处的地址送入8级×14位的堆栈区域进行保护。

单片机课程设计之热敏电阻测温

单片机课程设计之热敏电阻测温

- --JIUJIANG UNIVERSITY单片机课程设计报告题目热敏电阻温度采集系统设计院系电子工程学院专业自动化姓名xxxxxxxx班级学号xxxx指导教师xxxx日期2021-2-23目录第一局部:设计背景 (3)第二局部:系统主要功能 (5)第三局部:电路设计与参数选择 (5)第四局部:系统软件设计 (11)第五局部:系统调试与仪器使用 (21)第六局部:测试数据与结果分析 (23)第七局部:使用说明书 (23)第八局部:总结 (24)热敏电阻温度采集系统设计摘要温度在人类的生活中扮演着极其重要的角色,在冶金、钢铁、石化、水泥、玻璃、医药等行业温度的测量及为重要。

本次课程设计采用单片机了STC12C5A60S2和10K NTC热敏电阻为核心器件来设计热敏电阻测温系统。

通过NTC热敏电阻对外界温度信号进展采集,由于热敏电阻的阻值随外界温度变化而变化,再通过测量电路把阻值的变化转换为电压的变化,利用STC12C5A60S2单片机的集成AD把采集到的模拟电压信号转换为数字信号,利用单片机对数字信号进展处理后就可以得到相应的温度值,从而完成了对温度的测量。

该系统采用了STC12C5A60S2单片机、NTC热敏电阻、共阴极数码管显示、电容、排阻、晶振、电阻等元器件。

关键字:STC12C5A60S2单片机、热敏电阻、测温系统第一局部设计背景在人类的生活环境中,温度扮演着极其重要的角色。

无论你生活在哪里,从事什么工作,无时无刻不在与温度打着交道。

自18世纪工业革命以来,工业开展对是否能掌握温度有着绝对的联系。

在冶金、钢铁、石化、水泥、玻璃、医药等等行业,可以说几乎80%的工业部门都不得不考虑着温度的因素。

温度对于工业如此重要,由此推进了温度传感器的开展。

进入21世纪后,温度传感器正朝着高精度、多功能、总线标准化、高可靠性及平安性、开发虚拟传感器和网络传感器、研制单片测温系统等高科技的方向迅速开展。

在工农业生产中,温度检测及其控制占有举足轻重的地位,随着现代信息技术的飞速开展和传统工业改造的逐步实现,能够独立工作的温度检测和显示系统已经应用于诸多领域。

热敏电阻查表法程序

热敏电阻查表法程序

热敏电阻查表法程序查表法是一种通过预先制作的数据表来求解未知问题的方法。

如果你想通过查表法来使用热敏电阻,那么你可能需要一个热敏电阻的温度-阻值数据表。

然后,你可以通过测量热敏电阻的当前温度,然后在数据表中查找对应的阻值。

以下是一个简单的查表法的示例程序,这个程序会根据用户输入的温度,查找热敏电阻在该温度下的阻值:```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} 欧姆。

") ```请注意,这只是一个简单的示例程序,实际的热敏电阻可能会有更复杂的温度-阻值关系,可能需要更精确的模型或者设备来进行精确的测量。

此外,这个程序也没有处理可能的输入错误,例如用户输入的不是数字或者输入的温度不在数据表中的情况。

在实际使用中,你可能需要添加额外的错误处理代码来处理这些情况。

基于PIC单片机和DS18B20的温度测量系统设计

基于PIC单片机和DS18B20的温度测量系统设计
Zha i ng M ng, L u Ce l i ni
( U g f lcrcl n iern i o ies yGuy n 5 0 3Chn ) Co e eo etia E gn eigGuZh uUnv ri , ia g5 0 0 , ia E t
A bsr c : t a tThi p pe nto uc st i e p r t e M e s e e se s d 01 PI a d DS1 B20 s a ri r d e he M n—t m e aur aurm ntSy tm bae 1 e n 8 .The S n l i ge
,读 取温度寄 存器 等 ( / 共可读 9 寄存器 ) 个 前
两个就是温度
tmp = a On C a0; e L Re d e h r
术术 半 术 术 半 术 木 丰 术木 术 木 半 木 术,
/读取温度值低位 /
tmp Re d e h r e H= a On C a0;
W r e e h ru s n dc a a) i On C a(n i e h r t t g d
数字温度传感器 。它具有微 型化 、低功 耗、高性能 、 1 测温 系统硬软件设计
抗干扰能力强、易配处理器等优点,可直接将温度转
换成串行数字信号 ( 提供 9 位二进制数 ) 给单片棚友 理 , 卜
且在同一总线上可以挂接多个传感器芯片 。本文 以
系统 采 用 美国微 芯 公 司的 PC单 片 机 1F 5源自 I 8 42d ly ea
— —
o ( ;> ;- ) fr i8 i0 i - -
{ tmp d t x l e = a&O O ; DQ L _ OW 0;

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

最新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.}。

PIC18 单片机学习

PIC18 单片机学习

PIC18 单片机学习(程序实例)说明:18F基本模块初始化程序均在内,且测试通过,主程序可以调用各个程序!编译器使用PICC18//程序主要用于18F单片机学习#include <pic18.h> //18系列单片机头文件//-------------函数定义--------------void delay(unsigned int rr);void timer1(void);void SPI_Iint(void); //串行SPI输出设置函数void display(void);void i2cint(void); //i2c总线初始化程序void c64R(void); //i2c接口的EEPROM存储器(读程序)void c64W(void); //写程序void Start(void); //起始位发送函数void Stop(void); //停止位发送函数void WriteWait(void); //等待函数void Senddata(unsigned char data); //数据发送函数void Restart(void); //重复启动函数void Datain(void); //数据读入void Uartint(void); //通用同步/异步收发器初始化程序void Udatas(unsigned char dad); //UART数据发送void Uartrs(void); //串口接收数据发送函数void ADint(void); //AD模块初始化void shuchai(void);//-----------数据寄存器定义----------const unsigned char table[10]={0xee,0x82,0xdc,0xd6,0xb2,0x76,0x7e,0xc2,0xfe,0xf6}; //显示段码unsigned char buf[5]; //显示缓存unsigned char receive[10]; //定义接收缓存unsigned char dd; //定时器0,中断计数寄存器unsigned char save;unsigned char conet;unsigned char *Counter; //接收数据指针unsigned char DADh; //AD缓存,unsigned char DADl;unsigned int Dat;unsigned int Dat1; //保存上次的AD转换值,用于比volatile bit DADflage; //AD转换标志volatile bit I2Cerror; //I2C错误标志volatile bit Uartsend; //异步串口数据发送允许union //联合体用来对C64的地址进行操作!{unsigned char dizhi[2];unsigned int Adress;}add;#define AddLow add.dizhi[0]#define AddHigh add.dizhi[1]#define ADDss add.Adress//***********************************//初始化//***********************************void PICint(){SWDTEN=1; //禁止看门狗,18F看门狗是可以用软件控制开启的!INTCON=0;ADCON1=0x07; //AD端口全部始能为数字IO口TRISB7=0; //设置为输出端口RB7=0;PIE1=0;PIE2=0;PIE3=0;buf[0]=0;buf[1]=0;buf[2]=0;buf[3]=0;//CMCON=0x07; //关闭比较器,18F2680没有比较器}//***********************************//高优先级中断函数//***********************************void interrupt HI_ISR(){if(TMR0IF&TMR0IE) //确认是定时器0中断{dd++;TMR0IF=0;TMR0H=0xd8; //10ms定时常数TMR0L=0xef;if(dd==100){dd=0;buf[0]++;if(buf[0]==10){buf[0]=0;buf[1]++;if(buf[1]==10){buf[1]=0;buf[2]++;if(buf[2]==10){buf[2]=0;buf[3]++;if(buf[3]==10){buf[3]=0;}}}}}}if(ADIF) //判断是否是AD转换中断{ADIF=0; //清0DADh=ADRESH;DADl=ADRESL;Dat=256*DADh+DADl;if(((Dat-Dat1)==1)||((Dat1-Dat)==1)){Dat=Dat1;}DADflage=1;}}//***********************************//低优先级中断函数//***********************************void interrupt low_priority LOW_ISR(){if(RCIF&RCIE) //如果是串口接收中断的话,则进入中断处理{RCIF=0; //清中断标志*Counter=RCREG;//读取数据到数组Counter++;if((Counter-&receive[0])==10){Counter=&receive[0];Uartsend=1;}}}//***********************************//定时器0初始化子程序//***********************************void timer1(){IPEN=1; //打开高低优先级T0CON=0x09; //把定时器0设定为16位定时器,内部时钟触发,不使用分频器TMR0IE=1; //允许定时器0溢出中断TMR0IF=0; //清除中断标志TMR0IP=1; //设定定时器0中断为高优先级TMR0H=0xD8; //定时常数TMR0L=0xef;GIE=1;PEIE=1;TMR0ON=1;}//***********************************//AD转换初始化函数//***********************************void ADint() //使用于18F2680!{ADCON0=0x01; //AD转换速率为Fosc/4,并使能AD转换模块ADCON1=0x0e; //选择为右对齐模式,并且使能AD0为模拟通道ADCON2=0x91;TRISA=1; //RA0为输入模式ADIF=0;ADIE=1; //中断使能IPEN=1; //使能高低中断优先级ADIP=1; //AD转换设置为高优先级中断GIE=1; //开总中断以及外部中断PEIE=1;DADflage=0;}//***********************************//I2C初始化函数//***********************************void i2cint(){SSPCON1=0x08; //允许串口工作,I2C主控方式,时钟=Fosc/[4*(SSPADD+1)] RC4=1; //设置为输入RC3=1;SSPADD=7; //时钟频率约为0.125MSSPSTAT=0x80; //关闭标准速度方式SSPCON2=0;SSPEN=1; //使能串口(SSP模块)I2Cerror=0;}//***********************************//SPI初始化程序//***********************************void SPI_Iint(){TRISC5=0; //SDO引脚TRISC4=1; //SDI引脚TRISC3=0; //SCK,串行时钟输出引脚TRISA5=0; //RA5为从动SS端SSPCON1=0x30; //使能串口,高电平为空闲状态,并且发送频率为fose/4,主控方式; SSPSTAT=0xc0; //时钟下降沿发送数据!SSPIF=0;conet=0;}//***********************************//通用同步/异步收发器(UART)初始化//***********************************void Uartint(){TXSTA=0x04; //设置为高速异步,方式RCSTA=0x80; //使能UARTTRISC6=0; //设置为输入,对外部呈现高阻态TRISC7=1;SPBRG=25; //设置波特率为9600//波特率计算公式//1.同步方式:波特率=Fosc/[4(X+1)]//2.异步方式:BRGH=0:波特率=Fosc/[64(x+1)]// BRGH=1:波特率=Fosc/[16(x+1)]IPEN=1; //开中断优先级RCIP=0; //串口接收使能为低优先级RCIE=1; //串口接收中断使能RCIF=0;TXIE=0; //禁止发送中断GIE=1; //开总中断和外围中断PEIE=1;TXEN=1; //使能串口发送CREN=1; //使能串口接收,注意18F是CREN而不是RCEN,编译器都认为是正确的但是RCEN不管用! Counter=&receive[0];//把数组的首地址给指针Uartsend=0;}//***********************************//AD转换函数//***********************************void ADchange(){ADCON0=ADCON0|0x02; //启动AD转换if(DADflage) //如果AD转换完成,这里采用{DADflage=0;shuchai();display();}}//***********************************//AD 数据拆分//***********************************void shuchai(){unsigned int i;Dat1=Dat; //保存这次的计数值i=Dat;buf[3]=i/1000; //取出千位i=i%1000; //取出百位数buf[2]=i/100; //取出百位数i=i%100; //取出十位数buf[1]=i/10;i=i%10;buf[0]=i;}//***********************************//Uart receive data send//***********************************void Uartrs(){if(Uartsend){unsigned char i;Uartsend=0;for(i=0;i<10;i++){Udatas(*Counter);Counter++;}Counter=&receive[0]; //重新初始化}}//***********************************//Uart 数据发送子程序//***********************************void Udatas(unsigned char dad){TXREG=dad;while(1){if(TXIF==1) break; //等待数据写入}delay(80);}//***********************************//I2C写子程序//***********************************void c64W(){Start();if(I2Cerror==1){I2Cerror=0;return; //返回防止死循环}Senddata(0xa0); //发送寻址地址,以及写操作地址!if(I2Cerror==1){I2Cerror=0;Stop(); //错误处理return; //返回防止死循环}Senddata(0x00); //发送高位地址if(I2Cerror==1){I2Cerror=0;Stop(); //错误处理return; //返回防止死循环}Senddata(0x40); //发送地址低字节if(I2Cerror==1){I2Cerror=0;Stop(); //错误处理return; //返回防止死循环}Senddata(0x55); //发送数据if(I2Cerror==1){I2Cerror=0;Stop(); //错误处理return; //返回防止死循环}Stop();}//***********************************//I2C读数据程序//***********************************void c64R(){Start();if(I2Cerror==1){I2Cerror=0;return; //返回防止死循环}Senddata(0xa0); //发送寻址地址,以及写操作地址!if(I2Cerror==1){I2Cerror=0;Stop(); //错误处理return; //返回防止死循环}Senddata(0x00); //发送高位地址if(I2Cerror==1){I2Cerror=0;Stop(); //错误处理return; //返回防止死循环}Senddata(0x40); //发送地址低字节if(I2Cerror==1){I2Cerror=0;Stop(); //错误处理return; //返回防止死循环}Restart(); //发送重新起始位Senddata(0xa1); //发送读命令if(I2Cerror==1){I2Cerror=0;Stop(); //错误处理return; //返回防止死循环}Datain();Stop();if(save==0x55){RB7=1;}conet++;}//***********************************//I2C重复启动//***********************************void Restart(){RSEN=1;while(1){if(SSPIF==1) break;}SSPIF=0;}//***********************************//I2C数据写等待//***********************************void WriteWait(){while(1){Start(); //在数据写入时间,如果在给器件发送数据不会有响应Senddata(0xa0);Stop();if(I2Cerror==0) break; //等待数据写入,=0则有应答位产生}}//***********************************//I2C起始位发送函数//***********************************void Start(){unsigned char i=0;SEN=1; //起始位发送while(1){i++;if(SSPIF==1) break;if(i==200) //防止死循环{i=0;I2Cerror=1;break;}}SSPIF=0;}//***********************************//I2C停止位发送//***********************************void Stop(){PEN=1;while(1){if(SSPIF==1) break;}SSPIF=0;}//***********************************//I2C数据发送函数//***********************************void Senddata(unsigned char data){unsigned char i;SSPBUF=data; //发送数据while(1){if(SSPIF==1) break;}SSPIF=0;for(i=0;i<10;i++){}if(ACKSTAT) //如果没有发出应答信号{I2Cerror=1;}else //如果发出应答信号{I2Cerror=0;}}//***********************************//I2C 数据读入函数//***********************************void Datain(){RCEN=1;while(1){if(SSPIF==1) break;}SSPIF=0;save=SSPBUF; //读数ACKDT=1; //发送非应答位ACKEN=1;while(1){if(SSPIF==1) break;}SSPIF=0;}//***********************************//164显示程序//***********************************void display() //164显示程序,用SPI端口发送数据{unsigned char i;unsigned char y,t; //传输完四个字节for(i=0;i<4;i++){y=buf[i];t=table[y];SSPBUF=t;while(1){if(SSPIF) break;}SSPIF=0;}}//***********************************//延时函数//*********************************** void delay(unsigned int rr) //延时函数{unsigned int asd;for(asd=0;asd<rr;asd++){}}//***********************************//主函数//*********************************** void main(){PICint(); //初始化函数//Uartint(); //异步串行口初始化//SPI_Iint();//ADint(); //AD模块初始化//timer1();//display();//i2cint(); //I2C初始化//c64W(); //往C64里写一次数据//WriteWait();//c64R(); //读C64里while(1){//CLRWDT();//delay(20000);CLRWDT();RB7=1;CLRWDT();SLEEP(); //等待看门狗复位RB7=0;delay(20000);CLRWDT();}}PIC18 单片机学习(程序实例)说明:18F基本模块初始化程序均在内,且测试通过,主程序可以调用各个程序!编译器使用PICC18//程序主要用于18F单片机学习#include <pic18.h> //18系列单片机头文件//-------------函数定义--------------void delay(unsigned int rr);void timer1(void);void SPI_Iint(void); //串行SPI输出设置函数void display(void);void i2cint(void); //i2c总线初始化程序void c64R(void); //i2c接口的EEPROM存储器(读程序)void c64W(void); //写程序void Start(void); //起始位发送函数void Stop(void); //停止位发送函数void WriteWait(void); //等待函数void Senddata(unsigned char data); //数据发送函数void Restart(void); //重复启动函数void Datain(void); //数据读入void Uartint(void); //通用同步/异步收发器初始化程序void Udatas(unsigned char dad); //UART数据发送void Uartrs(void); //串口接收数据发送函数void ADint(void); //AD模块初始化void shuchai(void);//-----------数据寄存器定义----------const unsigned char table[10]={0xee,0x82,0xdc,0xd6,0xb2,0x76,0x7e,0xc2,0xfe,0xf6}; //显示段码unsigned char buf[5]; //显示缓存unsigned char receive[10]; //定义接收缓存unsigned char dd; //定时器0,中断计数寄存器unsigned char save;unsigned char conet;unsigned char *Counter; //接收数据指针unsigned char DADh; //AD缓存,unsigned char DADl;unsigned int Dat;unsigned int Dat1; //保存上次的AD转换值,用于比volatile bit DADflage; //AD转换标志volatile bit I2Cerror; //I2C错误标志volatile bit Uartsend; //异步串口数据发送允许union //联合体用来对C64的地址进行操作!{unsigned char dizhi[2];unsigned int Adress;}add;#define AddLow add.dizhi[0]#define AddHigh add.dizhi[1]#define ADDss add.Adress//***********************************//初始化//***********************************void PICint(){SWDTEN=1; //禁止看门狗,18F看门狗是可以用软件控制开启的!INTCON=0;ADCON1=0x07; //AD端口全部始能为数字IO口TRISB7=0; //设置为输出端口RB7=0;PIE1=0;PIE2=0;PIE3=0;buf[0]=0;buf[1]=0;buf[2]=0;buf[3]=0;//CMCON=0x07; //关闭比较器,18F2680没有比较器}//***********************************//高优先级中断函数//***********************************void interrupt HI_ISR(){if(TMR0IF&TMR0IE) //确认是定时器0中断{dd++;TMR0IF=0;TMR0H=0xd8; //10ms定时常数TMR0L=0xef;if(dd==100){dd=0;buf[0]++;if(buf[0]==10){buf[0]=0;buf[1]++;if(buf[1]==10){buf[1]=0;buf[2]++;if(buf[2]==10){buf[2]=0;buf[3]++;if(buf[3]==10){buf[3]=0;}}}}}}if(ADIF) //判断是否是AD转换中断{ADIF=0; //清0DADh=ADRESH;DADl=ADRESL;Dat=256*DADh+DADl;if(((Dat-Dat1)==1)||((Dat1-Dat)==1)){Dat=Dat1;}DADflage=1;}}//***********************************//低优先级中断函数//***********************************void interrupt low_priority LOW_ISR(){if(RCIF&RCIE) //如果是串口接收中断的话,则进入中断处理{RCIF=0; //清中断标志*Counter=RCREG;//读取数据到数组Counter++;if((Counter-&receive[0])==10){Counter=&receive[0];Uartsend=1;}}}//***********************************//定时器0初始化子程序//***********************************void timer1(){IPEN=1; //打开高低优先级T0CON=0x09; //把定时器0设定为16位定时器,内部时钟触发,不使用分频器TMR0IE=1; //允许定时器0溢出中断TMR0IF=0; //清除中断标志TMR0IP=1; //设定定时器0中断为高优先级TMR0H=0xD8; //定时常数TMR0L=0xef;GIE=1;PEIE=1;TMR0ON=1;}//***********************************//AD转换初始化函数//***********************************void ADint() //使用于18F2680!{ADCON0=0x01; //AD转换速率为Fosc/4,并使能AD转换模块ADCON1=0x0e; //选择为右对齐模式,并且使能AD0为模拟通道ADCON2=0x91;TRISA=1; //RA0为输入模式ADIF=0;ADIE=1; //中断使能IPEN=1; //使能高低中断优先级ADIP=1; //AD转换设置为高优先级中断GIE=1; //开总中断以及外部中断PEIE=1;DADflage=0;}//***********************************//I2C初始化函数//***********************************void i2cint(){SSPCON1=0x08; //允许串口工作,I2C主控方式,时钟=Fosc/[4*(SSPADD+1)] RC4=1; //设置为输入RC3=1;SSPADD=7; //时钟频率约为0.125MSSPSTAT=0x80; //关闭标准速度方式SSPCON2=0;SSPEN=1; //使能串口(SSP模块)I2Cerror=0;}//***********************************//SPI初始化程序//***********************************void SPI_Iint(){TRISC5=0; //SDO引脚TRISC4=1; //SDI引脚TRISC3=0; //SCK,串行时钟输出引脚TRISA5=0; //RA5为从动SS端SSPCON1=0x30; //使能串口,高电平为空闲状态,并且发送频率为fose/4,主控方式; SSPSTAT=0xc0; //时钟下降沿发送数据!SSPIF=0;conet=0;}//***********************************//通用同步/异步收发器(UART)初始化//***********************************void Uartint(){TXSTA=0x04; //设置为高速异步,方式RCSTA=0x80; //使能UARTTRISC6=0; //设置为输入,对外部呈现高阻态TRISC7=1;SPBRG=25; //设置波特率为9600//波特率计算公式//1.同步方式:波特率=Fosc/[4(X+1)]//2.异步方式:BRGH=0:波特率=Fosc/[64(x+1)]// BRGH=1:波特率=Fosc/[16(x+1)]IPEN=1; //开中断优先级RCIP=0; //串口接收使能为低优先级RCIE=1; //串口接收中断使能RCIF=0;TXIE=0; //禁止发送中断GIE=1; //开总中断和外围中断PEIE=1;TXEN=1; //使能串口发送CREN=1; //使能串口接收,注意18F是CREN而不是RCEN,编译器都认为是正确的但是RCEN不管用! Counter=&receive[0];//把数组的首地址给指针Uartsend=0;}//***********************************//AD转换函数//***********************************void ADchange(){ADCON0=ADCON0|0x02; //启动AD转换if(DADflage) //如果AD转换完成,这里采用{DADflage=0;shuchai();display();}}//***********************************//AD 数据拆分//***********************************void shuchai(){unsigned int i;Dat1=Dat; //保存这次的计数值i=Dat;buf[3]=i/1000; //取出千位i=i%1000; //取出百位数buf[2]=i/100; //取出百位数i=i%100; //取出十位数buf[1]=i/10;i=i%10;buf[0]=i;}//***********************************//Uart receive data send//***********************************void Uartrs(){if(Uartsend){unsigned char i;Uartsend=0;for(i=0;i<10;i++){Udatas(*Counter);Counter++;}Counter=&receive[0]; //重新初始化}}//***********************************//Uart 数据发送子程序//***********************************void Udatas(unsigned char dad){TXREG=dad;while(1){if(TXIF==1) break; //等待数据写入}delay(80);}//***********************************//I2C写子程序//***********************************void c64W(){Start();if(I2Cerror==1){I2Cerror=0;return; //返回防止死循环}Senddata(0xa0); //发送寻址地址,以及写操作地址!if(I2Cerror==1){I2Cerror=0;Stop(); //错误处理return; //返回防止死循环}Senddata(0x00); //发送高位地址if(I2Cerror==1){I2Cerror=0;Stop(); //错误处理return; //返回防止死循环}Senddata(0x40); //发送地址低字节if(I2Cerror==1){I2Cerror=0;Stop(); //错误处理return; //返回防止死循环}Senddata(0x55); //发送数据if(I2Cerror==1){I2Cerror=0;Stop(); //错误处理return; //返回防止死循环}Stop();}//***********************************//I2C读数据程序//***********************************void c64R(){Start();if(I2Cerror==1){I2Cerror=0;return; //返回防止死循环}Senddata(0xa0); //发送寻址地址,以及写操作地址!if(I2Cerror==1){I2Cerror=0;Stop(); //错误处理return; //返回防止死循环}Senddata(0x00); //发送高位地址if(I2Cerror==1){I2Cerror=0;Stop(); //错误处理return; //返回防止死循环}Senddata(0x40); //发送地址低字节if(I2Cerror==1){I2Cerror=0;Stop(); //错误处理return; //返回防止死循环}Restart(); //发送重新起始位Senddata(0xa1); //发送读命令if(I2Cerror==1){I2Cerror=0;Stop(); //错误处理return; //返回防止死循环}Datain();Stop();if(save==0x55){RB7=1;}conet++;}//*********************************** //I2C重复启动//*********************************** void Restart(){RSEN=1;while(1){if(SSPIF==1) break;}SSPIF=0;}//*********************************** //I2C数据写等待//*********************************** void WriteWait(){while(1){Start(); //在数据写入时间,如果在给器件发送数据不会有响应Senddata(0xa0);Stop();if(I2Cerror==0) break; //等待数据写入,=0则有应答位产生}}//***********************************//I2C起始位发送函数//***********************************void Start(){unsigned char i=0;SEN=1; //起始位发送while(1){i++;if(SSPIF==1) break;if(i==200) //防止死循环{i=0;I2Cerror=1;break;}}SSPIF=0;}//***********************************//I2C停止位发送//***********************************void Stop(){PEN=1;while(1){if(SSPIF==1) break;}SSPIF=0;}//***********************************//I2C数据发送函数//***********************************void Senddata(unsigned char data){unsigned char i;SSPBUF=data; //发送数据while(1){if(SSPIF==1) break;}SSPIF=0;for(i=0;i<10;i++){}if(ACKSTAT) //如果没有发出应答信号{I2Cerror=1;}else //如果发出应答信号{I2Cerror=0;}}//***********************************//I2C 数据读入函数//***********************************void Datain(){RCEN=1;while(1){if(SSPIF==1) break;}SSPIF=0;save=SSPBUF; //读数ACKDT=1; //发送非应答位ACKEN=1;while(1){if(SSPIF==1) break;}SSPIF=0;}//***********************************//164显示程序//***********************************void display() //164显示程序,用SPI端口发送数据{unsigned char i;unsigned char y,t; //传输完四个字节for(i=0;i<4;i++){y=buf[i];t=table[y];SSPBUF=t;while(1){if(SSPIF) break;}SSPIF=0;}}//***********************************//延时函数//*********************************** void delay(unsigned int rr) //延时函数{unsigned int asd;for(asd=0;asd<rr;asd++){}}//***********************************//主函数//*********************************** void main(){PICint(); //初始化函数//Uartint(); //异步串行口初始化//SPI_Iint();//ADint(); //AD模块初始化//timer1();//display();//i2cint(); //I2C初始化//c64W(); //往C64里写一次数据//WriteWait();//c64R(); //读C64里while(1){//CLRWDT();//delay(20000);CLRWDT();CLRWDT();SLEEP(); //等待看门狗复位RB7=0;delay(20000);CLRWDT();}}关于c语言流水灯程序悬赏分:20|解决时间:2010-4-13 17:04|提问者:chenli6522002流水灯怎么在下面代码中不能点亮,出现什么问题了?#include "reg51.h"char led[]={0x01,0x02,0x04,0x08};char led1[]={0x01,0x04,0x02,0x08,0x08,0x02,0x04,0x01};char led2[]={0x08,0x04,0x02,0x01};void delay(unsigned int time){ unsigned int j;for(;time>0;time++)for(j=0;j<125;j++);}void main(){char i;while(1){if(P0==0x0e)while(1){for(i=0;i<=3;i++){P2=led[i];delay(200);}if(P0==0x0d||P0==0x0d)break;}else if(P0==0x0d)while(1)for(i=0;i<=3;i++){P2=led1[i];delay(200);}if(P0==0x0b||P0==0x0e) break;}else if(P0==0x0b)while(1){for(i=0;i<=3;i++){P2=led2[i];delay(200);}if(P0==0x0e||P0==0x0d)break;}else P2=0;}}最佳答案如果是流水灯你使用一下程序会更好简单实现的功能是P1 P3口的流水灯循环闪动你可以参照这个写..使用位控制#include "reg51.h"void main(){unsigned int i=10;P1=0xfe;while(1){while(--i){;}P1=(P1<<1) | 0x01;if(P1==0xff) P3 = 0x7f;while(P1==0xff){while(--i){;}P3=(P3>>1) | 0x80;{P1=0xfe;P3=0xff;}}}}音响程序#define uchar unsigned char //定义一下方便使用#define uint unsigned int#define ulong unsigned long#include <reg52.h> //包括一个52标准内核的头文件char code dx516[3] _at_ 0x003b;//这是为了仿真设置的sbit BEEP=P1^7; //喇叭输出脚sbit P10=P1^0;sbit K1= P3^2;sbit K2= P3^5;sbit K3= P2^4;sbit K4= P2^5;uchar th0_f; //在中断中装载的T0的值高8位uchar tl0_f; //在中断中装载的T0的值低8位//T0的值,及输出频率对照表uchar code freq[36*2]={0xA9,0xEF,//00220HZ ,1 //00x93,0xF0,//00233HZ ,1#0x73,0xF1,//00247HZ ,20x49,0xF2,//00262HZ ,2#0x07,0xF3,//00277HZ ,30xC8,0xF3,//00294HZ ,40x73,0xF4,//00311HZ ,4#0x1E,0xF5,//00330HZ ,50xB6,0xF5,//00349HZ ,5#0x4C,0xF6,//00370HZ ,60xD7,0xF6,//00392HZ ,6#0x5A,0xF7,//00415HZ ,70xD8,0xF7,//00440HZ 1 //120x4D,0xF8,//00466HZ 1# //130xBD,0xF8,//00494HZ 2 //140x24,0xF9,//00523HZ 2# //150x87,0xF9,//00554HZ 3 //160xE4,0xF9,//00587HZ 4 //170x3D,0xFA,//00622HZ 4# //180x90,0xFA,//00659HZ 5 //190xDE,0xFA,//00698HZ 5# //200x29,0xFB,//00740HZ 6 //210x6F,0xFB,//00784HZ 6# //220xB1,0xFB,//00831HZ 7 //230xEF,0xFB,//00880HZ `10x2A,0xFC,//00932HZ `1#0x62,0xFC,//00988HZ `20x95,0xFC,//01046HZ `2#0xC7,0xFC,//01109HZ `30xF6,0xFC,//01175HZ `40x22,0xFD,//01244HZ `4#0x4B,0xFD,//01318HZ `50x73,0xFD,//01397HZ `5#0x98,0xFD,//01480HZ `60xBB,0xFD,//01568HZ `6#0xDC,0xFD,//01661HZ `7 //35};//定时中断0,用于产生唱歌频率timer0() interrupt 1{TL0=tl0_f;TH0=th0_f; //调入预定时值BEEP=~BEEP; //取反音乐输出IO}//******************************//音乐符号串解释函数//入口:要解释的音乐符号串,输出的音调串,输出的时长串changedata(uchar *song,uchar *diao,uchar *jie){uchar i,i1,j;char gaodi; //高低+/-12音阶uchar banyin;//有没有半个升音阶uchar yinchang;//音长uchar code jie7[8]={0,12,14,16,17,19,21,23}; //C调的7个值*diao=*song;{gaodi=0; //高低=0banyin=0;//半音=0yinchang=4;//音长1拍if((*(song+i)=='|') || (*(song+i)==' ')) i++; //拍子间隔和一个空格过滤switch(*(song+i)){case ',': gaodi=-12;i++;//低音break;case '`': gaodi=12;i++; //高音break;}if(*(song+i)==0) //遇到0结束{*(diao+i1)=0; //加入结束标志0*(jie+i1)=0;return;}j=*(song+i)-0x30; i++; //取出基准音j=jie7[j]+gaodi; //加上高低音yinc: switch(*(song+i)){case '#': //有半音j加一个音阶i++;j++;goto yinc;case '-': //有一个音节加长yinchang+=4;i++;goto yinc;case '_': //有一个音节缩短yinchang/=2;i++;goto yinc;case '.': //有一个加半拍yinchang=yinchang+yinchang/2;i++;goto yinc;}*(diao+i1)=j; //记录音符*(jie+i1)=yinchang; //记录音长i1++;}}//******************************************//奏乐函数//入口:要演奏的音乐符号串void play(uchar *songdata){uchar i,c,j=0;uint n;uchar xdata diaodata[112]; //音调缓冲uchar xdata jiedata[112]; //音长缓冲changedata(songdata,diaodata,jiedata); //解释音乐符号串TR0=1;for(i=0;diaodata[i]!=0;i++) //逐个符号演奏{tl0_f=freq[diaodata[i]*2]; //取出对应的定时值送给T0th0_f=freq[diaodata[i]*2+1];for(c=0;c<jiedata[i];c++) //按照音长延时{for(n=0;n<32000;n++);if((!K1)||(!K2)||(!K3)||(!K4))//发现按键,立即退出播放{TR0=0;return;}}TR0=0;for(n=0;n<500;n++); //音符间延时TR0=1;}TR0=0;}//仙剑uchar code xianjian[]={"|3_3_3_2_3-|2_3_2_2_,6,6_,7_|12_1_,7,6_,5_|,6---|" "3_3_3_2_3.6_|5_6_5_5_22_3_|45_4_32_1_|3.--3_|" "67_6_55_3_|5--3_5_|26_5_32_3_|3---|""26_6_6-|16_6_66_7_|`17_6_76_7_|3.--3_|""67_6_55_3_|5--3_5_|67_6_76_7_|3---|""26_6_6-|16_6_66_7_|`17_6_7.5_|6---|"};uchar code song3[]={"5-5_3_2_1_|3---|6-6_4_2_1_"",7--,5_|1.3_5.1_|,7.3_5 5_|""6.7_`1.6_|6_5_5-3_2_|1.1_13_2_|""1.1_12_3_|2.1_,62_3_|2-- ,5_|""1.3_5.1_|,7.3_55_|6.7_`1.6_|""6_5_5-3_2_|1.1_13_2_|1.1_12_3_""2.,6_,71_2_|1--"};//世上只有妈妈好uchar code mamahao[]={"6.5_35|`16_5_6-|35_6_53_2_|1_,6_5_3_2-|""2.3_55_6_|321-|5.3_2_1_,6_1_|,5--"};//三个按键选择三首不同的音乐播放,一个键停止播放void main(void) // 主程序{TMOD = 0x01; //使用定时器0的16位工作模式TR0 = 0;ET0 = 1; //定时器0中断EA = 1; //打开总中断while(1){if(!K1){while(!K1);play(xianjian); //播放音乐}if(!K2){while(!K2);play(song3); //播放音乐}if(!K3){while(!K3);play(mamahao); //播放音乐}}}延时程序(包括asm和C程序,都是我在学单片机的过程中用到的),在单片机延时程序中应考虑所使用的晶振的频率,在51系列的单片机中我们常用的是11.0592MHz和12.0000MHz的晶振,而在AVR单片机上常用的有8.000MHz和4.000MH的晶振所以在网上查找程序时如果涉及到精确延时则应该注意晶振的频率是多大。

热敏电阻测温程序

热敏电阻测温程序

热敏电阻测温程序热敏电阻是一种利用物质的电阻随温度变化的特性进行温度测量的传感器。

它是一种重要的温度传感器,广泛应用于各个领域,比如电子设备、家电、汽车等。

本文将介绍热敏电阻测温的原理和一种基于热敏电阻的测温程序。

一、热敏电阻的原理热敏电阻是一种材料,其电阻值会随温度的变化而发生改变。

一般来说,热敏电阻的电阻值会随温度的升高而减小,反之则增大。

这种特性使得热敏电阻可以用来测量温度。

常见的热敏电阻材料有铂电阻、镍铬电阻、铜电阻等。

二、基于热敏电阻的测温程序基于热敏电阻的测温程序主要包括以下几个步骤:1. 选择合适的热敏电阻:根据实际需求选择合适的热敏电阻材料和规格。

不同的热敏电阻材料具有不同的温度测量范围和精度,需要根据具体的应用场景进行选择。

2. 硬件电路设计:设计一个合适的电路,将热敏电阻与其他电子元器件连接起来。

一般来说,需要使用一个电压源和一个电阻,通过测量电阻两端的电压来测量热敏电阻的电阻值。

3. 程序编写:根据硬件电路设计的要求,编写相应的程序。

程序的主要功能是读取热敏电阻两端的电压值,并根据一定的算法将其转换为温度值。

4. 校准和测试:完成程序编写后,需要对测温系统进行校准和测试,确保温度测量的准确性和稳定性。

校准可以通过与其他准确的温度测量设备进行比较来完成。

5. 温度显示:最后,将测得的温度值显示出来。

可以使用液晶显示屏、数码管等设备来显示温度值。

同时,还可以将温度值通过串口、无线通信等方式传输到其他设备。

三、热敏电阻测温程序的应用举例热敏电阻测温程序可以应用于各个领域。

以下是一个基于热敏电阻的温度测量方案在家电领域的应用举例:在一台家用电热水壶中,我们可以使用热敏电阻来测量水温。

将热敏电阻置于热水壶的水箱中,通过测量热敏电阻两端的电压来获取水温信息。

然后,通过编写的测温程序将电压值转换为水温值,并将其显示在设备的液晶显示屏上。

当水温达到设定的温度范围时,电热水壶会自动断电,以保证水温在安全范围内。

单片机课程设计报告 基于单片机的热敏电阻测温系统设计

单片机课程设计报告 基于单片机的热敏电阻测温系统设计

单片机课程设计报告-- 基于单片机的热敏电阻测温系统设计单片机课程设计报告2011 / 2012 学年第 2学期课程名称:单片机课程设计上机项目:基于单片机的热敏电阻测温系统设计专业班级:电子信息工程02班1摘要在日常生活及工业生产过程中,经常要用到温度的检测及控制,温度是生产过程和科学实验中普遍而且重要的物理参数之一。

传统的测温元件有热电偶和热电阻。

而热电偶和热电阻测出的一般都是电压,再转换成对应的温度,这些方法相对比较复杂,需要比较多的外部硬件支持。

我们用一种相对比较简单的方式来测量。

我们采用温度传感器DS18B20作为检测元件,温度范围为-55~125 ºC,最高分辨率可达0.0625 ºC。

DS18B20可以直接读出被侧温度值,而且采用三线制与单片机相连,减少了外部的硬件电路,具有低成本和易使用的特点。

本文介绍一种基于STC12C5608AD单片机的一种温度测量及报警电路,该电路采用DS18B20作为温度监测元件,测量范围0℃-~+100℃,使用数码管驱动芯片CH451显示,能设置温度报警上下限。

正文着重给出了软硬件系统的各部分电路,介绍了集成温度传感器DS18B20的原理,STC12C5608AD单片机功能和应用。

该电路设计新颖、功能强大、结构简单。

关键词:温度测量DS18B20 STC12C5608AD CH451目录2摘要 (2)第1章绪论 (4)第2 章时间安排 (5)第3章设计方案及选材 (6)3.1 系统器件的选择 (7)3.1.1温度采集模块的选择与论证 (7)3.1.2 显示模块的选择与论证 (8)3.2 设计方案及系统方框图 (8)3.2.1 总体设计方案 (8)3.2.2 系统方框图 (9)第4章硬件设计 (10)4.1 总系统组成图 (10)4.2 温度测量传感器部分 (10)4.3 控制部分 (10)4.4 显示部分 (11)4.5 报警部分 (12)第5章程序流程图设计 (13)5.1 主程序流程图 (13)5.2 温度采集流程图 (14)第6章总结 (15)参考文献 (16)3第1章绪论现在电子技术日新月异,各种新型的自动控制系统也越来越多地运用到人们的日常生活、工业生产等领域,它不但可以提高劳动生产率,而且可以使控制的设备或执行的操作更加精确。

pic单片机温度采集实验程序

pic单片机温度采集实验程序

pic单片机温度采集实验程序温度采集实验题目:设计温度采集显示装置,通过定时中断(100ms)采集温度并显示在LED数码管上。

;AD_RT 程序,本程序是使用TMR0定时(100ms)中断,用热敏电阻测温,每100ms 测量一次,经A/D转换,查表求得温度值,送LED显示,其中利用了TMR0定时中断(100ms定时中断),每中断一次,采样一次。

LIST P=16f877A#include p16f877a.inc ;定义所用单片机的头文件#include ;使用spi控制74hc595在led显示的子程序#include STATUS_temp equ 20hW_temp equ 21hcount equ 22hORG 00HNOPGOTO STARTORG 04Hgoto intpSTART NOPbanksel OPTION_REG;select bank1movlw 41h ;TMR0 prescale rate 1:4movwf OPTION_REGbanksel INTCON;select bank0movlw 0a0h;enable GIE,TMR0movwf INTCONCALL InitADCNOPCALL InitSPImovlw 06hmovwf TMR0movlw 9chmovwf counthere goto here intp movwf W_temp swapf STATUS,Wmovwf STATUS_tempincf count,Fbtfss STATUS,Zgoto INT_ENDmovlw 9chmovwf count;启动AD转换BSF ADCON0,GO ;启动AD转换BTFSCADCON0,GO ;等待A/D转换结束GOTO $-1;根据AD转换结果查表求温度值MOVLW 0X3ASUBWF ADRESH,WCALL TMP_TABLE ;查表求实际温度值;求当前温度值的BCD码CALL Bin2BCDNOP;;查表求LED字型码MOVF DIS_TEMP2,WCALL CHAR_CODE1 ;查共阴极七段代码表MOVWF DIS_TEMP2MOVF DIS_TEMP1,W ;读取并存储A/D 转换结果CALL CHAR_CODE1 ;查共阴极七段代码表MOVWF DIS_TEMP1CALL LEDlightNOPINT_ENDmovlw 06hmovwf TMR0bcf INTCON,T0IFswapf STATUS_temp,Wmovwf STATUSswapf W_temp,Fswapf W_temp,Wretfie;/*************将结果转换为BCD码******************/ Bin2BCDCLRF DIS_TEMP1MOVWF DIS_TEMP2TtenthMOVLW .10SUBWF DIS_TEMP2,WBTFSS STATUS,CGOTO OUTMOVWF DIS_TEMP2INCF DIS_TEMP1,FGOTO TtenthOUTRETURN;/*********************************** ********************/ CHAR_CODE1;共阴极字符表ADDWF PCL,FRETLW 3fh ;0RETLW 06h ;1RETLW 5bh ;2RETLW 4fh ;3RETLW 66h ;4RETLW 6dh ;5RETLW 7dh ;6RETLW 07h ;7RETLW 7fh ;8RETLW 6fh ;9RETLW 77h ;ARETLW 7ch ;bRETLW 39h ;CRETLW 5eh ;dRETLW 79h ;ERETLW 71h ;F;/*********************************** ********************/ TMP_TABLEADDWF PCL,Fdt0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5dt6,6,6,7,7,7,8,8,8,9,9,0xa,0xa,0xb ,0xb,0xc,0xcdt0xd,0xd,0xe,0xe,0xf,0xf,0xf,0x10, 0x10,0x10dt0x11,0x11,0x12,0x12,0x12,0x13,0x1 3,0x14,0x14,0x14dt0x15,0x15,0x15,0x16,0x16,0x16,0x1 7,0x17,0x18,0x18dt0x19,0x19,0x1a,0x1a,0x1b,0x1b,0x1 c,0x1c,0x1cdt0x1d,0x1d,0x1d,0x1e,0x1e,0x1f,0x1 f,0x20,0x20dt0x21,0x21,0x22,0x22,0x23,0x23,0x2 4,0x24,0x25,0x25dt0x26,0x26,0x27,0x28,0x29,0x29,0x2 a,0x2a,0x2b,0x2bdt0x2c,0x2d,0x2e,0x2f,0x30,0x32 ;/********************************* ** **********************/end对应的两个子程序分别如下:1、InitADC:banksel ADCON0MOVLW 0X49MOVWF ADCON0 ; 选择A/D 通道为 RA0,打开 A/D 转换器; AD 转换时钟为 FOSC/8,当前转换通道是RA1banksel ADCON1MOVLW 0X00MOVWF ADCON1 ;转换结果左对齐,即ADRESL寄存器的低6 位为"0",所有模拟输入皆为模拟输入功能使用。

NTC热敏电阻高精度温度计程序

NTC热敏电阻高精度温度计程序
// temp_1=temp_1|0x0000;
delay1(50);//程序5次延时时间为54.25us
}
return temp_1;//返回温度值
}
void Negative()//温度为零度以下时,将变换温度
{
Negative_Temperature=Temperature;
Negative_Temperature=Negative_Temperature&0xf800;
DispBuf[2]=mm/10;//显示小数点:0.001
DispBuf[3]=mm%10;//显示小数点:0.0001
//i=DispBuf[0];//百位判断,如果为0,则消隐
//if(i==0)
// i=10;
//DispBuf[0]=DispTab_1[i];//查表,取字符
i=DispBuf[1];
CP=0;
delay1(1);
CP=1;
delay1(1);
CP=0;
}
RS=0;
delay(3);
E=0;
delay(3);
E=1;
delay(3);
E=0;
delay(3);
}
void write_Data(uchar a)//写数据
{
uchar i,temp;
for(i=0;i<8;i++)
{
write_Data(’D’);
write_Data(’S’);
write_Data(’1’);
write_Data(’8’);
write_Data(’B’);
write_Data(’2’);
write_Data(’0’);

单片机测量热电阻的方法

单片机测量热电阻的方法

单片机测量热电阻的方法
在单片机应用中,有时会遇到AD端口资源不够用的情况,但又需要测量电阻的大小,例如一个热敏电阻的阻值。

可以通过以下方法进行测量:
1. 利用两个单片机IO口,连接两个电阻,向同一个电容充电。

设置一个IO 口为输出端口,另一个为输入端口。

输出端口通过连接的电阻向电容充电。

电容上的电压上升,当超过一定阈值,输入端口逻辑电平就会变成1。

这个充电时间与终止电压、阈值电压以及RC对应的时间常数有关系。

具体数值由这个公式决定。

这个过程再测量一遍。

对应的时间与R2成正比。

因此,两次时间的比值,就等于电阻的比值。

如果已知其中一个电阻阻值,另外一个电阻便可以根据时间比值计算出来。

这就是IO口测量电阻的基本原理。

2. 可以通过查找所选NTC对应的R-T对照表(即温度阻值对照表),并利用曲线拟合的方法来求解温度值。

将R-T曲线划分为多个区间,每个区间都可以近似为一段小直线,然后通过一元一次方程求解出对应的温度值。

这些方法仅供参考,实际应用中需要结合具体情况进行选择和调整。

如果对具体操作不熟悉,建议咨询专业人士获取帮助。

热敏电阻测温程序

热敏电阻测温程序

热敏电阻测温程序热敏电阻是一种能够根据温度变化而改变电阻值的元件,它在现代电子设备中被广泛应用于温度测量和控制。

热敏电阻测温程序是基于热敏电阻的原理和特性设计的一种用于测量温度的程序。

本文将详细介绍热敏电阻测温程序的原理、实现方法和应用场景。

热敏电阻的原理是基于材料温度对电阻值的影响。

随着温度的升高,电阻值会发生相应的变化。

根据不同的材料特性,热敏电阻可以分为正温度系数热敏电阻和负温度系数热敏电阻。

正温度系数热敏电阻的电阻值随温度升高而增加,而负温度系数热敏电阻的电阻值随温度升高而减小。

热敏电阻测温程序的实现方法主要有两种:电压比较法和电流比较法。

电压比较法是通过将热敏电阻作为电压分压电路的一部分,根据电压的变化来测量温度;电流比较法是通过将热敏电阻作为电流比较电路的一部分,根据电流的变化来测量温度。

这两种方法在实现过程中需要结合其他电路元件,如运放、模拟转换器等,来完成温度的测量和处理。

在热敏电阻测温程序中,需要注意的是热敏电阻的选择和校准。

不同的应用场景需要选择不同特性的热敏电阻,如正温度系数还是负温度系数热敏电阻,以及具体的温度范围和精度要求。

此外,在使用热敏电阻进行温度测量之前,需要对其进行校准,以确保测量结果的准确性和可靠性。

热敏电阻测温程序的应用场景非常广泛。

在工业领域,热敏电阻常被应用于温度监控和控制系统中,如空调、冰箱、热水器等。

在医疗领域,热敏电阻可以用于体温计和医疗设备中的温度测量。

此外,热敏电阻还可以应用于环境监测、气象仪器、电子设备等领域。

总结起来,热敏电阻测温程序是一种利用热敏电阻的原理和特性设计的用于测量温度的程序。

它通过测量热敏电阻的电阻值来推导出温度值,并结合其他电路元件完成温度的测量和处理。

热敏电阻测温程序在工业、医疗、环境监测等领域有着广泛的应用。

在实际应用中,需要根据具体的应用场景选择合适的热敏电阻,并进行校准,以确保测量结果的准确性和可靠性。

通过热敏电阻测温程序,我们能够方便、准确地获取温度信息,为各个领域的温度监测和控制提供了重要的技术支持。

单片机rt与ntc查表

单片机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单片机热敏电阻测温查表程序

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.。

热敏电阻测温方法

热敏电阻测温方法

实现方法:
步骤 1:将 PA1、PA2、PA3 都设为低电平输出,使 C1 放电至放完。

步骤 2:将 PA1、PA3 设置为输入 FLOAT 状态,PA2设为高电平输出,通过 R1 电阻对 C1
充电,单片机寄存
器清零并开始计时,检测 PA3 口状态,当 PA3 口检测为高电平时,即 C1 上的电压达到单
片机高电
平输入的门嵌电压时,单片机寄存器记录下从开始充电到 PA3 口转变为高电平的时间 T1。

步骤 3:将 PA1、PA2、PA3 都设为低电平输出,使 C1 放电至放完。

步骤 4:将 PA2、PA3 设置为输入 FLOAT 状态,PA1设为高电平输出,通过 Rat 电阻对 C1
充电,单片机寄存
器清零并开始计时,检测 PA3 口状态,当 PA3 口检测为高电平时,即 C1 上的电压达到单
片机高电
平输入的门嵌电压时,单片机寄存器记录下从开始充电到 PA3 口转变为高电平的时间 T2。

步骤 5:查表法得到温度值
从电容的电压公式 Vc=V*E(-T/RC),可以得到:T1/R1=T2/Rat,即 T2/T1=Rat/R1。


温度系数
热敏电阻(NTC),其电阻值随温度增加而呈下降趋势,用户可根据其分度表(热敏电阻厂家提
供的温度
阻值对照表)通过查表方式获取在不同温度下的热敏电阻值。

首先,将该阻值充电时间和标
准电阻 R1
充电时间之商制作成温度表,通过热敏电阻和标准电阻充电时间之商(T2/T1)与表格数据比
较, 用查表
法可以得到温度值。

单片机rt与ntc查表

单片机rt与ntc查表

单片机rt与ntc查表
摘要:
1.单片机RT 与NTC 查表的概念与原理
2.单片机RT 与NTC 查表的方法与步骤
3.单片机RT 与NTC 查表的应用实例
4.单片机RT 与NTC 查表的优缺点分析
正文:
一、单片机RT 与NTC 查表的概念与原理
单片机RT(Run-Time)与NTC(National Temperature Controller)查表是一种通过单片机程序实现对硬件设备参数查询的方法。

RT 是指程序运行时的实时数据,NTC 则是一种温度传感器。

查表则是指通过单片机程序查询相关硬件设备的数据。

二、单片机RT 与NTC 查表的方法与步骤
1.首先,编写单片机程序,实现对NTC 温度传感器的数据查询。

2.通过单片机程序,将查询到的NTC 温度传感器数据存储在RT 数据区。

3.通过查表方法,实时读取RT 数据区中的温度数据,并进行相关处理。

三、单片机RT 与NTC 查表的应用实例
例如,我们可以通过单片机RT 与NTC 查表方法,实时监测环境温度,并在单片机程序中进行数据处理,如控制加热设备、调节通风系统等。

四、单片机RT 与NTC 查表的优缺点分析
优点:
1.实时性强,能够实时反映环境温度变化。

2.可编程性强,可根据需要进行相关数据处理与控制。

3.硬件设备接口简单,易于实现。

缺点:
1.对单片机程序编写者的技术要求较高。

2.系统稳定性受单片机程序影响较大。

热敏电阻参考程序

热敏电阻参考程序

#include<C8051F410.h>#include<math.h>#define WORD unsigned int#define BYTE unsigned char#define AD_LU 15//********************************************//WORD idata AD;float idata DIANYA,R,T_;BYTE code BCD_tab[] = {0x01,0x4f,0x12,0x06,0x4c,0x24,0x20,0x0f,0x00,0x04}; BYTE code WM_tab[] = {0xFB,0xFD,0xFE};BYTE idata BCD_ZH[3];BYTE idata tt=0;BYTE idata t=0;WORD idata XIANSHI_JISHU=0;//*********************************************sfr DM = 0xA0;sfr WM = 0x80;//**********************************************bit XIANSHI_BIT = 0;bit FUHAO_BIT = 0;bit XIANSHI_BIT_=1;//********************************************void CONFIG(){//看门狗禁止,以方便调试PCA0MD = 0x00; //看门狗禁止REG0CN = 0x10; //内部LDO使能PFE0CN = 0x20; //预取指令允许位置'1'//---------------------------------------//交叉开关配置XBR0 = 0x00;XBR1 = 0x40;P1MDIN = 0x7f;P1MDOUT = 0;//---------------------------------------//系统时钟配置,采用内部晶振CLKSEL = 0x00;//时钟乘法器OSCICN = 0x87;//振荡器使能不分频//----------------------------------------//T2初始化//T2工作于自动重装载定时方式,定时时间ms,PID运算时间最短为msTMR2CN = 0x04;//开定时器TMR2RLH = 0xe0;//定时器重装载高字节TMR2RLL = 0x18;//低字节TMR2H = 0xe0;//定时器高字节TMR2L = 0x18;//低字节IE |= 0x20;//允许TF2L或TF2H标志中断请求//-------------------------------------//VREF初始化REF0CN = 0x13;//基准电压.2v//--------------------------------------//ADC0初始化ADC0CN = 0x80;//ASC0处于使能状态,可以进行转换数据ADC0CF = 0xf0;//--------------------------------------EA = 1;//开启全局中断}//***************************************************************** ********void T2_INT()interrupt 5{//PID采样时间,最小间隔msTMR2CN &= 0x7f;//清除TF2中断标志XIANSHI_BIT = 1;if(tt<2){tt++;}else{tt=0;}WM = 255;DM = BCD_tab[BCD_ZH[tt]];WM = WM_tab[tt];XIANSHI_JISHU++;if(XIANSHI_JISHU<100){XIANSHI_JISHU++;}else{XIANSHI_JISHU = 0;XIANSHI_BIT_ = 1;}}//AD转换函数//***************************************************************** *********WORD ADC0(){BYTE x;WORD y;ADC0MX = AD_LU;ADC0CN |=0x10;x = ADC0CN&0x20;while(x==0){x = ADC0CN&0x20;}ADC0CN = ADC0CN&0xdf;y = 256*ADC0H+ADC0L;return y;}//转换函数//*************************************************************void BCD_ZHUANHUAN(int x){if(x<0){x = -x;FUHAO_BIT = 1;}else{FUHAO_BIT = 0;}BCD_ZH[0] = x%10;BCD_ZH[1] = x/10%10;BCD_ZH[2] = x/100;}//***************************************************************** float U_JISUAN(WORD x){return (2.200*(float)(x)/4095);}float R_JISUAN(float x){return 3600.0*x/(2.58-x);}float T_JISUAN(float x){float T;T = (1/(log(x/10000)/2800+1/298.15));return T;}//***************************************************************** //主函数void mian(){CONFIG();while(1){AD = ADC0();DIANYA =U_JISUAN(AD);R=R_JISUAN(DIANYA);T_=T_JISUAN(R)-273.15;if(XIANSHI_BIT_==1){BCD_ZHUANHUAN(T_*10);XIANSHI_BIT_=0;}}}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

//;*************************************************
1.//;* heat.c **
2.//;*************************************************
3.//;* 本程序为热敏电阻输入处理模块程序
4.//;* 将温度值在LCD特定位置显示
5.//;* 占用I/O RA1,RB5,RB4,RB3
6.//;* 使用RAM
7.//;* 程序包括:
8.//;* - tempdeal 热敏电阻输入处理子程序
9.//;* - heattab 温度值校准表
10.//;*
11.//;* 入口参数无
12.//;* 出口参数 TempH,TempL (温度值)
13.//;*************************************************
14.#include <pic18.h> // ;定义所用单片机的头文件
15.#define TSRCLK TRISD5
16.#define TRCLK TRISD4
17.#define TSER TRISD3
18.#define SRCLK RD5
19.#define RCLK RD4
20.#define SER RD3
21.
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. else
42. 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;//设置通道为RA1
71. PCFG2=1;//0100,设置各通道属性及参考电压为VDD,VSS
72. ADON=1;//使能AD
73.}
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,0
xb,0xb,0xc,0xc,
80. 0xd,0xd,0xe,0xe,0xf,0xf,0xf,0x1
0,0x10,0x10,
81. 0x11,0x11,0x12,0x12,0x12,0x13,0
x13,0x14,0x14,0x14,
82. 0x15,0x15,0x15,0x16,0x16,0x16,0
x17,0x17,0x18,0x18,
83. 0x19,0x19,0x1a,0x1a,0x1b,0x1b,0
x1c,0x1c,0x1c,
84. 0x1d,0x1d,0x1d,0x1e,0x1e,0x1f,0
x1f,0x20,0x20,
85. 0x21,0x21,0x22,0x22,0x23,0x23,0
x24,0x24,0x25,0x25,
86. 0x26,0x26,0x27,0x28,0x29,0x29,0
x2a,0x2a,0x2b,0x2b,
87. 0x2c,0x2d,0x2e,0x2f,0x30,0x32
88. };
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,0
x07,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);//延时1S
112. delay(65535);
113. }
114.}
115.。

相关文档
最新文档