基于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仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #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黑下载附件…………
复制代码
所有资料51hei提供下载:
新建文件夹.rar
(110.87 KB, 下载次数: 39)
|