打开大学时期用过的电脑,翻到了当时课程设计——《银行排队叫号系统》分享一下。

一、原理图

二、代码

/**********************************************************************

* 硬件材料:用M16单片机、4个独立按键(代表四个窗口营业员消号控制端)、

1个独立按键叫号(顾客使用)、无源蜂鸣器(起到提示作用)以

及LCD1602显示信息 *

* 目 的:使人们免于排队浪费时间和体力,能在排队的时间里处理个人事务 *

* 用 途:银行的排队,医院的挂号等等 *

* 功 能:实现自动排队并完成叫号,设置一个排号按键,以及四个柜台用消号

按键。

当按下叫号键时,1.若队列不满,LCD显示"Your No.is 01!"的字样。

2.若队列已排满,LCD显示"The queue is full,please wait"的字样。

当按下消号键时,1.若队列无人,LCD显示"Sorry,the queue is empty

!"的字样。2.若队列有人,蜂鸣器响,LCD显示如"No.01 come to No.1

window,please!"的字样。 *

* 时钟频率:内部1M *

* 编译环境:ICC-AVR6.31 *

* 编 程:Tinyf3 *

* 显 示:用LCD1602显示如"No.01 come to No.1window,please!"的字样 *

* 结 果:实验通过 *

*

* 要 求:通过控制4个独立按键实现窗口控制消号 ,一个键实现叫号。最大累计

允许20人排队,当排队人数超过此人数是系统显示停止排队 *

***********************************************************************/

#include

#include

#define uchar unsigned char

#define uint unsigned int

uchar prompt1[]="Your No.is 00!"; //1062第一行显示的字符

uchar prompt2[]="No.00 come to No"; //1062第一行显示的字符

uchar prompt3[]=".0window,please!"; //1062第二行显示的字符

uchar prompt4[]="The queue is"; //1062第一行显示的字符

uchar prompt5[]="full,please wait"; //1062第二行显示的字符

uchar prompt6[]="Sorry,the queue "; //1062第一行显示的字符

uchar prompt7[]="is empty!"; //1062第二行显示的字符

static uint num_count=0; //排队叫的号码

uint rank_number[20]={0}; //排队叫号存储的数组

uint num=0; //窗口消的号码

int RankFlag=0; //叫号的标志

int ClearNumFlag=0; //消号的标志

static uint LengthFlag=0; //队列长度 叫一次号时+1,消一次号时-1

/*****************************************

LCD1602 端口RS、RW、EN的定义

*****************************************/

#define RS_CLR PORTC &= ~BIT(PC4)

#define RS_SET PORTC |= BIT(PC4)

#define RW_CLR PORTC &= ~BIT(PC5)

#define RW_SET PORTC |= BIT(PC5)

#define EN_CLR PORTC &= ~BIT(PC6)

#define EN_SET PORTC |= BIT(PC6)

/*****************************************

定义音乐数据二维数组{x,y}

x:对应音符音阶的OCR0值,0表示休止符

y:对应音符节拍,0表示音乐结束

其中0x8A表示音阶6,0xD5表示音阶2

*****************************************/

uint music_data[][2]=

{

{0x8A,600},{0xD5,900},{ 0, 0}

};

/*延时函数*/

void delay_us(unsigned int n)

{

if (n == 0)

{

return ;

}

while (--n);

}

/*延时函数*/

void delay_ms(unsigned char i)

{

unsigned char a, b;

for (a = 1; a < i; a++)

for (b = 1; b; b++);

}

/*****************************************

LCD1602 *显示屏命令写入函数*

*****************************************/

void LCD_write_com(uchar com)

{

RS_CLR;

RW_CLR;

EN_SET;

PORTA = com;

delay_ms(5);

EN_CLR;

}

/*****************************************

LCD1602 *显示屏命令写入函数*

*****************************************/

void LCD_write_data(uchar data)

{

RS_SET;

RW_CLR;

EN_SET;

PORTA = data;

delay_ms(5);

EN_CLR;

}

/*****************************************

LCD1602 *显示屏清空显示*

*****************************************/

void LCD_clear(void)

