自己做的,不足之处,请点名出来.
热敏电阻测温仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include <reg52.h>
- #include <intrins.h>
- #include <math.h>
- typedef unsigned char uchar;
- typedef unsigned int uint;
- code uint VOL[]={ 343, 339, 339, 335, 332, 332, 328, 324, 320, 320,
- 316, 312, 312, 308, 304, 300, 300, 296, 292, 292,
- 289, 285, 285, 281, 277, 273, 273, 269, 265, 265,
- 261, 257, 257, 253, 250, 250, 246, 242, 242, 238,
- 234, 234, 230, 230, 226, 222, 222, 218, 218, 214,
- 210, 210, 207, 207, 203, 199, 199, 195, 195, 191,
- 191, 187, 187, 183, 179, 179, 175, 175, 171, 171,
- 167, 167, 164, 164, 160, 160, 160, 156, 156, 152,
- 152, 148, 148, 144, 144, 140, 140, 140, 136, 136,
- 132, 132, 132, 128, 128, 125, 125, 125, 121, 121,
- 121, 117, 113, 109, 109, 105, 101, 101, 97, 97,
- 93, 89, 89, 85, 85, 82, 82, 78, 78, 74,
- 74, 70, 70, 66, 66, 66, 62, 62, 58, 58,
- 58, 54, 54, 54, 50, 50, 50, 46, 46, 46,
- 42, 42, 42, 42, 39, 39, 39, 39, 35, 35};
- code uint Temper[]={ 100, 150, 200, 250, 300, 350, 400, 450, 500, 550,
- 600, 650, 700, 750, 800, 850, 900, 950, 1000, 1050,
- 1100, 1150, 1200, 1250, 1300, 1350, 1400, 1450, 1500, 1550,
- 1600, 1650, 1700, 1750, 1800, 1850, 1900, 1950, 2000, 2050,
- 2100, 2150, 2200, 2250, 2300, 2350, 2400, 2450, 2500, 2550,
- 2600, 2650, 2700, 2750, 2800, 2850, 2900, 2950, 3000, 3050,
- 3100, 3150, 3200, 3250, 3300, 3350, 3400, 3450, 3500, 3550,
- 3600, 3650, 3700, 3750, 3800, 3850, 3900, 3950, 4000, 4050,
- 4100, 4150, 4200, 4250, 4300, 4350, 4400, 4450, 4500, 4550,
- 4600, 4650, 4700, 4750, 4800, 4850, 4900, 4950, 5000, 5050,
- 5100, 5200, 5300, 5400, 5500, 5600, 5700, 5800, 5900, 6000,
- 6100, 6200, 6300, 6400, 6500, 6600, 6700, 6800, 6900, 7000,
- 7100, 7200, 7300, 7400, 7500, 7600, 7700, 7800, 7900, 8000,
- 8100, 8200, 8300, 8400, 8500, 8600, 8700, 8800, 8900, 9000,
- 9100, 9200, 9300, 9400, 9500, 9600, 9700, 9800, 9900, 10000};
- sbit STS=P1^0;
- sbit CE = P1^1;
- sbit CS=P1^2;
- sbit A0=P1^3;
- sbit RC=P1^4;
- sbit RS=P1^5 ;
- sbit RW=P1^6 ;
- sbit EN=P1^7 ;
- void delay_ms(uint z)
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- uint AD1674_Read(void)
- {
- uint temp;
- uchar temp1,temp2;
- CS=1; //片选信号
- CE=0; //初始化,关闭数据采集
- CS=0;
- A0=0;
- RC=0;
- CE=1;//CE=1,CS=0,RC=0,A0=0启动12位温度转换
- _nop_();
- while(STS==1); //等待数据采集结束
- CE=0; //芯片使能关闭
- RC=1;
- A0=0;
- CE=1;//CE=1,CS=0,RC=1,12/8=1,A0=0 允许高八位数据并行输出
- _nop_();
- temp1=P0; //读取转换结果的高八位
- CE=0; //芯片使能关闭
- RC=1;
- A0=1;
- CE=1;//CE=1,CS=0,RC=1,12/8=0,A0=1 允许低四位数据 并行输出
- _nop_();
- temp2=P0; //读取转换结果的第四位
- temp=((temp1<<4)|(temp2&0X0F)); //高位和低位合成实际温度,temp2为PO口的高四位
- return (temp); //还回转换结果,右移四位是因为temp2为P0口的高四位
- }
- /*** 写数据***/
- void w_dat(unsigned char dat)
- {
- RS = 1;
- //EN = 0;
- P2 = dat;
- delay_ms(5);
- RW = 0;
- EN = 1;
- EN = 0;
- }
- /*** 写命令***/
- void w_cmd(unsigned char cmd)
- {
- RS = 0;
- // EN = 0;
- P2 = cmd;
- delay_ms(5);
- RW = 0;
- EN = 1;
- EN = 0;
- }
- /*** 发送字符串到LCD***/
- void w_string(unsigned char addr_start, unsigned char *p)
- {
- unsigned char *pp;
-
- pp = p;
- w_cmd(addr_start);
- while (*pp != '\0')
- {
- w_dat(*pp++);
- }
- }
- /*** 初始化1602****/
- void Init_LCD1602(void)
- {
- EN = 0;
- w_cmd(0x38); // 16*2显示,5*7点阵,8位数据接口
- w_cmd(0x0C); // 显示器开、光标开、光标允许闪烁
- w_cmd(0x06); // 文字不动,光标自动右移
- w_cmd(0x01); // 清屏
- }
- void process(uint date,uchar add)
- {
- uchar A[7];
- A[0]=date/1000%10+'0';
- A[1]=date/100%10+'0';
- A[2]='.';
- A[3]=date/10%10+'0';
- A[4]=date%10+'0';
- A[5]='C';
- w_string(add,A);
- }
- void main()
- {
- uchar i,flag=0;
- uint result,temp1,temp2;
- float res;
- Init_LCD1602();
-
- w_string(0x80,"Temper:");
-
- while (1)
- {
- res=(float)(AD1674_Read());
- result=(uint)((res/2048.0-1.0)*500.0);
-
- temp1=abs(result-VOL[0]);
- for(i=1;i<150;i++)
- {
- temp2=abs(result-VOL[i]);
- if(temp1>=temp2)
- {
- temp1=temp2;
- flag=i;
- }
-
- }
-
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
热敏电阻测温.zip
(286.61 KB, 下载次数: 50)
|