温度显示程序.doc

上传人:豆**** 文档编号:17659117 上传时间:2022-05-25 格式:DOC 页数:10 大小:163KB
返回 下载 相关 举报
温度显示程序.doc_第1页
第1页 / 共10页
温度显示程序.doc_第2页
第2页 / 共10页
点击查看更多>>
资源描述

《温度显示程序.doc》由会员分享,可在线阅读,更多相关《温度显示程序.doc(10页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、【精品文档】如有侵权,请联系网站删除,仅供学习与交流1.2.3.4. 温度显示程序.精品文档.5. ;温度显示程序6. ;程序最后修改于:2004年2月29日21:207. /*-头文件说明-*/8. #include 9. #include 10. #include/_nop_() 11. #include/XBYTE 12. #include 13. #defineucharunsignedchar 14. #defineuintunsignedint 15. #defineN10 16. /#defineTMAX100 17. /#defineTMIN0 18. #defineUmax0

2、x7fff 19. #defineUf0x8000 20. #definea11.114e-12 21. #definea2-3.8071e-8 22. #definea30.0023857 23. #definea40.092139 24. /*-CPU引脚定义-*/25. /t6963引脚分配 26. #defineCWADDXBYTE0x8100/写指令代码地址 27. #defineDWADDXBYTE0x8000/写数据通道地址 28. /MAX1169引脚分配 29. sbitSCL=P10;/定义串行时钟线所在口使用时根据自己的需要来定义 30. sbitSDA=P11;/定义串

3、行数据线所在口使用时根据自己的需要来定义 31. /MAX5541引脚分配 32. sbitSCLK=P13;/定义串行时钟线所在口使用时根据自己的需要来定义 33. sbitDIN=P14;/定义串行数据线所在口使用时根据自己的需要来定义 34. sbitDA_CS=P15;/MAX5541片选端 35. /*-全局变量定义-*/36. ucharSystemError;37. uintcounter;/中断次数 38. floattemp_data;39. floats;40. uintyk;41. signedintek;42. /*-功能子程序段-*/43. ;定时器中断服务子程序44

4、. /定时器计数初值为50000 45. /定时100ms,中断30次 46. timer0()interrupt1using147. counter+;48. TH0=-100000/256;49. TL0=-100000%256;50. ;t696351. /液晶显示器地址:p27-CSP26-C/DWR-WRRD-RD则 52. /0000000000000000(数据通道) 53. /0100000000000000(指令通道) 54. /g6963.c-图形方式下的汉字、字符显示程序 55. voidsta01(void)/判断状态位 56. while(CWADD&3)!=3);5

5、7. voidsta3(void)58. while(CWADD&8)!=8);59. /写指令和写数据子程序 60. voidwritecode(unsignedcharcom)/写无参数指令 61. sta01();62. CWADD=com;63. voidwrite1byte(unsignedchardat1,unsignedcharcom)/写单字节参数指令 64. sta01();65. DWADD=dat1;66. sta01();67. CWADD=com;68. voidwrite2byte(unsignedchardat1,unsignedchardat2,unsigned

6、charcom)69. /写双字节参数指令 70. sta01();71. DWADD=dat1;72. sta01();73. DWADD=dat2;74. sta01();75. CWADD=com;76. voiddisp_ini(void)/显示屏初始化子程序 77. write2byte(0x00,0x00,0x40);/设置显示区域首地址0000h 78. write2byte(0x10,0x00,0x41);/设置文本显示的宽度,即一行所占的字节数(12864t,16个8X8点阵字符) 79. write2byte(0x00,0x08,0x42);/设置图形显示区域首地址0800

7、h,或为文本属性区域首地址 80. write2byte(0x10,0x00,0x43);/设置图形显示区域宽度,或为文本属性区域宽度(12864t,16个8x8点阵字符) 81. writecode(0xa7);/光标形状设置 82. writecode(0x9c);/显示开关设置,gtallon! 83. writecode(0x80);/显示方式设置,逻辑或合成 84. voidclearram(void)/清屏程序 85. unsignedinti;86. write2byte(0x00,0x00,0x24);/设置显示ram首地址0000h 87. writecode(0xb0);/

8、设置自动写方式 88. for(i=8192;i0;i-)/往显示区域写0;区域大小8k 89. sta3();90. DWADD=0;91. writecode(0xb2);/关闭自动写指令 92. 汉字点阵,存储在程序存储器中93. 点阵:16x1694. 提取点阵方向:横向(先上-下,再左-右)95. 字节掉转:否96. 字节方式:C语言97. unsignedcharcodewen32=98. 0x00,0x43,0x32,0x12,0x83,0x62,0x22,0x0B,/温 99. 0x10,0x27,0xE4,0x24,0x24,0x24,0x2F,0x20,100. 0x08,