{

LCD_write_com(0x01);

delay_ms(10);

}

/*****************************************

LCD1602 显示屏初始化函数

*****************************************/

void LCD_init(void)

{

DDRA = 0xFF; /*I/O口方向设置*/

// DDRC|= BIT(PC4) | BIT(PC5) | (BIT(PC6);

DDRC |= 0x70;

LCD_write_com(0x38); /*显示模式设置*/

delay_ms(10);

LCD_write_com(0x38);

delay_ms(10);

LCD_write_com(0x38);

delay_ms(10);

LCD_write_com(0x38);

LCD_write_com(0x08); /*显示关闭*/

LCD_write_com(0x01); /*显示清屏*/

LCD_write_com(0x06); /*显示光标移动设置*/

delay_ms(10);

LCD_write_com(0x0C); /*显示开及光标设置*/

}

/*****************************************

5按键其键值的读取函数实现 按键1 用来叫号

按键2,3,4,5用做4个窗口消号键

*****************************************/

uint sweep_key()

{

uint jianzhi;

DDRD=0x0F;

PORTD=0xF0; //行输出低电平,列带上拉电阻输入

delay_us(5);

if(PIND==0xF0)

{

RankFlag=0;

ClearNumFlag=0;;

}

if(PIND!=0xF0)

{

delay_ms(10); //消斗

if(PIND!=0xF0)

{

if(PIND==0x70)

jianzhi=0;

else if(PIND==0xB0)

jianzhi=1;

else if(PIND==0xD0)

jianzhi=2;

else if(PIND==0xE0)

jianzhi=3;

PORTD=0x0F; //反转

DDRD=0xF0;

delay_ms(5);

if(PIND==0x0E)

jianzhi=jianzhi+1;

else if(PIND==0x0D)

jianzhi=jianzhi+5;

}

}

if(jianzhi==1) //使叫号标志有效

RankFlag=1;

if(jianzhi>=2 && jianzhi<=5) //使消号标志有效

ClearNumFlag=1;

return(jianzhi);

}

/*****************************************

叫号机 按一次一号键变量+1,最大为20

*****************************************/

void QueueNumProcess()

{

uint i;

if(RankFlag==1) //判断叫号标志是否有效

{

//n= sizeof(rank_number) / sizeof(rank_number[0]);

if ( LengthFlag<20)

{

num_count++;

rank_number[LengthFlag] = num_count;

}

LengthFlag++;

}

}

/*****************************************

窗口消号处理函数

*****************************************/

void ClearNumProcess()

{

uint i;

if (ClearNumFlag==1) //判断消号标志是否有效

{

num=rank_number[0]; //把消的号赋给全局变量num

for(i=0;i<19;i++) //让数组整体左移一个存储单元,即把消得号删除

{

rank_number[i]=rank_number[i+1];

}

LengthFlag--;

}

}

/*****************************************

检测到按键后,检测函数处理及LCD显示处理

*****************************************/

void CheckButtonProcess(uint m) //m代表检测到的键值

{

uint jz,i,n;

jz=m;

if((jz==1) && (RankFlag==1))

{

// 当队列人数达到20时,提示

// The queue is full,please wait!

if( LengthFlag>=20 )

{

LCD_clear();

LCD_write_com(0x80+0x02);

delay_ms(10);

for(i=0;i<12;i++)

{

LCD_write_data(prompt4[i]);

delay_ms(10);

}

LCD_write_com(0x80+0x40);

delay_ms(10);

for(i=0;i<16;i++)

{

LCD_write_data(prompt5[i]);

delay_ms(10);

}

}

else

{

QueueNumProcess();

prompt1[11]=(num_count)/10+'0';

prompt1[12]=(num_count)%10+'0';

LCD_clear();

LCD_write_com(0x80+0);

delay_ms(10);

for(i=0;i<14;i++)

{

LCD_write_data(prompt1[i]); //"Your No.is 00!";

delay_ms(10);

}

RankFlag=0;

}

}

if(jz>=2 && jz<=5 && ClearNumFlag==1)

{

if(LengthFlag==0)

{

LCD_clear();

LCD_write_com(0x80+0);

delay_ms(10);

for(i=0;i<16;i++)

{

LCD_write_data(prompt6[i]);//"Sorry,the queue ";

delay_ms(10);

}

LCD_write_com(0x80+0x40);

delay_ms(10);

for(i=0;i<9;i++)

{

LCD_write_data(prompt7[i]);//"is empty!"

delay_ms(10);

}

}

else

{

ClearNumProcess(); //消号处理,营业员操作

PlayMusic(); //播放一小段音乐,提示

prompt2[3]=num/10+'0';

prompt2[4]=num%10+'0';

LCD_clear();

LCD_write_com(0x80+0);

delay_ms(10);

for(i=0;i<16;i++)

{

LCD_write_data(prompt2[i]); //"No.00 come to No";

delay_ms(10);

}

prompt3[1]=(jz-1)+'0';

LCD_write_com(0x80+0x40);

delay_ms(10);

for(i=0;i<16;i++)

{

LCD_write_data(prompt3[i]); //".0window,please!";

delay_ms(10);

}

ClearNumFlag=0;

}

}

}

