版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1. /*- 2. ; 温度显示程序 3. ; 程序最后修改于:2004年2月29日 21:20 4. -*/ 5. 6. /*-头文件说明-*/ 7. #include <REG52.H> 8. #include <
2、STDIO.H> 9. #include <INTRINS.H> /_nop_() 10. #include <ABSACC.H> / XBYTE 11. #include <DATASTRUCT1.H> 12.
3、0; 13. #define uchar unsigned char 14. #define uint unsigned int 15. 16. #define N 10 17. /#define TMAX 100 18. /#defin
4、e TMIN 0 19. #define Umax 0x7fff 20. #define Uf 0x8000 21. #define a1 1.114e-12 22. #define a2 -3.80
5、71e-8 23. #define a3 0.0023857 24. #define a4 0.092139 25. /*-CPU引脚定义-*/ 26. /t6963引脚分配 27. #define CWADD XBYTE0x8100
6、0; /写指令代码地址 28. #define DWADD XBYTE0x8000 /写数据通道地址 29. /MAX1169引脚分配
7、60; 30. sbit SCL = P10; /定义串行时钟线所在口 使用时根据自己的需要来定义 31. sbit SDA = P11; /定义串行数据线所在口 使用时根据自己的需要来定义 32. /MAX5541引脚分配 33. sbit SCLK = P13; /定义串行时钟线所在口 使用时根据自己的需要来定义
8、 34. sbit DIN = P14; /定义串行数据线所在口 使用时根据自己的需要来定义 35. sbit DA_CS= P15; /MAX5541片选端 36. 37. 38. /*-全局变量定义-*/ 39. uchar SystemError;
9、60; 40. uint counter; /中断次数 41. float temp_data; 42. float s; 43. uint yk; 44. signed int ek;
10、160; 45. 46. 47. /*-功能子程序段-*/ 48. /*- 49. ;定时器中断服务子程序 50. -*/ 51. /定时器计数初值为50000 52. /定时100ms,中断30次 53. timer0() interrupt 1 using 1
11、60; 54. 55. counter+; 56. TH0 = -100000/256; 57. TL0 = -100000%256; 58. 59
12、. 60. /*- 61. ;t6963 62. -*/ 63. /液晶显示器地址:p27-CS P26-C/D WR-WR RD-RD 则 64. / 00 00
13、;0000 0000 0000(数据通道) 65. / 01 00 0000 0000 0000(指令通道) 66. / &
14、#160; 67. /g6963.c-图形方式下的汉字、字符显示程序 68. 69. void sta01(void) /判断状态位 &
15、#160; 70. 71. while(CWADD&3)!=3); 72. 73. 74. 75. void sta3(void) 76. 77. 78. while(CWADD&8)!=8);&
16、#160; 79. 80. 81. 82. 83. /写指令和写数据子程序 84. 85. void writecode(unsigned char com)
17、60; /写无参数指令 86. 87. sta01(); 88. CWADD=com; 89. 90. void write1byte(unsigned char dat1,unsigned char com
18、) /写单字节参数指令 91. 92. sta01(); 93. DWADD=dat1; 94. sta01(); 95. CWADD=com; 96.
19、 97. 98. void write2byte(unsigned char dat1,unsigned char dat2,unsigned char com) 99. &
20、#160; /写双字节参数指令 100. 101.
21、; sta01(); 102. DWADD=dat1; 103. 104. sta01(); 105. DWADD=dat2; 106. 107. sta01(); 108.
22、160; CWADD=com; 109. 110. 111. 112. void disp_ini(void) /显示屏初始化子程序 113.
23、0;114. write2byte(0x00,0x00,0x40);/设置显示区域首地址0000h 115. write2byte(0x10,0x00,0x41);/设置文本显示的宽度,即一行所占的字节数(12864t,16个8X8点阵字符) 116. write2byte(0x00,0x08,0x42);/设置图形显示区域首地址0800h,或为文本属性区域首地址
24、160; 117. write2byte(0x10,0x00,0x43);/设置图形显示区域宽度,或为文本属性区域宽度(12864t,16个8x8点阵字符) 118. 119. writecode(0xa7);/光标形状设置 120. writecode(0x9c);/显示开关设置,gt all on!
25、 121. writecode(0x80);/显示方式设置,逻辑或合成 122. 123. 124. 125. void clearram(void)
26、; /清屏程序 126. 127. unsigned int i; 128. 129. write2byte(0x00,0x00,0x24);/设置显示ram首地址0000h 130. 131.
27、160; writecode(0xb0); /设置自动写方式 132. 133. for(i=8192;i>0;i-) /往显示区域写0;区域大小8k 134. 135
28、. sta3(); 136. DWADD=0; 137. 138. 139. writecode(0xb2); &
29、#160; /关闭自动写指令 140. 141. 142. 143. /*- 144. 汉字点阵,存储在程序存储器中 145. 点阵:16x16 146.
30、0; 提取点阵方向:横向(先上->下, 再左->右) 147. 字节掉转:否 148. 字节方式:C语言 149. -*/ 150. 151. unsigned char code wen32= 152. 0x00,0x43,0x32,0x12,0x83,0x62,0x2
31、2,0x0B, / 温 153. 0x10,0x27,0xE4,0x24,0x24,0x24,0x2F,0x20, 154. 0x08,0xFC,0x08,0x08,0xF8,0x08,0x08,0xF8, 155. 0x00,0xFC,0xA4,0xA4,0xA4,0xA4,0xFE,0x00; 156. 157. unsigned char c
32、ode du32= 158. 0x01,0x00,0x3F,0x22,0x22,0x3F,0x22,0x23, / 度 159. 0x20,0x2F,0x22,0x21,0x20,0x43,0x8C,0x30, 160. 0x00,0x84,0xFE,0x20,0x28,0xFC,0x20,0xE0, 161. 0x00,0xF0,0x20,0x40,0x80,0x60,0x1E,0x04;&
33、#160; 162. 163. unsigned char code wei32= 164. 0x00,0x10,0x0C,0x04,0x00,0xFF,0x01,0x01, / 为 165. 0x02,0x02,0x04,0x08,0x10,0x20,0x40,0x00, 166. 0x80,0x80,0x80,0x80,0x84,0xFE,0x0
34、4,0x04, 167. 0x04,0x84,0x64,0x24,0x04,0x04,0x28,0x10; 168. 169. unsigned char code clearchar16 = /擦除一个字符 170. 0x00,0x00,0x00,0x00,0x0
35、0,0x00,0x00,0x00, 171. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 172. ; 173. 174. unsigned char code dot16= 175. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 176. 0x00,0x00,0x00,0x3
36、0,0x30,0x00,0x00,0x00 177. ; 178. 179. /本文件为8×16点阵西文字库文件,字的横向8点构成一字节,左边点在字节的高位,字符点阵四角按左上角右上角左下角右下角取字*/ 180. /*0 */ 181. unsigned char code ch016= 182. 0x
37、00,0x00,0x7C,0xC6,0xC6,0xCE,0xD6,0xD6, 183. 0xE6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00; 184. 185. /*1 */ 186. unsigned char code ch116= 187. 0x00,0x00,0x18,0x38,0x78,0x18,0x18,0x1
38、8, 188. 0x18,0x18,0x18,0x7E,0x00,0x00,0x00,0x00; 189. 190. /*2 */ 191. unsigned char code ch216= 192. 0x00,0x00,0x7C,0xC6,0x06,0x0C,0x18,0x30, 193. 0x60,0xC0,0
39、xC6,0xFE,0x00,0x00,0x00,0x00; 194. 195. /*3 */ 196. unsigned char code ch316= 197. 0x00,0x00,0x7C,0xC6,0x06,0x06,0x3C,0x06, 198. 0x06,0x06,0xC6,0x7C,0x00,0x00,0x00,0x00; &
40、#160; 199. 200. /*4 */ 201. unsigned char code ch416= 202. 0x00,0x00,0x0C,0x1C,0x3C,0x6C,0xCC,0xFE, 203. 0x0C,0x0C,0x0C,0x1E,0x00,0x00,0x00,0x00; 204. 20
41、5. /*5 */ 206. unsigned char code ch516= 207. 0x00,0x00,0xFE,0xC0,0xC0,0xC0,0xFC,0x0E, 208. 0x06,0x06,0xC6,0x7C,0x00,0x00,0x00,0x00; 209. 210. /*6 */
42、0; 211. unsigned char code ch616= 212. 0x00,0x00,0x38,0x60,0xC0,0xC0,0xFC,0xC6, 213. 0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00; 214. 215. /*7 */ 216. unsigned cha
43、r code ch716= 217. 0x00,0x00,0xFE,0xC6,0x06,0x06,0x0C,0x18, 218. 0x30,0x30,0x30,0x30,0x00,0x00,0x00,0x00; 219. 220. /*8 */ 221. unsigned char code ch816= &
44、#160;222. 0x00,0x00,0x7C,0xC6,0xC6,0xC6,0x7C,0xC6, 223. 0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00; 224. 225. /*9 */ 226. unsigned char code ch916= 227. 0x00,0x00,0x7C,0xC6,0xC6,0
45、xC6,0x7E,0x06, 228. 0x06,0x06,0x0C,0x78,0x00,0x00,0x00,0x00 229. ; 230. 231. 232. 233. 234. void gshowword(unsigned char y,unsigned char x,unsigned
46、;char *w_no) /图形方式下显示一个汉字字符(分为左右两半字模) 235. /128*64dots,x-显示在第x(015)字符列!,y-显示在第y(063)点阵!行,w_no为tab代码 236. /调用示例:gshowword(2,4,hao)
47、; 在第二行第四列显示"好" -gshowword(点阵行,字符列,数组首地址) 237. unsigned int num; 238. unsigned char d1,d2,i=16; 239. num=y*16+x+0x800; &
48、#160; /16-每行显示宽度为16个字符;0-图形显示区首地址为0800h 240. 241. 242. 243. for(i=16;i>0;i-) 244. &
49、#160; d1=num/256; /得到显示屏上汉字显示的相对位置 245. d2=num%256; 246.
50、 write2byte(d2,d1,0x24); 247. write1byte(*w_no,0xc0); /写汉字左代码 248. wr
51、ite1byte(*(w_no+16),0xc0); /写汉字右代码 249. w_no+; 250. num+=0x10;
52、 /显示ram地址修正 251. 252. 253. 254. 255. 256. void gshowchar
53、(unsigned char y,unsigned char x,unsigned char *w_no) /图形方式下显示一个字符(分为左右两半字模) 257. /128*64dots,x-显示在第x(015)字符列!,y-显示在第y(063)点阵!行
54、,w_no为tab代码 258. /调用示例:gshowword(2,4,hao) 在第二点阵行第四字符列显示"好" 259.
55、;unsigned int num; 260. unsigned char d1,d2,i=16; 261. num=y*16+x+0x800; /16-每行显示宽度为16个字符;0-图形显示区首地址为0800h
56、60; 262. 263. for(i=16;i>0;i-) 264. 265. d1=num/256;
57、 /得到显示屏上汉字显示的相对位置 266. d2=num%256; 267. write2byte(d2,d1,0x24); 268.
58、 write1byte(*w_no,0xc0); /写汉字左代码 269. / write1byte(*(w_no+16),0xc0); /写汉字右代码 270.
59、 w_no+; 271. num+=0x10; /显示ram地址修正 272.
60、; 273. 274. 275. 276. 277. / 278. 279. void disp5ch(unsigned char y,unsigned char x,unsigned
61、0;long var) 280. /带灭零处理及小数点的五位数显示子程序(可显示0.00099.999),var指要显示的数据 281. uchar d4,d3,d2,d1,d0; 282. d4=var/10000;d3=(var%1
62、0000)/1000;d2=(var%1000)/100;d1=(var%1000)%100/10;d0=(var%1000)%100%10; 283. 284. if(d4=0) gshowchar(y,x,clearchar);
63、 285. else gshowchar(y,x,ch0+0x10*d4); /显示万位 286. 287. if(d4=0)&&(d3=0)
64、160;gshowchar(y,x,clearchar);gshowchar(y,x+1,clearchar); 288. else gshowchar(y,x+1,ch0+0x10*d3); /显示千位 289. 290. gsho
65、wchar(y,x+2,dot); /显示小数点 291. 292. gshowchar(y,x+3,ch0+0x10*d2); /显示百位 293
66、. 294. gshowchar(y,x+4,ch0+0x10*d1); /显示十位 295. 296. gshowchar(y,x+5,ch0+0x10*d0); /显示个位 297.
67、0; 298. 299. 300. void disp() 301. 302. float filter(); 303. double temptrans(float&
68、#160;x); 304. s = filter(); 305. temp_data = temptrans(s); 306. 307. disp_ini(); 308.
69、 clearram(); 309. 310. gshowword(2,4,wen); 311. gshowword(2,6,du); 312.
70、0;gshowword(2,8,wei); 313. 314. disp5ch(36,6,(unsigned long )(temp_data*1000) 315. / _nop_(); 316. 317.
71、60; 318. 319. / 320. 321. 322. /*- 323. ;MAX1169 324. -*/ 325. / I2C通用驱动AD程序 326. 327. 328. SomeNOP(void)
72、160;329. /uchar ij=255; 330. / while(ij-) 331. _nop_();_nop_();_nop_();_nop_(); 332. / 333. 334. /*- 335. 调用方式:void I2CStart(void) 2005/12
73、/10 336. 函数说明:私有函数,I2C专用 337. -*/ 338. void I2CStart(void) 339. 340. /EA=0; 341. SDA=1; /SomeNOP();/SCL保持高,SDA从高到低一次跳变,I2C通信开始 342. SCL=1; SomeNOP(); 343. SDA
74、=0; SomeNOP(); 344. SCL=0; SomeNOP(); 345. 346. /*- 347. 调用方式:void I2CStop(void) 2005/12/10 348. 函数说明:私有函数,I2C专用 349. -*/ 350. void I2CStop(void) 351.
75、 352. /SCL=0; 353. SDA=0; /SomeNOP(); /SCL保持高,SDA从低到高一次跳变,I2C通信停止 354. SCL=1; SomeNOP(); 355. SDA=1; SomeNOP(); 356. SCL=0; SomeNOP(); 357. /EA=1;
76、; 358. 359. 360. /*- 361. 调用方式:I2CAck(void) 2005/12/10 362. 函数说明:私有函数,I2C专用,等待从器件接收方的应答 363. ACK BY 364. -*/ 365. WaitAck(void) 366. 367. unsigned&
77、#160;char errtime=255;/因故障接收方无ACK(ACK对应SDA=0),超时值为255。 368. 369. SDA=1; 370. /SDA=0; 371. SCL=1; 372. SystemError=0x10; 373. while(SDA) 374. errtime-
78、; 375. if(!errtime) 376. I2CStop(); 377. SystemError=0x11; /出错后给全局变量赋值 378. return
79、; 379. 380. 381. SCL=0; 382. _nop_(); 383. 384. 385. 386. /*- 387. 调用方式:void SendAck(void)
80、;2005/12/10 388. 函数说明:私有函数,I2C专用,主器件为接收方,从器件为发送方时,应答信号。 389. -*/ 390. void SendAck(void) 391. 392. SDA=0; SomeNOP(); /数据线保持低,时钟线发生一次从高低的跳变 发送一个应答信号 393. SCL=1; SomeNOP(); &
81、#160;394. SCL=0; 395. 396. 397. /*- 398. 调用方式:void SendAck(void) 2005/12/10 399. 函数说明:私有函数,I2C专用,主器件为接收方,从器件为发送方时,非应答信号。 400. -*/ 401. void SendNotAck(void) 402.
82、60; 403. SDA=1; SomeNOP(); /数据线保持高,时钟线发生一次从高低的跳变 没有应答 404. SCL=1; SomeNOP(); 405. SCL=0; 406. 407. 408. /*- 409. 调用方式:void I2CSend(uchar ch) 2005/12/10
83、0; 410. 函数说明:私有函数,I2C专用 411. -*/ 412. void I2CSendByte(uchar ch) &
84、#160;/write device 413. 414. unsigned char i=8; 415. 416. while (i-) 417. 418. SCL=0;_nop_(); 419. SDA=(bit)(ch&0x80); ch<<=1; SomeNOP();
85、 /SCK下降沿发送数据 420. SCL=1; SomeNOP(); 421. 422. SCL=0; 423. 424. 425. /*- 426. 调用方式:uchar I2CReceive(void) 2005/12/10 427. 函数说明:私有函数,I2C专用 428.
86、 -*/ 429. uchar I2CReceiveByte(void) /read device 430. 431. unsigned char i=8,datatmp=0; 432. SDA=1; /释放总线
87、60; 433. while(i-) 434. 435. datatmp<<=1; 436. SCL=0;SomeNOP(); 437. SCL=1;SomeNOP(); /SCL做一次从低到高的跳变 可以接收数据 438. datatmp|=SDA;
88、439. 440. SCL=0; 441. return datatmp; 442. 443. 444. /*- 445. 调用方式:uint ADC(void) 2005/12/10 446. 函数说明:用于max1169AD转换测试(转换前是否一定要进行“HS MODE”设置?N,上电即默认为FS)
89、 447. -*/ 448. uint ADC(uchar addr) 449. 450. uint adc_data; 451. uchar nt1; 452.
90、; 453. I2CStart(); 454. nt1=(addr<<1)|0x61; 455. I2CSendByte(nt1); /写入器件地址,并设置器件为R模式 456. WaitAck();
91、 /写入地址后,器件向主机发送ACK。 457. 458. / SCL=0;
92、 /用延时的方式等待SCK变高(转换时SCK被max1169置低) 459. / SomeNOP(); 460. / while(!SCL); /由于转换过程很短,转换过程中SCL保持低,转换结束后slave释放对SCL控制权,但SCL仍然为0
93、160; 461. 462. adc_data=I2CReceiveByte(); /read d15d8 463. SendAck(); 464. adc_data<
94、<=8; 465. adc_data=adc_data|I2CReceiveByte(); /read d7d0 466. SendNotAck(); 467. I2CStop(); 468. 4
95、69. return(adc_data); 470. 471. 472. 473. void delay(uchar x) 474. uchar j; 475.
96、60; for(j=0;j<X;J+) ek="0,duk" 9600; +="(float)ch_adccount;" yk="(uint)filter()" yk; uint ek为当次采样比较误差,duk为pid运算结果 ="0,uk" int signed *sp) PIDpar
97、a pid(struct -* 常规PID控制炉温程序(只用到了PI部分) *- _nop_();_nop_();_nop_(); DA_CS="1;" ch<<="1;" ad5541_ck(); DIN="ch&0x8000;" (r-) while dacs2="1;" ch="da1;" ch; r=&quo
98、t;16;" uchar da1) ad5541(uint void SCLK="0;_nop_();_nop_();" ad5541_ck(void) * for(i="0;i<x;i+);" i; x) delayms(uchar *void -* MAX5541控制程序 *- y; return y="a1*x*x*x+a2*x*x+a3*x+a
99、4;" double temptrans(float 函数说明:3040度的温度曲线 温度转化程序 (N-2); (float)(sum sum="0.0;" for(count="1;count<N-1;count+)" 选择法进行排序 ch_adci="temp;" ch_adck="ch_adci;" temp="ch_adck;" k=&quo
100、t;i;" (ch_adcj<ch_adck) if (j="i+1;j<N;j+)" for (i="0;i<N-1;i+)" _nop_(); delay(80); ch_adccount="ADC(0x6);" (count="0;count<N;count+)" float temp; ch_adcN; count,i,j,k; fil
101、ter() 数据的算术平均值 相当于“中位值滤波法”+“算术平均滤波法”连续采样N个数据,去掉一个最大值和一个最小值然后计算N-2个 函数说明: 中位值平均滤波程序>rk - yk; 476. duk = (sp->kp + sp->ki) * ek - sp->kp * sp->ek1; &
102、#160; 477. uk = sp->uk1 + duk; 478. sp->ek1 = ek; /e(k)数据更新,给下一次PID运算
103、使用 479. sp->uk1 = uk; /u(k)数据更新 480. return(uk); /输出给函数返回值 481. 482. 483.
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2030中国超高清视频内容生产链条与终端普及率调查
- 2025-2030中国超高清视频产业链关键环节突破分析
- 2025-2030中国超导材料产业化制备技术突破与规模化应用前景报告
- 2025-2030中国证券行业市场发展现状分析及投资评估规划分析研究报告
- 2026四川长虹空调有限公司招聘信息管理等岗位5人备考题库及答案详解(名校卷)
- 2026甘肃省康复中心医院招聘68人备考题库附答案详解(综合卷)
- 信息化教学平台效果评估及优化方案
- 2023年高考数学复习一轮计划方案
- 企业内部审计制度优化方案
- 职业礼仪培训方案与课程设计
- 第5单元 你是我的镜子(教学设计)-四年级心理健康上学期同步备课系列(浙教版)
- TPM-计划保全实践手册
- 江苏省扬州市扬州梅岭教育集团2024-2025学年八年级下学期3月月考语文试题(原卷版+解析版)
- 龙湖批量精装交付标准手册
- 统编历史七年级下册(2024版)第8课-北宋的政治【课件】h
- 《模切刀模知识培训》课件
- 施工场地安全承诺书
- 2024秋期国家开放大学专科《液压与气压传动》一平台在线形考(形考任务+实验报告)试题及答案
- 4.1.1荒漠化的防治以我国西北地区为例(学生)
- 2024年浙江省初中学业水平考试社会试题(解析版)
- 新版高中物理必做实验目录及器材-(电子版)
评论
0/150
提交评论