一、 系统设计 该抢答器系统的设计是以单片机为中心控制模块,采用模块化设计的八路抢答器,具有五个模块,分别为:按键输入模块、显示模块、时钟与复位模块、核心控制模块、报警模块。 1.1按键输入模块 按键输入模块共有14个按键,分为抢答按键和控制按键。抢答按键共有八个,分别为S0―S7,供抢答选手进行抢答使用,P2.0-P2.7口为八个按键抢答信号的输入口,低电平有效。控制按键有4个,分别为 “加时间”“减时间”“开始键”“复位键”,其对应的I∕O接口分P1.0,P1.1,P1.2和P1.3。 1.2显示模块 显示模块既可以选用液晶显示器,也可以选用数码管显示。我们采用的是液晶显示电路来抢答选手及时间。 1.3时钟与复位模块 时钟与复位模块包括时钟电路和复位电路,单片机的最小系统就是由时钟电路、复位电路、电源电路及单片机构成。单片机的时钟信号用来提供单片机片内各种操作的时间基准,单片机的时钟信号通常用两种电路形式得到:内部振荡方式和外部振荡方式。复位操作则使单片机的片内电路初始化,使单片机从一种确定的初态开始运行。根据应用的要求,复位操作通常有两种基本形式:上电复位或开关复位。当5l系列单片机的复位引脚RST(全称RESET)出现2个机器周期以上的高电平时,单片机就执行复位操作。如果RST持续为高电平,单片机就处于循环复位状态。 1.4核心控制模块 核心控制模块就是人们所谓的CPU,它是整个系统的总控制部分,本系统的核心控制模块为51系列的单片机,只有我们通过软件程序的编写,并将程序写入单片机,该系统才会正确的工作。 主控制器选择即为单片机的选择,单片机实际上就是把CPU、RAM、ROM、定时器/计数器、I/O接口电路等微型机的主要部件集成在一块芯片上,因此称之为单片机。 AT89C51单片机主要有以下部件构成:八位微处理器CPU、振荡电路、总线控制部件、中断控制部件、片内Flash存储器、片内RAM、并行I/O接口、定时器和串行I/O接口。AT89C51单片机内部由CPU、4KB的FPEROM ,128B的RAM,两个16位的定时/计数器T0和T1,4个8位的I/O端P0、P1、P2、P3等组成。单片微机内部最核心的部分是CPU,CPU按其功能可分为运算器和控制器两部分。控制器由程序计数器PC、指令储存器、指令译码器、实时控制与条件转移逻辑电路等组成。它的功能是对来自存储器中的指令进行译码,通过实时控制电路,在规定的时刻发出各种操作所需的内部和外部的控制信号,使各部分协调工作,完成指令所规定的操作。运算器由算术逻辑器部件ALU、累加器ACC、暂存器、程序状态字寄存器PSW,BCD码运算调整电路等组成。为了提高数据处理和位操作功能,片内增加了一个通用寄存器B和一些专用寄存器,还增加了位处理逻辑电路的功能。 1.5报警模块 报警电路用于报警,当遇到报警信号时,发出警报。报警模块是由一个NPN型的三极管和一个喇叭组成的。 二、系统硬件设计 2.1核心控制模块设计 单片机的最小系统就是由时钟电路、复位电路、电源电路及单片机构成。如图1。 图1
2.2按键输入模块设计 键盘在单片机应用系统中能实现向单片机输入数据、传送命令功能,是人工干预单片机的主要手段。键盘实质上是一组按键开关集合。通常键盘所用开关为机械弹性开关,均利用了机械触点的合、断作用。键的闭合与否,反映在输出电压是呈现高电平或低电平,如果高电平表示断开的话,那么低电平则表示键闭合,所以通过对电平高低状态的检测,便可确认按键按下与否。为了确保CPU对一次按键动作只确认一次按键,必须消除抖动的影响,这样才能使键盘在单片机系统中的使用得更加稳定。 抢答器的输入按钮使用常开开关。这些常开开关组成了抢答按键,硬件电路简单,在程序设计上也不复杂,只要在程序中消除在按键过程中产生的“毛刺”现象就可以了。这里采用最常用的方法即延时法,其的原理为:因为“毛刺”脉冲一般持续时间短,约为几ms,而按键的时间一般远远大于这个时间,所以当单片机检测到有按键动静后再延时一段时间(这里取10ms)后再判断此电平是否保持原状态,如果是则为有效按键,否则无效。 AT89C51单片机P2.0-P2.7端口分别与S0-S7按钮相连对应8个不同的选手的抢答按键。选手通过抢答按键进行抢答,单片机接收信号后内部进行处理并在显示屏上显示选手编号。内部进行锁存。如图2.2所示。 图2.2 2.3显示模块设计 在单片机的应用系统中,显示器是最常见的输出设备,也是人机对话必不可少的部分。显示电路运用的是LCD显示器,如图2.3.1所示 图2.3.1 引脚图如图2.3.2所示 图2.3.2 端口定义:RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。RW为读写信号线,高电平(1)时进行读操作,低电平(0)时进行写操作。E(或EN)端为使能(enable)端,高电平(1)时读取信息,负跳变时执行指令。D0~D7为8位双向数据端。VEE为液晶对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生“鬼影”,使用时通过接一个10K的电位器调整对比度。 2.4时钟电路 单片机必须在时钟的驱动下才能工作。AT89C51单片机的时钟产生方法有两种:内部时钟方式和外部时钟方式。无论何种形式,都需要外部附加电路,产生时钟脉冲。
外部时钟方式就是直接将外部的振荡脉冲通过XTALl或XTAL2接入单片机,外部时钟方式多用于多机系统,以便各个单片机能够同时工作。对外部震荡信号无特殊要求,但需保证脉冲宽度不小于20ns,且频率应低于单片机所支持的最高频率。
内部时钟方式就是利用单片机芯片内部的振荡器,通过在引脚XTALl和XTAL2两端跨接晶体振荡器,构成稳定的自激振荡器的方法,再由获得的自激振荡器发出稳定的脉冲,直接送入芯片内部的时钟电路的方式。跨接的晶体振荡器如果已经起振,则会向XTAL2引脚上输出一定幅值的正弦波。自激振荡器的频率取决于晶体振荡器的频率,常见的晶体振荡器频率有6MHz和12MHz。 本系统中采用的是内部时钟方式。时钟电路如图2.4所示。 图2.4 从时钟电路的示意图中可以看到,单片机所跨接的晶体振荡器旁边还有两个电容器C2和C3。C2和C3被称为谐振电容,主要作用有两点:一是可以促使单片机系统快速起振;二是C2、C3具有对频率进行微调作用,有利于单片机系统振荡频率的稳定,维持单片机的正常运行。谐振电容的容值选择,与所用的晶体振荡器的频率值有关。晶体振荡器的振荡频率越高,相应的谐振电容的容值也要提高。二者如果配合的好,可以发挥谐振电容的积极作用。反之,自激振荡器频率的稳定性将受到影响。经过大量的实际应用,晶体振荡器的频率与谐振电容的容值之间形成了一定的固定搭配。例如:当晶体振荡器的频率为12MHz时,谐振电容的容值一般为30pF左右。
单片机在工作时,由内部振荡器产生或由外直接输入的送至内部控制逻辑单元的时钟信号的周期称为时钟周期。其大小是时钟信号频率的倒数,常用T=1/fosc表示。图中时钟频率为12MHz,即fosc=12MHz,则时钟周期为1/12μs。此电路在加电大约延迟10ms后振荡器起振,在XTAL2引脚产生幅度为3V左右的正弦波时钟信号。
为了减小寄生电容,更好地保证振荡器稳定、可靠地工作。在设计电路板时,晶体振荡器和谐振电容的位置应尽可能地靠近单片机的XTALl和XTAL2引脚 。 2.5复位电路 使CPU进入初始状态,从0000H地址开始执行程序的过程叫系统复位。单片机本身不能自动进行复位,必须配合相应的外部复位电路才能实现。从实现系统复位的方法来看,系统复位可分为硬件复位和软件复位。
硬件复位必须通过CPU外部的硬件电路给CPU的RESET端加上足够时间的高电位才能实现。上电复位,人工按钮复位和硬件看门狗复位均为硬件复位。硬件复位后,各专用寄存器的状态均被初始化,且对片内通用寄存器的内容没有影响。
软件复位就是用一系列指令来模拟硬件复位功能,最后通过转移指令使程序从0000H地址开始执行。对各专用寄存器的复位操作是容易的,也没有必要完全模拟,可根据实际需要去主程序初始化过程中完成。而对中断激活标志的清除工作常被遗忘,因为它没有明确的位地址可供编程。有的编程人员用020000(LJMP 0000H)作为软件陷阱,认为直接转向0000H地址就完成了软件复位,就是这类错误的典型代表。软件复位是使用软件陷阱和软件看门狗后必须进行的工作,这时程序出错完全有可能发生在中断子程序中,中断激活标志已置位,它将阻止同级中断响应。由于软件看门是高级中断,它将阻止说要中断响应,由此可见清除中断激活标志的重要性。
单片机的第9脚RST为硬件复位端,只要将该端持续4个机器周期的高电平即可实现复位,复位后单片机的各状态都恢复到初始化状态,其电路图如图2.5所示。 图2.5 复位电路的原理是单片机RST引脚接收到2uS以上的电平信号,只要保证电容的充放电时间大于2uS,即可实现复位,所以电路中的电容值是可以改变的。值得注意的是,在设计当中使用到了硬件复位和软件复位两种功能,软复位实际上就是当程序执行完毕之后,将程序指针通过一条跳转指令让它跳转到程序执行的起始地址。 2.6报警模块设计 报警模块的功能是在无人抢答和阐述超时的情况下报警。具体电路如图2.6。 图2.6 端口定义:三极管是NPN型小功率三极管,基极连接单片机,发射极连接喇叭并进行驱动。 2.7总体设计图 三、系统软件设计 实验的软件设计可以分为主程序和外部中断程序部分。 主流程图: 外部中断操作流程: 
源程序:
#include<reg51.h>
#include<lcd1602.h>
sbit sjjia=P1^0; //定义时间加按钮
sbit sjjian=P1^1; //定义时间减按钮
sbit kaishi=P1^2; //定义开始按钮
sbit fuwei=P1^3; //定义复位按钮
sbit soud=P1^4; //报警按钮
sbit led_r=P1^5; //定义抢答成功指示
sbit led_y=P1^6; //定义阐述时间到指示
unsigned char num[]={'0','1','2','3','4','5','6','7','8','9'},num2;
unsigned char model,time,temp;
void init() //初始化函数
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
ET0=1;
TR0=0;
EA=1;
P1=0x0f;
model=0;
time=30;
}
void delay(unsigned char i) //延时函数
{
unsigned char j,k;
while(i--)
for(j=100;j>0;j--)
for(k=100;k>0;k--);
}
void star() //启动
{
lcd_xml(0x80);lcd_xsj(" welcome ");
delay(100);
lcd_xml(0xc0);lcd_xsj(" 8 Way Responder");
delay(80);
}
void led_num() //刷新倒计时
{
lcd_xml(0x80);lcd_xsj(" Countdown : ");
lcd_xml(0x8d);lcd_xsj2(num[time/10]);
lcd_xml(0x8e);lcd_xsj2(num[time%10]);
}
void reset() //复位
{
TR0=0;
P1=0x0f;
led_r=0;
led_y=0;
P2=0xff;
model=0;
time=10;
led_num();
lcd_xml(0xc0);lcd_xsj(" Not started ");
}
void Not_started()
{
if(sjjia==0)
{
delay(10);
if(sjjia==0)
{
time++;
if(time==100) time=0;
led_num();
}
}
if(sjjian==0)
{
delay(10);
if(sjjian==0)
{
time--;
if(time==0) time=99;
led_num();
}
}
if(kaishi==0)
{
delay(10);
if(kaishi==0)
{
model=1;
TR0=1;
lcd_xml(0xc0);lcd_xsj(" Start Responder");
soud=1;delay(10);soud=0;
}
}
}
void anjian()
完整的Word格式文档51黑下载地址:
http://www.51hei.com/bbs/dpj-180994-1.html
|