|
主機(jī)通過(guò)按鍵完成叫號(hào),數(shù)碼管顯示被叫的號(hào),提醒顧客接受服務(wù);
從機(jī)通過(guò)串行通信方式完成排隊(duì)取號(hào)功能;
從機(jī)顯示隊(duì)列中排在其前面的顧客數(shù);
單片機(jī)源程序如下:
- #include <reg52.h>
- #define LED P2
- #define KEY P1
- #define DIG P0
- unsigned char GetKey(void);
- void delay10ms(void);
- unsigned char val[16] ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
- void initSer (void); //串口初始化
- unsigned char sendFlag = 0; //未發(fā)送數(shù)據(jù)時(shí)
- unsigned char receFlag =0; //未接受到數(shù)據(jù)時(shí)
- unsigned char key=0;
- void sendChar(unsigned char sendValue); //發(fā)送一字節(jié)數(shù)據(jù)
- void main(void)
- {
- initSer();
- LED=val[key];
- while(1)
- {
- key = GetKey();
- while(key) //單片機(jī)串口收到任意數(shù)據(jù)后,開始向PC發(fā)送數(shù)據(jù)
- {
- LED=val[key];
- sendChar(key); //發(fā)送數(shù)據(jù)
- key=0; //發(fā)完了清標(biāo)志
- }
- }
- }
- void serInt() interrupt 4 //中斷函數(shù)
- {
- if(RI) //如果收到任意數(shù)據(jù)
- {
- RI = 0;
- P1=SBUF; //數(shù)據(jù)的變化讓led燈直觀反應(yīng)出來(lái)
- receFlag=1; //修改接受標(biāo)志,便于主函數(shù)進(jìn)入while中發(fā)數(shù)據(jù)
- }
-
- if(TI)
- {
- TI = 0; //發(fā)送完一個(gè)數(shù)據(jù)
- sendFlag = 0; //清標(biāo)志位
- }
- }
- void sendChar(unsigned char Value) //發(fā)送一個(gè)字節(jié)數(shù)據(jù)
- {
- SBUF = Value;
- sendFlag = 1; //設(shè)置發(fā)送標(biāo)志位,發(fā)一字節(jié)就置位
- while(sendFlag); //直到發(fā)完數(shù)據(jù),將sendFlag清零后,才退出sendChar函數(shù)
- }
- void initSer() //初始化
- {
- //注意:剛上電時(shí),SCON是為0的
- TMOD=TMOD|0x20; //T1定時(shí)器模式,工作方式2
- TH1=0Xfd; // 256-(11059200/(32*12*9600))
- TL1=0xfd;
- SM0=0; //屬于SCON寄存器
- SM1=1; //串口工作方式1,10位異步,波特率可改
- REN=1; //允許串口接收
- ES=1; //開串口中斷
- EA=1; //開總中斷
- TR1=1; //啟動(dòng)定時(shí)器
- }
- unsigned char GetKey(void)
- {
- unsigned char hang = 0, lie = 0;
- unsigned char keyvalue = 0;
- // 第1回合第1步
- KEY = 0x0f; // 從IO口輸出,寫IO口
- if (KEY != 0x0f)// 從IO口輸入,讀IO口
- {
- // 讀出的不是0x0f說(shuō)明有按鍵被按下
- // 第1回合第2步:讀出端口從讀出值來(lái)判斷是哪一行
- delay10ms();
- // 第一回合中算出行號(hào)
- switch (KEY)
- {
- case 0x0e:hang = 1; break;
- case 0x0d: hang = 2; break;
- case 0x0b: hang = 3; break;
- case 0x07: hang = 4; break;
- default: break;
- }
- // 第2回合第1步
- KEY = 0xf0;
- if (KEY != 0xf0)
- {
- switch (KEY)
- {
- case 0xe0:lie = 1; break;
- case 0xd0: lie = 2; break;
- case 0xb0: lie = 3; break;
- case 0x70: lie = 4; break;
- default: break;
- }
- // 經(jīng)過(guò)2個(gè)回合后hang和lie都知道了,然后根據(jù)hang和lie去計(jì)算鍵值即可
- keyvalue = (hang - 1) * 4 + lie;
- return keyvalue;
- }
- }
- return 0;
- }
- void delay10ms(void) //誤差 0us
- {
- unsigned char a,b,c;
- for(c=5;c>0;c--)
- for(b=4;b>0;b--)
- for(a=248;a>0;a--);
- }
復(fù)制代碼
所有程序51hei提供下載:
kunkun.zip
(58.49 KB, 下載次數(shù): 27)
2019-6-25 14:38 上傳
點(diǎn)擊文件名下載附件
仿真和程序 下載積分: 黑幣 -5
|
|