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 |
|