温度显示程序_第1页
温度显示程序_第2页
温度显示程序_第3页
温度显示程序_第4页
温度显示程序_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论