使用pt100測溫度,經(jīng)過放大器放大后的電壓值乘以236就是實際的溫度值0.42V對應(yīng)100度,0V對應(yīng)0度,經(jīng)過ad運算顯示出來,其他濾掉,就只顯示0-100度,0-100對應(yīng)輸出0-5v的電壓使用DA,功能,ad和da使用同個芯片,就是實現(xiàn)0-100顯示,溫度變化的同時da輸出0-5v。
第二個就是壓力傳感器輸出芯片ad輸入0-5v,對應(yīng)壓力6-8pad,顯示出來。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png (27.68 KB, 下載次數(shù): 156)
下載附件
2017-9-10 23:54 上傳
0.png (18.27 KB, 下載次數(shù): 117)
下載附件
2017-9-10 23:54 上傳
0.png (24.76 KB, 下載次數(shù): 99)
下載附件
2017-9-10 23:53 上傳
0.png (58.07 KB, 下載次數(shù): 116)
下載附件
2017-9-10 23:51 上傳
單片機源程序如下:
- #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); //函數(shù)聲明
- uchar IIC_ERROR; //IIC錯誤標志
- void Delay(uint ms) //延時函數(shù)
- {
- 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寫數(shù)據(jù)
- {
- 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顯示位置設(shè)置
- {
- 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()//應(yīng)答信號
- {
- 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讀一個字節(jié)數(shù)據(jù)
- {
- 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寫一個字節(jié)數(shù)據(jù)
- {
- 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轉(zhuǎn)換值
- {
- 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黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
溫控系統(tǒng).rar
(121.02 KB, 下載次數(shù): 715)
2017-9-10 20:06 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|