使用pt100测温度,经过放大器放大后的电压值乘以236就是实际的温度值0.42V对应100度,0V对应0度,经过ad运算显示出来,其他滤掉,就只显示0-100度,0-100对应输出0-5v的电压使用DA,功能,ad和da使用同个芯片,就是实现0-100显示,温度变化的同时da输出0-5v。
第二个就是压力传感器输出芯片ad输入0-5v,对应压力6-8pad,显示出来。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include <reg52.h>
- #include <intrins.h>
- #define uint unsigned int
- #define uchar unsigned char
- #define NOP() _nop_()
- #define Delay5us() {_nop_();_nop_();_nop_();_nop_();_nop_();}
- #define LCD_LINE_ONE 1
- #define LCD_LINE_TWO 2
- sbit LCD_RS = P2^0 ;
- sbit LCD_RW = P2^1 ;
- sbit LCD_EN = P2^2 ;
- sbit SCL = P1^1;
- sbit SDA = P1^2;
- sbit BEEP = P1^0;
- uchar temp = 40;
- uchar pres = 40;
- uint Voltage[]={'0','0','0'}; //AD的LCD显示值
- unsigned char LCD_Line_1[] = {"TEMP: "};//TEMP-是温度值
- unsigned char LCD_Line_2[] = {"PRES: "};//PRES-是压力值
- extern void Convert_To_Voltage(uint val); //函数声明
- uchar IIC_ERROR; //IIC错误标志
- void Delay(uint ms) //延时函数
- {
- uchar i;
- while(ms--)
- {
- for(i=0;i<120;i++);
- }
- }
- bit LCD_Busy_Check() //检测忙信号
- {
- bit Result;
- LCD_RS = 0;
- LCD_RW = 1;
- LCD_EN = 1;
- Delay5us();
- Result = (bit)(P0&0x80);
- LCD_EN = 0;
- return Result;
- }
- void LCD_Write_Command(uchar cmd)//LCD写命令
- {
- while(LCD_Busy_Check());
- LCD_RS = 0;
- LCD_RW = 0;
- LCD_EN = 0;
- _nop_();
- _nop_();
- P0 = cmd;
- Delay5us();
- LCD_EN = 1;
- Delay5us();
- LCD_EN = 0;
- }
- void LCD_Write_Data(uchar dat)//LCD写数据
- {
- while(LCD_Busy_Check());
- LCD_RS = 1;
- LCD_RW = 0;
- LCD_EN = 0;
- P0 = dat;
- Delay5us();
- LCD_EN = 1;
- Delay5us();
- LCD_EN = 0;
- }
- void LCD_Set_Position(uchar pos) //LCD显示位置设置
- {
- if(pos == LCD_LINE_ONE)
- LCD_Write_Command(0x80);
- else
- LCD_Write_Command(0xc0);
- }
- void LCD_Display_A_Line(uchar Line_Addr,uchar s[])//LCD显示行
- {
- uchar i;
- LCD_Set_Position(Line_Addr);
- for(i=0;i<16;i++)
- {
- LCD_Write_Data(s[i]);
- }
- }
- void LCD_Dispay(void) //LCD实时显示
- {
- Convert_To_Voltage(temp*5);
- LCD_Line_1[6]= Voltage[2];
- LCD_Line_1[7]= Voltage[1];
- LCD_Line_1[8]= '.';
- LCD_Line_1[9]= Voltage[0];
- LCD_Line_1[11]= 'C';
- LCD_Line_1[12]= 'e';
- LCD_Line_1[13]= 'n';
- LCD_Line_1[14]= 't';
- LCD_Display_A_Line(LCD_LINE_ONE,LCD_Line_1);//温度显示
-
- Convert_To_Voltage(pres);
- LCD_Line_2[6]= Voltage[2]+6;
- LCD_Line_2[7]= '.';
- LCD_Line_2[8]= Voltage[1];
- LCD_Line_2[9]= Voltage[0];
- LCD_Line_2[11]= 'p';
- LCD_Line_2[12]= 'a';
- LCD_Display_A_Line(LCD_LINE_TWO,LCD_Line_2);//压力显示
- }
- void LCD_Initialise() //LCD初始化
- {
- LCD_Write_Command(0x38);Delay(5);
- LCD_Write_Command(0x0c);Delay(5);
- LCD_Write_Command(0x06);Delay(5);
- LCD_Write_Command(0x01);Delay(5);
-
- LCD_Display_A_Line(1,LCD_Line_1);
- LCD_Display_A_Line(2,LCD_Line_2);
- }
- /********************************PCF8591部分************************************/
- void Convert_To_Voltage(uint val)//电压换算成温度或压力
- {
- uint Tmp;
- Tmp = val;
- Voltage[2] = Tmp/100+'0';
- Tmp = Tmp%100*10;
- Voltage[1] = Tmp/100+'0';
- Tmp = Tmp%100*10;
- Voltage[0] = Tmp/100+'0';
- }
- /*****************IIC初始化*****************/
- void delay()
- {;;}
- void start()//停止
- {
- SDA=1;
- delay();
- SCL=1;
- delay();
- SDA=0;
- delay();
- }
- void stop() //启动
- {
- SDA=0;
- delay();
- SCL=1;
- delay();
- SDA=1;
- delay();
- }
- void respons()//应答信号
- {
- uchar i;
- SCL=1;
- delay();
- while((SDA==1)&&(i<250))
- i++;
- SCL=0;
- delay();
- }
- void init() //初始化PCF8591接口
- {
- SDA=1;
- delay();
- SCL=1;
- delay();
- }
- uchar read_byte()//对PCF8591读一个字节数据
- {
- uchar i,k;
- SCL=0;
- delay();
- SDA=1;
- delay();
- for(i=0;i<8;i++)
- {
- SCL=1;
- delay();
- k=(k<<1)|SDA;
- SCL=0;
- delay();
- }
- return k;
- }
- void write_byte(uchar date) //对PCF8591写一个字节数据
- {
- uchar i,temp1;
- temp1=date;
- for(i=0;i<8;i++)
- {
- temp1=temp1<<1;
- SCL=0;
- delay();
- SDA=CY;
- delay();
- SCL=1;
- delay();
- }
- SCL=0;
- delay();
- SDA=1;
- delay();
- }
- void write_add(uchar control,uchar date)//输出电压
- {
- start();
- write_byte(0x90);
- respons();
- write_byte(control);
- respons();
- write_byte(date);
- respons();
- stop();
- }
- uchar read_add(uchar control)//读取AD转换值
- {
- uchar date;
- start();
- write_byte(0x90);
- respons();
- write_byte(control);
- respons();
- start();
- write_byte(0x90+1);
- respons();
- date=read_byte();
- stop();
- return date;
- }
- void main()
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
温控系统.rar
(121.02 KB, 下载次数: 715)
|