
SW1 BIT P30
SW2 BIT P31
SW3 BIT P32
SW4 BIT P33
ORG 0000H
LJMP MAIN
ORG 0030H
DELAY: ;延时1毫秒
MOV R3,#2
DELAY1:
MOV R4,#250
DJNZ R4,$
DJNZ R3,DELAY1
DJNZ R2,DELAY
RET
MAIN:
JB SW1,MAIN1
MOV P2,#7FH
MOV P0,#0F9H
SJMP $
MAIN1:
JB SW2,MAIN2
MOV P2,#7FH
MOV P0,#0A4H
SJMP $
MAIN2:
JB SW3,MAIN3
MOV P2,#7FH
MOV P0,#0B0H
SJMP $
MAIN3:
MOV P2,#7FH
MOV P0,#99H
SJMP $
END
电路原理如附图,它由IC1和一个编码开关以及控制器等组成。编码开关是由IC1中的输入端A、B、C、D与二极管和按键组成。
验证编码开关是否正确,只要按住任意一个按键。使它有一个正电平输入,数码管就会显示相应的数字来。A、B、C、D这四条编码线。
分别是1、2、4、8。3则是由1+2同时输入一个正电平获得,5则由1+4获得,6则由2+4获得,7则由1+2+4获得,二极管是起反向截止作用的。
扩展资料:
抢答器,原理:如果为四路,当其中任一路控下后,其他几路即失效,结果为第一次按下的,可以用数码管或是LED灯来显示,当然这里只是讲原理与编程,具体可以根据抢答器路数及显示方式更改程序即可。
源程序如下:
<div class="blockcode"><blockquote>/用的是AT89S52开发板,独立按键接口如下,就用这四路。先按下的用LED灯来显示,对应第一个到第四个LED灯,其他再按无效,如果想再次实现,可手动复位单片机/
#include <reg52h>
sbit key1=P3^0; //定义按键,根据需要连接线路,如独立按键(4路)
sbit key2=P3^1;
sbit key3=P3^2;
sbit key4=P3^3。
参考资料来源:百度百科-抢答器
能把问题描述清楚看来程序实现对你来说不成问题,我用伪代码给你写出来你自己补充完整即可。
void main()
{
unsigned char key,cont;
bit flag = 0;
初始化IO口;\\关闭红灯点亮绿灯,数码管显示0
while(1)
{
key = P1&0xF;
if(key!=0xF)
{
/按下的按键相应绿灯关闭/
LED_G1 = (bit)(key&0x1);
LED_G2 = (bit)(key&0x2);
LED_G3 = (bit)(key&0x4);
LED_G4 = (bit)(key&0x8);
/按下的按键相应红色LED闪烁/
for(cont=0;cont<5;cont++)
{
LED_R1 = (~LED_G1)|flag;
LED_R2 = (~LED_G2)|flag;
LED_R3= (~LED_G3)|flag;
LED_R4 = (~LED_G4)|flag;
Delay();//延时
flag = ~flag;
}
关闭所有红色LED并开启所有绿色LED;
}
}
}
注意:代码是允许有同时按下的情况,当然也可以改为不允许同时按下的情况发生,即如果发生同时按下则随便选择一个按键,这样觉得有点不公平。
/
(1)实现一四人抢答器,有人抢答成功后,其他人再抢答无效;
(2)通过蜂鸣器响1秒来提示抢答成功,并在数码管上显示抢答者的序号;
(3)主持人通过按键清除抢答信息,并开始 30 秒的答题倒计时,当倒计时
结束时,通过蜂鸣器响 1 秒来提示回答问题时间到,此时可以开始新一轮的抢答
/
module qiangda(rst,clk,ina,inb,inc,ind,judge,clk_1hz,wei,duan,beep,wei1,duan1,clk_1khz);
input clk,clk_1hz;
input ina,inb,inc,ind,judge;
output[3:0] wei;
output[7:0] duan;
input rst,clk_1khz;
output [3:0] wei1;
output [7:0] duan1;
output beep;
reg[3:0] wei;
reg[7:0] duan;
reg flag;
reg [5:0] shi,ge,data;
reg [4:0] count;
reg [3:0] wei1;
reg [7:0] duan1;
reg beep;
reg yu;
reg [1:0] count3;
always @(posedge clk)
begin
if(!rst) //系统复位,个人认为复位不够完整
begin
yu = 0;
end
if(!judge) //主持人控制按键
begin
flag=0; //允许抢答
wei=4'b1111; //数码管全不亮
//个人认为分成duan1和duan,wei1和wei的数码管数据总线不经济
duan=8'hff;
yu=1; //重新开始倒计时
end
else
begin
if(ge==6'b000000&&shi==6'b000000) //处于等待状态,实际上是等主持人按键(!judge),
;
else
begin
if(!ina) //若a抢答
begin
if(!flag) //若无人抢答成功
begin
wei=4'b1101;
duan=8'hf9; //数码管显示1,代表a抢答成功
flag=1; //抢答标志位有效
end
end
else if(!inb) //b抢答处理电路
begin
if(!flag)
begin
wei=4'b1101;
duan=8'ha4; //数码管显示2,代表b抢答成功
flag=1;
end
end
else if(!inc)
begin
if(!flag)
begin
wei=4'b1101;
duan=8'hb0; //数码管显示3
flag=1;
end
end
else if(!ind)
begin
if(!flag)
begin
wei=4'b1101;
duan=8'h99; //数码管显示4
flag=1;
end
end
end
end
end
always@(posedge clk_1hz or negedge rst)
begin
if(!rst)
begin
count = 0;
end
else if(count >= 5'd30) //计时达到30秒,停止计时
count = count;
else if(yu==1) //触发条件yu=1时,重新开始计数那不是变成从30开始数?感觉该段有些问题
count = count+5'b1;
end
//以下always过程块为shi和ge的译码电路,完成倒计时功能
always @(count)
begin
if(count>=5'b10101) //count>20时
begin
shi = 5'b00000; //shi=0
ge = 5'b11110-count; //ge = 30-count
end
else if(count>=5'b01011) //10<count<=20时
begin
shi=5'b00001; //shi=1
ge=5'b10100-count; //ge = 20-count
end
else if(count>=5'b00001) //0<count<=10时
begin
shi=5'b00010; //shi=2
ge=5'b01010-count; //ge = 10-count
end
else //其它情况,ie count = 0
begin
shi=5'b00011; //shi=3
ge=5'b0; //ge = 0
end
end
//以下always过程块为蜂鸣器发声驱动电路
always@(posedge clk_1hz)
if(flag|(shi==0&&ge==0)) //flag==1,有人抢答成功
//shi==0&&ge==0,倒计时结束
begin //上述两种情况下蜂鸣器响一秒
if(count3==2'b1)
begin
beep<=0;
count3<=count3;
end
else
begin
beep<=1;
count3<=count3+2'b1;
end
end
else
begin
beep<=0;
count3<=0;
end
//以下always过程块是数码管动态刷新电路,动态显示倒计时信息(shi和ge)
always @(clk_1khz)
begin
if(!rst)
wei1 = 4'b0000;
else if(clk_1khz)
begin
wei1=4'b0111;
data=ge;
end
else
begin
wei1=4'b1011;
data=shi;
end
end
always @(data) //数字显示译码,共阳极数码管(duan1)
begin
case(data)
6'b000000: duan1=8'b1100_0000;
6'b000001: duan1=8'b1111_1001;
6'b000010: duan1=8'b1010_0100;
6'b000011: duan1=8'b1011_0000;
6'b000100: duan1=8'b1001_1001;
6'b000101: duan1=8'b1001_0010;
6'b000110: duan1=8'b1000_0010;
6'b000111: duan1=8'b1111_1000;
6'b001000: duan1=8'b1000_0000;
6'b001001: duan1=8'b1001_0000;
default:duan1=8'b1111_1111;
endcase
end
endmodule
>
以上就是关于怎么把用c语言编的四路抢答器程序转变成汇编语言的程序(程序如下)全部的内容,包括:怎么把用c语言编的四路抢答器程序转变成汇编语言的程序(程序如下)、抢答器的的设计原理 及图、求proteus单片机c语言程序代码,四路抢答器等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)