完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
#include
#define uint unsigned int #define uchar unsigned char static unsigned int state=0; static unsigned int action=0; ***it lcden=P2^7; ***it lcdrs=P2^6; ***it lcdrw=P2^5; /*----------------------------------------------------------- 变量定义 ------------------------------------------------------------*/ ***it key1 = P3^1; ***it key2 = P3^0; ***it key3 = P3^2; ***it key_start=P3^3; ***it 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; } } } |
|
相关推荐
4个回答
|
|
云汉达人
3个子机串起来,其中一个给主机发整合过的信息。 假设这3台机子分别编号为A、B和C。 A每隔2毫秒把一个数据bufA赋值并串口发给B,假设这个数据是8位的,如果按键按下,bufA=0000 0001,否则就是0000 0000 B一旦收到A的数据,马上检测一下自己的按键有没有被按,假设被按下时候bufB=0000 0010,把bufB与bufA相加发送给C C也是一样处理,一旦收到B机的数据,若按键按下,则bufC=0000 0100,把bufC跟B机传过来的数据相加,然后发给主机 主机只要检测一下每次的1个字节的最后3位,那个最先变1 |
|
|
|
你这种抢答器是要用三个51之间实现串口通信吗
51上面只有一路I2C总线能够实现串行通信,因此你需要将这三个51的I2C总线连起来,选择其中一个作为主机,另外两个作为从机进行通信 |
|
|
|
我是覺得應該不需要三塊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串口方面程序範例就有了,使用上應該沒什麼問題才對... 以上設計思路供參考 |
|
|
|
用74hc165行不行了
|
|
|
|
只有小组成员才能发言,加入小组>>
818 浏览 0 评论
1162 浏览 1 评论
2537 浏览 5 评论
2872 浏览 9 评论
移植了freeRTOS到STMf103之后显示没有定义的原因?
2720 浏览 6 评论
keil5中manage run-time environment怎么是灰色,不可以操作吗?
1116浏览 3评论
199浏览 2评论
465浏览 2评论
382浏览 2评论
M0518 PWM的电压输出只有2V左右,没有3.3V是怎么回事?
463浏览 1评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-29 22:25 , Processed in 0.696915 second(s), Total 87, Slave 65 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号