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单片机温敏电阻测温课程设计资料

一、设计目的、要求及方案选择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的温度测量系统设计

( 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单片机热敏电阻测温查表程序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 单片机学习(程序实例)说明: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、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间: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.。