附件1:
课 程 设 计
题 目
学 院 专 业 班 级
姓 名 指导教师
六路电子抢答器 机电工程学院 机械工程及其自动化 机自1205 于永杰
尹海斌
2015 年 1 月 8 日
单片机课程设计任务书
目录
第一章 选题背景 ———————————————— 4
1.1概述 ——————————————————— 4
1.2选题的目的和意义 ————————————— 4
1.3抢答器的设计要求————————————— 4
第二章 方案选择及设计思路与原理方框图————— 5
2.1设计思路————————————————— 6
2.2总体方框图———————————————— 6
2.3抢答器的工作流程————————————— 7
第三章 系统硬件总体设计 ———————————— 8
3.1 中央控制器 ——————————————— 8
3.2译码驱动显示电路设计——————————— 10
3.3时钟电路设计——————————————— 13
3.4复位电路设计——————————————— 14
3.5抢答电路设计——————————————— 14
3.6音乐电路设计——————————————— 15
3.7主持人控制电路设计———————————— 16
第四章 Proteus系统仿真———————————— 17
第五章 程序设计———————————————— 22
第六章 课程设计总结—————————————— 28
第七章 参考文献———————————————— 28
第一章 选题背景
1.1概述
抢答器是一种应用非常广泛的设备,在各种竞赛、抢答场合中,它能迅速、客观地分辨出最先获得发言权的选手。现在大多数抢答器均使用单片机和数字集成电路,并增加了许多新功能,如选手号码显示、抢按报警、选手得分等功能。
本课题利用AT89C51单片机及外围接口实现的抢答系统,利用单片机的定时/计数器定时和计数的原理使得系统能够正确地进行计时同时使LED 显示屏能够正确的显示时间和选手的号码。用开关做键盘输出,扬声器发出提示。
1.2选题的目的和意义
①、通过单片机课程设计,熟练掌握编程方法,将单片机理论知识与实践相结合。
②、通过六路电子抢答器控制系统的设计,掌握定时/计数器的使用方法,和简单程序的编写,提高实践能力。
③、初步掌握多功能抢答器的调整及测试方法。提高动手能力和排除故障的能力。
1.3抢答器的设计要求
①. 该抢答器具有控制系统清零、控制抢答器开始,便于主持人控制现场时间(例如抢答时间可以设置为15s ,当主持人按下开始键时时间进入倒计时,在LCD 上显示,同时有0.5s-1s 的蜂鸣器的声响) ②. 如果出现如下情况:
情况一:抢答时间已到,但是没有人抢答;意味着本次抢答无效,系统短暂报警,此时将切断抢答电路,禁止选手超时抢答,时间显示为88.
情况二:如果选手在主持人按开始键之前抢答,系统报警,LCD 同时显示违规选手的号码和倒计时时间为FF 。
情况三:如果有一选手在抢答时间内先按下抢答键,此时倒计时结束(定时器停止工作),LCD 同时显示抢答者的号码和抢答时刻的时间,直至回答完毕后主持人进行系统清零。
③. 不限制使用LCD 的类型
④. 在满足以上要求的基础上,可以加以创新。
1)回答和抢答时间倒计时五秒的时候,都会有报警提醒。
2) 开始抢答之前,电子显示屏一直显示F 88 。
3) 除主持人具有开始、清零开关以外,还具有一个总清零开关。
第二章 方案选择及设计思路与原理方框图
为了使设计更具有针对性,使用性更强,我们对其精心的设计,在设计过程中我们想到了很多的设计方案。
2.1设计思路
设计一个六路电子抢答器,可同时提供六名选手或者代表队参加比赛,他们的编号分别为1.2.3.4.5.6各用一个抢答器按钮,按钮的编号与选手的编号相对应,分别设为S1.S2.S3.S4.S5.S6. 节目主持人设置一个控制开关,用来控制系统的清零和抢答器的开始,并且抢答器具有数据锁存和显示功能。同时主持人可以根据要求设置抢答时间和回答时间,抢答未开始选手抢答则警报并显示选手号码和FF 。抢答开始时若有选手按抢答按钮,编号立即锁存,并在LED 数码管上显示出选手的编号,并且需在规定时间内回答出问题,倒计时计数五秒会有提示音。此外,要封锁输入电路,禁止其他选手抢答,优先抢答的选手的编号一直保持到主持人将系统清零结束为止。
2.2总体方框图
多路抢答器系统的整个系统从大体来看可以分为键盘抢答输入,系统处理,LED 电子显示屏显示,报警电路等。
2.3抢答器的工作流程
第三章 系统硬件总体设计
3.1 中央控制器
AT89C51是由美国Atmel 公司生产的至今世界上最新型的高性能八位单片机。该芯片采用FLASH 存储技术,内部具有2kb 字节快闪存储器,采用DIP 封装,是目前在中小系统中应用最为普及的单片机。 系统控制芯片采用MCS51系列单片机AT89C51,AT89C51 是一个低电压,高性能CMOS 8位单片机,片内含8k bytes 的可反复擦写的Flash 只读程序存储器和256 bytes的随机存取数据存储器(RAM ),器件采用ATMEL 公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash 存储单元。
3.1.1MCS51单片机的内部基本结构由以下部分组成:
1) 一个8 位的微处理器(CPU )。
2) 片内数据存储器RAM (128B ),用以存放可以读写的数据,如运算的中间结果、最终结果以及状态标志位等。
3) 片内程序存储器ROM (4KB ),用以存放已编制好的程序及程序中用到的常数。
4) 四个8 位并行I /O 接口P0~P3,每个口既可以用作输入,也可以用作输出使用。
5) 两个定时器/计数器,每个定时器/计数器都可以设置成计数方式,用以对外部事件进行计数,也可以设置成定时方式,并可以根据计数或定时的结果实现计算机控制。
6) 五个中断源的中断控制系统,提供两个中断优先级,能实现两
级中断嵌套。
7) 一个全双工串行异步通信接口,用于实现单片机之间或单机与微机之间的串行通信。
8) 片内振荡器和时钟产生电路,但需要外接石英晶体和微调电容,最高允许振荡频率为12MHz 。
单片机内部各功能部件通过内部总线连接,传送地址信息、数据信息和控制信息,各功能部件分时使用总线,即所谓的内部单总线结构。 AT89C52与其他MCS51单片机的不同之处在于具有8KB 可反复擦写(大于1000次)Flash ROM以及3个16位可编程定时/计数器中断。可反复擦写的Flash ROM 使得单片机能反复写入程序,使用更加地方便。
3.1.2 AT89C51引脚的功能
AT89C51单片机为40引脚芯片,采用PDIP 封装形式的AT89C51 P0口为8位双向I/O口,可被定义为数据或地址的低八位,在FIASH 编程时,P0 口作为原码输入口,当FIASH 进行校验时,P0输出原码,此时P0外部必须接上拉电阻;
P1口为8位双向I/O口,在FLASH 编程和校验时,P1口作为低八位地址接收;P2口为8位双向I/O口,可被定义为地址的高八位,在FLASH 编程和校验时接收高八位地址信号和控制信号; P3口为8位双向I/O口,同时P3口具有第二功能;
VCC ——工作电压+5V;
GND ——接地;
RST ——复位输入;
ALE/PROG——地址锁存允许信号输出;
/PSEN——程序存储器允许信号输出;
/EA/VPP——外部访问信号输入;
XTAL1——片内振荡器输入端;
XTAL2——片内振荡器输出端;
RXD ——串行口输入;
TXD ——串行口输出
3.2译码驱动显示电路设计
为了将编码显示出来,需用显示译码电路将计数器的输出数码转换为数码显示器件所需要的输出逻辑和一定的电平,这种译码器通常称为7段译码显示驱动器。
显示器件采用7段数码管显示电路。7段数码管显示电路有共阳显示模式和共阴显示模式两种。
如果7段数码管选用共阳显示模式,那就需要选用如74LS47等译码驱动集成电路。连接时将7段数码管的abcdefg7个发光二极管的正极连接在一起并接到5V 电源上,而把其余的7个负极接到74LS47相应的abcdefg 输出端上。
如果7段数码管选用共阴显示模式,那就是把7段数码管的
abcdefg 7个发光二极管的负极连接在一起并接地;同它们的7个正极分别接到译码驱动电路的相对应的驱动端上,并且由译码驱动电路输出高电平时,点亮7段数码管的相应笔划,如果要显示数字1,那
么译码驱动电路输出段bc 为高电平,其他段扫描输出端为低电平。配接共阴显示模式数码管的译码驱动集成电路有74LS48、CD4511等。 本设计拟采用共阴显示模式的7段数码管显示电路,所以选择CD4511。CD4511功能表如表2.1所示
:
CD4511常用于驱动共阴极LED 数码管显示器的 BCD 码—七段码译码器。具有BCD 转换、消隐和锁存控制、七段译码及驱动功能的CMOS 电路,能提供较大的拉电流,可直接驱动LED 显示器,方便地将信号传送给7段数码显示管。
但HCF4511与LED 数码显示器件连接时要加限流电阻,否则通电后会把7段译码管烧坏。通常数码管的工作电流选取在10-20mA ,电流太小了,7段数码管不太亮;电流过大,7段数码管容易损坏。限流电阻的选取为: R = 5 - 发光二极管的工作电压/发光二极管的工作电流。一般发光二极管的工作电压在1.8V--2.2V 。理论上我暂时按照3V/10m =300Ω来设计,实际阻值的大小,可以在调试中再调整
在六路电子抢答器的设计中,我们选择了7SEG-MPX4-CC (即四个共阴二极管显示器),其1、2、3、4是阴公共端,分别对应4个共阴二极管显示器;ABCDEFG DP表示共阴八段数码管,高电平时点亮,DP 表示小数点。如下图1所示为六路电子抢答器显示电路连接方式。
图1
其中P0口控制八段数码管所要显示的内容,即P0口输出段选信号;P2口的0、1、2 I/O口分别控制显示器的第1、3、4位,即P2口输出位选信号;排阻RP2作为上拉电阻使用。P0口作为I/O口输出的时候时 输出低电平为0 输出高电平,给所接的负载提供电流,因此必须接上拉电阻(电阻连接到VCC ),由电源通过这个上拉电阻给负载提供电流。而其它三个端口芯片内部已经设置有上拉功能,无需外接上拉电阻。
3.3时钟电路设计
时钟电路用于产生MCS-51单片机工作时所必须的时钟控制信号。其内部电路在时钟信号控制下,严格地按时序执行指令进行工作。在执行指令时,CPU 首先要到程序存储器中取出需要执行的指令操作码,然后译码,并由时序电路产生一系列控制信号去完成指令所规定操作。
本设计采用12MHz 晶振和两个30uF 瓷片电容,他们构成一个稳定的自激振荡器。该电容的大小影响振荡器频率的高低、振荡器的稳定性和起振的快速性。为单片机提供标准时钟。其中两个瓷片电容起微调作用。如图2:
图
2
3.4复位电路设计
复位引脚RST 通过一个斯密特触发器与复位电路相连,斯密特触发器用来抑制噪声,在每个机器周期的S5P2,斯密特触发器的输出电平由复位电路采样一次,然后才能得到内部复位操作所需要的信号。
复位电路通常采用上电自动复位和按钮复位两种方式。
该设计采用加电直接复位,复位电容采用1nF ,电阻1000欧。加电瞬间,RES 管脚为高电平。通过电阻回路放电,使电压逐渐降为零,从而实现了复位功能。如图3:
图3
3.5 抢答电路设计
抢答电路使用了AT89C51的P3口,由6位选手分别控制6个按键来实现抢答,P3口的0、1、2、3、4、5分别接1号、2号、3号、
4号、5号、6号选手,用于选手进行抢答。如下图4所示为六路电子抢答器抢答电路。
图4
3.6 音乐电路设计
P1.7接蜂鸣器电路的三极管基极,当P1.7为高电平时三极管导通,蜂鸣器工作发声 原理如图
5
图5
3.7主持人控制电路设计
在六路电子抢答器的设计中,控制电路使用了AT89C51的P0口,由主持人控制按键实现相应的功能。P1.0接“系统清零”按钮,用于主持人进行复位清零;P1.1、P1.2分别接“抢答时间+1”、 “抢答时间-1”按钮,用于主持人对抢答时间进行加1、减1;P1.3、P1.4分别接“答题时间+1”、“答题时间-1”按钮,用于主持人对答题时间进行加1、减1;P1.5接“开始抢答按钮”,用于主持人控制抢答的开始。原理图如下图6
图6
第四章 Proteus系统仿真
4.1 六路抢答器系统供电,系统自动清零LED 显示屏显示F FF, 此时p1.7口低电平三极管基级处于低电平,蜂鸣器不工作状态。
4.2若主持人还未按下开始抢答键,就有选手抢答(例如六号选手抢答),则系统锁定六号。在LED 显示屏上显示6 FF 并且蜂鸣器一直处于报警状态,只有当主持人按下复位键,系统才清零
4.3主持人正常按下开始键,进入30s 抢答时间若此期间无人抢答,倒计时5s 的时候,每隔一秒蜂鸣器报警一次,时间结束LED 显示F 88
4.4在开始抢答30s 内,若5号选手抢答则系统锁定5号,开始进入60s 回答时间。LED 显示5 60 ;蜂鸣器三极管基级高电平发短暂声,直到60s 回答时间结束系统显示5 88 倒计时5s 同时也有蜂鸣器提醒
4.5在任何情况下主持人可按下系统清零按键对系统进行清零,以恢复到系统通电时的初始状态,此时LCD 显示
F FF
4.6抢答时间+ 抢答时间— 范围(1-99s )
4.7回答时间+ 回答时间—(1-99s )
第五章 程序设计
#include
#define uchar unsigned char
#define uint unsigned int
sbit beep=P1^7;
sbit key1=P1^0; //系统清零
sbit key2=P1^1; //抢答时间+
sbit key3=P1^2; //抢答时间-
sbit key4=P1^3; // 答题时间+
sbit key5=P1^4; // 答题时间-
sbit key6=P1^5; //系统开始
uchar code table[13] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0xf1,0x01,0x08}; uchar temp1=30,temp2=60; //temp1为抢答时间,tmep2为答题时间
uchar num1,num2,count,flag=0;
/******************************************************************** * 名称 : Delay_1ms()
* 功能 : 延时子程序,延时时间为 1ms * x
* 输入 : x (延时一毫秒的个数)
* 输出 : 无
***********************************************************************/ void Delay(uint i)
{
uchar x,j;
for(j=0;j
for(x=0;x
}
void Delay_xiaodou() //按键消抖函数
{
uchar i=70;
while(i--)
{
P0 = 0;
P2 = 0xfe; //选择P2.0位数码管点亮
P0 = table[num1]; //赋值段码给P0口
Delay(2); //延时0.002秒
P0 = 0;
P2 = 0xfd; //选择P2.1位数码管点亮
P0 = table[num2/10]; //赋值段码给P0口
Delay(2); //延时0.002秒
P0 = 0;
P2 = 0xfb; //选择P2.2位数码管点亮
P0 = table[num2%10]; //赋值段码给P0口
Delay(2); //延时0.002秒
}
}
void dispaly()
{
P0 = 0;
P2 = 0xfe; //选择P2.0位数码管点亮
P0 = table[num1]; //赋值段码给P0口
Delay(2); //延时0.002秒
P0 = 0;
P2 = 0xfd; //选择P2.1位数码管点亮
if(num2==100)
P0 = table[10]; //赋值段码给P0口
else
P0 = table[num2/10]; //赋值段码给P0口
Delay(2); //延时0.002秒
P0 = 0;
P2 = 0xfb; //选择P2.2位数码管点亮
if(num2==100)
P0 = table[10]; //赋值段码给P0口
else
P0 = table[num2%10]; //赋值段码给P0口
Delay(2); //延时0.002秒
}
void key()
{
if(key1==0)
{
num1=10;
num2=100; //时间初始化
TR0=0;
count=0;
flag=0;
beep=0;
} if(key2==0) { if(temp1>=1&&temp11&&temp1=1&&temp21&&temp2
Delay_xiaodou();//按键消抖
}
if(key6==0)
{
TR0=1;
beep=1;
num1=10;
num2=temp1; //时间初始化
count=0;
flag=0;
}
}
void var() //数据处理
{
if(num2==0)
{
TR0=0;
num2=88;
beep=1;
Delay_xiaodou();
beep=0;
}
}
void key_qiangda()
{
if(P3!=0XFF&&flag==0) //如果有按键按下
{
if(TR0==0) //未开中断,即未开始抢答
{
num2=100;
switch(P3)
{
case 0xfe:num1=1;break;
case 0xfd:num1=2;break;
case 0xfb:num1=3;break;
case 0xf7:num1=4;break;
case 0xef:num1=5;break;
case 0xdf:num1=6;break;
}
flag=1;
beep=1;
}
else //打开中断,即开始抢答
if(P3!=0XFF&&flag==0)
{
num2=temp2;
count=0;
switch(P3)
{
case 0xfe:num1=1;break;
case 0xfd:num1=2;break;
case 0xfb:num1=3;break;
case 0xf7:num1=4;break;
case 0xef:num1=5;break;
case 0xdf:num1=6;break;
}
flag=1;
beep=1;
}
}
}
void Main(void)
{
beep=0;
num2=100;
num1=10;
TMOD=0X01;
EA=1;
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
ET0=1;
while(1)
{
dispaly();
key();//主持人按键调整和开始部分
key_qiangda();//选手抢答按键部分
var();
}
}
void time0()interrupt 1
{
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
count++;
if(num2
beep=1;
if(count==20)
{
beep=0;
count=0;
num2--;
}
}
第六章 课程设计总结
这次单片机课程设计过程中自己从中收获颇多,一开始老师说软件要自己学会用,自己感到一种茫然无助的感觉,但是当自己静下心来学习之后,感觉正像老师说的对我们严格也是对自己的锻炼。 虽然自己感觉单片机方面不是十分擅长,但是通过翻阅课本,查阅资料,在老师、学长还有周边的同学帮助下自己一点点进步,终于完成了自己的任务。
书山有路勤为径,学海无涯苦作舟。课程设计是对我们专业知识的一次综合实践运用,使我们迈向社会,从事职业工作一个必不可少的过程。通过这次单片机课程设计我深深地懂得了“千里之行,始于足下”的真正含义。以后不管在什么方面都需要稳打稳扎,脚踏实地,这要才能创造属于自己的价值
第七章 参考文献
【1】. 王贤勇,赵传申主编 《单片机原理与接口技术》 清华大学出版社 2010.3
【2】. 张毅刚,刘杰主编 《MCS-51系列单片机原理及应用》 哈尔滨工业大学出版社
【3】马德骏 张建宏 汤练兵 主编 《c 语言程序设计》 科学出版社
附件1:
课 程 设 计
题 目
学 院 专 业 班 级
姓 名 指导教师
六路电子抢答器 机电工程学院 机械工程及其自动化 机自1205 于永杰
尹海斌
2015 年 1 月 8 日
单片机课程设计任务书
目录
第一章 选题背景 ———————————————— 4
1.1概述 ——————————————————— 4
1.2选题的目的和意义 ————————————— 4
1.3抢答器的设计要求————————————— 4
第二章 方案选择及设计思路与原理方框图————— 5
2.1设计思路————————————————— 6
2.2总体方框图———————————————— 6
2.3抢答器的工作流程————————————— 7
第三章 系统硬件总体设计 ———————————— 8
3.1 中央控制器 ——————————————— 8
3.2译码驱动显示电路设计——————————— 10
3.3时钟电路设计——————————————— 13
3.4复位电路设计——————————————— 14
3.5抢答电路设计——————————————— 14
3.6音乐电路设计——————————————— 15
3.7主持人控制电路设计———————————— 16
第四章 Proteus系统仿真———————————— 17
第五章 程序设计———————————————— 22
第六章 课程设计总结—————————————— 28
第七章 参考文献———————————————— 28
第一章 选题背景
1.1概述
抢答器是一种应用非常广泛的设备,在各种竞赛、抢答场合中,它能迅速、客观地分辨出最先获得发言权的选手。现在大多数抢答器均使用单片机和数字集成电路,并增加了许多新功能,如选手号码显示、抢按报警、选手得分等功能。
本课题利用AT89C51单片机及外围接口实现的抢答系统,利用单片机的定时/计数器定时和计数的原理使得系统能够正确地进行计时同时使LED 显示屏能够正确的显示时间和选手的号码。用开关做键盘输出,扬声器发出提示。
1.2选题的目的和意义
①、通过单片机课程设计,熟练掌握编程方法,将单片机理论知识与实践相结合。
②、通过六路电子抢答器控制系统的设计,掌握定时/计数器的使用方法,和简单程序的编写,提高实践能力。
③、初步掌握多功能抢答器的调整及测试方法。提高动手能力和排除故障的能力。
1.3抢答器的设计要求
①. 该抢答器具有控制系统清零、控制抢答器开始,便于主持人控制现场时间(例如抢答时间可以设置为15s ,当主持人按下开始键时时间进入倒计时,在LCD 上显示,同时有0.5s-1s 的蜂鸣器的声响) ②. 如果出现如下情况:
情况一:抢答时间已到,但是没有人抢答;意味着本次抢答无效,系统短暂报警,此时将切断抢答电路,禁止选手超时抢答,时间显示为88.
情况二:如果选手在主持人按开始键之前抢答,系统报警,LCD 同时显示违规选手的号码和倒计时时间为FF 。
情况三:如果有一选手在抢答时间内先按下抢答键,此时倒计时结束(定时器停止工作),LCD 同时显示抢答者的号码和抢答时刻的时间,直至回答完毕后主持人进行系统清零。
③. 不限制使用LCD 的类型
④. 在满足以上要求的基础上,可以加以创新。
1)回答和抢答时间倒计时五秒的时候,都会有报警提醒。
2) 开始抢答之前,电子显示屏一直显示F 88 。
3) 除主持人具有开始、清零开关以外,还具有一个总清零开关。
第二章 方案选择及设计思路与原理方框图
为了使设计更具有针对性,使用性更强,我们对其精心的设计,在设计过程中我们想到了很多的设计方案。
2.1设计思路
设计一个六路电子抢答器,可同时提供六名选手或者代表队参加比赛,他们的编号分别为1.2.3.4.5.6各用一个抢答器按钮,按钮的编号与选手的编号相对应,分别设为S1.S2.S3.S4.S5.S6. 节目主持人设置一个控制开关,用来控制系统的清零和抢答器的开始,并且抢答器具有数据锁存和显示功能。同时主持人可以根据要求设置抢答时间和回答时间,抢答未开始选手抢答则警报并显示选手号码和FF 。抢答开始时若有选手按抢答按钮,编号立即锁存,并在LED 数码管上显示出选手的编号,并且需在规定时间内回答出问题,倒计时计数五秒会有提示音。此外,要封锁输入电路,禁止其他选手抢答,优先抢答的选手的编号一直保持到主持人将系统清零结束为止。
2.2总体方框图
多路抢答器系统的整个系统从大体来看可以分为键盘抢答输入,系统处理,LED 电子显示屏显示,报警电路等。
2.3抢答器的工作流程
第三章 系统硬件总体设计
3.1 中央控制器
AT89C51是由美国Atmel 公司生产的至今世界上最新型的高性能八位单片机。该芯片采用FLASH 存储技术,内部具有2kb 字节快闪存储器,采用DIP 封装,是目前在中小系统中应用最为普及的单片机。 系统控制芯片采用MCS51系列单片机AT89C51,AT89C51 是一个低电压,高性能CMOS 8位单片机,片内含8k bytes 的可反复擦写的Flash 只读程序存储器和256 bytes的随机存取数据存储器(RAM ),器件采用ATMEL 公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash 存储单元。
3.1.1MCS51单片机的内部基本结构由以下部分组成:
1) 一个8 位的微处理器(CPU )。
2) 片内数据存储器RAM (128B ),用以存放可以读写的数据,如运算的中间结果、最终结果以及状态标志位等。
3) 片内程序存储器ROM (4KB ),用以存放已编制好的程序及程序中用到的常数。
4) 四个8 位并行I /O 接口P0~P3,每个口既可以用作输入,也可以用作输出使用。
5) 两个定时器/计数器,每个定时器/计数器都可以设置成计数方式,用以对外部事件进行计数,也可以设置成定时方式,并可以根据计数或定时的结果实现计算机控制。
6) 五个中断源的中断控制系统,提供两个中断优先级,能实现两
级中断嵌套。
7) 一个全双工串行异步通信接口,用于实现单片机之间或单机与微机之间的串行通信。
8) 片内振荡器和时钟产生电路,但需要外接石英晶体和微调电容,最高允许振荡频率为12MHz 。
单片机内部各功能部件通过内部总线连接,传送地址信息、数据信息和控制信息,各功能部件分时使用总线,即所谓的内部单总线结构。 AT89C52与其他MCS51单片机的不同之处在于具有8KB 可反复擦写(大于1000次)Flash ROM以及3个16位可编程定时/计数器中断。可反复擦写的Flash ROM 使得单片机能反复写入程序,使用更加地方便。
3.1.2 AT89C51引脚的功能
AT89C51单片机为40引脚芯片,采用PDIP 封装形式的AT89C51 P0口为8位双向I/O口,可被定义为数据或地址的低八位,在FIASH 编程时,P0 口作为原码输入口,当FIASH 进行校验时,P0输出原码,此时P0外部必须接上拉电阻;
P1口为8位双向I/O口,在FLASH 编程和校验时,P1口作为低八位地址接收;P2口为8位双向I/O口,可被定义为地址的高八位,在FLASH 编程和校验时接收高八位地址信号和控制信号; P3口为8位双向I/O口,同时P3口具有第二功能;
VCC ——工作电压+5V;
GND ——接地;
RST ——复位输入;
ALE/PROG——地址锁存允许信号输出;
/PSEN——程序存储器允许信号输出;
/EA/VPP——外部访问信号输入;
XTAL1——片内振荡器输入端;
XTAL2——片内振荡器输出端;
RXD ——串行口输入;
TXD ——串行口输出
3.2译码驱动显示电路设计
为了将编码显示出来,需用显示译码电路将计数器的输出数码转换为数码显示器件所需要的输出逻辑和一定的电平,这种译码器通常称为7段译码显示驱动器。
显示器件采用7段数码管显示电路。7段数码管显示电路有共阳显示模式和共阴显示模式两种。
如果7段数码管选用共阳显示模式,那就需要选用如74LS47等译码驱动集成电路。连接时将7段数码管的abcdefg7个发光二极管的正极连接在一起并接到5V 电源上,而把其余的7个负极接到74LS47相应的abcdefg 输出端上。
如果7段数码管选用共阴显示模式,那就是把7段数码管的
abcdefg 7个发光二极管的负极连接在一起并接地;同它们的7个正极分别接到译码驱动电路的相对应的驱动端上,并且由译码驱动电路输出高电平时,点亮7段数码管的相应笔划,如果要显示数字1,那
么译码驱动电路输出段bc 为高电平,其他段扫描输出端为低电平。配接共阴显示模式数码管的译码驱动集成电路有74LS48、CD4511等。 本设计拟采用共阴显示模式的7段数码管显示电路,所以选择CD4511。CD4511功能表如表2.1所示
:
CD4511常用于驱动共阴极LED 数码管显示器的 BCD 码—七段码译码器。具有BCD 转换、消隐和锁存控制、七段译码及驱动功能的CMOS 电路,能提供较大的拉电流,可直接驱动LED 显示器,方便地将信号传送给7段数码显示管。
但HCF4511与LED 数码显示器件连接时要加限流电阻,否则通电后会把7段译码管烧坏。通常数码管的工作电流选取在10-20mA ,电流太小了,7段数码管不太亮;电流过大,7段数码管容易损坏。限流电阻的选取为: R = 5 - 发光二极管的工作电压/发光二极管的工作电流。一般发光二极管的工作电压在1.8V--2.2V 。理论上我暂时按照3V/10m =300Ω来设计,实际阻值的大小,可以在调试中再调整
在六路电子抢答器的设计中,我们选择了7SEG-MPX4-CC (即四个共阴二极管显示器),其1、2、3、4是阴公共端,分别对应4个共阴二极管显示器;ABCDEFG DP表示共阴八段数码管,高电平时点亮,DP 表示小数点。如下图1所示为六路电子抢答器显示电路连接方式。
图1
其中P0口控制八段数码管所要显示的内容,即P0口输出段选信号;P2口的0、1、2 I/O口分别控制显示器的第1、3、4位,即P2口输出位选信号;排阻RP2作为上拉电阻使用。P0口作为I/O口输出的时候时 输出低电平为0 输出高电平,给所接的负载提供电流,因此必须接上拉电阻(电阻连接到VCC ),由电源通过这个上拉电阻给负载提供电流。而其它三个端口芯片内部已经设置有上拉功能,无需外接上拉电阻。
3.3时钟电路设计
时钟电路用于产生MCS-51单片机工作时所必须的时钟控制信号。其内部电路在时钟信号控制下,严格地按时序执行指令进行工作。在执行指令时,CPU 首先要到程序存储器中取出需要执行的指令操作码,然后译码,并由时序电路产生一系列控制信号去完成指令所规定操作。
本设计采用12MHz 晶振和两个30uF 瓷片电容,他们构成一个稳定的自激振荡器。该电容的大小影响振荡器频率的高低、振荡器的稳定性和起振的快速性。为单片机提供标准时钟。其中两个瓷片电容起微调作用。如图2:
图
2
3.4复位电路设计
复位引脚RST 通过一个斯密特触发器与复位电路相连,斯密特触发器用来抑制噪声,在每个机器周期的S5P2,斯密特触发器的输出电平由复位电路采样一次,然后才能得到内部复位操作所需要的信号。
复位电路通常采用上电自动复位和按钮复位两种方式。
该设计采用加电直接复位,复位电容采用1nF ,电阻1000欧。加电瞬间,RES 管脚为高电平。通过电阻回路放电,使电压逐渐降为零,从而实现了复位功能。如图3:
图3
3.5 抢答电路设计
抢答电路使用了AT89C51的P3口,由6位选手分别控制6个按键来实现抢答,P3口的0、1、2、3、4、5分别接1号、2号、3号、
4号、5号、6号选手,用于选手进行抢答。如下图4所示为六路电子抢答器抢答电路。
图4
3.6 音乐电路设计
P1.7接蜂鸣器电路的三极管基极,当P1.7为高电平时三极管导通,蜂鸣器工作发声 原理如图
5
图5
3.7主持人控制电路设计
在六路电子抢答器的设计中,控制电路使用了AT89C51的P0口,由主持人控制按键实现相应的功能。P1.0接“系统清零”按钮,用于主持人进行复位清零;P1.1、P1.2分别接“抢答时间+1”、 “抢答时间-1”按钮,用于主持人对抢答时间进行加1、减1;P1.3、P1.4分别接“答题时间+1”、“答题时间-1”按钮,用于主持人对答题时间进行加1、减1;P1.5接“开始抢答按钮”,用于主持人控制抢答的开始。原理图如下图6
图6
第四章 Proteus系统仿真
4.1 六路抢答器系统供电,系统自动清零LED 显示屏显示F FF, 此时p1.7口低电平三极管基级处于低电平,蜂鸣器不工作状态。
4.2若主持人还未按下开始抢答键,就有选手抢答(例如六号选手抢答),则系统锁定六号。在LED 显示屏上显示6 FF 并且蜂鸣器一直处于报警状态,只有当主持人按下复位键,系统才清零
4.3主持人正常按下开始键,进入30s 抢答时间若此期间无人抢答,倒计时5s 的时候,每隔一秒蜂鸣器报警一次,时间结束LED 显示F 88
4.4在开始抢答30s 内,若5号选手抢答则系统锁定5号,开始进入60s 回答时间。LED 显示5 60 ;蜂鸣器三极管基级高电平发短暂声,直到60s 回答时间结束系统显示5 88 倒计时5s 同时也有蜂鸣器提醒
4.5在任何情况下主持人可按下系统清零按键对系统进行清零,以恢复到系统通电时的初始状态,此时LCD 显示
F FF
4.6抢答时间+ 抢答时间— 范围(1-99s )
4.7回答时间+ 回答时间—(1-99s )
第五章 程序设计
#include
#define uchar unsigned char
#define uint unsigned int
sbit beep=P1^7;
sbit key1=P1^0; //系统清零
sbit key2=P1^1; //抢答时间+
sbit key3=P1^2; //抢答时间-
sbit key4=P1^3; // 答题时间+
sbit key5=P1^4; // 答题时间-
sbit key6=P1^5; //系统开始
uchar code table[13] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0xf1,0x01,0x08}; uchar temp1=30,temp2=60; //temp1为抢答时间,tmep2为答题时间
uchar num1,num2,count,flag=0;
/******************************************************************** * 名称 : Delay_1ms()
* 功能 : 延时子程序,延时时间为 1ms * x
* 输入 : x (延时一毫秒的个数)
* 输出 : 无
***********************************************************************/ void Delay(uint i)
{
uchar x,j;
for(j=0;j
for(x=0;x
}
void Delay_xiaodou() //按键消抖函数
{
uchar i=70;
while(i--)
{
P0 = 0;
P2 = 0xfe; //选择P2.0位数码管点亮
P0 = table[num1]; //赋值段码给P0口
Delay(2); //延时0.002秒
P0 = 0;
P2 = 0xfd; //选择P2.1位数码管点亮
P0 = table[num2/10]; //赋值段码给P0口
Delay(2); //延时0.002秒
P0 = 0;
P2 = 0xfb; //选择P2.2位数码管点亮
P0 = table[num2%10]; //赋值段码给P0口
Delay(2); //延时0.002秒
}
}
void dispaly()
{
P0 = 0;
P2 = 0xfe; //选择P2.0位数码管点亮
P0 = table[num1]; //赋值段码给P0口
Delay(2); //延时0.002秒
P0 = 0;
P2 = 0xfd; //选择P2.1位数码管点亮
if(num2==100)
P0 = table[10]; //赋值段码给P0口
else
P0 = table[num2/10]; //赋值段码给P0口
Delay(2); //延时0.002秒
P0 = 0;
P2 = 0xfb; //选择P2.2位数码管点亮
if(num2==100)
P0 = table[10]; //赋值段码给P0口
else
P0 = table[num2%10]; //赋值段码给P0口
Delay(2); //延时0.002秒
}
void key()
{
if(key1==0)
{
num1=10;
num2=100; //时间初始化
TR0=0;
count=0;
flag=0;
beep=0;
} if(key2==0) { if(temp1>=1&&temp11&&temp1=1&&temp21&&temp2
Delay_xiaodou();//按键消抖
}
if(key6==0)
{
TR0=1;
beep=1;
num1=10;
num2=temp1; //时间初始化
count=0;
flag=0;
}
}
void var() //数据处理
{
if(num2==0)
{
TR0=0;
num2=88;
beep=1;
Delay_xiaodou();
beep=0;
}
}
void key_qiangda()
{
if(P3!=0XFF&&flag==0) //如果有按键按下
{
if(TR0==0) //未开中断,即未开始抢答
{
num2=100;
switch(P3)
{
case 0xfe:num1=1;break;
case 0xfd:num1=2;break;
case 0xfb:num1=3;break;
case 0xf7:num1=4;break;
case 0xef:num1=5;break;
case 0xdf:num1=6;break;
}
flag=1;
beep=1;
}
else //打开中断,即开始抢答
if(P3!=0XFF&&flag==0)
{
num2=temp2;
count=0;
switch(P3)
{
case 0xfe:num1=1;break;
case 0xfd:num1=2;break;
case 0xfb:num1=3;break;
case 0xf7:num1=4;break;
case 0xef:num1=5;break;
case 0xdf:num1=6;break;
}
flag=1;
beep=1;
}
}
}
void Main(void)
{
beep=0;
num2=100;
num1=10;
TMOD=0X01;
EA=1;
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
ET0=1;
while(1)
{
dispaly();
key();//主持人按键调整和开始部分
key_qiangda();//选手抢答按键部分
var();
}
}
void time0()interrupt 1
{
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
count++;
if(num2
beep=1;
if(count==20)
{
beep=0;
count=0;
num2--;
}
}
第六章 课程设计总结
这次单片机课程设计过程中自己从中收获颇多,一开始老师说软件要自己学会用,自己感到一种茫然无助的感觉,但是当自己静下心来学习之后,感觉正像老师说的对我们严格也是对自己的锻炼。 虽然自己感觉单片机方面不是十分擅长,但是通过翻阅课本,查阅资料,在老师、学长还有周边的同学帮助下自己一点点进步,终于完成了自己的任务。
书山有路勤为径,学海无涯苦作舟。课程设计是对我们专业知识的一次综合实践运用,使我们迈向社会,从事职业工作一个必不可少的过程。通过这次单片机课程设计我深深地懂得了“千里之行,始于足下”的真正含义。以后不管在什么方面都需要稳打稳扎,脚踏实地,这要才能创造属于自己的价值
第七章 参考文献
【1】. 王贤勇,赵传申主编 《单片机原理与接口技术》 清华大学出版社 2010.3
【2】. 张毅刚,刘杰主编 《MCS-51系列单片机原理及应用》 哈尔滨工业大学出版社
【3】马德骏 张建宏 汤练兵 主编 《c 语言程序设计》 科学出版社