前言
通过C语言程序写入51单片机实现水的温度的采集,并通过控制器控制加热器给水体加热,对水体的温进行PID控制,保证温度在设定值范围内波动
最终包括C51的视频的内容以及部分参考资料都可以在 百度分享链接内下载
链接: https://pan.baidu.com/s/1jpawh31O1gqv9CU_0LXFZQ 提取码: 2333
包含店家赠送的51的资料以及使用过程中需要用到的部分参考文件以及代码
1. 系统设计
系统硬件部分主要包含主控制器(89C52RC),温度传感器(DS18B20),加热器,数码管显示,AD采集以及DA输出
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uJ3Eourr-1586923872207)(https://i.loli.net/2019/01/05/5c301c0a82c78.jpg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Fn06LsXK-1586923872216)(https://i.loli.net/2019/01/05/5c301c136863c.jpg)]
1.1 主控制器
主控制器是89C52 使用手册下载 也可以在pdf 文件中找到使用手册
本次实验使用的设备是 德飞莱LY-51S V3.0 可以参考附件中V2.32版本的使用手册,实物可以参考京东链接介绍页面1, 基本操作视频在最上方发出的百度分享链接中(2.7G),以及店家附带的关于系统板的参考资料(600M)
系统控制器的原理图如图1.1所示
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WB1pRrMt-1586923872222)(https://i.loli.net/2019/01/05/5c301c15ac834.jpg)]
图1.2 所示是51 系统板原始图像,跟本版本几乎一致, 可以参考
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yR0hTqTd-1586923872241)(https://i.loli.net/2019/01/05/5c301c040a494.jpg)]
最终只使用到了:数码管显示,只是LED小灯,串口模块,AD-DA模块,循环会一一介绍
1.2 LED小灯
程序里面设计了四个小灯来标识程序执行情况,对应的使用P10 #F44336,P12 #F44336,P14 #F44336,P16 #F44336四个端口,这样便于小灯之前区分开,避免识别出错, LED只需要在程序中将LED进行赋值1 0 即可控制小灯亮灭,由于小灯是共阳极, 所以 设定LED=1 小灯是灭的 LED=0 实现小灯亮起
// 定义小灯表示输出
sbit LED0 = P1^0; // 程序主循环函数
sbit LED1 = P1^2; // 读取温度闪灯, 每次读取温度 闪灯一次
sbit LED2 = P1^4; // 小灯,串口接收信号 闪灯
sbit LED3 = P1^6; // 小灯,串口接收信号 闪灯
虽然原理图里面显示小灯是不同颜色, 但是在实际显示的时候全部是红色 所以间隔取了4个小灯来标识程序执行

LED0 是程序主循环程序指示灯,亮灭代表程序进入主程序的while 循环中循环执行, 主循环 控制小灯闪灭,同时循环判断读取温度标识位ReadTempFlag 只有满足的情况下会进入执行否则不执行
LED1 是温度读取小灯, 标识 程序进入中断函数执行, 设定值是中断函数每2ms 进入一次中断, 每次中断执行数码管刷新任务,同时每中断250次 0.5s 将程序执行标志位ReadTempFlag 置位 便于主程序执行,所以程序读取温度周期和程序执行周期都是0.5s
LED2 标识串口输出数据的小灯,每次串口接收到一个数据会将LED2 进行取反操作 如果输入两个数据则小灯会快速亮灭一次完成操作
LED3 标识命令执行小灯,程序里面目前设定的是5个字符标识一条指令, 每次满足5个字符之后LED3小灯会亮起,标识指令输入完成,当不满足的时候灯会灭掉,可以通过此等判断当前状态
1.3 数码管显示
数码管显示包含8个数据口P0的全部端口P00-P07以及两个控制控制口P22 #F44336,P23 #F44336的
#define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0 替换
sbit LATCH1=P2^2;//定义锁存使能端口 段锁存
sbit LATCH2=P2^3;// 位锁存
共阴极数码管原理图 对应的程序可以见程序工程display.c 在头文件display.h中定义了程序接口,对应的需要将P0口的线接到数码管的数据口上J3 , 同时需要将J50接口短接,否则数码管会很暗,几乎不可见同时需要将控制线 LATCH1 接到J2的B口, LATCH2接到J2的A口
程序会每次2ms循环显示数码管,showTemp 显示前面四个字,(-)25.1 的格式显示温度, showOuts 显示后面资格字 会显示-999 到999 的输出值, 显示计算得到的输出设定值, 输出值的显示会限定在-999 到999 之间,
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YiQA3YNj-1586923872249)(https://i.loli.net/2019/01/05/5c301c06deeb9.jpg)]
// 千四个数码管 显示温度 _00.0 格式
float showTemp(unsigned int temp)
{
unsigned int TempH,TempL;
uchar b=0,s=0,g=0,d=0; // 百 十 个位显示
float t_ = 0.0f;
// 显示温度值
if(temp&0x8000)
{
TempData[0]=0x40;//负号标志
temp=~temp; // 取反加1
temp +=1;
}
else
{
TempData[0]=0;
}
TempH=temp>>4;
TempL=temp&0x0F;
TempL=TempL*6/10;//小数近似处理
b = TempH/100; // 百位
s = (TempH%100)/10; // 十位
g = (TempH%10); // 个位
d = TempL; // 十分位
if(TempH/100==0)
TempData[1]=0;

该博客介绍了如何使用C51单片机实现水温控制系统的详细设计,包括主控制器89C52RC、温度传感器DS18B20、串口通信和AD-DA模块。系统通过PID控制确保水温维持在设定值范围内,并提供了相关资源的百度分享链接。
最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



