单片机实验路抢答器C语言版

合集下载

单片机C语言实现抢答器程序

单片机C语言实现抢答器程序
TEAM_c++; //a队举手次数+1
// }
}
void main()
{
unsigned int n; //用于控制等待时LED显示的形状
SECBOOL=15; //设置定时15s
P1=0xff; //p0口拉高
if(TIME_SWICH15==0){ //如果 15秒 按钮被按下 并且之前没有人举过手 )&&(TEAM_a==0&&TEAM_b==0)
Speed(0); //去抖
if(TIME_SWICH15==0){
D1=LED[3]; //显示1
S1=1; //用2号数码管
BELL=0; //响铃
Speed(3); //延时
BELL=1; //响铃
while(1){
if(wrong==0){ //允许答题按钮被按下
void Speed(unsigned char n){ //延时函数
unsigned char i,j,k;
for(k=0;k<n;k++)
for(i=0;i<255;i++)
for(j=0;j<255;j++);
}
void Speed1(){ //延时函数2
Speed(0); //去抖动
if(wrong==0){
KG=1; //开关被按下
break;
}
}
else
continue;
break;
}
TEAM_3=1;
BOOL=0; //
sbit TIME_SWICH30=P2^2; //连接(30秒 切换)按钮 (主持人控制)

八路抢答器-基于单片机C语言

八路抢答器-基于单片机C语言

#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit k1=P1^0;sbit k2=P1^1;sbit k3=P1^2;sbit k4=P1^3;sbit k5=P1^4;sbit k6=P1^5;sbit k7=P1^6;sbit k8=P1^7; //选手按键sbit beep=P3^6; //蜂鸣器uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77}; //0-9代码(共阴极)uchar shiwei,gewei,xuanshou,count,i,second;uchar score1,score2,score3,score4,score5,score6,score7,score8;//选手1~8的分数uint t,m,n,a,a1,a2,a3,a4,a5,a6,a7,a8;void Timer(){TMOD|=0x01;TH0=0xd8; //初值55536,计数10000次,每次1US,总计10msTL0=0xf0;IE=0x82; //这里是中断优先级控制EA=1(开总中断),ET0=1(定时器0允许中断),这里用定时器0来定时TR0=1;}void tim(void) interrupt 1 using 1 //为定时中断TR0{TH0=0xd8; //重新赋值TL0=0xf0;count++;if(count==100) //100*10ms=1秒{count=0;second--; //秒减1}}void delay(uint z) //延时函数{uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);//延时1ms}void display (uchar shiwei,gewei,xuanshou) //显示函数{P2=0xfe; //打开显示时间十位的位选低电平有效1111 1110 P0=shiwei;//显示十位delay(5);P2=0xfd; //个位位选1111 1101P0=gewei;delay(5);P2=0xf7; //选手位选1111 0111P0=xuanshou;delay(5);}void dis(void)//调用显示函数{shiwei=tab[second/10];gewei=tab[second%10];xuanshou=tab[i];display (shiwei,gewei,xuanshou);}void init() //初始化函数{P2=0x04;//0000 0100P0=0x3f;//数码管共阴0011 1111显示0t=0;beep=0;//蜂鸣器i=0;second=29;score1=60;score2=60;score3=60;score4=60;score5=60;score6=60;score7=60;score8=60;a1=1;a2=1;a3=1;a4=1;a5=1;a6=1;a7=1;a8=1;}void main()//主函数{init();//调用初始化函数if(k==1){ m=0; if(k1==0) {delay(5);if(k1==0);while(!k1);beep=1;delay(500);beep=0;} // 违规抢答显示号码报警while(t){if(m==0) //开关,保证程序只执行一次{switch(t){case 1:{TR0=0;i=1;second=score1;beep=1;delay(500);beep=0;a1=0;a2=1;a3=1;a4=1;a5=1;a6=1;a7=1;a8=1;m=1;break; //有选手抢答时显示选手号码蜂鸣器响,时间为0,t和i对应}}} }if(k2==0) {delay(5);if(k1==0);while(!k1);t=2;beep=1;delay(500);beep=0;}if(k3==0) {delay(5);if(k1==0);while(!k1);t=3;beep=1;delay(500);beep=0;}if(k4==0) {delay(5);if(k1==0);while(!k1);t=4;beep=1;delay(500);beep=0;}if(k5==0) {delay(5);if(k1==0);while(!k1);t=5;beep=1;delay(500);beep=0;}if(k6==0) {delay(5);if(k1==0);while(!k1);t=6;beep=1;delay(500);beep=0;}if(k7==0) {delay(5);if(k1==0);while(!k1);t=7;beep=1;delay(500);beep=0;}if(k8==0) {delay(5);if(k1==0);while(!k1);t=8;beep=1;delay(500);beep=0;}}if(k==0){Timer();//中断定时器打开delay(10);while(!k);while(1){dis();m=0;n=0;if (second==29){beep=1;delay(500);beep=0;}if(second==0){TR0=0;n=1;if(k1==0){delay(5);if(k1==0);while(!k1);t=1;beep=1;delay(500);beep=0;} // 违规抢答显示号码报警if(k2==0){delay(5);if(k1==0);while(!k1);t=2;beep=1;delay(500);beep=0;}if(k3==0){delay(5);if(k1==0);while(!k1);t=3;beep=1;delay(500);beep=0;}if(k4==0){delay(5);if(k1==0);while(!k1);t=4;beep=1;delay(500);beep=0;}if(k5==0){delay(5);if(k1==0);while(!k1);t=5;beep=1;delay(500);beep=0;}if(k6==0){delay(5);if(k1==0);while(!k1);t=6;beep=1;delay(500);beep=0;}if(k7==0){delay(5);if(k1==0);while(!k1);t=7;beep=1;delay(500);beep=0;}if(k8==0){delay(5);if(k1==0);while(!k1);t=8;beep=1;delay(500);beep=0;}if(k==0){beep=1;delay(500);beep=0;second=29;TR0=1;m=1;}}//如果再次按下开始按钮,蜂鸣器响0。

16路抢答器C程序

16路抢答器C程序
TR1=1;
s_flag=0;
break;
case 0x0d:
key=2;
TR0=0;
TR1=1;
s_flag=0;
break;
case 0x0b:
key=3;
{
case 0x0e:
key=4;
TR0=0;
TR1=1;
s_flag=0;
break;
case 0x0d:
key=5;
TR0=0;
TR1=1;
K_startcountflag=0;
K_timecountflag=0;
}
}
}
void Scan(void)
{
while(1)
{
P1=0xff;
K5=0;
temp=temp & 0x0f;
if(temp!=0x0f)
{
while(temp!=0x0f)
{
temp=P1;
temp=temp & 0x0f;
}
}
}
P1=0xff;
K6=0;
temp=P1;
temp=temp & 0x0f;
if(temp!=0x0f)
if(K0==0)
{
while(!K0);
TR0=1;
s=time;
tt=0;
flag=1;
s_flag=1;
b_flag=1;
key=0;
beep=1;
rled=1;
fall_flag=0; //清除违规标志位
for(i=50;i>0;i--)

8位抢答器C程序(原创)

8位抢答器C程序(原创)

#include <reg51.h>#define uchar unsigned charsbit key_tiaoshi1=P3^0;//调时加按钮sbit key_tiaoshi2=P3^2;//调时减按钮sbit key_zhuchi=P3^1; //主持人控制按钮sbit beep=P3^3; //蜂鸣sbit LED=P3^4;//LED指示灯/*sbit key_1=P1^0; //八位选手按钮sbit key_2=P1^1;sbit key_3=P1^2;sbit key_4=P1^3;sbit key_5=P1^4;sbit key_6=P1^5;sbit key_7=P1^6;sbit key_8=P1^7; *///4位8段共阴数码管0~9uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; uchar time,haoma,flag,count,m,x,a,tsbz;void keyscan(); //键盘扫描void display(); //LED显示void delay(uchar);//延时void main() //主函数{time=10; //抢答开始,倒计时10shaoma=0; //选手号显示tsbz=1; //调时间标志flag=0; //答题允许标志m=0; //产生1S的溢出标志TMOD=0x01; //定时器0工作与方式1EA=1;ET0=1;while(1){keyscan();display();}}void keyscan() //键盘扫描{ //if(key_tiaoshi1==0&&tsbz==1) //加时间{delay(8);if(key_tiaoshi1==0&&tsbz==1){ while(!key_tiaoshi1);a++;if(a==1){TR0=0;time++;flag=0;}if(a==2){TR0=0;a=0;time++;flag=0;}}}if(key_tiaoshi2==0&&tsbz==1)//减时间{delay(8);if(key_tiaoshi2==0&&tsbz==1){ while(!key_tiaoshi2);a++;if(a==1){TR0=0;time--;flag=0;}if(a==2){TR0=0;a=0;time--;}}}//if(key_zhuchi==0)//主持人按键按下{delay(8); //延时消抖if(key_zhuchi==0){while(!key_zhuchi); //按下count++;if(count==1) //主持人按一下,答题开始{ tsbz=0;flag=1;TH0=0x3c;TL0=0xb0;TR0=1;}if(count==2) //主持人按两下,30s答题倒计时{ tsbz=1;beep=1;time=30;TR0=0;flag=0;}if(count==3) //主持人按三下,答题倒计时{ tsbz=0;beep=1;TH0=0x3c;TL0=0xb0;TR0=1;flag=0;}if(count==4) //按四下,全部清零{ tsbz=1;TR0=0;haoma=0;time=10;flag=0;beep=1;LED=1;}}}if(flag==1) //允许抢答{ switch(P1) //等待按键按下{ case 0xfe:delay(8);if(P1==0xfe){flag=0;haoma=1;TR0=0;beep=0;LED=0;} break;case 0xfd:delay(8);if(P1==0xfd){flag=0;haoma=2;TR0=0;beep=0;LED=0;} break;case 0xfb:delay(8);if(P1==0xfb){flag=0;haoma=3;TR0=0;beep=0;delay(50);beep=1;} break; case 0xf7: delay(8);if(P1==0xf7) {flag=0;haoma=4;TR0=0;beep=0;LED=0;} break; case 0xef: delay(8);if(P1==0xef) {flag=0;haoma=5;TR0=0;beep=0;LED=0;} break; case 0xdf: delay(8);if(P1==0xdf) {flag=0;haoma=6;TR0=0;beep=0;LED=0;} break; case 0xbf: delay(8);if(P1==0xbf) {flag=0;haoma=7;TR0=0;beep=0;} break;case 0x7f:delay(8);if(P1==0x7f){flag=0;haoma=8;TR0=0;beep=0;LED=0;} break;}}}void display() //显示函数{ P0=table[time/10]; //计时十位显示P2=0xfe;delay(1);P2=0xff;P0=table[time%10]; //计时个位显示P2=0xfd;delay(1);P2=0xff;P0=0x49; //用来隔开时间显示和号码显示P2=0xfb;delay(1);P2=0xff;P0=table[haoma]; //选手号码显示P2=0xf7 ;delay(1);P2=0xff;}void INT_0() interrupt 1 //中断函数{TH0=0x3c; //50ms定时初值TL0=0xb0;m++;if(m==20) //产生1S的时间{m=0;time--; //倒计时}if(time==0) //没选手抢答,时间减到0 {TR0=0; //关闭定时器beep=0;//报警LED=0;flag=0; //不允许抢答}}void delay(uchar x) //延时{uchar i,j;for(i=x;i>0;i--)for(j=110;j>0;j--);}。

单片机实验8路抢答器C语言版

单片机实验8路抢答器C语言版

单片机综合实验报告题目: 8路抢答器实验班级:姓名:学号:指导老师:时间:一、实验内容:以单片机为核心,设计一个8位竞赛抢答器:同时供8名选手或8个代表队比赛,分别用8个按钮S0~S7表示。

本实验有Protues软件仿真。

分别设置一个抢答控制开关S1和复位开关S2,由主持人控制。

抢答器具有锁存与显示功能。

即选手按按钮抢答时,锁存相应的编号,并且优先抢答选手的编号一直保持显示在显示器上,直到主持人将系统复位为止。

抢答器具有定时抢答功能,且一次抢答的时间由主持人设定为30秒。

当主持人启动“开始”键后,定时器进行减计时,同时绿色LED灯亮。

二、实验电路及功能说明分别设置一个抢答控制开关S1和复位开关S2,由主持人控制。

抢答器具有锁存与显示功能。

即选手按按钮抢答时,锁存相应的编号,并且优先抢答选手的编号一直保持显示在显示器上,直到主持人将系统复位为止。

参赛选手在设定的时间内进行抢答,抢答有效,定时器停止工作,显示器上显示选手的编号和抢答的时间,并保持到主持人将系统复位为止。

复位后参赛队员可继续抢答。

如果定时时间已到,无人抢答,本次抢答无效,系统报警红色LED灯亮,并禁止抢答,定时显示器上显示00。

三、实验程序流程图:主程序;非法抢答序;抢答时间调整程序;回答时间调整程序;倒计时程序;正常抢答处理程序;犯规处理程序;显示及发声程序。

主流程图如下图所示子程序四、实验结果分析五、心得体会六、程序清单#include <reg51.h>#define uchar unsigned char#define uint unsigned intsbit wela_a=P3^0;sbit wela1=P3^1;sbit wela2=P3^7;sbit rest=P3^5;sbit host=P3^6;sbit led1=P3^4;//绿灯sbit led2=P3^3;//红灯sbit led3=P3^2;//黄灯sbit key1=P1^0;sbit key2=P1^1;sbit key3=P1^2;sbit key4=P1^3;sbit key5=P1^4;sbit key6=P1^5;sbit key7=P1^6;sbit key8=P1^7;uchar x,q,d,s,ge,t0,t1,start,flag; uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};void init();/*初始函数申明*/void display(uchar s,uchar ge,uchar a); void delay(uint z); void keyscan();void main(){init();display(s,ge,a);while(1){if(host==0) //主持人控制开关{delay(5);if(host==0){flag=1;start=1;delay(5); 延时while(!host); 检测开关}}if(rest==0) //复位{delay(5);if(rest==0){q=30;led2=1;led3=1;x=0;delay(5);start=1;delay(5);while(!rest);}}if(flag==1){if(start==0)//选手按下,倒计10秒开始 {led3=0;wela1=0;wela2=0;delay(1);TR0=0;TR1=1;display(s,ge,a);delay(1);}if(start==1)//主持人按下,倒计时30秒{led1=0;wela1=0;wela2=0;delay(1);TR0=1;TR1=0;display(s,ge,a);delay(1);keyscan();}}}}void init()/*初始化*/{t0=0;t1=0;flag=0;q=30;d=10;wela_a=0;a=0;TMOD=0x11;TH0=(65536-50000)/256;TL0=(65536-50000)%256;TH1=(65536-50000)/256;TL1=(65536-50000)%256;EA=1;ET0=1;ET1=1;TR0=0;TR1=0;}void display(uchar s,uchar ge,uchar a)/*数码管动态扫描*/{wela1=1;P0=table[ge];delay(5);wela2=1;P0=table[s];delay(5);wela_a=0;P2=table[a];delay(5);}void keyscan()/*按键扫描函数*/ {if(key1==0){delay(5);if(key1==0){a=1;P2=table[a];start=0;TR1=1;TR0=0;delay(5);while(!key1);}}if(key2==0){delay(5);if(key2==0){a=2;P2=table[a];start=0;delay(5);while(!key2);}}if(key3==0){delay(5);if(key3==0){a=3;P2=table[a]; start=0;delay(5);while(!key3);}}if(key4==0){delay(5);if(key4==0){a=4;P2=table[a]; start=0;delay(5);while(!key4);}}if(key5==0){delay(5);if(key5==0){a=5;P2=table[a]; start=0;delay(5);while(!key5);}}if(key6==0){delay(5);if(key6==0){a=6;P2=table[a]; start=0;delay(5);while(!key6);}}if(key7==0){delay(5);if(key7==0){a=7;P2=table[a]; start=0;delay(5);while(!key7);}}if(key8==0){delay(5);if(key8==0){a=8;P2=table[a];start=0;delay(5);while(!key8);}}}void delay(uint z)/*延时函数*/{uint i,j;for(i=z;i>0;i--)for(j=110;j>0;j--);}void time0() interrupt 1/*定时器0*/ {TH0=(65536-50000)/256;TL0=(65536-50000)%256;s=q/10;ge=q%10;t0++;if(t0==20){t0=0;q--;s=q/10;ge=q%10;if(q==0){while(1){q=0;a=0;led1=1;led2=0;wela1=0;wela2=0;delay(1);display(s,ge,a);}}}}void time1() interrupt 3/*定时器1*/ {TH1=(65536-50000)/256;TL1=(65536-50000)%256;s=d/10;ge=d%10;t1++;if(t1==20){t1=0;d--;s=d/10;ge=d%10;if(d==0){while(1){d=0;a=0;led1=1;led3=1;led2=0;wela1=0;wela2=0;delay(1);display(s,ge,a);}}}}//最后,给朋友们一点点提示,本程序有一点点小问题,有个中断没关,当主持人复位之后,后面的选手回答问题的时间就没有10秒了(可怜啊)。

51单片机四路抢答器PROTEUS仿真报告(含C语言程序)

51单片机四路抢答器PROTEUS仿真报告(含C语言程序)

HEFEI UNIVERSITY四路抢答器仿真设计题目四路抢答器仿真设计班级自动化(1)班成员 YCT 11050310**PT 11050310**WW 11050310**时间 2014.5.19四路抢答器仿真设计目录一、前言 (1)二、方案设计 (1)三、理论分析 (2)四、电路设计 (2)1、晶体振荡器电路 (2)2、复位电路 (3)3、按键扫描部分 (3)4、显示部分 (4)五、软件模块 (6)六、系统组装调试 (8)七、总结 (8)参考文献 (9)附录 (10)四路抢答器仿真设计一、前言本设计要求能够在主持人按下开始键后,四个参赛者开始抢按自己的按键,谁的按键先按下,谁面前的灯就会亮并且有相应的提示,当参赛者耗时太多时又会有相应的提示。

根据设计的要求,本系统采用独立式按键,通过单片机不停的扫描按键来控制LED灯和蜂鸣器,并用定时器T0来定超时的时间,当超时的时候让蜂鸣器响。

二、方案设计(1)、总体设计方案一:采用可编程I/O口扩展芯片82558255作为单片机的扩展接口能实现很多功能,但是这个系统并不复杂,用8155会浪费很多的资源,而且8255要用P0和P2端口作为地址线对它进行读写,这样不仅浪费端口还使得编程变的复杂。

从节省资源和简化编程的角度考虑,放弃了此方案。

方案二:直接采用AT89C52单片机直接用单片机不仅编程被简化,还有效的利用了各个端口。

8051单片机的资源完全够这个系统的要求。

所以最终选择了此方案。

(2)、模块方案一:采用4*4矩阵键盘此种键盘是常用的按键扫描方法,但是本系统只需要六个按键,这样就会浪费十个,而且矩阵按键扫描要送数读数,对于编程很复杂,最终放弃了此方案。

方案二:采用独立式键盘本系统只要六个按键就可以,用独立式键盘不仅节省端口还使编程变得简单。

程序只要不停的读数检查就行。

所以,最终选择此方案。

2、系统总体设计方案与实现框图采用六个独立式的键盘作为按键输入,当在开始后有按键按下时,就会有对应于这个按键的灯亮并且蜂鸣器响一声,其它按键再按也无效。

单片机抢答器实验报告(2篇)

单片机抢答器实验报告(2篇)

单片机抢答器实验报告(2篇)以下是网友分享的关于单片机抢答器实验报告的资料2篇,希望对您有所帮助,就爱阅读感谢您的支持。

篇一:单片机抢答器实验报告单片机八路抢答器实验报告一实验任务1. 设计一个竞赛抢答器,可同时供8名选手或者8个代表队参加比赛,他们的编号分别是1、2、3、4、5、6、7、8,各用一个抢答器的按钮,按钮的编号与选手的编号相对应。

2. 给节目主持人设计一个控制开关,用来控制系统的清零和抢答开始。

3.抢答器具有数据显示,声音提示的功能。

二.源程序(1)头文件#include#include#include#include#define uint unsigned int#define uchar unsigned char//-------------------------------------------------------------------------------------void show(); //液晶显示程序//-------------------------------------------------------------------------------------//12864液晶显示部分子程序模块//-------------------------------------------------------------------------------------sbit LCD_RS = P2 ; //寄存器输入sbit LCD_RW = P2; //液晶读/写控制sbit LCD_EN = P2; //液晶使能控制sbit LCD_PSB = P2;sbit SW1 = P1 ;sbit SW2 = P1;sbit SW3 = P1;sbit SW4 = P1;sbit SW5 = P1;sbit SW6 = P1;sbit SW7 = P1;sbit SW8 = P1;sbit beep = P3;#define LCD_data P0//sbit busy=P0; //lcd busy bitvoid lcd_xieping0(uchar x,uchar y,uchar date); void lcd_xieping(uchar x,uchar y,uchar *str); void chn_disp0(uchar code *chn);void img_disp(uchar code *img);void lcd_xieping1(uchar x,uchar y,uchar *str); void lcd_init();void write_cmd(uchar cmd); void delay_ms1(uint z);void delay_ms(uint z);void dingding(int a);//void Init_Timer0(void);void clr(void);extern unsigned char mmm[8][9]; char keynumber();(2)显示部分的程序#include “head.h”unsigned char mmm[8][9];void delay_ms(uint z)//长延时{uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void delay_ms1(uint z)//长延时{uint x,y;for(x=z;x>0;x--)for(y=10;y>0;y--);}//-------------------------------------------------------------------------------------// 液晶显示部分//-------------------------------------------------------------------------------------void write_cmd(uchar cmd){LCD_RS = 0;LCD_RW = 0;LCD_EN = 0;P0 = cmd;delay_ms1(1);LCD_EN = 1;delay_ms1(1);LCD_EN = 0;}void write_dat(uchar dat){LCD_RS = 1;LCD_RW = 0;LCD_EN = 0;P0 = dat;delay_ms1(1);LCD_EN = 1;delay_ms1(1);LCD_EN = 0;}void lcd_xieping0(uchar x,uchar y,uchar date) {switch(x){case 0: write_cmd(0x80+y); break;case 1: write_cmd(0x90+y); break;case 2: write_cmd(0x88+y); break;case 3: write_cmd(0x98+y); break;}write_dat(date);}void lcd_xieping(uchar x,uchar y,uchar *str) {switch(x){case 0: write_cmd(0x80+y); break;case 1: write_cmd(0x90+y); break;case 2: write_cmd(0x88+y); break;case 3: write_cmd(0x98+y); break;}while (*str){write_dat(*str);str++;}}void lcd_xieping1(uchar x,uchar y,uchar *str) {switch(x){case 0: write_cmd(0x84+y); break;case 1: write_cmd(0x94+y); break;case 2: write_cmd(0x8C+y); break; case 3: write_cmd(0x9C+y); break; }while (*str){write_dat(*str);str++;}}void lcd_init(){LCD_PSB = 1; //并口方式write_cmd(0x30); //基本指令操作delay_ms(5);write_cmd(0x0C); //显示开,关光标delay_ms(5);write_cmd(0x01); //清除显示内容delay_ms(5);}void chn_disp0(uchar code *chn) {uchar i,j;write_cmd(0x30); //void write_cmd(uchar cmd) write_cmd(0x84);j=0;for(i=0;iwrite_dat(chn[j*16+i]);write_cmd(0x8c);j=1;for(i=0;iwrite_dat(chn[j*16+i]);}void show(){lcd_xieping(0,0,mmm[0]);lcd_xieping(0,4,mmm[1]);lcd_xieping(1,0,mmm[2]);lcd_xieping(1,4,mmm[3]);lcd_xieping(2,0,mmm[4]);lcd_xieping(2,4,mmm[5]);lcd_xieping(3,0,mmm[6]);lcd_xieping(3,4,mmm[7]);}(3)抢答器:#include “head.h”unsigned int ms,i=0;//定义全局变量bit FLag=0;//定义停止,计时标志char yy[8]={0,0,0,0,0,0,0,0};void main(){unsigned char num=0,k,j,temp;EX0=1; //外部中断0开IT0=1; //IT1=0表示边沿触发EX1=1; //外部中断1开IT1=1; //IT1=1表示边沿触发Init_Timer0();lcd_init();for(k=0;kfor(j=0;jmmm[k][j]=0;//mmm[0][0]=…0‟;mmm[1][0]=…0‟;mmm[2][0]=…0‟;mmm[3][0]=…0‟;mmm[4][0]=…0‟;mmm[5][ 0]=…0‟;mmm[6][0]=…0‟;mmm[7][0]=…0‟;while(1){temp= keynumber();if(temp){mmm[i][0]=temp+‟0‟;mmm[i][1]=…:‟;mmm[i][2]= ms/1000+‟0‟;mmm[i][3]=ms%1000/100+‟0‟;mmm[i][4]=ms%100/10+‟0‟;mmm[i][5]=ms%10+‟0‟;mmm[i][6]=…m‟;mmm[i][7]=…s‟;mmm[i][8]=…\0‟;show();i++;}show();}}/*------------------------------------------------定时器初始化子程序------------------------------------------------*/ void Init_Timer0(void){TMOD |= 0x01;EA=1;ET0=1;TR0=1;}/*------------------------------------------------ 定时器中断子程序------------------------------------------------*/ void Timer0_isr(void) interrupt 1{TH0=0xFC; //重新赋值1ms TL0=0x66;if(FLag){ms++;if (ms==60000){ms=0;}}}/*------------------------------------------------ 外部中断0程序------------------------------------------------*/ void ISR_INT0(void) interrupt 0{EX0=0;dingding(50);lcd_xieping(0,2,” 可以开始抢答“); FLag=!FLag;}/*------------------------------------------------ 外部中断1程序------------------------------------------------*/ void ISR_INT1(void) interrupt 2 {if(FLag==0)//停止时才可以清零clr();}/*------------------------------------------------ 数值清零------------------------------------------------*/ void clr(void){unsigned char k,j;for(k=0;kmmm[k][j]=0;for(k=0;kms=0; //清空计时i=0;write_cmd(0x01); //清屏}char keynumber(){if((!SW1)&&(!yy[0])){delay_ms1(20);if((!SW1)&&(!yy[0])) {yy[0]=1;return 1;}}if((!SW2)&&(!yy[1])){delay_ms1(20);if(!SW2){yy[1]=1; return 2; } } if((!SW3)&&(!yy[2])) { delay_ms1(20); if(!SW3) { yy[2]=1; return 3; } } if((!SW4)&&(!yy[3])) { delay_ms1(20); if(!SW4) { yy[3]=1; return 4; } } if((!SW5)&&(!yy[4])) { delay_ms1(20); if(!SW5){ yy[4]=1; return 5; } } if((!SW6)&&(!yy[5])) { delay_ms1(20); if(!SW6) { yy[5]=1; return 6; } } if((!SW7)&&(!yy[6])) { delay_ms1(20); if(!SW7){yy[6]=1; return 7; }}if((!SW8)&&(!yy[7])) {delay_ms1(20); if(!SW8) {yy[7]=1; return 8; }}return 0;}void dingding(int a) {int k;for(k=0;kbeep=0;delay_ms(1); beep=1; }}篇二:单片机抢答器实验报告实习(设计) 报告姓名班级学号实习(设计) 科目基于51单片机的五路抢答器实习(设计) 地点实习(设计) 时间电气工程及自动化学院School of Electrical Engineering & Automation说明:(1)本日志用于记录实习(设计)过程中的各项活动内容,要求学生必须填写具体、齐全、工整。

基于单片机的八路抢答器的设计(C语言版)

基于单片机的八路抢答器的设计(C语言版)

毕业论文基于单片机的8路抢答器专业院系: 信息工程系班级名称: 计算机硬件与外设****: *******: ***完成时间: 2011年12月28日湖南铁道职业技术学院信息工程系2012届毕业设计任务书专业:硬件与外设班级:硬件091 填表日期:2011年11月20日指导教师王昱煜职称讲师联系电话159****7341学生姓名周俊兵课题名称基于单片机的8路抢答器的设计课题工作内容介绍单片机的选型、引脚功能等,然后分析抢答器的设计原理,从各个硬件的总体设计到局部电路设计,分析并阐述设计思路;再进行软件的设计,从程序总体流程图到关键部分的设计思路以及中断处理,最后附上程序代码。

该论文的主要内容应包括:1、单片机芯片选择(1)单片机选择(2)模块性能分析2、硬件设计(1)总体设计(2)外部振荡电路设计(3)复位电路设计(4)显示电路设计(5)按键电路设计(6)报警电路设计3、系统软件设计(1)程序总体结构图(2)程序流程图(3)主程序(4)中断处理4、总结本论文的撰写需要先设计出产品的电路图及软件系统,然后再自己焊接组装成产品,然后根据自己的设计思路及产品焊接组装流程用文字加图片的形式在文章中展示出来。

要求指标(目标)通过毕业设计,应达到以下要求:(1)熟悉单片机的型号及各引脚功能。

(2)熟悉单片机硬件电路设计。

(3)熟练单片机C语言程序设计。

(4)用C语言实现软件系统,并在仿真环境下调试运行。

(5)熟练电子元器件的焊接。

(6)根据硬件电路图和程序代码将产品制作出来并调试。

(7)撰写符合规范的毕业设计论文,对毕业设计所做的工作表达出来。

(8)掌握团队合作开发的方法。

(9)进一步积累实际的单片机产品的开发和研究经验。

进程安排(1)第1周:落实毕业设计任务,明确工作内容,部署毕业设计各项工作。

(2)第2周:查阅与课题相关或针对性强的文献5~10篇,阅读并进行归纳、总结。

(3)第3周:根据课题要求进行资料收集、整理,并写出分析报告。

单片机课程设计 八路抢答器(C语言)

单片机课程设计 八路抢答器(C语言)

单片机课程设计8路抢答器指导老师:宋*******学号:************ 班级:12电子卓越班目录一绪论 (3)二基本设计方案 (4)三具体设计 (5)四电路板的制作 (7)五电路功能测试与调试 (7)六心得体会 (8)附录 (9)一绪论1.1单片机抢答器的背景二十世纪跨越了三个“电”的时代,即电气时代、电子时代和现已进入的电脑时代。

不过,这种电脑,通常是指个人计算机,简称PC机。

它由主机、键盘、显示器等组成。

还有一类计算机,大多数人却不怎么熟悉。

这种计算机就是把智能赋予各种机械的单片机(亦称微控制器)。

顾名思义,这种计算机的最小系统只用了一片集成电路,即可进行简单运算和控制。

因为它体积小,通常都藏在被控机械的“肚子”里。

它在整个装置中,起着有如人类头脑的作用,它出了毛病,整个装置就瘫痪了。

现在,这种单片机的使用领域已十分广泛,如智能仪表、实时工控、通讯设备、导航系统、家用电器等。

各种产品一旦用上了单片机,就能起到使产品升级换代的功效,常在产品名称前冠以形容词——“智能型”,如智能型洗衣机等。

现在有些工厂的技术人员或其它业余电子开发者搞出来的某些产品,不是电路太复杂,就是功能太简单且极易被仿制。

究其原因,可能就卡在产品未使用单片机或其它可编程逻辑器件上。

在知识竞赛中,特别是做抢答题时,在抢答过程中,为了更确切的知道哪一组或哪一位选手先抢答到题,必须要有一个系统来完成这个任务。

若在抢答中,只靠人的视觉(或者是听觉)是很难判断出哪一组(或哪一个选手)先抢答到题的。

利用单片机编程来设计抢答器,可以使以上问题得以解决,即使两组的抢答时间相差几微秒,也能轻松的分辨出哪一组(或哪个选手)先抢答到题的。

本文主要介绍了抢答器的工作原理及设计,以及它的实际用途。

1.2设计要求:一、基本功能:1、六路抢答,抢答有效时相应的灯亮,并有音乐提示;2、每轮抢答需主持人按“开始”后,抢答才有效;3、抢答无效时,有相应的灯及音乐提示;二、扩展功能:1、扩展到8路或以上;2、抢答倒计时提示;3、各路的参赛者有得分显示;4、其他自行增加的功能;二基本设计方案2.1 单片机的选择我选择STC89C52单片机芯片的理由如下:1、在设计过程中可能会出现很多问题,89C52可重复烧程序;2、是80C51的增强型,功能与我们所学的51单片机基本相同;3、学校配套发的单片机开发板用的就是89C52,有很多相关教程,程序的测试与烧写都十分方便;4、器材室很方便就能领到。

基于单片机的抢答器设计与仿真(c语言)

基于单片机的抢答器设计与仿真(c语言)

课程设计报告论文题目基于单片机的多路抢答器的设计作者姓名龙鑫指导教师杨(晓辉)老师所在院系信息工程学院专业名称电气卓越完成时间2014年6月30日目录1.电路原理图的设计 (1)1.1 电路组成框图 (1)1.2 电路原理图 (2)2.电路硬件设计 (2)2.1单片机最小系统 (2)2.2按键电路 (6)2.3显示电路 (7)2.4报警电路 (8)3.系统软件的设计 (9)3.1编译软件——Keil C (9)3.2仿真软件——Proteus (10)4.调试及故障分析 (11)4.1程序调试 (11)5.总结 (12)参考文献 (14)附录一 (15)基于单片机的多路智能抢答器的设计1.电路原理图的设计根据设计功能的要求,电路应该包括控制电路,按键电路,以及用来显示裁决结果的显示电路。

除了用数码管显示目前的动作情形,同时也需要用声音提醒或者警告操作人员,因此也在电路设计时加入了报警电路。

1.1 电路组成框图抢答器电路总体设计方框图如图1所示:图1抢答器总体设计方框图1.2 电路原理图抢答器电路原理图如图2所示,控制电路以单片机AT89C51为核心,按键电路采用矩阵式键盘的接法,显示电路采共阴极数码管动态显示,报警采用蜂鸣器报警电路。

图2抢答器电路设计原理图2.电路硬件设计电路硬件包括:单片机最小系统(即控制电路)、按键电路、显示电路、报警电路。

2.1单片机最小系统(1)系统结构总线型单片机非总线应用的最小系统示意图如图3所示,只有单片机和时钟电路、复位电路构成的最简单电路,并行总线不用于外围扩展,可作为应用系统的I/O口使用。

图3 总线型单片机非总线应用的最小系统(2)系统特点○1有大量可使用的I/O口;○2没有并行扩展,应用系统结构简单;○3外围器件只能通过UART口的串行移位方式或虚拟串行扩展总线进行扩展。

(3)AT89C51单片机微控制器选用ATMAL公司生产的AT89C51,该芯片货源充足,并且价格也比较便宜。

《单片机应用技术(C语言)》实训课件—4.1 8路抢答器设计

《单片机应用技术(C语言)》实训课件—4.1 8路抢答器设计
否则显示“E”约3 s,继续保持锁定状态。
硬件电路
51单片机
4个按键由P0.0~P0.3控制; 共阳数码管由P1口静态控制; 由P3.0引脚控制的发光二极管 的亮灭模拟开锁电路的打开和 锁定。
程序设计思路
密码设定为“2”
if……else if …… else switch语句
#include <reg51.h> 器
P0=0xff;
//读引脚状态,需先置1
P1=disp[8];
//显示“”
while(1)
{
button=P0;
//第一次读按键状态
delay(1200);
//延时消抖
button=P0;
//第二次读按键状态
switch(button) //根据按键的值进行多分支跳转
{
case 0xfe: P1=disp[0];delay(10000);while(1);break; //0按下,显示0,待机
9 1 0 0 1 0 0 0 0 0x90 0 1 1 0 1 1 1 1 0x6F
三、程序设计
软件设计思路
使用数组存储显示数据
//定义数组led,依次存储包括0~7和“”的共阳极数码管显示码表 unsigned char code disp[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0xbf};
//从数组中取出数码管的显示字符“” P1=disp[8];
数组定义语句中,关键字“code”是为了把disp[] 数组存储在片内程序存储器ROM中。
程序设计:
系统上电时,数码管显示“”,表示开始抢答, 当记录到最先按下的按键序号后,数码管将显示该参赛 者的序号,同时无法再接受其它按键的输入;当系统按 下复位按钮S时,系统显示“”,表示可以接受新一轮 的抢答。

v-1 单片机六路抢答器C语言程序

v-1 单片机六路抢答器C语言程序

把216程序去掉空格添上下括号} v4扦测无错一处警告单片机六路数显计时抢答器c语言程序#include <reg52.h>#define uint unsigned int#define uchar unsigned charunsigned char codetable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xc0};sbit start=P3^6;sbit reset=P3^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;sbit key7=P1^6;sbit key8=P1^7;sbit jia=P3^4;sbit jian=P3^5;bit action = 0;uchar second=10,a[7]={0};uchar timer0_count = 0;uchar number=0;uchar number_display = 0; uchar k;void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=120;y>0;y--);}void display(uchar number,uchar second) {P2 = 0x01;P0 = table[second];delay(1);P2 = 0x02;P0 = table[number];delay(1);P2 = 0x04;P0 = table[a[0]];delay(1);P2 = 0x08;P0 = table[a[1]];delay(1);P2 = 0x10;P0 = table[a[2]];delay(1);P2 = 0x20;P0 = table[a[3]];delay(1);P2 = 0x40;P0 = table[a[4]];delay(1);P2 = 0x80;P0 = table[a[5]];delay(1);}void start_keyscan(){void fengling();while(start == 0){key7=0;display(number_display,second);if(start == 1){key7=1;action = 1;TR0 = 1;}}}uchar key_scan8(){if(key1 == 0){delay(8);if(key1 == 0){number = 1;number_display = number;} }if(key2 == 0){delay(8);if(key2 == 0){number = 2;number_display = number;}}if(key3 == 0){delay(8);if(key3 == 0){number = 3;number_display = number;}}if(key4 == 0){delay(8);if(key4 == 0){number = 4;number_display = number;}}if(key5 == 0){delay(8);if(key5 == 0){number = 5;number_display = number;}}if(key6 == 0){delay(8);if(key6 == 0){number = 6;number_display = number;}}if(number_display != 0){return number_display;}else{return 0;}}void reset_keyscan(){if(reset == 0){delay(8);if(reset == 0){number_display = 0;second=10;}}}void main(){TMOD=0x01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;ET0=1;TR0=0;P2=0x00;while(1){reset_keyscan();start_keyscan();if(jia==0&&a[number-1]<9){delay(10);while(jia==0)display(number_display,second);a[number-1]=a[number-1]+1;}if(jian==0&&a[number-1]>0){delay(10);while (jian==0) display(number_display,second);a[number-1]=a[number-1]-1;}while(action){while(!key_scan8()){display(number_display,second);if(second == 0){second = 10;break;}}TR0 = 0;key7=0;delay(80); display(number_display,second);key7=1;action = 0;break;}display(number_display,second);}}void timer0() interrupt 1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;timer0_count ++;if(timer0_count == 20){second --;timer0_count = 0;if(second==0){key7=0;delay(60);key7=1;}}}。

C语言单片机抢答器

C语言单片机抢答器
*函数原型:keychuli();
*功能:处理与键盘相连的P1口的内容,作为键值。
************************************************************************/
uchar keychuli()
{
uchar k;
P1=0xff;
k=P1; /*P1口内容送K*/
void breakjudge()
{
if(P_SHOW==1)
{
if(S4SIGN==1||S5SIGN==1||S6SIGN==1||S7SIGN==1)
{
P_SHOW=0;/*退出P_SHOW状态*/
LED0=1;
LED2=0;/*进入违规状态LED2亮*/
S4SIGN=0;S5SIGN=0;/*选手按键标志位清0*/
void renovate()
{
if(P_SHOW!=1)
{
dis[0]=time%10;
dis[1]=time/10;
dis[7]=number;
}
if(P_SHOW==1)
{
dis[0]=0x10;dis[1]=0x1b;dis[2]=0x1b;dis[3]=0x1b;
dis[4]=0x1b;dis[5]=0x1b;dis[6]=0x1b;dis[7]=0x1b;
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar code dis_7[29]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x0c,0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0xff,0xbf};

C51单片机8路抢答器实训报告

C51单片机8路抢答器实训报告

《单片机与接口技术》课程设计报告抢答系统设计学生姓名:_ _____曾超________学号:___201358264031____________班级:___物联网____________指导老师:__刘艳军_____________日期:__2015/06/28_____________1 题目与要求 (3)1.1 问题提出 (3)1.2 本系统涉及的知识点 (3)2系统硬件设计 (3)2.1 模块图 (3)2.2 部分模块电路图 (4) (6)3系统软件设计 (6)4 总结 (20)4.1程序调试情况 (20)4.2本人在程序设计中感想 (22)(四)参考文献(左对齐,宋体粗四号) (22)1 题目与要求1.1 问题提出实现一个“抢答系统设计”。

1)制作一个8人抢答器,以开关中的某个开关的按下(闭合)作为抢答按键。

2)无人抢答时,8只数码管轮流循环显示1~8(跑马),谁先抢答,数码管停止跑马,8个数码管同时亮谁的编号,并用蜂鸣器发提示音;其后再有人按键,系统不予响应,直到复位键按下,开始下一轮抢答。

3)主持人端有一个复位键,可重新开始抢答;有一个答案正确的按键,和一个答案错误的按键,按下时有不同的提示音;要想实现8路抢答器,首先要清楚抢答器的功能。

需要设置多少个功能键?功能按键通过哪个I/O口控制?对于此系统,我们第一步应该做什么,先完成哪个部分?1.2 本系统涉及的知识点本系统涉及到的知识点有:1.按键的处理。

2.数码管的动态静态显示。

2系统硬件设计2.1 模块图2.2 部分模块电路图1. 4*3矩阵键盘,本系统中只用到3个功能键,故令P1^4=0控制列线,P1^1,P1^2,P^3分别为横线,不需要做扫描。

分别控制S1,S5,S9.2.8路独立按键,为本系统的8路抢答按键。

通过P3口输入控制。

3.蜂鸣器,接在P1^5.3系统软件设计延时函数模块代码如下:V oid mDelay(unsigned int Delay){unsigned int i;for(;Delay>0;Delay--){for(i=0;i<124;i++){;}}}主程序函数模块,代码:#include<reg51.h>sbit P14=P1^4;sbit Right=P1^1;sbit False=P1^2;sbit P13=P1^3;sbit Beep = P1^5;unsigned char table[8]={0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f}; unsigned char wei[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdF,0xbF,0x7F}; void main(){int i,t;P14=0;//ap1:P3=0xff;while(1){for(i=0;i<8;i++){P2=wei[i]; //从这里开始修改选手编号跑马效果P0=table[i];mDelay(150);if(P3!=0xff){//r8=P3;switch(P3){case 0xfe:{//for(t=0;t<2;t++)//抢答后选手编号闪烁次数//{P2=0xfe;//按下哪一个按键,则数码管位码送该位。

抢答器__C语言版

抢答器__C语言版

实验十五抢答器一.实验目的实现一抢答器,用现有知识,使用一些芯片结合必要的的程序来实现抢答器的制作二.实验设备CPU挂箱,8255CPU模块,若干导线三.实验原理设置好8255A各端口的工作模式。

实验中应当使三个端口都工作于方式0,并使A 口为输出口,B口为输入口,C口为输出口。

将PA0-PA7口与数码管的输入与LED1—LED8相连,K1-K8与PB0-PB7相连,片选信号CS273与CS0相连,8255的PC与LED-A~LED-Dp相连。

去掉短路子连接。

四.试验程序#include<reg51.h>#include<absacc.h>#define PA XBYTE[0xcfa0]#define PB XBYTE[0xcfa1]#define PC XBYTE[0xcfa2]#define PCTL XBYTE[0xcfa3] //控制字地址unsigned char tag;unsigned char table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};void delay(unsigned int time){char i;for(;time>0;time--)for(i=0;i<5;i++);}void time(void) interrupt 0 //采用外部中断0{unsigned char i;tag=1;EA=0; //屏蔽中断PC=table[0];//PA=Oxff;for( i=1;i<4;i++){PA=0;delay(3000);PA=0xff; //LED灯先闪3次后可以开始进行抢答delay(3000);}}void main(void){// unsigned char i;PCTL=0x82; //送控制字,PA输出,PB输入,PC口输出IT0 = 1; //TCON里IT0=1为脉冲触发EX0 = 1;EA = 1;PA=0; //PA清零,灯全部打开P1=0x01;tag=0;while(1){while(tag){if(PB==0x01){PC=table[1];PA=0xFE;delay(30000);// PC=table[0];EA=1; //打开中断tag=0;break;}else if(PB==0x02){PC=table[2];PA=0xFD;delay(30000);// PC=table[0];EA=1; //打开中断tag=0;break;}else{}}//PC=table[0];}}。

4路at89c51抢答器的设计c语言

4路at89c51抢答器的设计c语言

4路AT89C51抢答器的设计(C语言)概述在各种答题活动中,抢答器是作为重要装备之一,用于检测谁首先按下按钮进行答题。

本文将介绍如何使用AT89C51单片机设计一款4路抢答器,并使用C语言进行编程。

设计原理抢答器的设计原理主要基于按键输入和信号处理。

当有参与者按下按钮进行抢答时,单片机将检测到该按钮按下的信号,并进行相应的处理,包括显示抢答者编号和记录答题结果等。

硬件连接以下是4路抢答器的硬件连接示意图:+-----------------+| || AT89C51 || |+-----+-----+-----+| |+----+--+ || Button1 +--++----+--+|+----+--+| Button2 |+----+--+|+----+--+| Button3 |+----+--+|+----+--+| Button4 |+----+--+程序设计初始化引脚和变量首先,需要初始化所使用的引脚和变量。

AT89C51的IO口用于连接按钮,需要将其配置为输入模式。

同时,定义一个变量用于记录当前的抢答者编号。

主循环主循环会不断扫描每个按钮的状态,当检测到有按钮按下时,记录抢答者编号并进行相应的处理。

按钮扫描函数按钮扫描函数用于检测按钮的状态。

当检测到按钮按下时,返回对应的编号。

在编写按钮扫描函数时,可以使用延时函数来确保稳定的检测结果。

显示抢答者编号函数显示抢答者编号函数用于将抢答者编号显示在LED灯或LCD屏幕上。

抢答者编号可以根据具体需求进行显示方式的设计,比如使用不同颜色的LED灯表示不同编号的抢答者。

记录答题结果函数记录答题结果函数用于记录每个抢答者的答题结果。

可以使用数组来存储每个抢答者的成绩或者答题情况。

中断处理在抢答器设计中,中断处理函数起着重要作用。

当检测到有按钮按下时,通过中断处理函数及时响应,并进行相应的处理。

总结本文介绍了使用AT89C51单片机设计4路抢答器的方法,并使用C语言进行编程。

16路抢答器C程序

16路抢答器C程序
8路抢答器8路数字抢答器九路抢答器八路抢答器vhdl四人抢答器简易三路抢答器抢答器八路抢答器实验报告八路抢答器原理四人抢答器
基于单片机设计的16路抢答器,P0口为7段数码管段码abcdefgd,P2口为数码管位选,P3口为4x4键盘接入口,下面是单片机汇编程序:
LINE EQU 34H
ROW EQU 35H
MOVC A,@A+DPTR
MOV P0,A
ACALL DELAY
MOV A,39H
MOV P2,A
RL A
MOV 39H,A
MOV A,@R0
SWAP A
ANL A,#0FH
MOVC A,@A+DPTR
MOV P0,A
ACALL DELAY
INC R0
DJNZ R3,NEXT
NOP
NOP
RET
LSCAN: MOV P3,#0FH
RET
DELAY1:MOV R6,#10
D1: MOV R7,#250
DJNZ R7,$
DJNZ R6,D1
RET
TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0BFH
END
_
F1 EQU 66H
ORG 0
AJMP START
ORG 000BH
AJMP EXET0
ORG 0010H
START: MOV 40H,#10
MOV SP,#60H
MOV 30H,#00H
MOV 31H,#10H
MOV 32H,#0AAH
MOV 33H,#00H
MOV DPTR,#TAB
MOV TMOD,#01H

单片机实训报告抢答器

单片机实训报告抢答器

一、实训目的1. 熟悉单片机的编程环境和调试方法。

2. 掌握单片机外围电路的设计与连接。

3. 学会使用单片机实现抢答器的功能。

4. 提高实际动手能力和解决问题的能力。

二、实训背景随着电子技术的不断发展,单片机在各个领域得到了广泛应用。

抢答器作为一种常见的电子设备,在竞赛、培训等场合中发挥着重要作用。

本实训项目旨在通过设计一款基于单片机的抢答器,使学生掌握单片机的编程、调试及外围电路设计等方面的知识。

三、实训内容1. 硬件设计(1)主控芯片:选用AT89C52单片机作为主控芯片。

(2)按键模块:设计6个按键K0~K5,分别对应6个选手。

(3)显示模块:采用LED数码管显示选手编号。

(4)声音模块:采用蜂鸣器发出报警声响。

(5)其他电路:电源电路、复位电路等。

2. 软件设计(1)程序编写:使用C语言编写单片机程序,实现抢答器功能。

(2)程序调试:使用Keil uVision5软件进行程序编译、调试。

3. 抢答器功能(1)选手抢答:6个选手分别按动对应的按键,抢答器会根据按键优先级显示选手编号,并发出报警声响。

(2)锁存功能:优先抢答的选手编号会一直保持,直至主持人清除系统。

(3)显示功能:LED数码管显示抢答选手的编号。

(4)报警功能:蜂鸣器发出报警声响。

四、实训步骤1. 硬件搭建(1)将AT89C52单片机、按键、LED数码管、蜂鸣器等元器件焊接在电路板上。

(2)连接电源电路和复位电路。

2. 程序编写(1)在Keil uVision5软件中创建新工程,并添加AT89C52单片机头文件。

(2)编写按键扫描程序,实现按键的识别和优先级判断。

(3)编写LED数码管显示程序,显示抢答选手的编号。

(4)编写蜂鸣器报警程序,实现报警声响。

(5)编写主函数,实现抢答器的整体功能。

3. 程序调试(1)在Keil uVision5软件中编译程序,生成HEX文件。

(2)使用Proteus仿真软件进行仿真,观察程序运行效果。

基于单片机的八路抢答器程序设计

基于单片机的八路抢答器程序设计

基于单片机的八路抢答器程序设计(C语言)#include <reg51.h>#define uchar unsigned char#define GPIO_KEY P1sbit key1_zhuchi=P3^1; //主持人按键sbit key2_addt=P3^0; //加时按键sbit key3_mint=P3^2; //减时按键sbit beep=P1^5; //蜂鸣器报警sbit LED=P2^0; //LED指示灯sbit LSA=P2^2; //数码管位选sbit LSB=P2^3;sbit LSC=P2^4;//8段共阴数码管0~9段选uchar time,KeyValue,flag,count,m,a,tsbz;//倒计时时间,检测到的选手号,允许抢答标志,主持人按键检测次数,溢出标志,加时判断,时间调整标志uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};void keyscan(); //键盘扫描函数void display(); //数码管显示函数void delay(uchar i); //延时函数void Key_down(); //选手按键按键扫描函数void main() //主函数{time=10; //初设抢答时间为10sKeyValue=0; //设置抢答没开始时选手号为0tsbz=1; //调时间标志flag=0; //答题允许标志m=0; //产生1S的溢出标志TMOD=0x01; //定时器0工作与方式1EA=1;ET0=1;while(1){keyscan();display();}}void keyscan() //键盘扫描{if(key2_addt==0&&tsbz==1) //为抢答或答题加时间{delay(8); //消抖if(key2_addt==0&&tsbz==1){while(!key2_addt);a++;if(a==1){TR0=0;time++;flag=0;}if(a==2){TR0=0;a=0;time++;flag=0;}}}if(key3_mint==0&&tsbz==1)//为抢答或答题减时间{delay(8);if(key3_mint==0&&tsbz==1){while(!key3_mint);a++;if(a==1){TR0=0;time--;flag=0;}if(a==2){TR0=0;a=0;time--;flag=0;}}}if(key1_zhuchi==0)//主持人按键按下{delay(8); //延时消抖if(key1_zhuchi==0){while(!key1_zhuchi); //按下count++;if(count==1) //主持人按键按下一次,开始抢答倒计时{tsbz=0; //不允许调时flag=1; //允许抢答TH0=0x3c;TL0=0xb0;TR0=1; //开启计时器}if(count==2) //主持人按键按下两次,切换到30s答题倒计时界面,可进行答题时间调整{LED=1;tsbz=1; //允许调整时间time=30;TR0=0; //停止计时flag=0; //不允许抢答}if(count==3) //主持人按键按下三次,答题时间开始倒计时{tsbz=0; //不允许调时TH0=0x3c;TL0=0xb0;TR0=1; //开启计时器flag=0; //不允许抢答}if(count==4) //主持人按键按下四次,全部清零{tsbz=1;TR0=0;time=10;flag=0;count=0;KeyValue=0;LED=1;}}}if(flag==1) //允许抢答后进行选手按键扫描{Key_down();}}void display() //显示函数{LSA = 1;LSB = 1;LSC = 1;P0=table[KeyValue]; //选手号码显示delay(100);P0=0x00; //消隐LSA = 0;LSB = 1;LSC =1;P0=0x40; //用来隔开时间显示和号码显示delay(100);P0=0x00; //消隐LSA = 1;LSB = 0;LSC =1;P0=table[time/10]; //计时十位显示delay(100);P0=0x00; //消隐LSA = 0;LSB = 0;LSC =1;P0=table[time%10]; //计时个位显示delay(100);P0=0x00; //消隐}void INT_0() interrupt 1 //中断函数{TH0=0x3c; //50ms定时初值TL0=0xb0;m++;if(m==20) //产生1S的时间{m=0;time--; //倒计时if(time<=5&&time>=0){uchar b=100;while(b--) //蜂鸣器报警{beep=~beep;delay(100);LED=~LED; //LED闪烁报警delay(50000);}}}if(time==0) //没选手抢答或答题时间结束{LED=0;TR0=0; //关闭定时器flag=0;//不允许抢答}}void delay(uchar i) //延时{while(i--);}void Key_down() //扫描选手按键{uchar c=100;uchar n=0;GPIO_KEY=0x0f;if(GPIO_KEY!=0x0f)//读取按键是否按下delay(8);//延时10ms进行消抖if(GPIO_KEY!=0x0f)//再次检测键盘是否按下{GPIO_KEY=0X0F;//测试列switch(GPIO_KEY){case(0X07): KeyValue=1;break;case(0X0b): KeyValue=2;break;case(0X0d): KeyValue=3;break;case(0X0e): KeyValue=4;break;}GPIO_KEY=0XF0;//测试行switch(GPIO_KEY){case(0X70): KeyValue=KeyValue;break;case(0Xb0): KeyValue=KeyValue+4;break;case(0Xd0): KeyValue=KeyValue+9;break;case(0Xe0): KeyValue=KeyValue+9;break;}}}while((n<50)&&(GPIO_KEY!=0xf0)) //检测按键松手检测{delay(8);n++;}switch(KeyValue) //读取选手按键{case 1: //一号选手抢答成功delay(8);if(KeyValue==1){flag=0;TR0=0;while(c--) //蜂鸣器提示抢答成功{beep=~beep;delay(100);}LED=0;}break;case 2: //二号选手抢答成功delay(8);if(KeyValue==2){flag=0;TR0=0;while(c--) //蜂鸣器提示抢答成功{beep=~beep;delay(100);}LED=0;}break;case 3: //三号选手抢答成功delay(8);if(KeyValue==3){flag=0;TR0=0;while(c--) //蜂鸣器提示抢答成功{beep=~beep;delay(100);}LED=0;}break;case 4: //四号选手抢答成功delay(8);if(KeyValue==4){flag=0;TR0=0;while(c--) //蜂鸣器提示抢答成功{beep=~beep;delay(100);}LED=0;}break;case 5: //五号选手抢答成功delay(8);if(KeyValue==5){flag=0;TR0=0;while(c--) //蜂鸣器提示抢答成功{beep=~beep;delay(100);}LED=0;}break;case 6: //六号选手抢答成功delay(8);if(KeyValue==6){flag=0;TR0=0;while(c--) //蜂鸣器提示抢答成功{beep=~beep;delay(100);}LED=0;}break;case 7: //七号选手抢答成功delay(8);if(KeyValue==7){flag=0;TR0=0;while(c--) //蜂鸣器提示抢答成功{beep=~beep;delay(100);}LED=0;}break;case 8: //八号选手抢答成功delay(8);if(KeyValue==8){flag=0;TR0=0;while(c--) //蜂鸣器提示抢答成功{beep=~beep;delay(100);}LED=0;}break;}}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

单片机综合实验报告
题目: 8路抢答器实验
班级:
姓名:
学号:
指导老师:
时间:
一、实验内容:
以单片机为核心,设计一个8位竞赛抢答器:同时供8名选手或8个代表队比赛,分别用8个按钮S0~S7表示。

本实验有Protues软件仿真。

分别设置一个抢答控制开关S1和复位开关S2,由主持人控制。

抢答器具有锁存与显示功能。

即选手按按钮抢答时,锁存相应的编号,并且优先抢答选手的编号一直保持显示在显示器上,直到主持人将系统复位为止。

抢答器具有定时抢答功能,且一次抢答的时间由主持人设定为30秒。

当主持人启动“开始”键后,定时器进行减计时,同时绿色LED灯亮。

二、实验电路及功能说明
分别设置一个抢答控制开关S1和复位开关S2,由主持人控制。

抢答器具有锁存与显示功能。

即选手按按钮抢答时,锁存相应的编号,并且优先抢答选手的编号一直保持显示在显示器上,直到主持人将系统复位为止。

参赛选手在设定的时间内进行抢答,抢答有效,定时器停止工作,显示器上显示选手的编号和抢答的时间,并保持到主持人将系统复位为止。

复位后参赛队员可继续抢答。

如果定时时间已到,无人抢答,本次抢答无效,系统报警红色LED灯亮,并禁止抢答,定时显示器上显示00。

三、实验程序流程图:
主程序;
非法抢答序;抢答时间调整程序;回答时间调整程序;倒计时程序;正常抢答处理程序;犯规处理程序;显示及发声程序。

主流程图如下图所示
子程序
四、实验结果分析
五、心得体会
六、程序清单
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit wela_a=P3^0;
sbit wela1=P3^1;
sbit wela2=P3^7;
sbit rest=P3^5;
sbit host=P3^6;
sbit led1=P3^4;//绿灯
sbit led2=P3^3;//红灯
sbit led3=P3^2;//黄灯
sbit key1=P1^0;
sbit key2=P1^1;
sbit key3=P1^2;
sbit key4=P1^3;
sbit key5=P1^4;
sbit key6=P1^5;
sbit key7=P1^6;
sbit key8=P1^7;
uchar x,q,d,s,ge,t0,t1,start,flag; uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void init();/*初始函数申明*/
void display(uchar s,uchar ge,uchar a); void delay(uint z); void keyscan();
void main()
{
init();
display(s,ge,a);
while(1)
{
if(host==0) //主持人控制开关
{
delay(5);
if(host==0)
{
flag=1;
start=1;
delay(5); 延时
while(!host); 检测开关
}
}
if(rest==0) //复位
{
delay(5);
if(rest==0)
{
q=30;
led2=1;
led3=1;
x=0;
delay(5);
start=1;
delay(5);
while(!rest);
}
}
if(flag==1)
{
if(start==0)//选手按下,倒计10秒开始 {
led3=0;
wela1=0;
wela2=0;
delay(1);
TR0=0;
TR1=1;
display(s,ge,a);
delay(1);
}
if(start==1)//主持人按下,倒计时30秒{
led1=0;
wela1=0;
wela2=0;
delay(1);
TR0=1;
TR1=0;
display(s,ge,a);
delay(1);
keyscan();
}
}
}
}
void init()/*初始化*/
{
t0=0;
t1=0;
flag=0;
q=30;
d=10;
wela_a=0;
a=0;
TMOD=0x11;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
EA=1;
ET0=1;
ET1=1;
TR0=0;
TR1=0;
}
void display(uchar s,uchar ge,uchar a)/*数码管动态扫描*/
{
wela1=1;
P0=table[ge];
delay(5);
wela2=1;
最新可编辑word文档。

相关文档
最新文档