/*****************************************

音乐处理函数

*****************************************/

void sound(uchar i)

{

uint x;

x=music_data[i][0]; //取音乐的匹配数

if(x!=0)

{

TCNT0=0x00;

OCR0=x; //比较值赋值

TCCR0 = 0x1A; //CTC模式允许比较反转输出OC0

}

else

{

TCCR0 = 0x00; //频率为0,休止符,不发声

}

}

void delayms(uint i) //节拍延迟

{

uchar a;

for(;i;i--)

{

for (a = 220; a; a--)

{

;

}

}

}

/*****************************************

播放音乐函数

*****************************************/

void PlayMusic()

{

uchar i=0;

DDRB |= BIT(PB3);

//PORTB &= ~BIT(PB3);

while(music_data[i][1]!=0) //等待最后一个音符到来

{

sound(i); //输出音符

delayms(music_data[i][1]);//节拍延时

TCCR0 = 0x00; //奏完一个音符停止

i++; //准备一下个音符

}

}

/*****************************************

main 函数

*****************************************/

void main(void)

{

uint Kvalue;

LCD_init();

while(1)

{

Kvalue=sweep_key(); //获取键值

if (RankFlag==1 || ClearNumFlag==1)//判断叫号标志和消号标志是否有效

CheckButtonProcess(Kvalue);

delay_ms(20);

RankFlag=0; //使叫号标志无效

ClearNumFlag=0; //使消号标志无效

Kvalue=0; //键值清0

}

}

