主机通过按键完成叫号,数码管显示被叫的号,提醒顾客接受服务;
从机通过串行通信方式完成排队取号功能;
从机显示队列中排在其前面的顾客数;
单片机源程序如下:
- #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)
|