C语言以温度测量为主的多功能任务设计.docx
- 文档编号:24470583
- 上传时间:2023-05-27
- 格式:DOCX
- 页数:30
- 大小:273.14KB
C语言以温度测量为主的多功能任务设计.docx
《C语言以温度测量为主的多功能任务设计.docx》由会员分享,可在线阅读,更多相关《C语言以温度测量为主的多功能任务设计.docx(30页珍藏版)》请在冰豆网上搜索。
C语言以温度测量为主的多功能任务设计
《单片机原理及应用课程设计任务》
课题:
以温度测量为主的多功能任务设计
班级学号
学生姓名
指导教师
淮阴工学院
电子与电气工程学院
2014-5
目录
一、课程设计目的3
二、设计要求3
2.1总体要求3
2.2具体要求3
三、设计内容及方法4
3.1设计准备4
3.2功能设计及系统总体设计5
四、硬件电路总体设计5
4.1硬件总框图5
4.1.1主控电路5
4.1.2按键控制扫描模块6
4.1.3DS1820温度显示模块7
4.1.4数码管显示模块7
4.1.5LED显示模块8
4.1.6扬声器模块9
五、软件流程框图11
六、完整的程序清单及注释14
七、设计总结23
八、参考文献23
一、课程设计目的
《单片机原理及应用》课程设计是一项重要的实践性教育环节,是学生在校期间必须接受的一项工程训练。
在课程设计过程中,在教师指导下,运用工程的方法,通过一个简单课题的设计练习,可使学生通过综合的系统设计,熟悉应用系统的设计过程、设计要求、完成的工作内容和具体的设计方法,了解必须提交的各项工程文件,也达到巩固、充实和综合运用所学知识解决实际问题的目的。
通过课程设计,应能加强学生如下能力的培养:
(1)独立工作能力和创造力;
(2)综合运用专业及基础知识,解决实际工程技术问题的能力;
(3)查阅图书资料、产品手册和各种工具书的能力;
(4)工程绘图的能力;
(5)编写技术报告和编制技术资料的能力。
二、设计要求
2.1总体要求
(1)独立完成设计任务
(2)绘制系统硬件总框图
(3)绘制系统原理电路图
(4)制定编写设计方案,编制软件框图,完成详细完整的程序清单和注释;
(5)制定编写调试方案,编写用户操作使用说明书
(6)写出设计工作小结。
对在完成以上文件过程所进行的有关步骤如设计思想、指标论证、方案确定、参数计算、元器件选择、原理分析等作出说明,并对所完成的设计作出评价,对自己整个设计工作中经验教训,
2.2具体要求
本次工程实践主要以单片机为基础,进行单片机软件编程,目的是为了提高学生的软件编程和系统设计能力,整个设计系统包括两个部分,硬件及软件部分,硬件部分已经制作成功,学生可以对硬件模块电路进行分析调试,在此基础上,编写模块软件,并进行仿真调试,最后各模块组织一个多功能任务系统,进行系统软件总体调试,实现设计任务要求。
软件编程是本次工程实践的重要环节。
在为期两周的工程实践中,将占据主要时间,学生要完成的软件编程任务主要包括以下几点:
1)、熟悉KeilC51编程平台及相关编程软件;
2)、编写、调试蜂鸣器或继电器动作或方波程序并进行软硬件联调;
3)、编写、调试LED流水灯(循环显示)程序并进行软硬件联调;
4)、编写、调试键盘扫描子程序并进行软硬件联调;
5)、编写、调试数码管动态扫描程序并进行软硬件联调。
具体课题:
课题名字的多功能任务的含义是:
要求每个同学所设计的电路和程序必须实现4个功能,电路提供四个按键,要求同学们能编写、调试对应的键盘扫描子程序,从而实现,当按下A按键,实现蜂鸣器或继电器动作,当按下B按键,实现LED流水灯(循环显示),当按下C按键,实现数码管动态扫描显示(显示内容可以自己确定),前3个功能,对于每个课题都是相同,只有最后一个按键不同,其功能取决于所选课题名称,即当按下D按键,要求实现相应课题的最主要的功能。
温度测量与控制系统设计是一个非常简单而又应用普遍的温度控制系统、他包括温度采集、信号转换、单片机处理以及控制、报警等部分。
要求学生采用声光报警方式。
三、设计内容及方法
单片机原理及其应用课程设计通常选择一般常见、常用的简单应用装置或对象进行微机控制。
所涉及的系统可以实际制作,也可以实验室模拟,具体步骤:
3.1设计准备
认真研究设计任务书,明确设计要求、条件、内容、和步骤;通过阅读有关资料,了解设计对象;复习课程有关内容,熟悉有关单元电路的设计方法和设计步骤;搜集、分析、消化相关资料、软件等,掌握微型计算机应用系统软件的设计方法;准备好设计需要的图书、资料和工具;拟定设计计划等。
3.2功能设计及系统总体设计
要求学生有创新精神和创新意识,分析所掌握的资料,了解设计对象的功能。
在充分考虑功能设计后,进行总体设计,以功能、结构为标,制定总体方案,规划硬、软件功能分配等;初步确定关键元器件地选择。
四、硬件电路总体设计
4.1硬件总框图
控制原理:
该设计以单片机为主控电路,分别控制5个工作模块:
按键控制模块、实时时钟模块、数码管显示模块、LED显示模块、扬声器模块。
按键控制模块由单片机P1.4-P1.7口控制。
温度显示由DS1302完成,由单片机INT0、INT1、T0口控制。
数码管显示由LED显示模块由P0口和P1.0-P1.3控制。
LED模块由P2口控制。
扬声器由T0口控制。
4.1.1主控电路
本次课程设计中主要是设计一个以作息时间控制为主的多功能控制系统。
该设计中我们主控电路部分采用了单片机AT89C52芯片来实现这些功能,AT89C52是一个低电压,高性能CMOS的8位单片机,片内含8KB的可反复擦写的Flash只读程序存储器和256B的随机存取数据存储器(RAM)。
其引脚如下图所示:
VCC:
供电电压。
GND:
接地。
P0口(P0.0-P0.7):
P0口来控制数码管的段选,以显示相应的数值。
P1口(P1.0-P1.7):
P1口用来控制数码管的位选,以达到动态显示的效果。
P2口(P2.0-P2.7):
P2口来控制LED的亮灭。
P3口(P3.0-P3.7):
P3.0为RXD(串行输入口),P3.1为TXD(串行输出口),P3.2为/INT0(外部中断0),P3.3为/INT1(外部中断1),P3.4为T0(记时器0外部输入),
P3.5为T1(记时器1外部输入),P3.6为/WR(外部数据存储器写选通),P3.7为/RD(外部数据存储器读选通)。
XTAL1(19脚)和XTAL2(18脚)为振荡器输入输出端口,外接12MHz晶振。
RST/Vpd(9脚)为复位输入端口,外接电阻电容组成的复位电路。
VCC(40脚)和VSS(20脚)为供电端口,分别接+5V电源正负端。
P0~P3为可编程通用I/O脚,其功能用途由软件定义。
4.1.2按键控制扫描模块
按键用于控制数码显示、LED显示、扬声器等模块的工作。
通过扫描按键是否按下,来设定各模块的工作情况,使各模块可以在按键的控制下,有序地进行工作。
设计中使用单个按键实现单个功能,属于较为简单的控制方式.
按键输入电路
使用4个按键分别与单片机的平P1.4、P1.5、P1.6、P1.7分别连接,以完成按键控制。
4.1.3DS1820温度显示模块
DS18B20“一线总线”数字化温度传感器同DS1820一样,DS18B20支持“一线总线”接口,测量温度范围为-55~+125摄氏度。
在-10~+85摄氏度范围内,DS18B20的精度为正负0.5摄氏度,DS1822的精度较差,为正负2摄氏度。
现场温度直接以“一线总线”的数字方式传输,可大大提高系统的抗干扰性,因此它适合于恶劣环境的现场温度测量,如环境控制、设备或过程控制等。
DS18B20内部结构主要有四部分组成:
64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。
DS18B20的管脚排列为:
DQ为数字信号输入/输出端;GND为电源地;VDD为外接供电电源输入端。
GNDDQVDD
4.1.4数码管显示模块
设计中采用四位共阳极数码管,共阳极是指其公共端接正极,通过单片机AT89C52的P1口控制其位选,以达到动态显示的效果,再通过P0口,控制其段选以显示相应的数值。
在其位选控制部分,采用了一个9012型三极管,要求当P1口输出低电平时,位选成功。
数码管显示电路
硬件电路中,数码管显示的小时和分.小时通过按键2控制,分通过按键3控制。
数码管要正常显示,就要用驱动电路来驱动数码管的各个段码,从而显示出我们要的数字,因此根据数码管的驱动方式的不同,可以分为静态式和动态式两类。
①静态显示驱动:
静态驱动也称直流驱动。
静态驱动是指每个数码管的每一个段码都由一个单片机的I/O端口进行驱动,或者使用如BCD码二-十进制译码器译码进行驱动。
静态驱动的优点是编程简单,显示亮度高,缺点是占用I/O端口多,如驱动5个数码管静态显示则需要5×8=40根I/O端口来驱动,要知道一个89S51单片机可用的I/O端口才32个呢:
),实际应用时必须增加译码驱动器进行驱动,增加了硬件电路的复杂性。
②动态显示驱动:
数码管动态显示接口是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8个显示笔划"a,b,c,d,e,f,g,dp"的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于单片机对位选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。
通过分时轮流控制各个数码管的的COM端,就使各个数码管轮流受控显示,这就是动态驱动。
在轮流显示过程中,每位数码管的点亮时间为1~2ms,由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O端口,而且功耗更低。
4.1.5LED显示模块
LED(LightEmittingDiode),发光二极管,是一种固态的半导体器件,它可以直接把电转化为光。
LED的心脏是一个半导体的晶片,晶片的一端附在一个支架上,一端是负极,另一端连接电源的正极,使整个晶片被环氧树脂封装起来。
半导体晶片由两部分组成,一部分是P型半导体,在它里面空穴占主导地位,另一端是N型半导体,在这边主要是电子。
但这两种半导体连接起来的时候,它们之间就形成一个“P-N结”。
当电流通过导线作用于这个晶片的时候,电子就会被推向P区,在P区里电子跟空穴复合,然后就会以光子的形式发出
能量,这就是LED发光的原理。
而光的波长也就是光的颜色,是由形成P-N结的材料决定的。
LED显示电路
本次设计中通过按键1来控制其流水显示,打开电源后按下按键1,流水灯模块有效。
电路中LED为共阳极,故控制流水灯显示的P2口应为低电平时才有效。
从原理图中可以看出,如果要让接在P2.0口的LED1亮起来,那么只要把P2.0口的电平变为低电平就可以了;相反,如果要接在P2.0口的LED1熄灭,就要把P2.0口的电平变为高电平;同理,接在P2.1~P2.7口的其他7个LED的点亮和熄灭的方法同LED1。
因此,要实现流水灯功能,我们只要将发光二极管LED1~LED8依次点亮、熄灭,8只LED灯便会一亮一暗的做流水灯了。
我们首先把要显示流水花样的数据建在一个以TAB为标号的数据表中,然后通过查表指令“MOVC A,@A+DPTR”把数据取到累加器A中,然后再送到P1口进行显示。
在此我们还应注意一点,由于人眼的视觉暂留效应以及单片机执行每条指令的时间很短,我们在控制二极管亮灭的时候应该延时一段时间,否则我们就看不到“流水”效果了。
4.1.6扬声器模块
要求扬声器能够发出连续,断续的声音及音乐,我们可以选择一个蜂鸣器来实现这些功能。
蜂鸣器电路图:
蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。
下面我们以电磁式蜂鸣器为例来说明它的工作原理:
电磁式蜂鸣器由振荡器、电磁线圈、磁铁、振动膜片及外壳等组成。
接通电源后,振荡器产生的音频信号电流通过电磁线圈,使电磁线圈产生磁场。
振动膜片在电磁线圈和磁铁的相互作用下,周期性地振动发声,当输出高电平时,三极管截止,蜂鸣器的两引脚间的直流电压接近于0V,没有电流流过线圈,蜂鸣器不发声;当输出低电平时,三极管导通,使蜂鸣器的两个引脚间获得将接近+5V的直流电压,这样蜂鸣器的电流形成回路,发出声音在这个设计中是通过p3.4口控制其发声的。
由于p3.4与ds1302是连在一起的,故只要ds1302工作,就可以设定使扬声器发出声音。
4.2硬件总电路图
五、软件流程框图
图1主程序流程图
图2蜂鸣器程序流程图
图3流水灯程序流程图
图4时间显示流程图
图5DS18B20温度计主程序流程图
主程序的主要功能是负责温度的实时显示,读出并处理DS18B20的测量温度值,温度测量每1S测量一次。
六、完整的程序清单及注释
#include
#include
unsignedcharcodeduanma[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//显示段码值01234567
unsignedcharcodeweima[6]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};//分别对应相应的数码管点亮,即位码
unsignedchartemp1[6]={0x77,0x7c,0x39,0x5e,0x79,0x71};//显示段码值ABCDEF
unsignedchartemp[6];//用于存放临时变量
sbitduan=P2^6;//定义段选端口
sbitwei=P2^7;//定义为选端口
sbitkey1=P3^4;//定义独立键盘1端口
sbitkey2=P3^5;//定义独立键盘2端口
sbitkey3=P3^6;//定义独立键盘3端口
sbitkey4=P3^7;//定义独立键盘4端口
sbitfm=P2^3;//定义蜂鸣端口
sbitDQ=P2^2;//定义单总线数据端口
sbitDIOLA=P2^5;
bitflag;//定义标志位
unsignedcharte;
/*--------------------------------------
MS延时函数
----------------------------------------*/
voiddelayms(unsignedintt)
{
unsignedcharx,y;
for(x=t;x>0;x--)
for(y=110;y>0;y--);
}
/*--------------------------------------
uS延时函数
----------------------------------------*/
voiddelayus(unsignedintt)
{
while(t--)
{
_nop_();
}
}
/*--------------------------------------
数码管动态显示函数
----------------------------------------*/
voiddisplay_shumaguan()
{
staticunsignedchari;//定义静态变量
P0=0;//清零
duan=1;//位锁存
duan=0;
P0=weima[i];//取位码
wei=1;//位锁存
wei=0;
P0=temp1[i];//取显示数据,段码
duan=1;//段锁存
duan=0;
i++;
if(i==6)//检测6位扫描完全结束?
如扫描完成则从第一个开始再扫次
i=0;
}
/*--------------------------------------
18B20温度显示函数
----------------------------------------*/
voiddisplay_ds18b20()
{
staticunsignedchari;//定义静态变量
P0=0;//清零
duan=1;//位锁存
duan=0;
P0=weima[i];//取位码
wei=1;//位锁存
wei=0;
P0=temp[i];//取显示数据,段码
duan=1;//段锁存
duan=0;
i++;
if(i==6)//检测6位扫描完全结束?
如扫描完成则从第一个开始再扫描
i=0;
}
/*--------------------------------------
定时器0中断函数
----------------------------------------*/
voidinit_time0()
{
TMOD|=0X01;//使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影
TH0=(65536-2000)/256;//给定初值
TL0=(65536-2000)%256;
EA=1;//总中断打开
ET0=1;//定时器0中断打开
}
/*--------------------------------------
定时器0中断服程序
----------------------------------------*/
voidinit_time()interrupt1
{
staticunsignedintte;
te++;
if(te==300)
{
te=0;
flag=1;
}
display_ds18b20();//调用18B20显示函数
TH0=(65536-2000)/256;//定时器赋初值
TL0=(65536-2000)%256;//定时器赋初值
}
/*--------------------------------------
定时器1中断函数
----------------------------------------*/
voidinit_time1()
{
TMOD|=0X10;//使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
TH1=(65536-2000)/256;//给定初值
TL1=(65536-2000)%256;
EA=1;//总中断打开
ET1=1;//定时器1中断打开
}
/*--------------------------------------
定时器1中断服程序
----------------------------------------*/
voidinit_time11()interrupt3
{
display_shumaguan();//调用数码管显示函数
TH1=(65536-2000)/256;//重新赋值
TL1=(65536-2000)%256;
}
/*--------------------------------------
ds18b20初始化函数
----------------------------------------*/
bitinit_18b20()
{
bitbat=0;
DQ=1;//DQ复位
delayus(5);//稍做延时
DQ=0;//单片机将DQ拉低
delayus(200);//精确延时大于480us小于960us
delayus(250);
DQ=1;//拉高总线
delayus(40);//15~60us后接收60-240us的存在脉冲
bat=DQ;//如果x=0则初始化成功,x=1则初始化失败
delayus(20);//稍作延时返回
returnbat;
}
/*------------------------------------------------
ds18b20写入一个字节
------------------------------------------------*/
voidwriteonechar(unsignedcharc)
{
unsignedchari;
for(i=0;i<8;i++)
{
DQ=0;
DQ=c&0x01;
delayus(10);
DQ=1;
c>>=1;
}
delayus(25);
}
/*------------------------------------------------
ds18b20读取一个字节
------------------------------------------------*/
unsignedcharreadonechar()
{
unsignedchari,rec;
for(i=0;i<8;i++)
{
DQ=0;//给脉冲信号
rec>>=1;
DQ=1;//给脉冲信号
if(DQ)
rec|=0x80;
delayus(30);
}
returnrec;
}
/*------------------------------------------------
ds18b20读取温度
------------------------------------------------*/
unsignedintreadtemp()
{
unsignedintb=0,t=0;
unsignedchara=0;
init_18b20();
writeonechar(0xcc);//跳过读序号列号的操作
writeonechar(0x44);//启动温度转换
delayus(10);
init_18b20();
writeonechar(0xcc);//跳过读序号列号的操作
writeonechar(0xbe);//读取温度寄存器等(共可读9个寄存器)前两个就是温度
delayus(10);
a=readonechar();//低位
b=readonechar();//高位
b<<=8;
t=a+b;
returnt;
}
voidfengjie(unsignedintnum)
{
unsignedcharth,tl;
if(num&0x8000)
{
temp[0]=0x40;
num=~num;
num+=1;
}
else
temp[0]=0;
th=num>>4;
tl=num&0x0f;
tl=tl*6/10;
if(th>100)
temp[1]=duanma[th/100];
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 温度 测量 为主 多功能 任务 设计