主機通過按鍵完成叫號,數碼管顯示被叫的號,提醒顧客接受服務;
從機通過串行通信方式完成排隊取號功能;
從機顯示隊列中排在其前面的顧客數;
單片機源程序如下:
- #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; //未發送數據時
- unsigned char receFlag =0; //未接受到數據時
- unsigned char key=0;
- void sendChar(unsigned char sendValue); //發送一字節數據
- void main(void)
- {
- initSer();
- LED=val[key];
- while(1)
- {
- key = GetKey();
- while(key) //單片機串口收到任意數據后,開始向PC發送數據
- {
- LED=val[key];
- sendChar(key); //發送數據
- key=0; //發完了清標志
- }
- }
- }
- void serInt() interrupt 4 //中斷函數
- {
- if(RI) //如果收到任意數據
- {
- RI = 0;
- P1=SBUF; //數據的變化讓led燈直觀反應出來
- receFlag=1; //修改接受標志,便于主函數進入while中發數據
- }
-
- if(TI)
- {
- TI = 0; //發送完一個數據
- sendFlag = 0; //清標志位
- }
- }
- void sendChar(unsigned char Value) //發送一個字節數據
- {
- SBUF = Value;
- sendFlag = 1; //設置發送標志位,發一字節就置位
- while(sendFlag); //直到發完數據,將sendFlag清零后,才退出sendChar函數
- }
- void initSer() //初始化
- {
- //注意:剛上電時,SCON是為0的
- TMOD=TMOD|0x20; //T1定時器模式,工作方式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; //啟動定時器
- }
- 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說明有按鍵被按下
- // 第1回合第2步:讀出端口從讀出值來判斷是哪一行
- delay10ms();
- // 第一回合中算出行號
- 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;
- }
- // 經過2個回合后hang和lie都知道了,然后根據hang和lie去計算鍵值即可
- 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--);
- }
復制代碼
所有程序51hei提供下載:
kunkun.zip
(58.49 KB, 下載次數: 27)
2019-6-25 14:38 上傳
點擊文件名下載附件
仿真和程序 下載積分: 黑幣 -5
|