9、0xFC,0x08,0x08,0xF8,0x08,0x08,0xF8,101. 0x00,0xFC,0xA4,0xA4,0xA4,0xA4,0xFE,0x00;102. unsignedcharcodedu32=103. 0x01,0x00,0x3F,0x22,0x22,0x3F,0x22,0x23,/度 104. 0x20,0x2F,0x22,0x21,0x20,0x43,0x8C,0x30,105. 0x00,0x84,0xFE,0x20,0x28,0xFC,0x20,0xE0,106. 0x00,0xF0,0x20,0x40,0x80,0x60,0x1E,0x04;107. unsign

10、edcharcodewei32=108. 0x00,0x10,0x0C,0x04,0x00,0xFF,0x01,0x01,/为 109. 0x02,0x02,0x04,0x08,0x10,0x20,0x40,0x00,110. 0x80,0x80,0x80,0x80,0x84,0xFE,0x04,0x04,111. 0x04,0x84,0x64,0x24,0x04,0x04,0x28,0x10;112. unsignedcharcodeclearchar16=/擦除一个字符 113. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,114. 0x00,0x00,

11、0x00,0x00,0x00,0x00,0x00,0x00,115. unsignedcharcodedot16=116. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,117. 0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00118. /本文件为816点阵西文字库文件,字的横向8点构成一字节,左边点在字节的高位,字符点阵四角按左上角右上角左下角右下角取字*/ 119. /*0*/120. unsignedcharcodech016=121. 0x00,0x00,0x7C,0xC6,0xC6,0xCE,0xD6,0xD6,122.

12、 0xE6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00;123. /*1*/124. unsignedcharcodech116=125. 0x00,0x00,0x18,0x38,0x78,0x18,0x18,0x18,126. 0x18,0x18,0x18,0x7E,0x00,0x00,0x00,0x00;127. /*2*/128. unsignedcharcodech216=129. 0x00,0x00,0x7C,0xC6,0x06,0x0C,0x18,0x30,130. 0x60,0xC0,0xC6,0xFE,0x00,0x00,0x00,0x00;131.

13、/*3*/132. unsignedcharcodech316=133. 0x00,0x00,0x7C,0xC6,0x06,0x06,0x3C,0x06,134. 0x06,0x06,0xC6,0x7C,0x00,0x00,0x00,0x00;135. /*4*/136. unsignedcharcodech416=137. 0x00,0x00,0x0C,0x1C,0x3C,0x6C,0xCC,0xFE,138. 0x0C,0x0C,0x0C,0x1E,0x00,0x00,0x00,0x00;139. /*5*/140. unsignedcharcodech516=141. 0x00,0x00

14、,0xFE,0xC0,0xC0,0xC0,0xFC,0x0E,142. 0x06,0x06,0xC6,0x7C,0x00,0x00,0x00,0x00;143. /*6*/144. unsignedcharcodech616=145. 0x00,0x00,0x38,0x60,0xC0,0xC0,0xFC,0xC6,146. 0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00;147. /*7*/148. unsignedcharcodech716=149. 0x00,0x00,0xFE,0xC6,0x06,0x06,0x0C,0x18,150. 0x30,0x30,

15、0x30,0x30,0x00,0x00,0x00,0x00;151. /*8*/152. unsignedcharcodech816=153. 0x00,0x00,0x7C,0xC6,0xC6,0xC6,0x7C,0xC6,154. 0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00;155. /*9*/156. unsignedcharcodech916=157. 0x00,0x00,0x7C,0xC6,0xC6,0xC6,0x7E,0x06,158. 0x06,0x06,0x0C,0x78,0x00,0x00,0x00,0x00159. voidgshowwor

16、d(unsignedchary,unsignedcharx,unsignedchar*w_no)/图形方式下显示一个汉字字符(分为左右两半字模) 160. /128*64dots,x-显示在第x(015)字符列!,y-显示在第y(063)点阵!行,w_no为tab代码 161. /调用示例:gshowword(2,4,hao)在第二行第四列显示好-gshowword(点阵行,字符列,数组首地址) 162. unsignedintnum;163. unsignedchard1,d2,i=16;164. num=y*16+x+0x800;/16-每行显示宽度为16个字符;0-图形显示区首地址为08

