实验十六温度自动控制系统数码管显示文档格式.docx
- 文档编号:18062562
- 上传时间:2022-12-13
- 格式:DOCX
- 页数:15
- 大小:59.86KB
实验十六温度自动控制系统数码管显示文档格式.docx
《实验十六温度自动控制系统数码管显示文档格式.docx》由会员分享,可在线阅读,更多相关《实验十六温度自动控制系统数码管显示文档格式.docx(15页珍藏版)》请在冰豆网上搜索。
单片机引脚分配如图16-2所示:
数码管显示
图16-2硬件示意图
硬件电路图如图48-3所示,使用端口输出PWM波形,该波形加到单向可控硅上控制温度加热元件。
温度测量使用端口,使用DS18B20器件,显示使用和口。
按键控制功能与实验26相同.
图48-3电路连接图
(2)软件流程设计
该闭环系统采用的直接反馈的方法,根据温度传感器测量出来温度与我们希望的温度相比较,根据比较结果,不断改变占空比。
如测量的温度小于期望的温度值,就增加PWM波形的占空比,如果大于期望的温度值,就减少PWM波形的占空比……,最终达到一定的平衡状态。
软件系统基本流程如左图所示:
#include<
>
sbitdata1=P1^0;
sbitclk=P1^1;
sbitplus=P2^0;
sbitsubs=P2^1;
sbitstop=P2^2;
sbitoutput=P3^4;
sbitDQ=P3^3;
unsignedcharflag,flag_1=0;
unsignedcharhigh_time,low_time,count=0;
//占空比调节参数
unsignedcharset_temper=40;
//设定温度
unsignedchartemper;
//测量的温度
unsignedchari;
unsignedcharj=0;
/***********************************************************
延时子程序,延时时间以12M晶振为准,延时时间为30us×
time
***********************************************************/
voiddelay(unsignedchartime)
{
unsignedcharm,n;
for(n=0;
n<
time;
n++)
for(m=0;
m<
2;
m++){}
}
写一位数据子程序
voidwrite_bit(unsignedcharbitval)
EA=0;
DQ=0;
//拉低DQ以开始一个写时序
if(bitval==1)
_nop_();
DQ=1;
//如要写1,则将总线置高
delay(5);
//延时90us供DA18B20采样
//释放DQ总线
写一字节数据子程序
voidwrite_byte(unsignedcharval)
unsignedchari;
unsignedchartemp;
//TR0=0;
for(i=0;
i<
8;
i++)//写一字节数据,一次写一位
temp=val>
i;
//移位操作,将本次要写的位移到最低位
temp=temp&
1;
write_bit(temp);
//向总线写该位
delay(7);
//延时120us后
//TR0=1;
EA=1;
读一位数据子程序
unsignedcharread_bit()
unsignedchari,value_bit;
//拉低DQ,开始读时序
//释放总线
i++){}//8usdelay
value_bit=DQ;
return(value_bit);
读一字节数据子程序
unsignedcharread_byte()
unsignedchari,value=0;
i++)
if(read_bit())//读一字节数据,一个时序中读一次,并作移位处理
value|=0x01<
<
delay(4);
//延时80us以完成此次都时序,之后再读下一数据
return(value);
复位子程序
unsignedcharreset()
unsignedcharpresence;
//拉低DQ总线开始复位
delay(30);
//保持低电平480us
//释放总线
delay(3);
//等待芯片应答信号75us
presence=DQ;
//获取应答信号
delay(28);
//延时以完成整个时序
return(presence);
//返回应答信号,有芯片应答返回0,无芯片则返回1
获取温度子程序
voidget_temper()
unsignedchari,j;
do
i=reset();
//复位
}while(i!
=0);
//1为无反馈信号
i=0xcc;
//发送设备定位命令
write_byte(i);
i=0x44;
//发送开始转换命令
delay(180);
//延时
//0为无反馈信号C,再次复位
//设备定位
i=0xbe;
//读出缓冲区内容
j=read_byte();
//先读出低位
i=read_byte();
//后读出高位
i=(i<
4)&
0x7f;
//屏蔽最高位(一位符号位)
j=j>
4;
temper=i|j;
温度比较处理子程序
***********************************************************/
compare_temper()
if(++flag_1==2)
if(set_temper>
temper)
if(high_time<
100)//温度未达到,但占空比已经100%,则不执行
high_time++;
low_time=100-high_time;
}
elseif(set_temper<
temper)
if(low_time<
100)//温度超过设定温度,但占空比已经为1%,则不执行
high_time--;
else
{}
flag_1=0;
/*****************************************************
T0中断服务子程序,用于控制电平的翻转,40us*100=4ms周期
******************************************************/
voidserve_T0()interrupt1using1
if(++count<
=(high_time))
output=1;
elseif(count<
=100)
output=0;
count=0;
TH0=0x2f;
TL0=0xe0;
串行口中断服务程序,用于上位机通讯
******************************************************/
voidserve_sio()interrupt4using2
RI=0;
//clearreceiveflag
i=SBUF;
if(i==2)
while(RI==0){}//等待接收温度值
set_temper=SBUF;
//设定控制温度值
SBUF=0x02;
//发给主机02
while(TI==0){}
TI=0;
elseif(i==3)//主机要求采样温度,发温度值
{
SBUF=temper;
voiddisp_1(unsignedchardisp_num1[6])
{
unsignedcharn,a,k,m;
6;
k=disp_num1[n];
for(a=0;
a<
a++)
clk=0;
m=(disp_num1[n]&
1);
disp_num1[n]>
=1;
if(m==1)
data1=1;
data1=0;
clk=1;
显示子程序
功能:
将占空比温度转化为单个字符,显示占空比和测得到的温度
voiddisplay()
unsignedcharcodenumber[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xe6};
unsignedchardisp_num[6];
unsignedintk,k1;
k=high_time;
k=k%1000;
k1=k/100;
if(k1==0)
disp_num[0]=0;
disp_num[0]=0x60;
k=k%100;
disp_num[1]=number[k/10];
disp_num[2]=number[k%10];
disp_num[3]=0;
k=temper;
disp_num[4]=number[k/10];
disp_num[5]=number[k%10];
disp_1(disp_num);
主程序
main()
unsignedcharz;
unsignedchara,b,flag_2=1,count1=0;
unsignedcharphil[]={2,0xce,0x6e,0x60,0x1c,2};
;
TMOD=0x21;
//T1为8位重装定时器,T0为16位定时器
//50ms中断
TL0=0x40;
SCON=0x50;
//串口工作于方式1,允许接收,采用中断方式
PCON=0x00;
//波特率不加倍
TH1=0xfd;
//波特率为9600
TL1=0xfd;
PS=1;
//串口中断优先
//开总中断
EX1=0;
//关外部中断
ET0=1;
//开定时器0中断
//ET0=0;
ES=1;
//开串行口中断
TR0=1;
//定时器1开始计时
TR1=1;
high_time=50;
//初始化为占空比50%,周期为200ms
low_time=50;
while
(1)
if(plus==0)
5;
for(b=0;
b<
102;
b++){}//消抖延时
set_temper++;
flag=0;
elseif(subs==0)
if(subs==0)
set_temper--;
elseif(stop==0)
if(stop==0)
//为停止键,跳出循环,只显示,没有控制
break;
get_temper();
b=temper;
if(flag_2=1)
a=b;
if((fabs(a-b))>
5)
temper=a;
temper=b;
a=temper;
flag_2=0;
if(++count1>
50)
display();
count1=0;
compare_temper();
//温度比较和控制
TR0=0;
z=1;
//显示-phil-
disp_1(phil);
b++){}
五、实验步骤
1.编写项目方案,说明硬件设计方案和软件设计方案;
2.进行详细设计,画出电路原理图,并绘制程序流程图;
3.根据程序流程图,编写程序。
4.程序调试、除错。
5.按照实验要求,对每一项功能进行测试,如果有问题,返回第5步;
直到圆满完成所有功能要求。
六、实验报告
1.写出项目方案,包括硬件设计方案和软件设计方案。
2.给出电路原理图和程序流程图的设计。
3.提供程序清单,并加以注释。
4.在调试过程中发现了哪些问题?
你是怎么解决的?
5.总结项目开发的经验
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 十六 温度 自动控制系统 数码管 显示