基于51单片机的排队叫号系统设计(已通过proteus仿真)
系统概述
笔者认为,该项目设计特点为:工作模式贴近生活实际,设计思路较为小众,芯片利用率高,代码易懂。
该系统在实际应用中可减缓流水号排序速度,增加用户及时按下按键的时间,使之更为实用。
应用软件及版本
本系统设计主要使用了keil5和proteus8.6。读者应注意在直接通过下方链接下载原工程文件后,
自己电脑上的软件版本是否与笔者的相匹配。一般情况下都是高版本软件能打开低版本文件,
否则会出现问题。
系统功能描述
本系统基于STC15F2K60S2芯片,通过proteus仿真软件,模拟排队叫号系统。
因proteus8.6版本中不含有该芯片,故采用AT89C51作为替代。
该系统共有八个窗口,显示屏显示叫号格式为“窗口号--流水号”。
八个按键控制八个窗口的占用状态,按下为占用,重复按下为办理业务结束,解除占用。
代码及仿真展示
#include <STC15F2K60S2.H>
#include <intrins.h>
typedef unsigned char uchar;
typedef unsigned int uint;
sbit shcp_dr = P2^0;
sbit ds_dr = P2^1;
sbit stcp_dr = P2^2;
sbit mr_dr = P2^3;
sbit oe_dr = P2^4;
sbit Beep = P2^6;
sbit Win1 = P1^0;
sbit Win2 = P1^1;
sbit Win3 = P1^2;
sbit Win4 = P1^3;
sbit Win5 = P1^4;
sbit Win6 = P1^5;
sbit Win7 = P1^6;
sbit Win8 = P1^7;
uint code DigSegBuff[]=
{
0x00c0,0x00f9,0x00a4,0x00b0,0x0099,0x0092,0x0082,0x00f8,
0x0080,0x0090,0x0088,0x0083,0x00c6,0x00a1,0x0086,0x008e,
0x00bf,0x00c1,0x0091
};
static uchar flag[]={1,1,1,1,1,1,1,1};
void IniSystem();
void IniPeripherals();
void DelayXms(uint uiXms);
void BeepVoice(uchar ucNum);
void SendWords(uint uiDig);
void Display();
void main()
{
IniSystem();
_nop_();
IniPeripherals();
_nop_();
while(1)
{
Display();
}
}
void IniSystem()
{
shcp_dr = 0;
stcp_dr = 1;
mr_dr = 0;
oe_dr = 1;
Beep = 0;
EX0 = 0;
IE0 = 0;
}
void IniPeripherals()
{
shcp_dr = 0;
stcp_dr = 0;
mr_dr = 1;
oe_dr =1;
Beep = 1;
P1 = 0xff;
EA = 1;
EX0 = 1;
IE0 = 1;
IT0 = 1;
}
void DelayXms(uint uiXms)
{
uint i,j;
for(i = uiXms;i > 0;i--)
{
for(j = 110;j > 0;j--);
}
}
void BeepVoice(uchar ucNum)
{
uchar k;
for(k = 0;k < ucNum;k++)
{
Beep = 0;
DelayXms(120);
Beep = 1;
DelayXms(120);
}
Beep = 1;
}
void SendWords(uint uiDig)
{
uint uiTemp = ~uiDig;
uchar k;
for(k = 0;k < 16;k++)
{
if((uiTemp & 0x8000) != 0x8000)
{
ds_dr = 1;
}
else
{
ds_dr = 0;
}
shcp_dr = 0;
_nop_();
shcp_dr = 1;
_nop_();
shcp_dr = 1;
uiTemp = uiTemp << 1;
}
stcp_dr = 0;
_nop_();
stcp_dr = 1;
_nop_();
stcp_dr = 0;
oe_dr = 0;
}
void Display()
{
uchar k,m;
uint uiTemp,uiBit = 0x0001;
static uchar NumQ = 0,NumB = 0,NumS = 0,NumG = 1;
for(m = 0;m < 8;m++)
{
if(flag[m] == 1)
{
BeepVoice(3);
for(k = 0; k < 20;k++)
{
uiTemp = (uiBit << 8) | ((DigSegBuff[0]) & 0x00ff);
SendWords(uiTemp);
uiBit = uiBit << 1;
DelayXms(6);
uiTemp = (uiBit << 8) | ((DigSegBuff[m+1]) & 0x00ff);
SendWords(uiTemp);
uiBit = uiBit << 1;
DelayXms(6);
uiTemp = (uiBit << 8) | ((DigSegBuff[16]) & 0x00ff);
SendWords(uiTemp);
uiBit = uiBit << 1;
DelayXms(6);
uiTemp = (uiBit << 8) | ((DigSegBuff[16]) & 0x00ff);
SendWords(uiTemp);
uiBit = uiBit << 1;
DelayXms(6);
uiTemp = (uiBit << 8) | ((DigSegBuff[NumQ]) & 0x00ff);
SendWords(uiTemp);
uiBit = uiBit << 1;
DelayXms(6);
uiTemp = (uiBit << 8) | ((DigSegBuff[NumB]) & 0x00ff);
SendWords(uiTemp);
uiBit = uiBit << 1;
DelayXms(6);
uiTemp = (uiBit << 8) | ((DigSegBuff[NumS]) & 0x00ff);
SendWords(uiTemp);
uiBit = uiBit << 1;
DelayXms(6);
uiTemp = (uiBit << 8) | ((DigSegBuff[NumG]) & 0x00ff);
SendWords(uiTemp);
uiBit = uiBit << 1;
DelayXms(6);
uiBit = uiBit << 1;
uiBit = 0x0001;
}
NumG ++;
if(NumG > 9)
{
NumG = 0;
NumS ++;
if(NumS > 9)
{
NumS = 0;
NumB ++;
if(NumB > 9)
{
NumB = 0;
NumQ ++;
if((NumQ == 9)&(NumB == 9)&(NumS == 9)&(NumG > 9))
{
NumQ = 0;
NumB = 0;
NumS = 0;
NumG = 1;
}
}
}
}
}
}
}
void int0Win() interrupt 0
{
EX0 = 0;
if(Win1 == 0)
{
flag[0] = ~flag[0];
}
if(Win2 == 0)
{
flag[1] = ~flag[1];
}
if(Win3 == 0)
{
flag[2] = ~flag[2];
}
if(Win4 == 0)
{
flag[3] = ~flag[3];
}
if(Win5 == 0)
{
flag[4] = ~flag[4];
}
if(Win6 == 0)
{
flag[5] = ~flag[5];
}
if(Win7 == 0)
{
flag[6] = ~flag[6];
}
if(Win8 == 0)
{
flag[7] = ~flag[7];
}
EX0 = 1;
}
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/32cd94a17da638228c9e80137fcf4078.png)
工程文件链接
上述工程文件链接(含代码文件和仿真文件)