17、00h 165. for(i=16;i0;i-)166. d1=num/256;/得到显示屏上汉字显示的相对位置 167. d2=num%256;168. write2byte(d2,d1,0x24);169. write1byte(*w_no,0xc0);/写汉字左代码 170. write1byte(*(w_no+16),0xc0);/写汉字右代码 171. w_no+;172. num+=0x10;/显示ram地址修正 173. voidgshowchar(unsignedchary,unsignedcharx,unsignedchar*w_no)/图形方式下显示一个字符(分为左右两半字

18、模) 174. /128*64dots,x-显示在第x(015)字符列!,y-显示在第y(063)点阵!行,w_no为tab代码 175. /调用示例:gshowword(2,4,hao)在第二点阵行第四字符列显示好 176. unsignedintnum;177. unsignedchard1,d2,i=16;178. num=y*16+x+0x800;/16-每行显示宽度为16个字符;0-图形显示区首地址为0800h 179. for(i=16;i0;i-)180. d1=num/256;/得到显示屏上汉字显示的相对位置 181. d2=num%256;182. write2byte(d2

19、,d1,0x24);183. write1byte(*w_no,0xc0);/写汉字左代码 184. /write1byte(*(w_no+16),0xc0);/写汉字右代码 185. w_no+;186. num+=0x10;/显示ram地址修正 187. voiddisp5ch(unsignedchary,unsignedcharx,unsignedlongvar)188. /带灭零处理及小数点的五位数显示子程序(可显示0.00099.999),var指要显示的数据 189. uchard4,d3,d2,d1,d0;190. d4=var/10000;d3=(var%10000)/1000

20、;d2=(var%1000)/100;d1=(var%1000)%100/10;d0=(var%1000)%100%10;191. if(d4=0)gshowchar(y,x,clearchar);192. elsegshowchar(y,x,ch0+0x10*d4);/显示万位 193. if(d4=0)&(d3=0)gshowchar(y,x,clearchar);gshowchar(y,x+1,clearchar);194. elsegshowchar(y,x+1,ch0+0x10*d3);/显示千位 195. gshowchar(y,x+2,dot);/显示小数点 196. gshow

21、char(y,x+3,ch0+0x10*d2);/显示百位 197. gshowchar(y,x+4,ch0+0x10*d1);/显示十位 198. gshowchar(y,x+5,ch0+0x10*d0);/显示个位 199. voiddisp()200. floatfilter();201. doubletemptrans(floatx);202. s=filter();203. temp_data=temptrans(s);204. disp_ini();205. clearram();206. gshowword(2,4,wen);207. gshowword(2,6,du);208.

