基于pcf8591 tlc2543的雙路溫度檢測報警系統 帶串口上位機控制帶仿真 源程序
溫度傳感器是 LM35
兩路測溫通道所用的ad芯片分別是pcf8591 和 tlc2543
仿真開始運行后 串口助手發a 啟動pcf那路的測量 并顯示在6位一體數碼管
串口助手發b 啟動tlc那路的測量 并顯示在6位一體數碼管
當tlc那路溫度超過100攝氏度 蜂鳴器報警 并且上位機收到error!字符串
pcf那路測溫范圍0-150攝氏度
tlc那路測溫0-120攝氏度 數碼管顯示到小數點后一位
注意 運行仿真前要把兩個lm35的初始溫度設置為150攝氏度和30攝氏度 否則會抱錯 什么real time simulation failed
上面的lm35初始溫度設置為150攝氏度 下面的設置為30攝氏度 如下圖所示
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
s.png (67.75 KB, 下載次數: 24)
下載附件
2018-5-12 21:36 上傳
e.png (68.34 KB, 下載次數: 39)
下載附件
2018-5-12 21:36 上傳
b.png (65.45 KB, 下載次數: 33)
下載附件
2018-5-12 21:36 上傳
a.png (66.41 KB, 下載次數: 35)
下載附件
2018-5-12 21:36 上傳
begin.png (11.4 KB, 下載次數: 42)
下載附件
2018-5-12 21:36 上傳
單片機源程序如下:
- #include "tlc2543.h"
- #include "uart.h"
- #define TIME_PERIOD 300
- unsigned char DSY_BUFF_CODE[16] = {0xc0,0xf9,0xa4,0xb0,
- 0x99,0x92,0x82,0xf8,
- 0x80,0x90,0x88,0x83,
- 0xc6,0xa1,0x86,0x8e};
- unsigned char txt[] = "Error!";
- sbit seg1 = P2^2;
- sbit seg2 = P2^3;
- sbit seg3 = P2^4;
- sbit seg4 = P2^5;
- sbit seg5 = P2^6;
- sbit bell = P3^7; //pcf8591那路溫度超過100攝氏度 報警
- sbit led = P3^6; //pcf8591那路溫度超過100攝氏度 閃燈
- void timer_init();
- unsigned int read_tmp();
- unsigned int temp_pcf8591,temp_tlc2543;
- bit flag;
-
- void main()
- {
- timer_init();
- UART_int();
- // send_dc(0xff);
- bell = 0;
- led = 0;
- while(1)
- {
- temp_pcf8591 = read_tmp();
- temp_tlc2543 = get_data();
-
- if(temp_pcf8591>=10000) {bell = 1; led = 1; send_string(txt);}
- else { bell = 0; led = 0;}
-
- }
- }
- void timer_init()
- {
- TMOD=0x01;
- TH0=(65536-TIME_PERIOD)/256;
- TL0=(65536-TIME_PERIOD)%256;
- EA=1;
- ET0=1;
- // TR0=1; //先不開啟定時器0 后面通過上位機發特定字符來開啟定時器從而顯示溫度
- }
- void timer0_int ()interrupt 1
- { static unsigned char num = 0;
- static unsigned int temp;
- num++;
- TH0=(65536-TIME_PERIOD)/256;
- TL0=(65536-TIME_PERIOD)%256;
- if(flag) temp = temp_pcf8591; //flag標志位控制要顯示的溫度值(pcf8591所測的溫度還是tlc2543測的溫度)
- else temp = temp_tlc2543;
- switch(num) //動態顯示
- {
- case 1:
- P2 &= 0x03;
- P0 = (DSY_BUFF_CODE[temp/10000]);
- seg1 = 1;
- break;
- case 2:
- P2 &= 0x03;
- P0 = DSY_BUFF_CODE[temp%10000/1000];
- seg2 = 1;
- break;
- case 3:
- P2 &= 0x03;
- P0 = (DSY_BUFF_CODE[temp%1000/100])&(0x7f);
- seg3 = 1;
- break;
- case 4:
- P2 &= 0x03;
- P0 = DSY_BUFF_CODE[temp%100/10];
- seg4 = 1;
- break;
- default:
- break;
-
- }
- if(num==4) num =0;
-
- }
- void UART_ISR() interrupt 4
- {
- if(RI)
- {
- P2 = ~P2;
- RI=0;
- if(SBUF == 'a')
- {
- TR0 = 1; //發a 開啟定時器0
- flag = 1; //并且顯示pcf8591的溫度
-
- }
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
0.jpg (41.94 KB, 下載次數: 29)
下載附件
2018-5-12 23:13 上傳
所有資料51hei提供下載:
新建文件夾.rar
(110.87 KB, 下載次數: 39)
2018-5-12 21:36 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|