• 回复
  • 收藏
  • 点赞
  • 分享
  • 发新帖

用mcs-51单片机做六人抢答器

要求:
  1:主持人按下启动按钮才能开始抢答;
  2:当没有人抢答30秒后题目作废;
  3:抢答之后有10秒的考虑时间如果答不上来题目作废;
  4:显示抢答人的号码;
  5:显示30秒倒计时时间;
全部回复(32)
正序查看
倒序查看
xing1234
LV.6
2
2007-12-08 09:02
如果有二个人在同一时间按下按纽(比如在1uS内或更短时间),单片机如何分配优先级?
0
回复
jamesbt
LV.4
3
2007-12-08 10:47
@xing1234
如果有二个人在同一时间按下按纽(比如在1uS内或更短时间),单片机如何分配优先级?
我做过
qq;67200357
0
回复
madboy21
LV.8
4
2007-12-08 14:38
@xing1234
如果有二个人在同一时间按下按纽(比如在1uS内或更短时间),单片机如何分配优先级?
1个uS这个时间完全可以做得到,当然是采用了硬件锁存电路,但是有没必要考虑这个问题?这个概率太低了,基本上没有发生的可能.就算碰上可以按系统逻辑判定.
0
回复
xing1234
LV.6
5
2007-12-08 15:39
@madboy21
1个uS这个时间完全可以做得到,当然是采用了硬件锁存电路,但是有没必要考虑这个问题?这个概率太低了,基本上没有发生的可能.就算碰上可以按系统逻辑判定.
楼主的意思估计不想用太多的外围电路,我只是一种极端的假设.
0
回复
hv12
LV.1
6
2007-12-08 17:30
这个不难呀.
0
回复
qb_0007
LV.2
7
2007-12-09 09:48
@xing1234
楼主的意思估计不想用太多的外围电路,我只是一种极端的假设.
我想在软件上作必要的保护
0
回复
xing1234
LV.6
8
2007-12-12 12:00
如果主持人还没有按下按纽,而抢答的人已经有二个以上把按纽按下,并且保持闭合状态,这个时候如何显示公平.
我只是一种想法,感觉有点意思.
0
回复
qb_0007
LV.2
9
2007-12-12 23:13
@xing1234
如果主持人还没有按下按纽,而抢答的人已经有二个以上把按纽按下,并且保持闭合状态,这个时候如何显示公平.我只是一种想法,感觉有点意思.
我想做个报警只要主持人没有说开始有人按下抢答开关就会产生报警提示有人犯规.只是想法还没有验证.
0
回复
qb_0007
LV.2
10
2007-12-12 23:16
@hv12
这个不难呀.
对初学者来说就有点难了,做的时候想得太理想了存在的问题也不少呀,也不知如何解决.
0
回复
xing1234
LV.6
11
2007-12-14 15:17
@qb_0007
我想做个报警只要主持人没有说开始有人按下抢答开关就会产生报警提示有人犯规.只是想法还没有验证.
如果只是做个样机自个玩玩,也许没什么,如果是产品的话最好想清楚,主持人用口说开始是不行的,因为启动时间不好定.只不过这些东东可以多打几个补丁;一步一步的来!
0
回复
xing1234
LV.6
12
2007-12-14 15:29
@xing1234
如果只是做个样机自个玩玩,也许没什么,如果是产品的话最好想清楚,主持人用口说开始是不行的,因为启动时间不好定.只不过这些东东可以多打几个补丁;一步一步的来!
如果要求时间扫描的速度不是很快就用AT89C51或AT89C2051,快的话用PIC16系列,这些都是比较通用的.PIC对初学者来说难度稍大,建议51入手.
0
回复
xing1234
LV.6
13
2007-12-14 15:47
@xing1234
如果要求时间扫描的速度不是很快就用AT89C51或AT89C2051,快的话用PIC16系列,这些都是比较通用的.PIC对初学者来说难度稍大,建议51入手.
如果我用89C51做的话:
硬件
1、 晶振选高,用24M
2、 用P0.0做启动开关.
3、 用P1做抢答开关.
4、 P2、P3做LED显示(静态).
程序
1、 启动显示复位;
2、 一直查询P0.0到按下启动开关;
3、 P0.0为非后打开定时器计数,1秒更新一次显示,其余时间查询并记录比较P1;
4、 新读出的P1与上次读的数按位比较;
0
回复
2007-12-14 19:05
我以前做过个8路的,要么?截了个小图!要的话给我电话,13998595046
0
回复
qb_0007
LV.2
15
2007-12-15 00:06
@xing1234
如果我用89C51做的话:硬件1、晶振选高,用24M2、用P0.0做启动开关.3、用P1做抢答开关.4、P2、P3做LED显示(静态).程序1、启动显示复位;2、一直查询P0.0到按下启动开关;3、P0.0为非后打开定时器计数,1秒更新一次显示,其余时间查询并记录比较P1;4、新读出的P1与上次读的数按位比较;
谢谢你   给我这么多建议!!  420439660我的qq长联系呀!我也是第一次做没有经验请你多多帮忙!!谢谢你!!!
0
回复
xing1234
LV.6
16
2007-12-15 09:47
@qb_0007
谢谢你  给我这么多建议!!  420439660我的qq长联系呀!我也是第一次做没有经验请你多多帮忙!!谢谢你!!!
QQ714641683,是公司的计算机,所以少于上QQ;
0
回复
xing1234
LV.6
17
2007-12-15 10:22
加简单点外围,也许在抢答端口用几个二极管做个与/或门,用中断做效果会好些.
0
回复
qb_0007
LV.2
18
2007-12-18 22:54
@xing1234
QQ714641683,是公司的计算机,所以少于上QQ;
那你的msn呢?我加你!
0
回复
2007-12-19 14:53
@qb_0007
那你的msn呢?我加你!
我的MSN  xscn1986@hotmail.com
0
回复
xing1234
LV.6
20
2007-12-19 15:53
@电源插头
我的MSN  xscn1986@hotmail.com
yyxing1234@tom.com
0
回复
qb_0007
LV.2
21
2007-12-20 16:46
@电源插头
我以前做过个8路的,要么?截了个小图!要的话给我电话,13998595046
自己设计自己做才有乐趣!!呵呵…………
0
回复
qb_0007
LV.2
22
2007-12-20 17:38
@xing1234
加简单点外围,也许在抢答端口用几个二极管做个与/或门,用中断做效果会好些.
这个抢答器我设计好了能帮我看看吗?我怎么传给你呀?谢谢你!!!
0
回复
xing1234
LV.6
23
2007-12-21 08:42
@qb_0007
这个抢答器我设计好了能帮我看看吗?我怎么传给你呀?谢谢你!!!
上面有邮箱地址
0
回复
qb_0007
LV.2
24
2007-12-23 13:31
@xing1234
上面有邮箱地址
我给你发过去了收到了吗??
0
回复
xing1234
LV.6
25
2007-12-24 09:37
@qb_0007
我给你发过去了收到了吗??
QQ内回复
0
回复
cq_hyb
LV.2
26
2007-12-28 18:54
@xing1234
如果我用89C51做的话:硬件1、晶振选高,用24M2、用P0.0做启动开关.3、用P1做抢答开关.4、P2、P3做LED显示(静态).程序1、启动显示复位;2、一直查询P0.0到按下启动开关;3、P0.0为非后打开定时器计数,1秒更新一次显示,其余时间查询并记录比较P1;4、新读出的P1与上次读的数按位比较;
这办法太差,优先级太难保证,有可能搞的顺序错乱,2个人同时按的话有时就区分不出来的,用51实现这个功能太简单了,如果软硬件搭配的好的,也不存在什么优先级的问题,时钟越快,区分度越高,
0
回复
qb_0007
LV.2
27
2008-01-03 23:41
@cq_hyb
这办法太差,优先级太难保证,有可能搞的顺序错乱,2个人同时按的话有时就区分不出来的,用51实现这个功能太简单了,如果软硬件搭配的好的,也不存在什么优先级的问题,时钟越快,区分度越高,
请问一下那怎样用外部电路实现呢??
0
回复
qb_0007
LV.2
28
2008-01-11 22:26
单片机六人抢答器
定时器0定时50ms 循环20次完成定时一秒 ;
用串行口做显示输出
外部抢答按钮用防抖开关用中断做的键盘扫描.
P1.0 做灯光报警
P1.1做声音报警
ORG    0000H
AJMP   MAIN
ORG    0003H                  定义外部0中断
AJMP   INT0SEV
ORG    000BH    定义定时器0中断
AJMP   T0SEV                
ORG    0030H
MAIN:
MOV  SP ,  #60H
MOV  TMOD ,#01H 定义定时器T0的工作模式
MOV  TH0 ,, #3CH                  给定时器赋初值
MOV  TL0  ,#0B0H
MOV  R2  ,  # 20 循环次数
MOV  R3  ,  #0 个位显示
MOV  R4  ,  #3 十位显示
SETB   EA 开总中断
SETB   ET0 开定时器中断
SETB   P0.0 给p0.0赋初值
LCALL  XIANSHI 调用显示子程序
CLR   P1.0
JB  P0.0  ,  $
LCAII  K3
SETB  P1.0 开始按钮
SETB  IT0 边沿触发方式
SETB  TR0 开启定时器
SETB   EX0 开启外部中断
JB  P0.1  ,  $
AJMP  MAIN


