八路抢答器设计.docx
《八路抢答器设计.docx》由会员分享,可在线阅读,更多相关《八路抢答器设计.docx(24页珍藏版)》请在冰豆网上搜索。
![八路抢答器设计.docx](https://file1.bdocx.com/fileroot1/2023-1/22/3e8a4347-4cd7-4f0e-9b2c-eb130635c48b/3e8a4347-4cd7-4f0e-9b2c-eb130635c48b1.gif)
八路抢答器设计
基于C51单片机的抢答器的设计
1引言2
1.80C51单片机基本工作原理3
2.51单片机外部引脚说明5
3.RST引脚7
451单片机定时/计数器基础7
2.八路抢答器的设计12
1设计要求12
2.2硬件电路图12
2.3编程和调试14
3.心得体会与总结25
3.1心得体会25
3.2从八路抢答器可以看80C51要如下特点:
26
4.参考文献26
基于C51单片机的抢答器的设计
学生姓名:
刘义冬指导老师:
周克辉
摘要本课程设计进行了C51单片机的抢答器的设计,首先介绍了抢答器的特点,其次详细分析了其原理,以8路抢答器为例,进行了抢答器电路的设计,最后在C51开发板平台上进行了软件实现,结果达到了抢答器的目标。
本次课程设计的系统开发平台为WindowsXP,课程设计软件采用的是KeiluVision2、AltiumDesigner6。
关键词仿傎;89C51;中断;定时
1引言
本次课程设计主要是解决在C51开发板平台上的抢答器的设计,加深对单片机应用的了解。
由于C51开发板平台已经为我们提供了基本的模块,所以不必设计单独模块的电路,但这要求我们要非常熟悉KeiluVision2环境。
随着生活水平的提高,大家为对智力游戏公平起见,以及在时间上争分夺秒,所以对设计的电路要求大大提高,使生活越来越充满了色彩。
1.80C51单片机基本工作原理
51单片机的内部结构框图如上图所示。
51单片机组成结构中包含运算器、控制器、片内存储器、4个I/O口、串行口、定时器/计数器、中断系统、振荡器等功能部件。
1)I/O端口
PORT0DRIVERS,PORT0LATCH端口0驱动器与锁存器
PORT1DRIVERS,PORT1LATCH端口1驱动器与锁存器
PORT2DRIVERS,PORT2LATCH端口2驱动器与锁存器
PORT3DRIVERS,PORT3LATCH端口3驱动器与锁存器
通过这些端口,数据可以输出到单片机外,也可以从单片机外输入到单片机。
2)存储器
RAM,RAMADDRREGISTER片内随机存储器与随机存储器的地址寄存器,51单片机具有128字节的片内RAM,用于保存变量、中间运算结果等,部分RAM具有位寻址能力。
FLASH片内ROM,用于保存代码等片内ROM采用FLASH存储器构成,具有ISP功能,容量随型号不同而不同,对于AT89S51单片机,ROM容量为4k。
STACKPOINTER栈指针,堆栈是保存工作现场数据、地址、指令等的寄存器,栈指针用于指向堆栈的栈顶。
3)算术与逻辑运算
BREGISTER用于乘除等操作的寄存器,常作为运算的第2操作数。
ACC累加器,大部分单操作数指令均以ACC作为其操作数,多数双操作数指令也以累加器作为第一个操作数,通常操作结果也保存在累加器中。
TMP1、TMP2暂存器,用于暂时保存数据
ALU8位算术逻辑单元ALU,用于处理各种算术运算和逻辑运算,在12MHz时钟时,多数指令的执行时间为1μs。
PSW程序状态字,用于记录与控制程序运行的的相关信息,可以位寻址。
4)指令处理
PROGRAMADDRESSREGISTER程序地址存储器
BUFFER总线缓冲器
PCINCREMENTER程序计数器加1处理
PROGRAMCOUNTER保存下一条指令的16位地址寄存器,可寻址范围为64k。
DUALDPTR双数据指针,DPTR为两个8位缓存器(DPH和DPL)组成的16位缓存器,主要功能是存储16位地址,作为存取ROM和RAM的地址指针用,读写RAM用MOVX指令,读写ROM用MOVC指令。
5)时序控制与指令寄存
TIMINGANDCONTROL定时与控制单元
INSTRUCTIONREGISTER指令寄存器
WATCHDOG看门狗
OSC时钟振荡器,与外接晶体一起组成时钟振荡器
6)ISP部分
ISPPORTISP端口,通过该端口与PC通信,实现ISP
PROGRAMLOGIC编程逻辑,控制ISP操作
2.51单片机外部引脚说明
1)主电源引脚
VCC(40脚):
接+5V电源正端。
VSS(20脚):
接+5V电源地端。
电源电压范围是4~5.5V,最高电源电压为6.6V。
任何引脚对地的电压范围是-1V~7V。
2)外接晶体引脚
石英晶体与内部的反相器组成Pierce振荡器,接线如图1-2所示。
1-1
XTAL1(19脚):
接外部石英晶体的一端,在单片机内部,它是一个反相放大器的输入端,这个放大器构成了片内振荡器。
当采用外部时钟时,该引脚作为外部振荡信号的输入端。
XTAL2(18引脚)接外部石英晶体的另外一端。
在单片机内部,它是反相放大器的输出端。
1-2
3)输入/输出引脚
(1)P0口(P0.0~P0.7)引脚39~32:
具有漏极开路结构,作为输出端使用,需要外接上拉电阻(在作为I/O口使用时,T1管夹断);
若作为输入端使用,需要先将“1”写入端口(使T2管夹断);
P0口可作为地址总线(AB0-AB7),也可作为数据总线(DB0-DB7);
P0可驱动8个LSTTL,其它P口可以驱动4个LSTLL。
(1个LSTTL负载为0.4mA)。
如1-3
1-3
3.RST引脚
该引脚为单片机的上电复位引脚,高电平有效。
当单片机电源电压达到单片机工作电压、同时单片机振荡器正常工作后,该引脚上必须持续两个机器周期的高电平,就可实现复位操作,使单片机恢复到初始状态。
如1-4
1-4
451单片机定时/计数器基础
51单片机内有两个16位定时/计数器,它们具有四种工作方式,其控制字和状态均在相应的特殊功能寄存器中,通过对控制寄存器的编程,就可方便地选择适当的/定时计数工作方式。
1.4.1定时器T0由计数器TL0(低8位)和TH0(高8位)构成,定时器T1由计数器TL1(低8位)和TH1(高8位)构成。
特殊功能寄存器TMOD控制定时寄存器的工作方式,TCON则用于控制定时器T0和T1的启动和停止计数,同时管理定时器T0和T1的溢出标志。
为使定时/计数器满足程序需要,程序开始时需对TL0、TH0、TL1和TH1进行初始化编程,以确定它们的工作方式并控制T0和T1如何工作。
框图如1-8
1-8
1)定时/计数器的方式控制寄存器TMOD,字节地址为89H,其格式如下:
GATE位:
GATE=1时,INT0引脚控制计数器0的时钟端,INT1控制计数器1的时钟端,这时,外中断引脚的高电平将引起计数器计数,计数器所计数值乘以计数时钟周期就是外中断引脚高电平的时间。
GATE=0时,计数器时钟不受外部中断引脚控制。
C/T位:
C/T=0时,计数器时钟脉冲来自经过12分频的晶体振荡器,因此时钟周期与机器周期相同。
计数器的计数值乘以时钟周期就是时间,所以C/T=0时为定时工作模式。
C/T=1时,计数器时钟脉冲来自外引脚P3_4(T0)或是P3_5(T1),在外引脚的下降沿,计数器计数,允许计数频率为晶体频率的1/24。
所以C/T=1时为计数工作模式。
M1、M0位:
是4种工作方式选择位:
2)定时器控制寄存器TCON,字节地址为88H,位地址为88H—8FH,其格式如下:
TF1位:
T1计数器溢出标志位
TF1=1时,说明计数器发生溢出,向CPU申请中断,该位在响应中断后,自动清零。
TF1=0时,说明计数器未发生溢出。
TR1位:
T1计数器激活位,软件置“1”或清“0”
TR1=1时,使计数器计数
TR1=0时,禁止计数器计数
TF0位:
T0计数器溢出标志位
TF0=1时,说明计数器发生溢出,向CPU申请中断,该位在响应中断后,自动清零。
TF0=0时,说明计数器未发生溢出。
TR0位:
T0计数器激活位,软件置“1”或清“0”
TR0=1时,使计数器计数
TR0=0时,禁止计数器计数
3)TR1、GATE1和INT1三个变量之间的关系
如1-9所示的是计数器时钟端控制信号CONTROL的逻辑图,按照该逻辑图可以得到时钟端控制信号CONTROL的逻辑表达式为:
由该表达式可以知道,TR1=1同时GATE=0时,或是TR1=1同时INT1=1时,CONTROL=1,计数器的时钟端连接时钟信号或是外输入信号T1,可以计数。
1-9
1)工作方式1
定时/计数器1的工作方式1逻辑框图如图1-9所示(定时/计数器0与定时/计数器1的情况完全一致),这时定时/计数器1为13位计数器,由TH1的全部8位和TL1的低8位构成。
定时工作模式(C/T=0):
多路开关连接时钟脉冲的12分频输出,16位计数器进行计数。
计数工作模式(C/T=1)
多路开关接通外计数引脚(T1),当外计数脉冲发生负向跳变时,计数器加1。
当TL的低8位溢出时,都会向TH进位,而全部16位计数器溢出时,则会使计数器溢出标志位TF1=1。
如1-10。
1-10
若C/T=0同时TR1=1:
若是GATE=0,则计数器对单片机时钟计数,由于时钟周期为已知,则计数值乘以时钟周期就是定时时间,也就是GATE=0期间的时间。
若是GATE=1,则信号控制计数器,在INT1=1时计数器计数,因为时钟周期已知,所以计数器的数值乘以时钟周期就是定时时间,也就是INT1=1期间的时间。
若C/T=1同时TR1=1:
若是GATE=0,则计数器对外引脚T1输入的脉冲计数,计数值是GATE=0期间的外输入脉冲数。
若是GATE=1,则信号控制计数器,在INT1=1时计数器计数,计数值INT1=1期间的外输入脉冲数。
TF1是定时/计数器的溢出标志位,溢出时TF1=1,TF1溢出中断被CPU响应时,转入中断服务时由硬件清“0”,但也可由软件查询和清“0”。
当GATE=0时,定时器/计数器的启动或停止由TR1控制,只要用软件置TR1=1,定时/计数器就开始工作;置TR1=0,定时/计数器停止工作。
当GATE=1,同时TR1=1时,定时器/计数器的启动或停止还可以由INT1控制,中断输入引脚INT1控制定时器/计数器是否工作,当INT1=1时,开始定时,INT0=0时停止定时。
定时/计数器的时钟源由C/T选择,当C/T=0时,选择时钟源,C/T=1时选择外引脚P3.4。
2.八路抢答器的设计
1设计要求
功能如下所要求:
1抢答器同时供8名选手比赛,分别用8个按钮S1,S2,S3,S4,S5,S6,S7,S8表示。
2设置一个系统清除和抢答控制开关S9,S10,该开关由主持人控制。
3抢答器判断选手和显示功能。
即选手按动按钮,并在数码管上显示,同时扬声器发出报警声响提示,同时其它选在按下按钮无效,抢答选手的编号一直保存到主持人件系统清除为止。
4抢答器具有定时抢答功能,且一次抢答时间由主持人设定(如30秒)。
当主持人启动”开始”按键后,计时器进行减计时,同时当小于5s时峰鸣器发出短暂的声响,声响持续的时间0.5秒左右。
5参赛选手在设定(60s)的时间内进行抢答,抢答有效,定时器停止工作,显示器上显示选手的编号和抢答器的时间,并保持到主持人将系统清除为止;如果选手在设定的时间内没有回答正确本次抢答无效,同时当小于5s时峰鸣器发出短暂的声响,声响持续的时间0.5秒左右。
6如果定时时间已到,无人抢答,本次抢答无效,系统报警并禁止抢答,定时器显示00。
2.2硬件电路图
由设计要求可以道要有八个输入信号、一个启动信号和一个复位信号。
同时要显示还需要三位七段LED进行显示选手号码和时间,还有报警需要一个峰鸣器,因单片机的输出口驱动能力是有限的,所以要加4PNP开关三极管做驱动电路(单片机一上电所要I/O输出都是高电平如果用NPN管相应一些电路会动作),在设计时要注意P0要接上拉电阻。
要想单片机正常工作需要满足三个条件:
1)提供电源,本电路图的电源由USB电源直接提给;2)复位电路;3)石英晶振起振产生所需要的频率。
电路图如下。
2.3编程和调试
流程图
1)根据流程图和硬件电路可以编写程序和下:
#defineuintunsignedint
ucharcodetalbe[]={
0x3F,0x06,0x5B,0x4F,
0x66,0x6D,0x7D,0x07,
0x7F,0x6F,0x00,0x7C,
0x39,0x5E,0x79,0x71};
ucharaa,sum,shi,ge,ok,haoma;
sbitdula=P2^0;
sbitwela=P2^1;
sbitstart=P3^4;
sbits1=P1^0;
sbits2=P1^1;
sbits3=P1^2;
sbits4=P1^3;
sbits5=P1^4;
sbits6=P1^5;
sbits7=P1^6;
sbits8=P1^7;
sbittemp=P2^7;
sbitret=P3^5;
//延时程序
voiddelay(uintz)
{
uintx,y;
for(x=110;x>0;x--)
for(y=z;y>0;y--);
}
//初始化程序
voidinit()
{
TMOD=0x01;
TL0=(65536-50000)%256;
TH0=(65536-50000)/256;
EA=1;
ET0=1;
//TR0=1;
sum=30;
ok=1;
haoma=10;
}
//显示程序
voiddisp()
{
shi=sum/10;
ge=sum%10;
wela=1;
P0=0xfd;
wela=0;
P0=0xff;
dula=1;
P0=talbe[ge];
dula=0;
delay(3);
wela=1;
P0=0xfe;
wela=0;
P0=0xff;
dula=1;
P0=talbe[shi];
dula=0;
delay(3);
wela=1;
P0=0x7f;
wela=0;
P0=0xff;
dula=1;
P0=talbe[haoma];
dula=0;
delay(3);
}
//键盘扫描程序
voidkey()
{
if(start==0)
{
delay(10);
if(start==0)
{
TR0=1;
while(start==0);
templay();
ok=0;
}
}
if(ok==0)
{
if(s1==0)
{
templay();
haoma=1;
TR0=0;
sum=60;
TR0=1;
ok=1;
}
}
if(ok==0)
{
if(s2==0)
{
templay();
haoma=2;
TR0=0;
sum=60;
TR0=1;
ok=1;
}
}
if(ok==0)
{
if(s3==0)
{
templay();
haoma=1;
TR0=0;
sum=60;
TR0=1;
ok=1;
}
}
if(ok==0)
{
if(s4==0)
{
templay();
haoma=2;
TR0=0;
sum=60;
TR0=1;
ok=1;
}
}
if(ok==0)
{
if(s5==0)
{
templay();
haoma=1;
TR0=0;
sum=60;
TR0=1;
ok=1;
}
}
if(ok==0)
{
if(s6==0)
{
templay();
haoma=2;
TR0=0;
sum=60;
TR0=1;
ok=1;
}
}
if(ok==0)
{
if(s7==0)
{
templay();
haoma=1;
TR0=0;
sum=60;
TR0=1;
ok=1;
}
}
if(ok==0)
{
if(s8==0)
{
templay();
haoma=2;
TR0=0;
sum=60;
TR0=1;
ok=1;
}
}
if(ret==0)
{
templay();
TR0=0;
sum=0;
haoma=10;
}
}
//峰鸣器程序
voidtemplay()
{
temp=0;
delay(20);
temp=1;
}
//定时器/计数器0中断服务程序
voidtime0()interrupt1
{
TL0=(65536-50000)%256;
TH0=(65536-50000)/256;
aa++;
}
//主程序
voidmain()
{
init();
while
(1)
{
if(aa==20)
{
aa=0;
sum--;
}
if(sum==0)
{
sum=0;
TR0=0;
}
if(sum==5)
{
templay();
}
disp();
key();
}
}
2)调试与分析:
秒表程序时要满足下列条件:
(1)设定初值;
(2)开中断(总中断和定时器中断)
(3)开计数器;
(4)设定初值;
在设计定时器程序时,往往都是忘记开计数器和中断,走的程序总是走,还有时间不准确是由于初值没有设定正确所倒至。
倒计时程序是在秒表程序的改进,只要给设定倒计时时间,它就会自动每到一秒减一。
在倒时程序中最容易出错的就是减到0的时候忘记在设定倒计时时间。
当按下启动按钮时倒计开始显示,当时间到0秒时有要重新设定倒计时间。
在按电路中总是会出现按下去时灵时不灵的现象,这是由于机械开关在接通和松时都会产生抖动,影响按钮的误动,在设计要注意消抖。
按下启动按钮开始30秒倒计时,同时判断是否有选手按下,如果有60秒倒计时,判断选手是否在设定的时间内把问题回答正确。
在调试启动和选手按钮时,要注意把选手铵钮的判断有放到启动按钮的外面,否则会出按启动按钮可以30秒倒计时,但是所要选手按钮不起作用,这是因为你把选手按钮的判断放在启动按钮里面去判断了,所以我们在写程序时要注意放到外面来判断。
当选手回答问题完时,我们要对它进行复位,等待主持人下一按下启动按钮时才可以下一次的抢答。
3.心得体会与总结
3.1心得体会
从本次设计中可以看我对一些基础知识还是不够了解,在一个是对现在的一些新的技术了解很,对C语言编程还要一些提高,所以在今后的习学中应该加强。
3.2从八路抢答器可以看80C51要如下特点:
⑴有优异的性能价格比。
⑵集成度高,体积小,可靠性好。
⑶控制能力强。
⑷低功耗,低电压,便于生产便携式产品。
⑸易扩展。
4.参考文献
[1]王幸之,钟爱琴,王雷,王闪,AT89系列单片机原理与接口技术,北京:
北京航空航天大学出版社,2004
[2]求是科技,单片机典型模块设计实例导航,北京:
人民邮电出版社,2004
[3]李广弟,朱月秀,王秀山,单片机基础(修订版)。
北京:
北京航空航天大学出版社2001
[4]LeonardSB.ElementaryCinearCircuitAnalysis.London;Holt,RinnchartAndwinstons,1981
[5]Chua.LO,DesoerCA,KuhES.LinearandNonlinearCircuits,McGraw-Hill,1987.