1.设计目的作用
1、掌握51单片机最小系统的设计;
2、掌握硬件电路的设计方法;
3、掌握C51的编程方式。
2.设计要求
基于AT89C51单片机设计制作一个抢答器,具体要求如下:
设计一个智力竞赛抢答器,可同时共8名选手参加比赛,编号为1、2、3、4、5、6、7、8,各用一个按键。
用一个按键作为主持人总开关,用来控制系统的清零和抢答的开始。
抢答器开始后,数码管开始10秒倒计时,若有选手按动抢答按钮,在LED数码管上显示选手的编号,同时灯亮且伴随声音提示;倒计时完成后,选手不能再抢答;有人抢答成功后,要禁止其他选手抢答,同时开始显示60秒回答时间倒计时提示;最先抢答选手的编号一直保留到主持人将系统清零。
仿真图(Proteus 8.6版本)
源代码:
#include<at89x51.h>
sbit zkey=P3^5; // 主持人按键
sbit zkey1=P3^6;
sbit beep=P3^7; // 蜂鸣器
sbit led=P3^4; //指示灯
sbit shiwei=P3^0;
sbit gewei=P3^1;
sbit ge=P3^3; //数码管的位选
unsigned char code seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,
0x82,0xf8,0x80,0x90};//共阳数码管段选值
unsigned char people; // 抢答结果
unsigned char counter; // counter每100,minite加1
unsigned char second; // 秒表计数值
unsigned char time1; // 10秒倒计时
unsigned char time2; // 60秒倒计时
void delay(unsigned int z) //延时函数
{
unsigned i,j;
for(i=z;i>0;i--)
for(j=120;j>0;j--);
}
void time_display(unsigned char x)//函数功能:时间显示
{
unsigned char shi,ge;
shi=x/10;
ge=x%10;
shiwei=1;gewei=0;
P0=seg[ge];
delay(20);
shiwei=0;gewei=1;
P0=seg[shi];
delay(20);
shiwei=0;gewei=0;delay(20);
}
void xuanshou_display(unsigned char y)//函数功能:选手编号显示
{
shiwei=1;gewei=0;
P2=seg[y];
}
unsigned char keyscan() //键盘扫描函数
{
unsigned char keyvalue,temp;
keyvalue=0;
P1=0xff; //P1口8位置1,作输入
temp=P1; //读P1口,送入temp中
delay(10); //消抖
if(~(P1&temp))
{
switch(temp)
{
case 0xfe: keyvalue=1; break;
case 0xfd: keyvalue=2; break;
case 0xfb: keyvalue=3; break;
case 0xf7: keyvalue=4; break;
case 0xef: keyvalue=5; break;
case 0xdf: keyvalue=6; break;
case 0xbf: keyvalue=7; break;
case 0x7f: keyvalue=8; break;
default: keyvalue=0; break;
}
}
return keyvalue;
}
void timer_init() //定时器T0初始化
{
EA=1;
ET0=1;
TMOD=0x01; //定时器T0方式1定时
TH0=0xd8; //装入定时器定时常数,设定10ms中断一次
TL0=0xef;
}
void init() //初始化函数
{
people=0; // 抢答结果
counter=0; // counter每100,minite加1
second=0; // 秒表计数值
time1=10; // 10秒倒计时
time2=60; // 60秒倒计时
P0=seg[0];
P2=seg[0];
}
void main() //主函数
{
init();
timer_init();
led=0;
while(1)
{
if(zkey==0) //总开关第一次闭合
{
delay(10); //消抖
if(zkey==0) //总开关第一次闭合
{
second=time1;
while(second)
{
TR0=1;
time_display(second); //十秒倒计时显示
people=keyscan(); //将抢答结果送入people
while(people!= 0) //判断有按键按下
{
TR0=0; //停止10秒倒计时
led=1; //灯亮
xuanshou_display(people); //显示对应选手编号
beep=0; //蜂鸣器响
delay(2000);
beep=1;
led=0;
second=time2; //60秒倒计时
while(second)
{
TR0=1;
time_display(second);
if(zkey1==0) //总开关第二次闭合
{
delay(10); //消抖
if(zkey1==0) //总开关第二次闭合
init();
}
}
}
}
TR0=0;
people=0; //抢答结果清零,终止循环
}
}
}
}
void timer0() interrupt 1 //定时器T0中断函数
{
if(counter<100)
{
counter++;
}
else
{
counter=0;
second=second-1;
}
TH0=0xd8; //重新装载
TL0=0xef;
TR0=1;
}
元件清单
元件名称 | 型号 | 单位 | 数量 |
51最小开发板 | STC89C52 | 1 | |
AC/DC电源 | 每班5个 | ||
万用板 | 9X15cm(3连孔) | 块 | 1 |
按键开关 | 6*6*5MM/直插/4脚 | 个 | 12 |
单排插针 | 1*40P、2.54mm间距 | 根 | 1 |
电阻 | 10k/1/8W | 个 | 13 |
杜邦线 | 母对母/1P对1P/20CM/40根一排 | 排 | 半排 |
红色LED | ø5 | 个 | 1 |
排母 | 1*16、2.54mm间距 | 个 | 1 |
排阻 | 4.7K(9脚) | 个 | 1 |
三极管 | 9015 | 个 | 3 |
数码管 | 2位一体共阳 | 个 | 2 |
有源蜂鸣器 | 有源/5V/电磁式/ YHE12-05 | 个 | 1 |