定时中断
T0SEV :
MOV   th0  ,  #3CH
MOV  TL0  ,  #0B0H
DJNZ  R2   ,  LOOP
MOV  R2   ,   #20
CJNE  R3  ,   #0  ,  K1
CJNE  R4  ,   #0  ,  K2
CLR   TR0
CLR   EA
CLR   ET0
CLR   EX0
AJMP   LOOP
K2:
MOV  R3   ,  #9
DEC   R4
AJMP   LOOP
K1:
DEC  R3
LOOP:
LCALL   XIANSHI
RETI




外部中断服务
INT0SEV:
CLR  EA
CLR  TR0
JNB  P0.2 ,  KEY1
JNB  P0.3 ,  KEY2
JNB  P0.4 ,  KEY3
JNB  P0.5 ,  KEY4
JNB  P0.6 ,  KEY5
JNB  P0.7 ,  KEY6


KEY1:
MOV   R3  ,  #1
MOV   R4  ,  #0
LCALL  XIANSHI
RETI
KEY2:
MOV   R3  ,  #2
MOV   R4  ,  #0
LCALL  XIANSHI
RETI
KEY3:
MOV   R3  ,  #3
MOV   R4  ,  #0
LCALL  XIANSHI
RETI
KEY4:
MOV   R3  ,  #4
MOV   R4  ,  #0
LCALL  XIANSHI
RETI
KEY5:
MOV   R3  ,  #5
MOV   R4  ,  #0
LCALL  XIANSHI
RETI
KEY6:
MOV   R3  ,  #6
MOV   R4  ,  #0
LCALL  XIANSHI
RETI



