东华多路温度巡回检测仪的设计报告Word格式.docx
《东华多路温度巡回检测仪的设计报告Word格式.docx》由会员分享,可在线阅读,更多相关《东华多路温度巡回检测仪的设计报告Word格式.docx(14页珍藏版)》请在冰点文库上搜索。
可选择寄生工作方式。
检测温度范围为100°
C~+500°
C
内置EEPROM,限温报警功能。
64位光刻ROM,内置产品序列号,方便多机挂接。
(2)CPU主控模块——AT89C51
At89C51是一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。
使用Atmel公司高密度非易失性存储器技术制造,与工业80C51产品指令和引脚完全兼容。
片上Flash允许程序存储器在系统可编程,亦适于常规编程器。
在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得AT89S52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
AT89S52具有以下标准功能:
8k字节Flash,256字节RAM,32位I/O口线,看门狗定时器,2个数据指针,三个16位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。
另外,AT89S52可降至0Hz静态逻辑操作,支持2种软件可选择节电模式。
空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。
掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。
8位微控制器8K字节在系统可编程Flash。
五实验调试及运行结果
六设计体会
通过这次对多路温度巡回检测系统的设计,让我了解了利用所学单片机知识设计电路的程序与方法,也让我了解了关于多路温度巡回检测系统的基本原理与设计理念,要设计一个电路总要先用仿真仿真成功之后才实际接线的。
通过这次学习,让我对各种电路都有了大概的了解,对proteus软件的使用也更为熟练。
对于这些电路还是应该自己动手实际操作才会有深刻理解。
七试验程序源代码
#include<
reg52.h>
#include<
I2C.H>
LCD1602.H>
UART.h>
#definePCF85910x90//PCF8591的地址选择第零号通道
#defineNOKEY0xff//OXff代表没有按键按下
#defineSTART0x00//0x00代表PCF8591开始转化的命令
sbitcd4051A=P2^4;
//CD4051的通道值用于选择输入的通道号
sbitcd4051B=P2^3;
sbitcd4051C=P2^2;
unsignedcharOPEN=1;
//总开关标志
unsignedcharkeynumber;
//按键值
unsignedcharvolatilesend;
//串口发送标志
unsignedcharvolatilechannel=0;
//当前通道
unsignedcharvolatiletick=0;
codeunsignedchardisc1[]={"
TempofNo.:
"
};
unsignedinttemperature[8]={250,250,250,250,250,250,250,250};
//设置温度初始值
/**************************************函数声明部分**************************************************************/
unsignedcharKeyscan(void);
//键盘扫描
voidAD_Convert(unsignedchar);
//AD转换程序
voidDisplay(unsignedchark);
//显示程序
voidTargetInit(void);
voidDelay(unsignedchardelay);
voidLcddisplay(unsignedcharnumber);
voidDelay(unsignedchar);
/*****************************************************************************************************************************/
voidDelay(unsignedchartimedelay)//延时函数
{
unsignedchari;
for(;
timedelay<
0;
timedelay--)
{
for(i=0;
i<
110;
i++);
}
}
//硬件的初始化//
voidTargetInit(void)
{
TMOD=0x21;
TR1=0;
TH1=0xfd;
TL1=0xfd;
TR0=0;
TH0=(65536-46080)/256;
//11.0592Mhz下的50ms定时
TL0=(65536-46080)%256;
ET0=1;
SM0=0;
SM1=1;
REN=1;
ES=1;
EA=1;
TR0=1;
TR1=1;
/*****************************************************************中断处理函数******************************************************/
voidTimer_ISR(void)interrupt1
{TR0=0;
//重载计数器初值
tick++;
if((tick%20)==0)//发送标志每隔1秒置位一次即每隔一秒使用串口发送一次数据
send=1;
//发送标志置位
}
if(tick==100)
{tick=0;
channel++;
if(channel>
7){channel=0;
}//隔10秒切换到下一个通道
/*******************************AD转换函数*********************************************************************************************************/
voidAD_Convert(unsignedcharnumber)
{floatAD_data;
floatsum=0;
unsignedcharch;
switch(number)
{
case0:
cd4051C=0;
//选择转换通道
cd4051B=0;
cd4051A=0;
break;
case1:
cd4051B=0;
cd4051A=1;
case2:
cd4051B=1;
case3:
case4:
cd4051C=1;
cd4051B=0;
case5:
case6:
cd4051B=1;
case7:
}
//Delay(5);
for(ch=0;
ch<
8;
ch++)
ISendByte(PCF8591,START);
//开始转换选择通道0
AD_data=(float)IRcvByte(PCF8591);
//读取转换结果·
AD_data=(AD_data/256)*5.0;
//转换结果/256*5V
AD_data=AD_data*100;
//
if(AD_data<
100)
AD_data=100;
sum=sum+AD_data;
sum=sum/8;
//取连续转换八次的的平均值
temperature[number]=(unsignedint)sum;
}
/************************************************显示函数******************************************************************************************/
voidLcddisplay(unsignedcharnumber)
{unsignedintdis[3];
dis[0]=temperature[number]/100+'
0'
;
//百位
dis[1]=(temperature[number]%100)/10+'
//十位
dis[2]=(temperature[number])%10+'
//各位
lcd_pos(0,0);
prints(disc1);
lcd_pos(11,0);
lcd_wdat(number+'
);
lcd_pos(5,1);
lcd_wdat(dis[0]);
lcd_wdat(dis[1]);
lcd_wdat(dis[2]);
lcd_wdat('
'
C'
/***************************************************************按键扫描函数*************************************************************************/
unsignedcharKeyscan(void)
{unsignedcharnumber;
number=0xff;
//如果无按键按下则返回0xff
if(P1!
=0xff)
Delay(10);
{switch(P1)
case0xfe:
number=0;
break;
//如果有按键按下则返回按下的按键号
case0xfd:
number=1;
case0xfb:
number=2;
case0xf7:
number=3;
case0xef:
number=4;
case0xdf:
number=5;
case0xbf:
number=6;
case0x7f:
number=7;
return(number);
voidmain()
{TargetInit();
lcd_init();
while
(1)
{if(~OPEN)//如果上位机发送OFF命令则停止显示
{
lcd_wcmd(0x01);
while(OPEN)
while(Keyscan()!
=NOKEY)
{keynumber=Keyscan();
AD_Convert(keynumber);
//有按键按下时转换和显示按键对应的通道
Lcddisplay(keynumber);
if(send)
{send=0;
Uartsend("
thetempofNo."
keynumber,temperature[keynumber]);
}
AD_Convert(channel);
Lcddisplay(channel);
//无按键按下时转换当前的通道
if(send)
{
send=0;
channel,temperature[channel]);