22、 gshowword(2,8,wei);209. disp5ch(36,6,(unsignedlong)(temp_data*1000);210. /_nop_(); 211. ;MAX1169212. /I2C通用驱动AD程序 213. SomeNOP(void)214. /ucharij=255; 215. /while(ij-) 216. _nop_();_nop_();_nop_();_nop_();217. 调用方式:voidI2CStart(void)2005/12/10218. 函数说明:私有函数,I2C专用219. voidI2CStart(void)220. /EA=0; 2

23、21. SDA=1;/SomeNOP();/SCL保持高,SDA从高到低一次跳变,I2C通信开始 222. SCL=1;SomeNOP();223. SDA=0;SomeNOP();224. SCL=0;SomeNOP();225. 调用方式:voidI2CStop(void)2005/12/10226. 函数说明:私有函数,I2C专用227. voidI2CStop(void)228. /SCL=0; 229. SDA=0;/SomeNOP();/SCL保持高,SDA从低到高一次跳变,I2C通信停止 230. SCL=1;SomeNOP();231. SDA=1;SomeNOP();232.

24、 SCL=0;SomeNOP();233. /EA=1; 234. 调用方式:I2CAck(void)2005/12/10235. 函数说明:私有函数,I2C专用,等待从器件接收方的应答236. ACKBY237. WaitAck(void)238. unsignedcharerrtime=255;/因故障接收方无ACK(ACK对应SDA=0),超时值为255。 239. SDA=1;240. /SDA=0; 241. SCL=1;242. SystemError=0x10;243. while(SDA)244. errtime-;245. if(!errtime)246. I2CStop()

25、;247. SystemError=0x11;/出错后给全局变量赋值 248. return;249. SCL=0;250. _nop_();251. 调用方式:voidSendAck(void)2005/12/10252. 函数说明:私有函数,I2C专用,主器件为接收方,从器件为发送方时,应答信号。253. voidSendAck(void)254. SDA=0;SomeNOP();/数据线保持低,时钟线发生一次从高低的跳变发送一个应答信号 255. SCL=1;SomeNOP();256. SCL=0;257. 调用方式:voidSendAck(void)2005/12/10258. 函数

26、说明:私有函数,I2C专用,主器件为接收方,从器件为发送方时,非应答信号。259. voidSendNotAck(void)260. SDA=1;SomeNOP();/数据线保持高,时钟线发生一次从高低的跳变没有应答 261. SCL=1;SomeNOP();262. SCL=0;263. 调用方式:voidI2CSend(ucharch)2005/12/10264. 函数说明:私有函数,I2C专用265. voidI2CSendByte(ucharch)/writedevice 266. unsignedchari=8;267. while(i-)268. SCL=0;_nop_();269

27、. SDA=(bit)(ch&0x80);ch=1;SomeNOP();/SCK下降沿发送数据 270. SCL=1;SomeNOP();271. SCL=0;272. 调用方式:ucharI2CReceive(void)2005/12/10273. 函数说明:私有函数,I2C专用274. ucharI2CReceiveByte(void)/readdevice 275. unsignedchari=8,datatmp=0;276. SDA=1;/释放总线 277. while(i-)278. datatmp=1;279. SCL=0;SomeNOP();280. SCL=1;SomeNOP(

28、);/SCL做一次从低到高的跳变可以接收数据 281. datatmp|=SDA;282. SCL=0;283. returndatatmp;284. 调用方式:uintADC(void)2005/12/10285. 函数说明:用于max1169AD转换测试(转换前是否一定要进行“HSMODE”设置?N,上电即默认为FS)286. uintADC(ucharaddr)287. uintadc_data;288. ucharnt1;289. I2CStart();290. nt1=(addr1)|0x61;291. I2CSendByte(nt1);/写入器件地址,并设置器件为R模式 292.

29、WaitAck();/写入地址后,器件向主机发送ACK。 293. /SCL=0;/用延时的方式等待SCK变高(转换时SCK被max1169置低) 294. /SomeNOP(); 295. /while(!SCL);/由于转换过程很短,转换过程中SCL保持低,转换结束后slave释放对SCL控制权,但SCL仍然为0 296. adc_data=I2CReceiveByte();/readd15d8 297. SendAck();298. adc_data=8;299. adc_data=adc_data|I2CReceiveByte();/readd7d0 300. SendNotAck()

30、;301. I2CStop();302. return(adc_data);303. voiddelay(ucharx)304. ucharj;305. for(j=0;jX;J+)ek=0,duk9600;+=(float)ch_adccount;yk=(uint)filter()yk;uintek为当次采样比较误差,duk为pid运算结果=0,ukintsigned*sp)PIDparapid(struct-*常规PID控制炉温程序(只用到了PI部分)*-_nop_();_nop_();_nop_();DA_CS=1;ch=1;ad5541_ck();DIN=ch&0x8000;(r-)w

31、hiledacs2=1;ch=da1;ch;r=16;ucharda1)ad5541(uintvoidSCLK=0;_nop_();_nop_();ad5541_ck(void)*for(i=0;ix;i+);i;x)delayms(uchar*void-*;MAX5541控制程序*-y;returny=a1*x*x*x+a2*x*x+a3*x+a4;doubletemptrans(float函数说明:3040度的温度曲线;温度转化程序(N-2);(float)(sumsum=0.0;for(count=1;countN-1;count+)选择法进行排序ch_adci=temp;ch_adck

32、=ch_adci;temp=ch_adck;k=i;(ch_adcjch_adck)if(j=i+1;jN;j+)for(i=0;iN-1;i+)_nop_();delay(80);ch_adccount=ADC(0x6);(count=0;countrk-yk;306. duk=(sp-kp+sp-ki)*ek-sp-kp*sp-ek1;307. uk=sp-uk1+duk;308. sp-ek1=ek;/e(k)数据更新,给下一次PID运算使用 309. sp-uk1=uk;/u(k)数据更新 310. return(uk);/输出给函数返回值 311. ;温控系统主程序312. main

33、()313. uintDA_i=0;314. uintukout=0;315. uintcounter=0;316. /uintrk=19316;/40度 317. /uintrk=20000;/50度 318. uintrk=28600;/60度 319. /uintrk=34727;/70度 320. /uintrk=38674;/80度 321. uintyk;322. autostructPIDpara*p1,data1=3.14,0.065,28600,0,0;323. autostructPIDpara*p2,data2=3.14,0,28600,0,0;324. TMOD=0x01;/采用定时器0方式1 325. TH0=-100000/256;/定时器预置计数初值 326. TL0=-100000%256;327. EA=1;/CPU开中断 328. ET0=1;/开C/T中断 329. TR0=1;/启动C/T 330. while(1)331. /_nop_(); 332. if(!(counter+%10)333. disp();334. if(!(counter+%30)/每隔3s做一次运算 335. if(rk-yk0x1420)/积分分离PID,当温度大于10度仅为P控制器,当温度小于10度加入积分 336. p1=&d

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 小学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com