显示子程序:
XIANSHI :
MOV  SCON  ,  #00H
MOV  DPTR  ,#TAB
MOV  A  , R3
MOVC   A  ,  @A+DPTR
MOV   SBUF  ,A
JNB  TI   ,   $
CLR   TI
MOV  A  , R4
MOVC   A  ,  @A+DPTR
MOV   SBUF  ,A
JNB  TI   ,   $
CLR   TI
RET
声音报警
K3:
MOV  R5  ,#50
K4:
MOV  R6  ,#FFH
K5:
DJNZ   R6   ,  K5
CPL  P1.1
DJNZ  R5  ,  K4
RET
END
0
回复
qb_0007
LV.2
29
2008-01-11 22:39
@qb_0007
单片机六人抢答器定时器0定时50ms循环20次完成定时一秒;用串行口做显示输出外部抢答按钮用防抖开关用中断做的键盘扫描.P1.0做灯光报警P1.1做声音报警ORG    0000HAJMP  MAINORG    0003H                  定义外部0中断AJMP  INT0SEVORG    000BH  定义定时器0中断AJMP  T0SEV                ORG    0030HMAIN:MOV  SP,  #60HMOV  TMOD,#01H定义定时器T0的工作模式MOV  TH0,,#3CH                  给定时器赋初值MOV  TL0  ,#0B0HMOV  R2  ,  #20循环次数MOV  R3  ,  #0个位显示MOV  R4  ,  #3十位显示SETB  EA开总中断SETB  ET0开定时器中断SETB  P0.0给p0.0赋初值LCALL  XIANSHI调用显示子程序CLR  P1.0JB  P0.0  ,  $LCAII  K3SETB  P1.0开始按钮SETB  IT0边沿触发方式SETB  TR0开启定时器SETB  EX0开启外部中断JB  P0.1  ,  $AJMP  MAIN定时中断T0SEV:MOV  th0  ,  #3CHMOV  TL0  ,  #0B0HDJNZ  R2  ,  LOOPMOV  R2  ,  #20CJNE  R3  ,  #0  ,  K1CJNE  R4  ,  #0  ,  K2CLR  TR0CLR  EACLR  ET0CLR  EX0AJMP  LOOPK2:MOV  R3  ,  #9DEC  R4AJMP  LOOPK1:DEC  R3LOOP:LCALL  XIANSHIRETI外部中断服务INT0SEV:CLR  EACLR  TR0JNB  P0.2,  KEY1JNB  P0.3,  KEY2JNB  P0.4,  KEY3JNB  P0.5,  KEY4JNB  P0.6,  KEY5JNB  P0.7,  KEY6KEY1:MOV  R3  ,  #1MOV  R4  ,  #0LCALL  XIANSHIRETIKEY2:MOV  R3  ,  #2MOV  R4  ,  #0LCALL  XIANSHIRETIKEY3:MOV  R3  ,  #3MOV  R4  ,  #0LCALL  XIANSHIRETIKEY4:MOV  R3  ,  #4MOV  R4  ,  #0LCALL  XIANSHIRETIKEY5:MOV  R3  ,  #5MOV  R4  ,  #0LCALL  XIANSHIRETIKEY6:MOV  R3  ,  #6MOV  R4  ,  #0LCALL  XIANSHIRETI显示子程序:XIANSHI:MOV  SCON  ,  #00HMOV  DPTR  ,#TABMOV  A  ,R3MOVC  A  ,  @A+DPTRMOV  SBUF  ,AJNB  TI  ,  $CLR  TIMOV  A  ,R4MOVC  A  ,  @A+DPTRMOV  SBUF  ,AJNB  TI  ,  $CLR  TIRET声音报警K3:MOV  R5  ,#50K4:MOV  R6  ,#FFHK5:DJNZ  R6  ,  K5CPL  P1.1DJNZ  R5  ,  K4RETEND
望各位高手给予指导谢谢!!!
0
回复
2008-01-30 10:24
@qb_0007
单片机六人抢答器定时器0定时50ms循环20次完成定时一秒;用串行口做显示输出外部抢答按钮用防抖开关用中断做的键盘扫描.P1.0做灯光报警P1.1做声音报警ORG    0000HAJMP  MAINORG    0003H                  定义外部0中断AJMP  INT0SEVORG    000BH  定义定时器0中断AJMP  T0SEV                ORG    0030HMAIN:MOV  SP,  #60HMOV  TMOD,#01H定义定时器T0的工作模式MOV  TH0,,#3CH                  给定时器赋初值MOV  TL0  ,#0B0HMOV  R2  ,  #20循环次数MOV  R3  ,  #0个位显示MOV  R4  ,  #3十位显示SETB  EA开总中断SETB  ET0开定时器中断SETB  P0.0给p0.0赋初值LCALL  XIANSHI调用显示子程序CLR  P1.0JB  P0.0  ,  $LCAII  K3SETB  P1.0开始按钮SETB  IT0边沿触发方式SETB  TR0开启定时器SETB  EX0开启外部中断JB  P0.1  ,  $AJMP  MAIN定时中断T0SEV:MOV  th0  ,  #3CHMOV  TL0  ,  #0B0HDJNZ  R2  ,  LOOPMOV  R2  ,  #20CJNE  R3  ,  #0  ,  K1CJNE  R4  ,  #0  ,  K2CLR  TR0CLR  EACLR  ET0CLR  EX0AJMP  LOOPK2:MOV  R3  ,  #9DEC  R4AJMP  LOOPK1:DEC  R3LOOP:LCALL  XIANSHIRETI外部中断服务INT0SEV:CLR  EACLR  TR0JNB  P0.2,  KEY1JNB  P0.3,  KEY2JNB  P0.4,  KEY3JNB  P0.5,  KEY4JNB  P0.6,  KEY5JNB  P0.7,  KEY6KEY1:MOV  R3  ,  #1MOV  R4  ,  #0LCALL  XIANSHIRETIKEY2:MOV  R3  ,  #2MOV  R4  ,  #0LCALL  XIANSHIRETIKEY3:MOV  R3  ,  #3MOV  R4  ,  #0LCALL  XIANSHIRETIKEY4:MOV  R3  ,  #4MOV  R4  ,  #0LCALL  XIANSHIRETIKEY5:MOV  R3  ,  #5MOV  R4  ,  #0LCALL  XIANSHIRETIKEY6:MOV  R3  ,  #6MOV  R4  ,  #0LCALL  XIANSHIRETI显示子程序:XIANSHI:MOV  SCON  ,  #00HMOV  DPTR  ,#TABMOV  A  ,R3MOVC  A  ,  @A+DPTRMOV  SBUF  ,AJNB  TI  ,  $CLR  TIMOV  A  ,R4MOVC  A  ,  @A+DPTRMOV  SBUF  ,AJNB  TI  ,  $CLR  TIRET声音报警K3:MOV  R5  ,#50K4:MOV  R6  ,#FFHK5:DJNZ  R6  ,  K5CPL  P1.1DJNZ  R5  ,  K4RETEND
大致瀏覽了你的程序,沒細看,有幾點建議:
1:顯示最好用中斷做(前提是你在練習,不是做產品),這對你以後的顯示程序有很大的幫助,可以做成模塊!不管做什麼,特別是匯編,如果不做模塊,你的每個案子都會是新的,這樣會很累的!
2:不管你在做什麼,標識千萬不要用K1,X1(變量或者子程序名)之類的,最好用相應的英文或者中文拼音(不能怕這樣麻煩),這樣有助與你的寫作程序,不然程序大了會很麻煩!你會不知道哪個是哪個的!
3:不能用P1.X的方式吧,應該重新定義或者改為P1^X的方式
至於其它的沒細看,不好評論!
0
回复
qb_0007
LV.2
31
2008-02-27 21:53
@fengzi7fengzi
大致瀏覽了你的程序,沒細看,有幾點建議:1:顯示最好用中斷做(前提是你在練習,不是做產品),這對你以後的顯示程序有很大的幫助,可以做成模塊!不管做什麼,特別是匯編,如果不做模塊,你的每個案子都會是新的,這樣會很累的!2:不管你在做什麼,標識千萬不要用K1,X1(變量或者子程序名)之類的,最好用相應的英文或者中文拼音(不能怕這樣麻煩),這樣有助與你的寫作程序,不然程序大了會很麻煩!你會不知道哪個是哪個的!3:不能用P1.X的方式吧,應該重新定義或者改為P1^X的方式至於其它的沒細看,不好評論!
谢谢你!
0
回复