1 開發(fā)環(huán)境
仿真圖:proteus8.9以上
程序代碼:KEIL4/KEIL5
原理圖:AD
設(shè)計(jì)編號:A0006
視頻講解
基于51單片機(jī)的雙機(jī)串口通信排隊(duì)叫號系統(tǒng)(LCD顯示)設(shè)計(jì)
2 功能說明介紹
結(jié)合實(shí)際情況,基于51單片機(jī)設(shè)計(jì)一個(gè)排隊(duì)叫號系統(tǒng)設(shè)計(jì)。該系統(tǒng)應(yīng)滿足的功能要求為:
由51單片機(jī)、按鍵模塊、LCD1602液晶屏、蜂鳴器呼叫模塊構(gòu)成
具體功能:
1、主機(jī)通過按鍵完成叫號,LCD1602液晶顯示屏顯示被叫的號碼及服務(wù)的柜臺號;同時(shí),蜂鳴器響,以提醒顧客接收服務(wù);
2、從機(jī)按下按鍵實(shí)現(xiàn)取號,并通過串行通信方式實(shí)現(xiàn)排隊(duì)取號功能;
3、從機(jī)還可以實(shí)時(shí)顯示自己的排隊(duì)號及及當(dāng)前正在等待的人數(shù)。
3 仿真圖
AT89C51是美國ATMEL公司生產(chǎn)的低電壓,高性能CMOS16位單片機(jī),片內(nèi)含4k bytes的可反復(fù)擦寫的只讀程序存儲器和128 bytes的隨機(jī)存取數(shù)據(jù)存儲器,期間采用ATMEL公司的高密度、非易失性存儲技術(shù)生產(chǎn),兼容標(biāo)準(zhǔn)MCS-51指令系統(tǒng),片內(nèi)置通用16位中央處理器和Flash存儲單元,功能強(qiáng)大的AT89C51單片機(jī)可靈活應(yīng)用于各種控制領(lǐng)域。
AT89C51提供以下標(biāo)準(zhǔn)功能:4k字節(jié)Flash閃速存儲器,128字節(jié)內(nèi)部RAM,32個(gè)I/O口線,兩個(gè)1 6位定時(shí)/計(jì)數(shù)器,一個(gè)5向量兩級中斷結(jié)構(gòu),一個(gè)全雙工串行通信口,片內(nèi)振蕩器及時(shí)鐘電路。同時(shí),AT89C51可降至0Hz的靜態(tài)邏輯操作,并支持兩種軟件可選的節(jié)電工作模式??臻e方式停止CPU的工作,但允許RAM,定時(shí)/計(jì)數(shù)器,串行通信口及中斷系統(tǒng)繼續(xù)工作。掉電方式保存RAM中的內(nèi)容,但振蕩器停止工作并禁止其它所有部件工作直到下一個(gè)硬件復(fù)位。
本系統(tǒng)中央控制器采用的單片機(jī)AT89C51,復(fù)位電路采用上電復(fù)位電路。外接的晶振為12MHz晶振。
當(dāng)前仿真情況為:取號機(jī)取了三個(gè)號,叫號器的柜臺2叫第一個(gè)號。叫號過程有蜂鳴器提示。
4 程序
工程文件使用Keil4/keil5打開。
代碼分為取號機(jī)代碼和叫號機(jī)代碼,分別編譯產(chǎn)生hex加載到對應(yīng)的單片機(jī)中。
代碼
叫號機(jī)主函數(shù)
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit RS=P2^0; //1:數(shù)據(jù)輸入,0:指令輸入
sbit RW=P2^1; //1: 讀出,0:寫入
sbit E=P2^2; //1:有效,0:無效
sbit key0=P1^0;
sbit key1=P1^1;
sbit key2=P1^2;
sbit key3=P1^3;
sbit key4=P1^4;
sbit key5=P1^5;
sbit key6=P1^6;
sbit key7=P1^7;
sbit BEEP=P2^6;
uint sev=0;
uint sev1=0;
uint sev2=0;
uint sev3=0;
uint sev4=0;
uint m=0,i=0;
uint jhao=1,qhao=0,dhao=0; //排隊(duì)叫號 //窗口消的號碼
uint jz=0;
uchar data test[]="Hello!"; //初始顯示的字符
uchar data prompt2[]="No.00 come to No"; //1062第一行顯示的字符
uchar data prompt3[]="0.window,Please!"; //1062第二行顯示的字符
uchar data prompt8[]="00 is left";
uchar data prompt9[]="All is 00";
uchar data prompt10[]="W1 - 00";
uchar data prompt11[]="W2 - 00";
uchar data prompt12[]="W3 - 00";
uchar data prompt13[]="W4 - 00";
void intCon()
{
EA=0; //關(guān)總中斷
SCON=0x50; //0101 0000,SM0 SM1=01表示選擇工作方式1;SM2 REN=01表示串行口多機(jī)通訊控制位,串行口允許接收(從外部接收數(shù)據(jù))
PCON=0X00; //電源控制寄存器 最高位為SMOD,為0,表示波特率不加倍,為1,表示波特率加倍
TMOD=0x20; //0010 0000,GATE=0,以運(yùn)行控制位TR啟動定時(shí)器;采用定時(shí)1工作方式2
TH1=0xfd; //波特率9600=2^smod*(11.05926*10^6)/(32*12*(2^8-X))
TL1=0xfd;
TR1=1; //計(jì)數(shù)器工作
}
//
void delay(int n) //延時(shí)子程序
{
int k,j;
for(k=0;k<=n;k++)
for(j=0;j<=10;j++);
}
void delay1s(int n) //延時(shí)子程序
{
int k,j;
for(k=0;k<=n;k++)
for(j=0;j<=120;j++);
}
void SPEAKER(uint x) //蜂鳴器程序
{
for(i=0;i<=200;i++)
{
delay(x);
BEEP=~BEEP;
}
BEEP=1; }
/**************LCD程序**********/
void delay1ms(unsigned int ms) //延時(shí)的時(shí)間
{
uint k,j;
for(k=0;k<ms;k++)
for(j=0;j<100;j++);
}
void LCD_w_com(unsigned com) // 寫入指令
{
RW=0;
RS=0;
E=1;
P0=com;
delay1ms(40);
E=0;
RW=1;
}
void LCD_w_dat(uchar dat) // 寫入數(shù)據(jù)
{
RW=0;
RS=1;
E=1;
P0=dat;
delay1ms(40);
E=0;
RW=1;
}
void gotoxy(unsigned x,unsigned y) {
if(x==1)
LCD_w_com(0x80+y);
else
LCD_w_com(0xC0+y);
}
void clear_LCD(void)
{
LCD_w_com(0x01); //清屏指令
LCD_w_com(0x02); // 光標(biāo)歸位
}
void init_LCD(void) // 初始化LCD
{
LCD_w_com(0x38); // LCD為兩行顯示
LCD_w_com(0x0c); // 顯示字符 關(guān)閉光標(biāo)
LCD_w_com(0x06); // 輸入方式設(shè)置
gotoxy(1,0);
for(i=0;i<=5;i++)
{
LCD_w_dat(test[i]);
}
}
/*********叫號機(jī) 按一次一號鍵變量+1最大為10*************/
void key()
{
if(qhao>jhao)
{
SPEAKER(11);
delay(200);
SPEAKER(15);
clear_LCD();
sev++;
prompt2[3]=(jhao+1)/10+'0';
prompt2[4]=(jhao+1)%10+'0';
prompt3[0]=jz+'0';
gotoxy(1,0);
for(m=0;m<=15;m++)
{
LCD_w_dat(prompt2[m]);
}
gotoxy(2,0);
for(m=0;m<=15;m++)
{
LCD_w_dat(prompt3[m]);
}
jhao++;
}
}
void k5()
{
clear_LCD();
dhao=qhao-jhao;
prompt8[0]=dhao/10+'0';
prompt8[1]=dhao%10+'0';
gotoxy(1,0);
for(m=0;m<=9;m++)
{
LCD_w_dat(prompt8[m]);
}
}
void k6()
{
clear_LCD();
prompt9[7]=(sev)/10+'0';
prompt9[8]=(sev)%10+'0';
gotoxy(1,0);
for(m=0;m<=8;m++)
{
LCD_w_dat(prompt9[m]);
}
}
void k7()
{
clear_LCD();
prompt10[5]=sev1/10+'0';
prompt10[6]=sev1%10+'0';
prompt11[5]=sev2/10+'0';
prompt11[6]=sev2%10+'0';
prompt12[5]=sev3/10+'0';
prompt12[6]=sev3%10+'0';
prompt13[5]=sev4/10+'0';
prompt13[6]=sev4%10+'0';
gotoxy(1,0);
for(m=0;m<=6;m++)
{
LCD_w_dat(prompt10[m]);
}
gotoxy(1,8);
for(m=0;m<=6;m++)
{
LCD_w_dat(prompt11[m]);
}
gotoxy(2,0);
for(m=0;m<=6;m++)
{
LCD_w_dat(prompt12[m]);
}
gotoxy(2,8);
for(m=0;m<=6;m++)
{
LCD_w_dat(prompt13[m]);
}
}
//矩陣鍵盤掃描函數(shù)
void matrixkeyscan()
{
unsigned char temp;
P1=0xff; //先向P1 口寫1;端口讀狀態(tài)
P1=0xf0; //列送di電平,行送gao電平
temp=P1;
if(temp!=0xf0)//判斷是否有鍵按下,若有鍵按下則temp不等于0xf0
{
delay(10); // 防抖動
if(temp!=0xf0)
{
P1=0xef; //掃描第一行
temp=P1;
switch(temp)
{
case(0xe7):{jz=1;sev1++; key();} ;break; //第一行第一列
case(0xeb):{jz=2;sev2++; key();} ;break; //第一行第二列
case(0xed):{jz=3;sev3++; key();} ;break; //第一行第三列
case(0xee):{jz=4;sev4++; key();} ;break; //第一行第四列
}
P1=0xdf;
temp=P1;
switch(temp) //掃描第二行
{
case(0xd7):k5();break; //第二行第一列
case(0xdb):k6();break; //第二行第二列
case(0xdd):k7();break; //第二行第三列
}
}
}
}
void main()
{
//intCon();
clear_LCD();
init_LCD();
jhao=0;
while(1) //一直執(zhí)行
{
matrixkeyscan();
SBUF=jhao; //叫號送發(fā)送存儲器
while(!TI); //若一幀數(shù)據(jù)發(fā)送完畢,則TI=1,在將 TI置為0,讓其處于接收狀態(tài)
TI=0;
if(RI) //若接收完一幀數(shù)據(jù),則RI=1
{
RI=0; //將RI置0,讓其處于接收狀態(tài)
qhao=SBUF;//取號數(shù)從接收存儲器中取得
}
}
}
叫號機(jī)主程序流程圖如下圖所示。
取號機(jī)部分代碼:
unsigned long qhao=1,dhao=1,jhao=0; //分別為取到的人數(shù),等待的人數(shù) 叫到的人數(shù)
void intCon()
{
EA=0; //關(guān)總中斷
SCON=0x50; //0101 0000,SM0 SM1=01表示選擇工作方式1;SM2 REN=01表示串行口多機(jī)通訊控制位,串行口允許接收(從外部接收數(shù)據(jù))
PCON=0X00; //電源控制寄存器 最高位為SMOD,為0,表示波特率不加倍,為1,表示波特率加倍
TMOD=0x20; //0010 0000,GATE=0,以運(yùn)行控制位TR啟動定時(shí)器;采用定時(shí)1工作方式2
TH1=0xfd; //波特率為9600bit/s
TL1=0xfd;
TR1=1; //計(jì)數(shù)器工作
}
void delay(int n) //延時(shí)程序
{
int k,j;
for(k=0;k<=n;k++)
for(j=0;j<=10;j++);
}
void delay1s(int n) //延時(shí)程序
{
int k,j;
for(k=0;k<=n;k++)
for(j=0;j<=120;j++);
}
/**************LCD程序**********/
void delay1ms(unsigned int ms) //延時(shí)的時(shí)間
{
uint k,j;
for(k=0;k<ms;k++)
for(j=0;j<100;j++);
}
void LCD_w_com(unsigned com) // 寫入指令
{
RW=0;
RS=0;
E=1;
P0=com;
delay1ms(40);
E=0;
RW=1;
}
void LCD_w_dat(uchar dat) // 寫入數(shù)據(jù)
{
RW=0;
RS=1;
E=1;
P0=dat;
delay1ms(40);
E=0;
RW=1;
}
void gotoxy(unsigned x,unsigned y) {
if(x==1)
LCD_w_com(0x80+y);
else
LCD_w_com(0xC0+y);
}
void clear_LCD(void)
{
LCD_w_com(0x01); //清屏指令
LCD_w_com(0x02); // 光標(biāo)歸位
}
void init_LCD(void) // 初始化LCD
{
LCD_w_com(0x38); // LCD為兩行顯示
LCD_w_com(0x0c); // 顯示字符 關(guān)閉光標(biāo)
LCD_w_com(0x06); // 輸入方式設(shè)置
gotoxy(1,0);
for(i=0;i<=7;i++)
{
LCD_w_dat(test[i]);
}
}
// 判斷取號鍵被按下
void panduan_01()
{
if(K1==0)
{ delay(10); //防抖
if(K1==0)
{
if(qhao>99)
{
EA=0;
delay1s(5000);
clear_LCD();
gotoxy(1,2);
for(m=0;m<=11;m++)
{
LCD_w_dat(prompt4[m]);
}
gotoxy(2,0);
for(m=0;m<=15;m++)
{
LCD_w_dat(prompt5[m]); //提示隊(duì)列已滿
}
}
else
{
clear_LCD();
prompt1[11]=(qhao)/10+'0';
prompt1[12]=(qhao)%10+'0';
qhao++;
gotoxy(1,0);
for(m=0;m<=13;m++)
{
LCD_w_dat(prompt1[m]); //"Your No.is 00!";
}
}
dhao=qhao-jhao; //等待的人數(shù)=人數(shù)-叫的人
prompt8[0]=(dhao-1)/10+'0';
prompt8[1]=(dhao-1)%10+'0';
gotoxy(2,0);
for(m=0;m<=9;m++)
{
LCD_w_dat(prompt8[m]);
}
}
}
while(K1==0);
}
//判斷等待的人數(shù)鍵被按下 ,按下顯示等待的人數(shù),松開后顯示取到的號碼
void panduan_02()
{
if(K2==0)
{ delay(10); //防抖
if(K2==0)
{
dhao=qhao-jhao; //等待的人數(shù)=人數(shù)-叫的人
clear_LCD();
prompt8[0]=dhao/10+'0';
prompt8[1]=dhao%10+'0';
gotoxy(2,0);
for(m=0;m<=9;m++)
{
LCD_w_dat(prompt8[m]);
}
}
}
}
void main(void)
{
clear_LCD();
init_LCD();
intCon();
jhao=0;
while(1)
{
if(K1==0)
panduan_01();
SBUF=qhao; //取號送發(fā)送存儲器
while(!TI); //若一幀數(shù)據(jù)發(fā)送完畢,則TI=1,在將 TI置為0,讓其處于接收狀態(tài)
TI=0;
if(RI) //若接收完一幀數(shù)據(jù),則RI=1
{
RI=0; //將RI置0,讓其處于接收狀態(tài)
jhao=SBUF; //叫號數(shù)從接收存儲器中取得
}
if(K2==0)
panduan_02();
}
}
取號機(jī)取號程序流程:
5 原理圖
原理圖由AD繪制,原理圖和仿真圖有出入,原理圖需要電源,電源開關(guān)模塊。此設(shè)計(jì)資料詳細(xì),硬件手冊資料圖片詳細(xì),不對硬件調(diào)試負(fù)責(zé),做實(shí)物需要一定的基本功。主控芯片可以換為STC89C51/STC89C52
如圖3.1是本系統(tǒng)的硬件設(shè)計(jì)方案,具體地,主機(jī)及從機(jī)硬件電路由以下模塊構(gòu)成:
(1)單片機(jī)最小系統(tǒng)。用于驅(qū)動和控制其他模塊,以實(shí)現(xiàn)整體功能,其以AT89C51單片機(jī)為核心芯片,并輔以復(fù)位電路和晶振電路。
(2)按鍵模塊。主機(jī)按鍵由四個(gè)矩陣按鍵構(gòu)成,代表不同的柜臺;從機(jī)按鍵由一個(gè)按鍵構(gòu)成,用于顧客取號;
(3)顯示模塊。主機(jī)通過LCD1602液晶顯示屏顯示被叫的號碼及服務(wù)的柜臺號; 從機(jī)通過LCD1602液晶顯示屏顯示自己的排隊(duì)號;
(4)蜂鳴器模塊。用以提醒顧客接收服務(wù);
![]() |
(5)電源模塊。用于整個(gè)系統(tǒng)的供電。
6 視頻講解
代碼講解+仿真講解+仿真演示+原理圖講解
7 設(shè)計(jì)報(bào)告
排隊(duì)論(又稱隨機(jī)服務(wù)系統(tǒng))是研究系統(tǒng)由于隨機(jī)因素的干擾而出現(xiàn)排隊(duì)(或擁塞)現(xiàn)象的規(guī)律的一門學(xué)科,它適用于一切服務(wù)系統(tǒng),包括公共服務(wù)系統(tǒng)、通信系統(tǒng)、計(jì)算機(jī)系統(tǒng)等。可以說,凡是出現(xiàn)擁塞現(xiàn)象的系統(tǒng),都屬于隨機(jī)服務(wù)系統(tǒng)。一個(gè)對象通過擁塞系統(tǒng)接受服務(wù)必須經(jīng)過三個(gè)環(huán)節(jié),即到達(dá)、排隊(duì)等候處理、接受服務(wù)和離去。例如在醫(yī)院中,排隊(duì)流程如下:患者在掛號的同時(shí)領(lǐng)取排隊(duì)號碼,然后到候診區(qū)候診;當(dāng)為前一患者完成診斷后,醫(yī)生通過本系統(tǒng)呼叫隊(duì)列中下一位患者,患者就可直接到空閑診室行排隊(duì)等候服務(wù)。
另一個(gè)方面,伴隨著服務(wù)行業(yè)業(yè)務(wù)量不斷增長,業(yè)務(wù)種類日益增多,排隊(duì)等候已成為人們經(jīng)常面臨的實(shí)際問題。在銀行,醫(yī)院,電信,稅務(wù),工商等營業(yè)大廳里,前擁后擠,雜亂無章的排隊(duì)等候,已是司空見慣的現(xiàn)象,影響了服務(wù)質(zhì)量。因此,改善服務(wù)質(zhì)量,樹立良好的企業(yè)形象,解決客戶勞累的排隊(duì)現(xiàn)象,創(chuàng)造人性化服務(wù)環(huán)境已成為急需解決的問題。設(shè)計(jì)一套排隊(duì)抽號的服務(wù)系統(tǒng),可以很好的解決因排隊(duì)引起的種種問題。
本系統(tǒng)通過AT89C51單片機(jī)直接擴(kuò)展獨(dú)立鍵盤,完成排隊(duì)取號流程,單片機(jī)控制LCD1602顯示排隊(duì)等待情況,控制蜂鳴器發(fā)聲完成叫號功能。該系統(tǒng)有良好的人機(jī)交互界面,模擬排隊(duì)管理,科學(xué)地處理各種排隊(duì)情況,操作簡便,控制靈活,顯示清晰,制作成本低,性價(jià)比較高。
7.1 設(shè)計(jì)目的
(1)鞏固和加深對單片機(jī)原理和接口技術(shù)知識的理解;
(2)培養(yǎng)根據(jù)課題需要選學(xué)參考書籍、查閱手冊和文獻(xiàn)資料的能力;
(3)學(xué)會方案論證的比較方法,拓寬知識,初步掌握工程設(shè)計(jì)的基本方法;
(4)掌握常用儀器、儀表的正確使用方法,學(xué)會軟、硬件的設(shè)計(jì)和調(diào)試方法;
(5) 能按課程設(shè)計(jì)的要求編寫課程設(shè)計(jì)報(bào)告,能正確反映設(shè)計(jì)和實(shí)驗(yàn)成果,能用計(jì)算機(jī)繪制電路圖、仿真圖和流程圖。
7.2 設(shè)計(jì)要求及內(nèi)容
(1)主機(jī)通過按鍵完成叫號,LCD1602液晶顯示屏顯示被叫的號碼及服務(wù)的柜臺號;同時(shí),蜂鳴器響,以提醒顧客接收服務(wù);
(2)從機(jī)按下按鍵實(shí)現(xiàn)取號,并通過串行通信方式實(shí)現(xiàn)排隊(duì)取號功能;
(3)從機(jī)還可以實(shí)時(shí)顯示自己的排隊(duì)號。
7.3 本文結(jié)構(gòu)安排
本文圍繞著基于51單片機(jī)的排隊(duì)叫號系統(tǒng)展開設(shè)計(jì),以排隊(duì)叫號需求為出發(fā)點(diǎn),首先明確了研究背景與意義,介紹了設(shè)計(jì)目的,并論述了設(shè)計(jì)要求及設(shè)計(jì)內(nèi)容,接下來的幾章將具體展開相關(guān)設(shè)計(jì)與研究:
第二章介紹系統(tǒng)總體方案及相關(guān)理論知識,重點(diǎn)闡述了系統(tǒng)功能需求和系統(tǒng)方案論證,接著簡要介紹了系統(tǒng)硬件及軟件基本知識。
第三章重點(diǎn)展開硬件系統(tǒng)設(shè)計(jì),首先明確主機(jī)及從機(jī)硬件電路設(shè)計(jì)的思路及框架。接著依次介紹了:單片機(jī)最小系統(tǒng)、按鍵電路、LCD1602顯示電路、蜂鳴器提醒電路、電源電路等。通過對以上重點(diǎn)電路的介紹,強(qiáng)化了硬件電路設(shè)計(jì)的細(xì)節(jié)和重點(diǎn)。
第四章展開軟件系統(tǒng)設(shè)計(jì),通過對軟件設(shè)計(jì)進(jìn)行需求分析,明確軟件設(shè)計(jì)的目的與需求,進(jìn)一步通過程序流程圖展示設(shè)計(jì)思路及框架。接著依次介紹了主函數(shù)流程、從機(jī)取號流程、主機(jī)叫號程序流程、蜂鳴器提醒流程。
第五章介紹仿真實(shí)現(xiàn)步驟,特別是仿真電路實(shí)現(xiàn)的流程和仿真測試,完美實(shí)現(xiàn)了設(shè)計(jì)需求及目標(biāo)。
第六章總結(jié)全文,總結(jié)本文所做的工作及貢獻(xiàn),并根據(jù)存在的問題展望此課題今后的研究方向。
資料清單下載鏈接
見文章視頻
文章來源:http://www.zghlxwxcb.cn/news/detail-763924.html
本資料下載鏈接:文章來源地址http://www.zghlxwxcb.cn/news/detail-763924.html
到了這里,關(guān)于基于51單片機(jī)的雙機(jī)串口通信排隊(duì)叫號系統(tǒng)(LCD顯示)設(shè)計(jì)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!