版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1./*2.温度显示程序3.程序最后修改于:2004年2月29日21:204.*/5.6./*头文件说明*/7.#include <REG52.H>8.#include <STDIO.H>9.#include <INTRINS.H>.nop_()10.#include <ABSACC.H>/ XBYTE11.#include <DATASTRUCT1.H>12.13.#define uchar unsigned char14.#define uint unsigned int15.16.#define N 1017./#define
2、TMAX 10018./#define TMIN 019.#define Umax 0x7fff20.#define Uf0x800021.#define a11.114e-1222.#define a2-3.8071e-823.#define a30.002385724.#define a40.09213925.CPU引脚定义*/26./t6963 引脚分配27.#define CWADD XBYTE0x8100/写指令代码地址28.#define DWADD XBYTE0x8000/写数据通道地址29./MAX1169引脚分配30.sbitSCL = P1A0;/定义串行时钟线所在口使用时
3、根据自己的需要来定义31.sbitSDA=P1A1;/定义串行数据线所在口使用时根据自己的需要来定义32./MAX5541引脚分配33.sbitSCLK=P1A3;/定义串行时钟线所在口使用时根据自己的需要来定义34.sbit DIN = P1A4;/定义串行数据线所在口使用时根据自己的需要来定义35.sbit DA_CS= P1A5;/MAX5541 片选端36.37.38./*全局变量定义*/39.uchar SystemError;40.uint counter;/中断次数41.float temp_data;42. floats;43. uint yk;44. signed int e
4、k;45.46.47. /* 功能子程序段*/48. /*49. ;定时器中断服务子程序50. */51. /定时器计数初值为5000052. /定时100ms ,中断30次53. timer0() interrupt 1using 154. 55. counter+;56. TH0 = -100000/256;57. TL0 = -100000%256;58. 59.60. /*61. ;t696362. */63. / 液晶显示器地址:p27-CS P26-C/D WR-WR RD-RD则64. /00 00 0000 0000 0000(数据通道)65. /01 00 0000 0000
5、 0000(指令通道)66. /;67. /g6963.c-图形方式下的汉字、字符显示程序68.69. void sta01( void )/ 判断状态位70. 71. while (CWADD&3)!=3);72.73. 74.75. void sta3( void )76. 77.78. while (CWADD&8)!=8);79.80. 81.82.83. /写指令和写数据子程序84.85.void writecode(unsignedchar com)/写无参数指令86.87.sta01();88.CWADD=com;89.90.void write1byte(uns
6、ignedchar dat1,unsignedcharcom)/写单字节参数指令91.92.sta01();93.DWADD=dat1;94.sta01();95.CWADD=com;96.97.98.void write2byte(unsignedchar dat1,unsignedchardat2,unsignedchar com)99./写双字节参数指令100.101.sta01();102.DWADD=dat1;103.104.sta01();105.DWADD=dat2;106.107.sta01();108.CWADD=com;109.110.111.112.void disp_i
7、ni(void )/显示屏初始化子程序113.114.write2byte(0x00,0x00,0x40);/设置显示区域首地址0000h115.write2byte(0x10,0x00,0x41);/设置文本显示的宽度,即一行所占的字节数(12864t,16个8X8点阵字符)116.write2byte(0x00,0x08,0x42);/设置图形显示区域首地址0800h ,或为文本属性区域首地117.write2byte(0x10,0x00,0x43);个8x8点阵字符)/设置图形显示区域宽度,或为文本属性区域宽度(12864t,16118.119.writecode(0xa7);/120.
8、writecode(0x9c);/121.writecode(0x80);/122.123.光标形状设置显示开关设置,gt all on!显示方式设置,逻辑或合成124.125.126.127.128.129.130.131.132.133.134.135.136.137.138.139.140.141.142.143.144.145.146.147.148.149.150.151.152.153.154.155.156.157.158.159.160.161.162.163.164.165.166.void clearram( void )unsigned int i;write2byte(
9、0x00,0x00,0x24);writecode(0xb0);for (i=8192;i>0;i-)sta3();DWADD=0;writecode(0xb2);/清屏程序/设置显示ram 首地址0000h/设置自动写方式/往显示区域写0;区域大小8k/关闭自动写指令/*汉字点阵,存储在程序存储器中点阵:16x16提取点阵方向:横向(先上-> 下,再左-> 右)字节掉转:否字节方式:C语言*/unsigned char code wen32=0x00,0x43,0x32,0x12,0x83,0x62,0x22,0x0B,/ 温0x10,0x27,0xE4,0x24,0x24
10、,0x24,0x2F,0x20,0x08,0xFC,0x08,0x08,0xF8,0x08,0x08,0xF8,0x00,0xFC,0xA4,0xA4,0xA4,0xA4,0xFE,0x00;unsigned char code du32=0x01,0x00,0x3F,0x22,0x22,0x3F,0x22,0x23,/ 度0x20,0x2F,0x22,0x21,0x20,0x43,0x8C,0x30,0x00,0x84,0xFE,0x20,0x28,0xFC,0x20,0xE0,0x00,0xF0,0x20,0x40,0x80,0x60,0x1E,0x04;unsigned char cod
11、e wei32=0x00,0x10,0x0C,0x04,0x00,0xFF,0x01,0x01,/ 为0x02,0x02,0x04,0x08,0x10,0x20,0x40,0x00,0x80,0x80,0x80,0x80,0x84,0xFE,0x04,0x04,167. 0x04,0x84,0x64,0x24,0x04,0x04,0x28,0x10;168.169. unsigned char code clearchar16 = / 擦除一个字符170. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,171. 0x00,0x00,0x00,0x00,0x00
12、,0x00,0x00,0x00,172. ;173.174. unsigned char code dot16=175. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,176. 0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00177. ;178.179. /本文件为8X16点阵西文字库文件,字的横向8点构成一字节,左边点在字节的高位,字符点阵四角按左上 角上角送下角下角取字*/180. /*0 */181. unsigned char code ch016=182. 0x00,0x00,0x7C,0xC6,0xC6,0xCE,0x
13、D6,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,0x18,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,0xC6,0x
14、FE,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;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.205
15、. /*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 */211. unsigned char codech616=212. 0x00,0x00,0x38,0x60,0xC0,0xC0,0xFC,0xC6,213. 0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00;214.215. /*7 */216. unsigned char code
16、 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=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,0xC
17、6,0xC6,0xC6,0x7E,0x06,228. 0x06,0x06,0x0C,0x78,0x00,0x00,0x00,0x00229. ;230.231.232.233.234. void gshowword(unsigned char y,unsigned char x,unsigned char *w_no) / 图形方式下 显示一个汉字字符(分为左右两半字模)235. /128*64dots,x-显示在第x (015)字符列!,y-显示在第y (063 )点阵!行,w_no为tab代码236. /调用示例:gshowword(2,4,hao)在第二行第四列显示"好&quo
18、t;-gshowword(点阵行,字符列,数组首地址)237. unsignedint num;238. unsignedchar d1,d2,i=16;239. num=y*16+x+0x800;/16-每行显示宽度为16个字符;0 图形显示区首地址为0800h240.241.242.243.for (i=16;i>0;i-)244. d1=num/256;/得到显示屏上汉字显示的相对位置245.d2=num%256;246.write2byte(d2,d1,0x24);247.write1byte(*w_no,0xc0);/写汉字左代码248.write1byte(*(w_no+16
19、),0xc0);/写汉字右代码249.w_no+;250.251.252.253.254.255.256.257.258.num+=0x10;/显示ram地址修正void gshowchar(unsignedchar y,unsignedchar x,unsignedchar *w_no) / 图形方式下显示一个字符(分为左右两半字模)/128*64dots,x-显示在第x (015 )字符列!,y-显示在第y (063 )点阵!行,w_no为tab代码/调用示例:gshowword(2,4,hao)在第二点阵行第四字符列显示11好259.260.261.262.263.264.265.266
20、.267.268.269.270.271.272.273.274.275.276.277.278.279.unsignedint num;unsignedchar d1,d2,i=16;num=y*16+x+0x800;址为0800hfor (i=16;i>0;i-)d1=num/256;d2=num%256;write2byte(d2,d1,0x24);write1byte(*w_no,0xc0);/ write1byte(*(w_no+16),0xc0); / w_no+;num+=0x10;/ /void disp5ch(unsignedchar y,unsigned/16-每行显
21、示宽度为16个字符;0-图形显示区首地/得到显示屏上汉字显示的相对位置/写汉字左代码写汉字右代码/显示ram地址修正char x,unsignedlong var)280. 带灭零处理及小数点的五位数显示子程序(可显示0.00099.999) , var指要显示的数据281. uchard4,d3,d2,d1,d0;282. d4=var/10000;d3=(var%10000)/1000;d2=(var%1000)/100;d1=(var%1000)%100/10;d0=(var%1000)%100%10;283.284. if (d4=0) gshowchar(y,x,clearchar)
22、;285. else gshowchar(y,x,ch0+0x10*d4);/ 显示万位286.287. if (d4=0)&&(d3=0) gshowchar(y,x,clearchar);gshowchar(y,x+1,clearchar);288.else gshowchar(y,x+1,ch0+0x10*d3);/显示千位289.290.291.292.293.294.295.296.297.298.299.300.301.302.303.304.305.306.307.308.309.310.311.312.313.314.gshowchar(y,x+2,dot);g
23、showchar(y,x+3,ch0+0x10*d2);gshowchar(y,x+4,ch0+0x10*d1);gshowchar(y,x+5,ch0+0x10*d0);void disp()floatfilter。;double temptrans( float s = filter();temp_data = temptrans(s);disp_ini();clearram();gshowword(2,4,wen);gshowword(2,6,du);gshowword(2,8,wei);disp5ch(36,6,(unsignedx);long/显示小数点/显示百位/显示十位/显示个位
24、)(temp_data*1000);315.316.317.318.319./ _nop_();/320.321.322. /*323. ;MAX1169324. */325. / I2C通用驱动AD程序326.327.328. SomeNOP(void )329. /ucha门j=255;330. / while(ij-)331. _nop_();_nop_();_nop_();_nop_();332. /333.334. /*335. 调用方式:void I2CStart(void) 2005/12/10336. 函数说明:私有函数,I2C专用337. -*/338. void I2CSt
25、art( void )339. 340. /EA=0;341. SDA=1; /SomeNOP();/SCL保持高,SDA从高至此氐一次跳变,I2C通信开始342. SCL=1; SomeNOP();343. SDA=0; SomeNOP();344. SCL=0; SomeNOP();345. 346. /*347. 调用方式:void I2CStop(void) 2005/12/10348. 函数说明:私有函数,I2C专用349. -*/350. void I2CStop( void )351. 352. /SCL=0;353. SDA=0; /SomeNOP();/SCL保持高,SDA从
26、低到高一次跳变,I2C通信停止354. SCL=1; SomeNOP();355. SDA=1; SomeNOP();356. SCL=0; SomeNOP();357. /EA=1;358. 359.360. /*361. 调用方式:I2CAck(void) 2005/12/10362. 函数说明:私有函数,I2C专用,等待从器件接收方的应答363. ACK BY364. -*/365. WaitAck( void )367. unsigned char errtime=255; / 因故障接收方无 ACK(ACK 对应 SDA=0),超时值为 255 368.369. SDA=1;370.
27、 /SDA=0;371. SCL=1;372. SystemError=0x10;373. while (SDA)374. errtime-;375. if (!errtime)376. I2CStop();377. SystemError=0x11;/出错后给全局变量赋值378. return ;379. 380. ;381. SCL=0;382. _nop_();383. 384.385.386. /*387. 调用方式:voidSendAck(void) 2005/12/10388. 函数说明:私有函数,I2C专用,主器件为接收方,从器件为发送方时,应答信号。389. -*/390. v
28、oid SendAck( void )391. 392. SDA=0;SomeNOP(); /数据线保持低,时钟线发生一次从高低的跳变发送一个应答信号393. SCL=1;SomeNOP();394. SCL=0;395. 396.397. /*398. 调用方式:voidSendAck(void) 2005/12/10399. 函数说明:私有函数,I2C专用,主器件为接收方,从器件为发送方时,非应答信号。400. -*/401. void SendNotAck( void )402. 403. SDA=1;SomeNOP(); /数据线保持高,时钟线发生一次从高低的跳变没有应答404. SC
29、L=1;SomeNOP();405. SCL=0;406. 407.408. /*409. 调用方式:void I2CSend(uchar ch) 2005/12/10410. 函数说明:私有函数,I2C专用411. -*/412. void I2CSendByte(uchar ch)/write device413. 414. unsigned char i=8;415.416. while (i-)417. 418. SCL=0;_nop_();419. SDA=(bit)(ch&0x80); ch<<=1; SomeNOP();/SCK 下降沿发送数据420. SCL
30、=1; SomeNOP();421. 422. SCL=0;423.424. 425. /*426. 调用方式:uchar I2CReceive(void) 2005/12/10427. 函数说明:私有函数,I2C专用428.-*/429. uchar I2CReceiveByte( void ) /read device430. 431. unsigned char i=8,datatmp=0;432. SDA=1;/释放总线433. while (i-)434. 435. datatmp<<=1;436. SCL=0;SomeNOP();437. SCL=1;SomeNOP()
31、; /SCL做一次从低到高的跳变可以接收数据438. datatmp|=SDA;439. ;440. SCL=0;441. return datatmp;442. 443.444. /* 445. 调用方式:uint ADC(void) 2005/12/10446.函数说明:用于max1169AD转换测试(转换前是否一定要进行“HSMODE设置? N,上电即默认为FS)447.-*/448.449.450.451.452.453.454.455.456.uint ADC(uchar addr)uint adc_data;uchar nt1;I2CStart();nt1=(addr<<
32、;1)|0x61;I2CSendByte(nt1);/写入器件地址,并设置器件为 R模式WaitAck();/写入地址后,器件向主机发送ACK。457.458./ SCL=0;/用延时的方式等待SCK变高(转换时SCK被max1169459.460.置低)/ SomeNOP();/ while(!SCL);/由于转换过程很短,转换过程中 SCL保持低,转换结束后slave释放对SCL控制461.462.463.464.465.466.467.468.469.470.471.472.473.474.475.权,但SCL仍然为0adc_data=I2CReceiveByte();/read d15
33、d8SendAck();adc_data<<=8;adc_data=adc_data|I2CReceiveByte();/read d7d0SendNotAck();I2CStop();return (adc_data);void delay(uchar x) uchar j;for (j=0;j<X;J+) ek="0,duk"9600; += "(float)ch_adccount;"yk= "(uint)filter()"yk; uint ek为当次采样比较误差,duk为pid运算结果="0,uk&q
34、uot; int signed *sp) PIDpara 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= "16;" uchar da1) ad5541(uintvoid SCLK= "0;_
35、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+a4;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= "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+)"
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 患者观察和巡视管理制度
- 康复用品管理制度
- 2022年三年级语文下册第六单元主题阅读+答题技巧(含答案、解析)部编版
- 【假期阅读技能提升训练】小学语文三年级下册阅读技能提升内文阅读第5讲-附答案.部编版
- 2024年张家口办理客运从业资格证2024年试题
- 2024年巴中申请客运从业资格证考试题和答案
- 2024年武威道路客运输从业资格证理论考试答案
- 2024年天水道路旅客运输驾驶员从业资格考试试题及答案
- 历史-浙江省湖州、衢州、丽水2024年11月三地市高三教学质量检测试卷试题和答案
- 吉首大学《国际商务礼仪》2021-2022学年第一学期期末试卷
- 司法所安置帮教工作流程图
- 贫困户困难补助申请书
- 桥梁养护与加固绪论课件
- 部队战时政治工作-PPT课件
- 平板显示技术:TFT-LCD工艺
- 动火安全作业票填写模板2022年更新
- 外研版九年级英语上册全套ppt课件
- 沟槽开挖支护专项施工方案(46页)
- Matlab基本介绍
- 部编版四年级语文上册专项复习课外阅读专项
- 横道图施工进度计划
评论
0/150
提交评论