资源描述
湖南商学院
《单片机应用系统》课程设计(实习)报告
题 目 基于单片机抢答器设计
姓 名:
胡飘
学 号:
专 业:
电子信息工程
班 级:
电信1004班
指引教师:
肖婧
职 称:
实验师
计算机与信息工程学院
6月
课程设计(实习)评审表
姓 名
胡飘
学 院
计信学院
学 号
专业班级
电信1004班
题 目
基于单片机抢答器设计
评
审
意
见
评审成绩
指引教师签名
职称
评审时间
年 月 日
课程设计(实习)作品验收表
题目
基于单片机抢答器设计
参加人员
姓 名
胡飘
班 级
电信1004班
学 号
设计任务与规定:
具备3路抢答输入(由独立按键实现),时间辨别率不大于100ms。显示抢答剩余时间,初始为10秒。抢答成功,蜂鸣器响,同步显示抢答成功号码。
作品完毕状况:
上电显示10s,按开始键开始倒计时,若有按键显示时间和抢答者号码,同步蜂鸣器响,若倒计时为0,蜂鸣器响,按清除键则复位到10s。
验收状况:
验收教师签名:___________
年 月 日
注:1. 除“验收状况”栏外,别的各栏均由学生在作品验收前填写。
2. “验收状况”栏由验收小组按实际验收状况如实填写。
目 录
1 设计任务与规定………………………………………………1
2 系统功能描述…………………………………………………1
3 系统总体设计…………………………………………………1
4 系统详细设计…………………………………………………3
4.1 重要电路设计……………………………………………3
4.1.1 输入模块设计………………………………………3
4.1.2 单片机模块…………………………………………4
4.1.3 显示模块……………………………………………4
4.1.4 声音模块……………………………………………5
4.2 软件设计…………………………………………………6
4.2.1 主程序设计…………………………………………6
4.2.2 定期器设计…………………………………………7
5 系统实现与测试………………………………………………7
5.1 Proteus软件……………………………………………7
5.2 安装和调试过程…………………………………………8
5.2.1 软硬件调试…………………………………………8
5.2.2 硬件安装……………………………………………8
6 课程设计总结…………………………………………………10
6.1 心得体会…………………………………………………10
6.2. 实践总结…………………………………………………10
参照文献…………………………………………………………11
附录………………………………………………………………11
基于单片机抢答器设计
1 设计任务与规定
具备3路抢答输入(由独立按键实现),时间辨别率不大于100ms。显示抢答剩余时间,初始为10秒。抢答成功,蜂鸣器响,同步显示抢答成功号码。
2 系统功能描述
(1)具备3路抢答输入(由独立按键实现),时间辨别率不大于100ms。
(2)主持人按“开始”键,显示抢答剩余时间,初始为10秒。
(3)抢答成功,蜂鸣器响,同步显示抢答成功号码。
(4)主持人按“清除键”键,复位为初始10秒,进入准备状态。
(5)若十秒倒计时时间到,则蜂鸣器响。
3 系统总体设计
抢答输入和控制输入共同控制单片机输出显示和蜂鸣器响,输出锁存控制输入优先性。
各模块如下:
(1)输入模块:由独立按键实现抢答输入和“开始”“清除”控制输入。
(2)单片机控制模块:采用AT89S51芯片控制输出。
(3)输出锁存模块:采用74HC573芯片锁存数据。
(4)显示输出模块:由四位共阳数码管输出显示倒计时和抢答者号码。
(5)声音输出模块:由蜂鸣器工作来控制声音。
原理方框图如图1所示。
显示
输出
声音
输出
输
出
锁
存
抢答输入模块
控制输入模块
单片机模块
图1 原理方框图
整体电路图如图2所示。
图2 基于单片机抢答器系统整体电路图
4 系统详细设计
4.1 重要电路设计
4.1.1 输入模块设计
(1)抢答键输入模块
抢答键输入电路图如图3所示。
图3 抢答键输入电路图
由3个独立按键表达1号,2号,3号抢答者,一端接地一端分别接接单片机P1.0,P1.1,P1.2,如果按下,则相应I/O口变为低电平,从而控制单片机P1口。
(2)“开始”“清除”控制键输入模块
“开始”“清除”控制键输入电路图如图4所示
图4 “开始”“清除”控制键输入电路图
由2个独立按键控制“开始”和“清除”,一端接地一端分别接接单片机P3.6,P3.7,如果按下,则相应I/O口变为低电平,从而控制单片机P1口。
4.1.2 单片机模块
单片机重要由程序设计和输入模块信号控制,用于对显示、声音等模块进行控制。
单片机控制输出电路图如图5所示。
接蜂鸣器
接
排
阻
和74HC753
接数码管位选端
图5 单片机控制输出电路图
P0口连接有一种排阻,用作P0口上拉电阻,保证P0口没有数据输出时候处在高电平状态。还接在74HC753芯片D端,作为它输入,锁存输出到数码管。
P2口低四位接数码管未选端,P3.4接蜂鸣器。
4.1.3 显示模块
显示模块重要是显示抢答倒计时时间,抢答者号码。
数码管显示办法涉及两种:一种是静态显示,一种是动态显示。其中静态显示特点是显示稳定不闪烁,程序编写简朴,但占用端口资源多;动态显示特点是:显示稳定性没静态好,程序编写复杂,但是相对静态显示而言占用端口资源少。在本设计中依照实际状况采用是动态显示办法。
4位七段数码管显示电路如图6所示。
接74HC753即P0口
接AT89S51P2端口低四位
图6 4位七段数码管显示电路图
上图中数码管采用是4位一体七段共阳数码管,其中A~G段分别接到单片机P0口,由单片机输出P0口数据来决定段码值,位选码COM1, COM2,COM3,COM4分别接到单片机P2.0,P2.1,P2.2 ,P2.3,由单片机来决定当前该显示是哪一位。
通过查表法,将其在数码管上显示出来,其中P0口为字型码输入端,P2口低4位为字选段输入段。在这里咱们通过查表将字型码送给7段数码管显示数字。
4.1.4 声音模块
声音模块重要是单片机控制蜂鸣器发声。
选用压电式无源蜂鸣器,声音频谱范畴约在几十到几千赫兹,编写程序控制单片机P3.4口“高”“低”电平转换频率,产生一定频率巨型波,接上蜂鸣器就能发出一定频率声音,若再运用延时程序控制“高”“低”电平持续时间,就能变化输出频率,从而变化音调,使蜂鸣器发出不同声音。
单片机控制蜂鸣器电路图如图7所示。
图7 单片机控制蜂鸣器电路图
单片机通过内部定期器操作实现交替变换波形输出驱动扬声器发声。
4.2 软件设计
4.2.1 主程序设计
一上电数码管显示10—0,表达初始时间为10s,0表达没有抢答,先扫描“开始”“清除”键,判断“开始”键与否按下,若按下,则开始倒计时,并扫描抢答键,若有抢答键按下,则显示抢答者号码和抢答时间,判断倒计时与否为0,若是则蜂鸣器响。
程序流程图如图8所示。
开始
扫描开始键和清除键
蜂鸣器响,复位
开始键按下?
Y
显示倒计时,扫描抢答键
倒计时为0吗?
Y
N
N
有抢答键按下吗
Y
显示抢答者号码,蜂鸣器响
N
清除键按下?
Y
复位
结束
图8 程序流程图
4.2.2 定期器设计
采用定期器/计数器T0方式1定期,定期时间为50ms,相应十进制数初始值为15536,因使用时钟为12MHz,因此定期时间为1us*(65536-15536)=1us*50000=50ms。要想定期1s,需要20次中断,因而程序中定义了中断次数单元count,来对中断次数进行计数。要使最小辨别率为50ms,在定期器计时一次即50ms时,对键盘进行一次扫描实现。由于采用74HC753芯片,因而程序变得简朴,只需将秒单元进行“second / 10”运算,即可得到秒十位BCD码,秒个位BCD码只需取余数“second % 10”运算就可得到,并都送P0口经锁存器运用动态方式显示。
5 系统实现与测试
5.1 Proteus 软件
Proteus软件是由英国Labcenter Electronics公司于1989年推出EDA工具软件,Proteus软件不但具备原理布图,PCB自动制版或人工布线及互动电路仿真功能,针对微解决器应用,还可以直接在基于原理图虚拟原型上编程,并实现软件源码级实时调试,如有显示及输出,还能看到运营后输入输出效果,配合系统配备虚拟仪器如示波器,逻辑分析仪等,为单片机系统虚拟仿真提供了功能强大软硬件调试手段。
Proteus软件特点:
(1)除了既可以仿真模仿电路又可仿真数字电路以及数字、模仿混合电路外,其独特是可以仿真各种单片机及嵌入式解决器。
(2)具备各种仿真仪器仪表工具,如示波器、逻辑分析仪、各种信号发生器、计数器、电压源、电压表、电流表、虚拟终端等,同一种仪器仪表可在同一电路中随意调动。
(3)可以进行软、硬件结合仿真系统,且仿真是交互、可视化。
5.2 安装和调试过程
5.2.1 软件调试
运用Keil uVision4软件进行程序编写,编译,调试,生成.hex文献,运用Proteus进行电路原理图描绘,然后把.hex文献载入AT89S51芯片中,再仿真,通过功能对照,来检查修改程序,一步步使仿真与实现功能相近。
一开始蜂鸣器怎么都不响,通过查资料请教别人,最后发现是由于蜂鸣器一次高低电平变换程序没有循环,因此没有维持一定期间让它工作,通过在蜂鸣器子程序中加入一种100次循环,并是高低电平之间延时1ms发现蜂鸣器工作是最合理。
日后又发现按下抢答键,倒计时不断止,通过诸多次实验之后,发现是应当在判断抢答键与否按下必定条件下是定期器使能标示位置0。
当主持人按下开始键,2号抢答者按下抢答键时,
Proteus仿真运营图如图所示
图9 Proteus仿真运营图
5.2.2 硬件安装
由于经费限制,元件数量也不是特别多,因此准备自己焊板子,晶振复位都准备自己焊。精心策划每个元件安装位置,和可以节约引线,我把每个元件多余引脚某些当做线路来用,以使电路美观一点。竣工之后运营不正常,分析也许是各个引脚和线路之间不稳定因素,特别是因此电源和地都是通过引一根线出来接电源孔悬在空中接电源,觉得还是不可靠,于是最后还是决定用最小系统来作为硬件核心,以避免不必要影响。
日后又最小系统,杜邦线和排针再一次焊好了电路,一上电显示-1,8,8,0,蜂鸣器响时间和仿真图里蜂鸣器该响时间同样长,“开始”“抢答”“清除”键都不作用。暂时连接数码管各线我都用万用表测试过了,是连通,我想也许会是如下因素:
(1)也许是排阻问题,但是如果是话,数码管应当不会亮。
(2)也许是数码管问题,但是也已经测试过,是对的相应各引脚,并且可以显示。
(3)调用蜂鸣器响程序放错位置了,但是检查了没错。
通过仔细检查、测试、修改、调试之后,
硬件电路图如图10所示。
图10 硬件电路图
6 课程设计总结
6.1 心得体会
本次课程设计,先从分析题目开始,从课本上找类似也许实现功能块,明确整体思路,大概画出整体电路模块,由于第一次接触实际应用设计,思维比较混乱,诸多功能觉得考虑地方太多,很难。日后去图书馆查阅了两天资料,找到类似应用系统,仔细研究了一番,多了个没接触过芯片,通过几本书上资料,拼凑修改之后还是仿真不了,也请教了某些教师,日后通过比较此外一种方案,觉得性价比和简便限度更高,因此放弃了原有方案,重新开始设计。
通过修改程序和仿真调试,显示某些是差不多按我所想实现了,但蜂鸣器要么不响,要么能听到一丁点声响,参照了别同窗蜂鸣器响程序,尚有在网上找了诸多关于蜂鸣器资料,又请教教师问题,最后终于把蜂鸣器问题解决了。
仿真出来后,焊接电路,半途发现焊反了,怕影响电路拆了又重焊,还是显示不正常,一上电是某些不该有数字,按开始键三个数码管都一起显示倒计时,蜂鸣器始终响,一动电路又断断续续,问过教师之后,决定还是用最小系统来作为硬件核心,以避免不必要影响。
终于是又把电路板焊出来了,但是还是不如我所愿,显示还是不正常,一上电蜂鸣器响时间和仿真蜂鸣器该响时时间同样长,按开始键也没有反映。通过同窗协助,检查了数码管以及和单片机连接地方,都没有问题,按理来说一上电应当和主程序一开始设定功能同样,只能再重新测好每一种电路线和元件。经教师指引,应当在上电时,测每个脚应当有电压,看元件输出功能与否对的,再逐渐拟定每一种芯片和电路与否有问题,然后修改调试。我只能想到是,仿真和实际电路对于程序下载也许存在某些区别,特别是数码管位选和显示段,还需不断学习,改进。
6.2 实践总结
通过这段时间每天起早贪黑守着电脑旁调试,以及不断查阅资料和请教别人过程中,发现自己是多么不懂,时间是过得很充实,几乎忘了吃喝拉撒,每天做到凌晨一两点,身心疲倦,每天睡觉梦到先是程序该怎么改,日后又硬件该怎么测试,梦里想出来诸多修改并最后成功办法。
综上所述,本次课程设计让我更加细心,认真地去做每一种某些,一步步依照功能来测试电路,锁定要修改地方,学到不但是单片机知识,尚有诸多对于咱们这个专业来说必备某些技能。
参照文献
[1].唐颖、程菊花等.单片机原理与应用及C51程序设计[M].北京大学出版社,
[2].张毅刚、杨志明等.基于Proteus单片机课程基本实验与课程设计[M].人民邮电出版社,
[3].宋戈、黄鹤松等.51单片机范例大全[M].中华人民共和国邮电出版社,
[4].徐爱钧、彭秀华等.单片机高档语言编程与uVision2应用实践[M].电子工业出版社,
附录
源程序清单
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
unsigned char code table[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x08,0x03,0x46,0x21,0x06,0x0e};
//共阴极数码管编码表 0 - f显示
sbit start= P3^6; // 变量定义
sbit reset = P3^7;
sbit key1 = P1^0;
sbit key2 = P1^1;
sbit key3 = P1^2;
sbit buzzer = P3^4;
bit start_flag = 0;
bit key1_flag = 0;
bit key2_flag = 0;
bit key3_flag = 0;
bit reset_flag = 0;
bit action = 0;
uchar second = 10;
uchar count = 0;
uchar number = 0;
uchar number_display = 0;
void delay(uint z) //延时函数
{
uint x,y;
for(x=z;x>0;x--)
for(y=100;y>0;y--);
}
void display(uchar number,uchar second) //数码管显示驱动函数
{
uchar second_first,second_second;
second_first = second / 10;
second_second = second % 10;
P2 = 0xfd;
P0 = table[number];
delay(2);
P2 = 0xf7;
P0 = 0x3f;
delay(2);
P2 = 0xfb;
P0 = table[second_first];
delay(2);
P2 = 0xfe;
P0 = table[second_second];
delay(2);
}
void start_keyscan() //开始键扫描函数
{
if(start == 0)
{
delay(8);
if((start == 0)&&(!start_flag))
{
start_flag = 1;
action = 1;
TR0 = 1;
}
}
else
{
start_flag = 0;
}
}
uchar key_scan3() //3位抢答键扫描函数
{
if(key1 == 0)
{ delay(8);
if((key1 == 0)&&(!key1_flag))
{ key1_flag = 1;
number = 1;
number_display = number;
}
}
else
{
key1_flag = 0;
number = 0;
}
if(key2 == 0)
{ delay(8);
if((key2 == 0)&&(!key2_flag))
{ key2_flag = 1;
number = 2;
number_display = number;
}
}
else
{
key2_flag = 0;
number = 0;
}
if(key3 == 0)
{ delay(8);
if((key3 == 0)&&(!key3_flag))
{ key3_flag = 1;
number = 3;
number_display = number;
}
}
else
{
key3_flag = 0;
number = 0;
}
if(number_display != 0)
{
return 1;
}
else
{
return 0;
}
}
void reset_keyscan() // 复位键扫描函数
{
if(reset == 0)
{
delay(8);
if((reset == 0)&&(!reset_flag))
{
reset_flag = 1;
number_display = 0;
second=10;
}
}
else
{
reset_flag = 0;
}
}
void beep() //蜂鸣函数,延时1ms,脉宽t = 1ms 周期T = 2ms 频率f = 0.5khz
{
uint i;
for(i=0;i<100;i++)
{
delay(10); //延时1ms
buzzer = ~buzzer;
}
buzzer = 1; //给P3.7口送高电平
}
void init_T0() //定期器T0初始化
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=0;
}
void main() //
{
init_T0(); //定期器T0初始化
while(1)
{
start_keyscan(); //开始键扫描
reset_keyscan(); //复位键扫描
while(action==1) //若按下开始键
{
key_scan3(); //扫描抢答键
if(!key_scan3()) //若没有抢答键按下
{
display(number_display,second); //显示倒计时
}
else
{
TR0 = 0; //停止计时
display(number_display,second); //显示抢答者号码
beep(); //蜂鸣器响
action = 0;
break;
}
}
display(number_display,second); //显示时间
}
}
void timer0() interrupt 1 //中断服务函数
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
count++;
if(count%2==0)
{
key_scan3(); //扫描抢答键
}
if(count==20)
{
count=0;
second--;
if(second==0)
{
TR0 = 0;
number_display = 0;
beep();
action = 0;
}
}
}
展开阅读全文