python银行排队系统仿真_单片机实现银行排队叫号系统Proteus仿真相关推荐

  1. 基于51单片机水位检测自动抽水系统Proteus仿真

    资料编号:168   下面是相关功能视频演示: 168-基于51单片机水位检测自动抽水系统Proteus仿真(源码+仿真+全套资料) 功能讲解: 采用51单片机作为控制CPU,采用ADC0832采集水 ...

  2. 基于STM32单片机一氧化碳(CO)气体监控系统proteus仿真设计

    本设计是基于STM32单片机CO气体检测系统仿真设计(仿真+程序+原理图+仿真视频) 仿真图proteus 8.9 程序编译器:keil 5 编程语言:C语言 设计编号:C0045 主要功能: 1.S ...

  3. 智能水位检测系统proteus_基于单片机控制的智能检测系统Proteus仿真设计研究

    0引言近年来,单片机发展到了一个全新阶段,广泛应用于电子.机械控制.自动化生产设计等行业,并逐步延伸到智能控制的诸多领域.以单片机为控制核心的小型自动化生产检测系统,尤其在一些液体产品的检测等复杂工程 ...

  4. 基于51单片机的水位水质检测系统Proteus仿真原理图PCB

    功能: 0.本系统采用STC89C52作为单片机 1.LCD1602液晶实时显示水位.水质百分比 2.按键设置水位水质阈值并通过液晶显示 3.具备4个LED分别作为水位水质的上下限指示灯 4.具备声光 ...

  5. C语言温控风机程序,温度控制电风扇单片机c系统proteus仿真.docx

    温度控制电风扇单片机c系统proteus仿真.docx 摘 要电子技术是根据电子学的原理,运用电子元器件设计和制造某种特定功能的电路以解决实际问题的科学,包括信息电子技术和电力电子技术两大分支.在电气 ...

  6. 基于stm32单片机的台历日历计时器万年历Proteus仿真(源码+仿真+全套资料)

    资料编号:151 视频讲解: 151-基于stm32单片机的台历日历计时器万年历Proteus仿真(源码+仿真+全套资料) 采用stm32单片机作为主控,LCD屏幕上部分显示电子日历,下半屏幕显示台历 ...

  7. 【043】基于51单片机的篮球比赛积分计时系统Proteus仿真

    一.压缩包资料内容 (1).基于51单片机的篮球比赛积分计时系统proteus仿真设计一份: (2).基于51单片机的篮球比赛积分计时系统proteus仿真设计keli源代码一份: (3).基于51单 ...

  8. 单片机实验笔记(汇编、Proteus仿真)(下)

    接上一条单片机实验笔记(汇编.Proteus仿真) 第五节课 第五节课 内容为驱动多位数码管.和驱动一位数码管大同小异. ORG 0000H LJMP MAINORG 0100H MAIN: MOV ...

  9. 【038】基于51单片机的土壤湿度自动浇花系统Proteus仿真设计

    一.压缩包资料内容 (1).基于51单片机的土壤湿度自动浇花系统proteus仿真设计一份: (2).基于51单片机的土壤湿度自动浇花系统proteus仿真设计keli源代码一份: (3).基于51单 ...

  10. 基于51单片机的室内温度可燃气体检测报警系统Proteus仿真(源码+仿真+全套资料)

    资料编号:133 讲解视频: 133-基于51单片机的室内温度可燃气体检测报警系统Proteus仿真(源码+仿真+全套资料) 功能介绍: 采用51单片机作为主控,LCD1602显示当前温度和可燃气体浓 ...

最新文章

  1. python 进制转换_Python数据结构与算法——递归应用之进制转换
  2. python读取html内容 dom获取_python学习笔记十三 JS,Dom(进阶篇)
  3. 汇编语言程序设计c,c与汇编语言程序设计
  4. 计算机如何“看懂”图片?达摩院提出新的研究方法
  5. 循序渐进DB2(第2版)——DBA系统管理、运维与应用案例
  6. Could not find support-media-compat.aar
  7. unity摄影机depth模式_Unity3D Camera 摄像机属性详解
  8. Linux PWN从入门到熟练
  9. 如何把SQLServer数据库从高版本降级到低版本?
  10. PHP数组之间的比较,PHP 数组之间的比较方法:
  11. apache+php
  12. mysql5.7.76安装,win7下mysql5.7.17安装配置方法图文教程
  13. springboot菜鸟入门
  14. jsdroid 教程_2020年建筑行业资源近2000G免费建筑教程,分享给有需要的建筑同行
  15. 范浩强树的学习历程,同时附加一个例题HDU4585shaolin
  16. php notice错误是什么意思,PHP中Notice错误常见解决方法
  17. PC浏览器播放m3u8
  18. 【清华大学】深入理解操作系统(陈渝) 第二章
  19. ZoomIt v4.5
  20. JavaScript中事件的绑定与解绑

热门文章

  1. pingfang css,前端项目,引入PingFang SC字体
  2. vim编辑器永久显示行号
  3. Kinect v2 使用ork功能包进行物体识别
  4. 【功能测试】-【黑盒测试用例】
  5. Java开发 明华usbkey_明华驱动官方版下载-明华usbkey数字证书驱动下载v3.0.2420.9 最新版-当易网...
  6. python实验总结与分析_Python程序设计实验一报告
  7. linux aix试题,《aix-linux考试试题.xls》-支持高清全文免费浏览-max文档
  8. SeetaFace6人脸识别源码编译和示例运行
  9. 刹车盘的噪音测试软件,某车型盘式制动器尖叫噪声分析及改进
  10. 2021华为软挑(区域初赛)总结