实验十六温度自动控制系统数码管显示文档格式.docx

上传人:b****4 文档编号:18062562 上传时间:2022-12-13 格式:DOCX 页数:15 大小:59.86KB
下载 相关 举报
实验十六温度自动控制系统数码管显示文档格式.docx_第1页
第1页 / 共15页
实验十六温度自动控制系统数码管显示文档格式.docx_第2页
第2页 / 共15页
实验十六温度自动控制系统数码管显示文档格式.docx_第3页
第3页 / 共15页
实验十六温度自动控制系统数码管显示文档格式.docx_第4页
第4页 / 共15页
实验十六温度自动控制系统数码管显示文档格式.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

实验十六温度自动控制系统数码管显示文档格式.docx

《实验十六温度自动控制系统数码管显示文档格式.docx》由会员分享,可在线阅读,更多相关《实验十六温度自动控制系统数码管显示文档格式.docx(15页珍藏版)》请在冰豆网上搜索。

实验十六温度自动控制系统数码管显示文档格式.docx

单片机引脚分配如图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.总结项目开发的经验

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1