收藏 分销(赏)

单片机恒温控制系统设计.doc

上传人:w****g 文档编号:10820642 上传时间:2025-06-18 格式:DOC 页数:7 大小:115.50KB 下载积分:6 金币
下载 相关 举报
单片机恒温控制系统设计.doc_第1页
第1页 / 共7页
单片机恒温控制系统设计.doc_第2页
第2页 / 共7页


点击查看更多>>
资源描述
1. 功能要求 用户设定温度值后,显示设定温度和当前温度根据当前温度和设定温度之间的差值,控制加温或停止加温,最终达到恒温。 2.方案论证 按要求,系统采用1片51单片机、1片A/D转换器ADC0809、键盘和4个共阴极7段LED显示器件。系统框图如图1所示。 MCS-51单片机 显示设定温度 和当前温度 加温 控制电路 A/D 测温元件热敏电阻 键盘 设定温度 图1 . 恒温控制系统原理图 3.硬件电路设计 本设计中,8255A和A/D转换器都作为单片机的扩展外设。 4.硬件电路的功能(分模块介绍) (1) 温度采集与控制单元电路: 温度采集电路是用热敏电阻和一个分压电阻形成电压采样点,电压经换算可得到当前温度。用一个大功率电阻形成温度控制电路,控制点接地,大功率电阻上有电流流过则发热,控制点接+12V,大功率电阻上无电流流过则停止发热。电路图如下图2所示。 +5V +12V 分压电阻510Ω 控制点A 热敏电阻Rt 采样点V 大功率电阻100Ω 图2.温度采集与控制单元电路 (2)动态显示电路: 假设温度在100 ℃一下,因此可以选择4个共阴极的七段LED,前两个显示设定温度,后两个显示当前温度。单片机与8255A相连,用8255A的A口连接段码,B口连接位码实现动态显示。具体电路如图3所示。单片机与8255A的连接电路略,假设8255A的地址为FFF0H -FFF3H。 PA6 PA0 PB0 PB3 8255A a~g a~g a~g a~g X1 X2 X3 X4 图3.动态显示电路 (3)A/D转换与温度控制电路: 数据采集选用A/D转换器0809,程序中循环采集A/D转换值,采集完成由单片机接收采集的数据,经计算分析,确定是否加温,加温有8255A的PC0控制。具体电路如图4所示。 +5V +12V 分压电阻510Ω 控制点A 热敏电阻Rt 采样点V 大功率电阻100Ω 图2.温度采集与控制单元电路 ≥ ≥ P0 WR P2.7 RD MCS-51 A/D 0809 ALE SC OE C B A 8255 A’ A UNL2803 PC7 PC0 图4.数据采集与温度控制电路 单片机接收到A/D转换值X后,将其转换为测试点的电压V,在计算出电阻Rt的值。Rt计算过程为: V=5X/256 i=V/510 Rt=(5-V)/i=510*(5-V)/V 固有:Rt=510*(256-X)/X 热敏电阻的阻值与温度之间有对应关系。有的热敏电阻的阻值与温度之间是线性关系,有的是非线性。对线性关系,可用公式将Rt换算成温度,对于非线性关系,可用查表程序。 从连接电路中可知,0809芯片的地址是7FFFH,0809的控制端CBA与地相连,因此只可采集IN0的信号。采样结束信号EOC与8255的PC7相连,可通过查询测试A/D转换状态。 UNL2803是反向驱动电路,A端为0时,A’为12V,停止加温;A端为1时,A’为0V,开始加温。 (4)键盘电路: 键盘是用来设置恒温时的温度值,根据要求,可设置两个按键开关,K1用于增加设定值,K2用于减小设定值,两个开复安分别接在两个外部中断请求端INT0和INT1上,每按一次开关,温度值变化一次,开关电路如图5所示。由于外部中断是低电平或低脉冲出发,故连接时将K—端与中断请求端相连。 +5V K+ K— K 图5.按键电路 5. 程序设计 系统程序分为主程序、数据转换与控制子程序和中断服务程序。 (1) 主程序: 完成系统的8255初始化、启动A/D转换并采集数据、循环显示设定温度和采集温度。程序流程如果6所示。 启动A/D转换 转换结束 开始 接受采样值 调用转换控制子程序 保存转换值 显示设定温度 显示当前温度 N Y 图6.主程序流程图 (2) 数据转换与控制子程序: 热敏电阻采用mfd103,电阻与温度之间为非线性关系,因此,从A/D转换器接收的数据经计算得到Rt,经查表形成温度值,存入相应单元,并比较设定值与实际温度,控制加热电路。子程序流程图如下所示。 N 当前温度>设定温度 返回 采样值转换为Rt 保存温度 查表得到温度 Y 图7.数据转换与控制子程序流程图 当前温度>设定温度 Y 开始 停止加热 加热 N (3)中断服务程序 中断服务程序由两个外部中断服务程序组成,其中一个完成设定温度加1,另一个完成设定温度减1。 6.程序清单 #include<absacc.h> #include<reg51.h> #include<intrins.h> #define uchar unsigned char #define uint unsigned int //定义0~9的共阴极显示代码 Code unchar Table[10]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //定义热敏电阻值与温度关系表(表为20~39℃电阻值,温度间隔为1) code unit wd[20]= {0x30CC,0x2EA6,0x2C9C,0x2AAB,0x2802,0x2710,0x2564, 0x23CC,0x2248,0x20D6,0x1F76,0x1E26,0x1CE7,0x1BB6, 0x1A93,0x197D,0x1874,0x1778,0x1687,0x15A0}; uint wd_s,wd_c //分别存放设定温度和当前温度 unit x; //定义变量存放采样值 //数据转换与控制子程序 void change() { unit rt,I; rt=510*(256-x)/x; //计算Rt for(i=1;i<20;i++) //查电阻表,形成当前温度值 {if (rt>=wd[i]) break;} wd_c=20+i; //保存温度 if (wd_c<wd_s) //当前温度小于设定温度时,开始加热 XBYTE[0XFFF2]=1; if (wd_c>wd_s) //当前温度大于设定温度时,停止加热 XBYTE[0XFFF2]=0; } //0号中断服务程序 void int0_fun(void) interrupt 0 {wd_s++; } //1号中断服务程序 void int0_fun(void) interrupt 1 {wd_s--; } //主程序 main() { unchar m[4]; //存放温度各位数 unchar com=0xfe; //显示位码 unchar i; //定义循环变量 IE=0x85; //中断初始化 IT0=1; IT1=1; XBYTE[0x7FFF3]=00X88; //8255A初始化 while(1) { XBYTE[0x7FFF]=0; //启动转换 if (XBYTE[0x7FFF2]&0x80=0); x=XBYTE[0x7FFF]; change() m[0]=wd_s/10; //形成设定温度的十位和个位 m[1]=wd_s%10; m[2]=wd_c/10; //形成当前温度的十位和个位 m[3]=wd_c%10; //显示温度 for (i=0;i<4;i++) { XBYTE[0xFFF1]=0xff; XBYTE[0xFFF0]=table[m[i]]; XBYTE[0xFFF1]=com; com=_crol_(com,1); } } } 7
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 通信科技 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服