• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

请问三路的抢答器如何加上串口以实现通信

c116学员0 2017-03-16 浏览量:1063
#include <reg52.h>
#define uint unsigned int 
#define uchar unsigned char
 
static unsigned int state=0;
static unsigned int action=0;  
sbit  lcden=P2^7;
sbit  lcdrs=P2^6;
sbit  lcdrw=P2^5;




/*-----------------------------------------------------------
变量定义
------------------------------------------------------------*/
sbit key1 = P3^1;
sbit key2 = P3^0;
sbit key3 = P3^2;
sbit key_start=P3^3;
sbit key_reset = P3^5;


bit key_start_flag = 0;
bit key_flag = 0;

uchar second = 20;
uchar timer0_count = 0;
uchar number = 0;
uchar number_display = 0;
void  delay(uchar z)
{
uchar x,y;
for(x=z;x>0;x--)
 for(y=110;y>0;y--);
}
void   write_com(uchar com) //根据1602写数据的时序图写程序
{ lcdrs=0; //re低电平写命令
  lcdrw=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;

}
void   write_data(uchar   shuju)
{
 lcdrs=1;//rs高电平写数据
 lcdrw=0;
 P0=shuju;
 delay(5);
 lcden=1;
 delay(5);
 lcden=0;
}
void  LCD_init() //根据1602的指令集写
{ lcden=0;
   write_com(0x80);
   write_com (0x0e);
   write_com(0x38);
   write_com(0x01);
   write_com(0x06);
}





/*-----------------------------------------------------------
“开始抢答”键扫描函数
------------------------------------------------------------*/
void start_keyscan()
{
if(key_start == 0) //如果“开始答题”按键被按下
{
delay(8);  //按键防抖动,延时8ms后,如果检测到按键依然是按下的状态,说明按键是真的被按下了
if((key_start == 0)&&(!key_start_flag))//如果按下“开始答题按键”,并且当前不是正在答题的状态
{
key_start_flag = 1; //“key_start_flag” 变量置1,表示已经按下了开始答题按键,进入了开始答题的状态
action  = 1;
TR0 = 1; //定时器0开始运行,开始倒计时
state = 0;
}
}
}
/*-----------------------------------------------------------
“复位键”扫描函数
------------------------------------------------------------*/
void reset_keyscan()
{
if(key_reset == 0)//如果“复位”按键被按下
{
delay(8); //按键防抖动,延时8ms后,如果检测到按键依然是按下的状态,说明按键是真的被按下了
if(key_reset == 0)//如果按下“复位按键”
{ TR0=0;
second=20; //设置要显示的秒数为12
key_start_flag = 0; //“key_start_flag”标志位置0,表示跳出答题的状态
number_display = 0;//设置显示的抢答者的号码为0
   state = 1;
}
}
}
/*-----------------------------------------------------------
4位抢答键扫描函数
------------------------------------------------------------*/
uchar key_scan3()
{
if(key_flag==0)
{
    if(key1 == 0) 
{
delay(8); //按键防抖动
if(key1 == 0)
{
key_flag=1;
number  = 1;  //要显示的抢答者的号码为1
number_display = number;
TR0=~TR0;
while(!key1);
}
}


if(key2 == 0)
{
delay(8);
if(key2 == 0)
{
  key_flag=1; 
number  = 2;
number_display = number;
TR0=~TR0;
while(!key2);
}
}


if(key3 == 0)
{
delay(8);
if(key3 == 0)
{
  key_flag=1; 
number  = 3;
number_display = number;
TR0=~TR0;
while(!key3);
}
}



}  
}
void display(uchar add,uchar x)
{
uchar ge,shi;
ge=x%10;
shi=x%100/10;
write_com(0x80+add);
write_data(0x30+shi);
write_data(0x30+ge);
}


void main()
{
TMOD=0x01;
TH0=0x3c;
TL0=0xb0;
EA=1;
ET0=1;
TR0=0;
LCD_init();
while(1)
{
start_keyscan();
reset_keyscan();
while(key_start_flag)
{
reset_keyscan();
while(!key_scan3())
{
display(0x06,second);
display(0x09,number_display);
if(second == 0)
break;//跳出当前循环
}
display(0x06,second);
display(0x09,number_display);
}
display(0x06,second);
display(0x09,number_display);
}
}

/*-----------------------------------------------------------
中断服务函数
------------------------------------------------------------*/
void timer0() interrupt 1
{
TH0=0x3c;
TL0=0xb0;
timer0_count ++;
if(timer0_count == 20)
{
timer0_count = 0;
second --;
if(second == 0)
{
TR0 = 0;
number_display = 0;
}

}

}

0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案

其他答案 数量:4

  • 你这种抢答器是要用三个51之间实现串口通信吗

    51上面只有一路I2C总线能够实现串行通信,因此你需要将这三个51的I2C总线连起来,选择其中一个作为主机,另外两个作为从机进行通信

    • 发布于2017-03-16
    • 举报
    • 评论 0
    • 0
    • 0

  • 我是覺得應該不需要三塊51開發板做,一塊開發板

    然後按鈕各自接線出去,這樣應該需要6x3=18個I/O,用18個以上I/O口的51就可了(STC15系列)

    可以用Busy waiting輪詢或者ISR中斷方式判斷誰先按下搶答

    然後開啟Tiimer定時器的中斷數秒即可

    最後透過UART串口輸出到上位機電腦

    電腦也有程式偵測串口來的資料,可以只存和傳送一個Byte的資料來解析就足夠了

    x111 1111

    其中最高位保留,第7~5 Bit判斷哪方先按下按鈕,低4 Bit為答題的選擇 (0未按下,1按下)

    程式只要負責解析就可以輸出顯示結果了

    而51串口方面程序範例就有了,使用上應該沒什麼問題才對...

    以上設計思路供參考

    • 发布于2017-03-17
    • 举报
    • 评论 0
    • 0
    • 0

  • 扫描按键就可以了,扫描到就让其他按键失能
    • 发布于2017-03-19
    • 举报
    • 评论 0
    • 0
    • 0

相关问题

问题达人换一批

请问三路的抢答器如何加上串口以实现通信