资源描述
基于单片机食堂售饭系统设计
姓名:刘磊
学号:
班级:电气091
指引教师:闫群民
课设日期 :6月25日
单片机食堂售饭收费系统应用摘要
0引言
第一章.系统功能阐明
1.就餐阶段
2.充值阶段
3.初始化阶段
第二章. 系统整体设计
2.1 应用系统构造设计
2. 2 设备选取
2.2.1 IC 卡
2.2.1 按钮
2.2.3 显示单元
2.2.4 上位机连接
第三章 硬件某些
3.1 IC卡接口连接
3.2 键盘和显示接口设计
3.3 蜂鸣器报警单元连接
3.4 IC卡上电检测电路设计
第四章
4.1 软件构造设计
4.1.1 主程序
4.1.2 按键解决程序
附录;
软件某些.
单片机食堂售饭收费系统应用摘要
本文论述了老式食堂售饭系统局限性,简介了以IC卡为媒介单片机售饭系统。
从系统功能阐明出发,对控制系统构成构造、系统设备选型进行了分析,设计出了以
单片机为核心硬件电路和支持各硬件某些软件程序。通过集成测试,该系统安全、
精确无误、性能稳定可靠,实现了售饭管理科学化和当代化。
核心词AVR单片机,1 0卡,三极管,SLE4442卡 ,232芯片
0引言
IC卡,又称集成电路卡或者智能卡,是继磁卡、光电卡之后新一代标记卡。这种具备智
能便于携带卡片,为当代信息解决和传播提供了一种全新豹手段。随着超大规模集成电路、
大容量存储芯片以及信怠安全技术发展,IC卡技术也不断有新进展,应用领域也不断地扩
大,以IC卡为媒介单片枫售饭系统就是一种范例。IC卡应用提高了人们生活和工作现
代化限度,已成为一种国家科技发展水平当代化限度标志之一
.
IC卡售饭机是合用于就餐人数密集食堂收费系统,该系统从主线上解决了餐券
流通过中盼伪造、丢失、维茵交叉感染等一系列闻题,增进了饮食鼹务管理南规范化、系
统化和科学化方向发展。
第一章.系统功能阐明
食堂IC卡售饭机作为食堂收费终端,依照实际使用环境,应具备如下功能特点,以
合用不同阶段数据解决。
1. 就餐阶段
就餐阶段即正常使用阶段。在IC卡插入售饭机后,系统能读出IC卡里面预先存储
金额,并能在面对就餐者和售饭员两方面双屏进行显示。售饭员运用键盘输入就餐者
选定食物金额,售饭机自动用卡中金额减去应付金额。操作完毕后屏幕显示应付
金额|以及卡中余额。
如果就餐者卡中余额不大于预先设定金额,售饭机则给出报警音,提示就餐卡为
IC卡进行充值。食堂售饭窗口不具备为卡充值功能,就餐者必要到指定地方进行充
值。
如果就餐卡浮现故障,售饭机给出报警音,提示就餐者修卡,食堂售饭窗口不具备
对卡进行修复功能。就餐者必要到指定地方修复。如果修复失败,就餐者只有到充
值窗口重新办理就餐卡。
2. 充值阶段
在充值阶段,IC卡售饭机读出卡里面余额,就餐者在充值窗口交纳一定金额后,
由工作人员通过键盘输入次此充值金额,售饭机自动将本次充值金额加入卡中。操作完毕后,屏幕显示充值后卡中余额。
3. 初始化阶段
初始化阶段是为卡发行做准备。在此阶段,工作人员通过键盘进行就餐卡初始
化工作。此阶段重要任务是写入顾客群号和初始金额。只有通过初始化之后,就餐卡
方能发行.
第二章.系统总体设计
2.1.应用系统构造设计
依照1.1所述IC卡售饭机功能特点,售饭机系统需要完毕数据输入、显示和处
理三种功能,整个系统构造框图如图2-1所示。
2.2 设备选取
本设计采用Atmel公司高性能低功耗AT90S8535作为控制核心,按照上图所拟定系统构造,
选取适当功能部件,完毕完整系统控制电路设计,控制系统需要选取IC卡单元,键盘单元,
显示单元三某些。
2.2.1 IC卡
依照IC卡读写特点,IC卡分为接触型IC卡和射频卡两类。
(1)接触型IC卡
接触型IC卡表露有6个或8个金属触点,IC卡插入读写器内后,在徽解决器控制下完毕可是读写操作。
(2)射频卡
射频卡没有金属触点,丽是在卡内置有天线和射频卡处在读写卡器一定距离内时,
读写卡器通过发射射频信号对卡进行读写操作。依照IC卡内部构造,IC卡又可分为存储
卡、逻辑加密卡和CPU卡。
(1)存储卡
(2)逻辑加密卡
(3)CPU 卡
2.2.2 按钮
(1) 独力按钮
独立型按键一脚通过电阻接电源端或者地,而另一脚接单片机I/0口,其构造
如图2-2所示。在按键被按下和没有按下时,I/0口电平刚好相反。这样通过检测I/0
口电平状态即可判断哪个按键被按下了。
此类键盘特点是按键电路配备灵活、按键状态辨认简朴,但是每一种按键需要占用
一种l/口,资源占用率较高,当按键数量不是诸多或者系统有睨较多I/0口剩余时,
可以采用此类设计。
(2) 行列式按钮
矩阵扫描键盘有行线和列线构成。按键位子行列线交叉点上,构造图如2-3所示。
一种3*3矩阵构造就可以构成一种具有9个按键键盘。按键设立在行列线交叉点上,行
列线分别接到按键开关两端。行列通过上拉电阻接到+5V上。平时当没有按键按下时,列线
处在高电平状态;而当有键按下时,行列线导通,因而列线电平状态将由此相连接,各键按
下与否会影响该键所在行列线电平。这样行列线配合起来进行恰当解决,即可拟定按键位置。
此类键盘与独立式键盘相比,要节约诸多I/0口,合用于按键数量较多场合。
矩阵扫描键盘有行线和列线构成。按键位子行列线交叉点上,构造图如2-3所示。
此类键盘与独立式键盘相比,要节约诸多I/0口,合用于按键数量较多场合。
2.2.3显示单元
IC卡售饭机系统只需要进行数字显示即可,但需要显示屏件直观和高亮度。在此基本上,本
设计采用高亮度红色LED数码管作为显示屏件,详细设计见硬件设计某些。
2.2.4上位机连接
第三章 硬件某些
IC卡售饭机硬件电路如图3—1所示,,下面对各单元电路分别予以明
如图3-1所示
3.1 IC卡接口连接
本设计采用西门子SLE4442逻辑加密型IC卡,它与AT90D8535连接如
图3—2所示。
1〉IC卡简介
SLE4442是西门子公司一款具备可编程安全代码(PSC)和写保护功
能智能型存、储芯片。它有2568EEPROM主存储器,不可逆4个写保护
存储器,lB错误计数器具备3B密码保护功能。SLE4442采用两线数据传
输方式,符合IS07816-3原则。每个字节写入/擦除时间为2.5豪秒,
数据保存时间上.
SLE4442具备一种安全逻辑,用以控制存储器读写操作.在密码成功之
前,除3B密码(可编程安全代码)外,数据都可以读出,只有在校验密码成功之后
才可以执行数据写入动作.在校验密码之前,可以将错误计数器某一位写“0”。
错误计数器初始值为0X03,每校验密码错误一次则将其中一位写“0”,如果连
续三次密码校验错误,错误计数器值变为OX03,IC卡报废。
2〉SLE4442IC卡引脚配备
3.2键盘和显示接口设计
1. 键盘编码
依照对系统功能分析,为了使IC卡售饭机可以适应不同阶段数据解决,系统设
置了如下16个数字键和功能键。
数字键:O到9、小数点按键“."功能键:+、一、初始化键、修复键、确认键
其按键配备如图3—17所示。
2.键盘功能定义
(1) 就餐阶段
就餐阶段属于消费阶段,待就餐者插入IC卡后,按“一"键后从键盘输入消费金
额,爵按“拟定’’键即可完毕一次正常消费。如果就餐者插入是合法卡,则会显示IC卡中
金额;如果插入是非法卡,则会显示“EEEEEEEE”,同步发出警报声。如果IC卡 出
错,同步发出警报声提示进行修复工作。如果修复失败,则会显示“EEEEFFFF",同步发出报警声。
(2)充值阶段
就餐者在充值阶段为IC卡充值。插入IC卡后,显示卡里面余额。按“+"键后从键盘
输入充值金额,然后再按“拟定”键,即可完毕一次充值过程。如果充值失败,则会显示“FFFFFF"同步给出报警提示重新充值。
(3)修复阶段
将损坏就餐卡插入售饭机,按“修复"键,再按“确认’’键,即可对就餐卡进行修复。
如果修复失败,系统会发出报警声。
(4)初始化阶段
初始化阶段为IC卡发行做准备。插入新卡后按“初始化”键,然后从键盘输入预充值
金额,然后按“拟定",售饭机自动完毕IC卡初始化工作并写入预充值金额。
3.3蜂鸣报警器接口设计
本设计采用
电磁式蜂鸣器作
为IC卡出错报
警提示。它与单片
机AT90S8
535连接如
图3-18所示。单片机AT90S8535PD3口通过NPN型三极管驱动蜂鸣器。当PD3输出高电平时,三极管导通,蜂鸣器发出报警声。
3.4 IC卡上电检测电路设计
IC 卡上电检测电路如图3-19所示。单片机在检测到IC卡上电后才开始执行卡
读写操作。IC卡上电检测电路即IC卡上电检测以保证单片机正常操作。
在IC卡卡座上普通有静动两片金属片。在IC卡插入卡座时,动金属片被IC金属片一端固定通过电阻LED 接地。静金属片固定装5伏电压,在IC卡没有插入时,动金属片为0伏电压,IC卡插入后静金属片变为5伏电压,LED点亮,提示有IC卡插入单片对卡进行初始检测,这样通过与动金属片连接单片机DP2 电平,即可检测IC2与否上电。
第四章 软件构造设立
1.软件构造设计
IC卡售饭祝软件系统采用模块纯程序设计。从构造主看,系统控制软件重要涉及一
个主程序、按键解决程序和其她某些辅助解决程序。从功能上看,系统控制软件则重要由
IC卡控制程序。
4.1-1主程序
主程序重要完毕系统初始化、IC卡插入检测、读写和键盘输入与解决、异常状况
报警解决等工作,以完毕人机交互功能。
图4-1主程序流程图
4.1.2按键解决程序
按键解决程序是系统服务程序一某些。按键解决程序完毕按键辨认与解决工作。在确认有键被按下后,通过查找按键,区别功能键与数字键,从而依照不同状况进行相应解决
附录:程序
#include<io8385v.h>
#include<SLE4442.h>
#define uchar unsigned char
#define unit unsigned int
#define MAM 0 /*定义主存储器代号*/
#define SCM 1 /*定义加密存储器代号*/
#define PRM 2 /*定义保护存储器代号*/
sbit IsCard=P3^2;//判断与否有卡,当P3.2口为低电平时,卡插入;当P3.2口为高电平时,无卡。(由于当卡插入时,E1口与E2口接通,由于E2口接地,则E1被拉成低电平)
#define DisPort PA//PA口为段选口
#define DigPort PC//PC口为位选口
uchar DisplayData[4];//更新显示四位数组
uchar DisplayDig=0;
uint TimeCount;
uint DisplayTemp=0xffff;
uchar code DisplayCode[11]=
{
0xC0,/*0*/
0xF9,/*1*/
0xA4,/*2*/
0xB0,/*3*/
0x99,/*4*/
0x92,/*5*/
0x82,/*6*/
0xF8,/*7*/
0x80,/*8*/
0x90,/*9*/
0xBF,/*-*/
};
uchar FuHao;
bit XiuGai;
uchar Dig[4]={0x60,0xa0,0xc0,0xf0};//4位数码管代码(由于在硬件中将第四位数码管三极管误焊成了NPN型8050,8050特点是输入为高电平时亮,而8550特点是当输入为低电平时亮,因此当第一位数码管亮时,应为01100000,即0X60)
int YuE;
sbit Bee=P3^3;
void Timer0Init(void) //100微秒@11.0592MHz
{
AUXR &= 0x7F; //定期器时钟12T模式(STC89C52有2个工作模式:6T和12T,12T表达12个时钟完毕1个指令)
TMOD &= 0xF0; //设立定期器模式
TMOD |= 0x02; //设立定期器模式
TL0 = 0xA4; //设立定期初值
TH0 = 0xA4; //设立定期重载值
TF0 = 0; //清除TF0标志
TR0 = 1; //定期器0开始计时
ET0=1;
EA=1;
}
void UpDisplay() //更新显示
{
if(DisplayTemp!=0xffff)
{
DisplayData[0]=DisplayTemp/1000%10;
DisplayData[1]=DisplayTemp/100%10;
DisplayData[2]=DisplayTemp/10%10;
DisplayData[3]=DisplayTemp%10;
}
else
{
DisplayData[0]=10;
DisplayData[1]=10;
DisplayData[2]=10;
DisplayData[3]=10;//DisplayTemp=0xffff时,数码管显示----
}
}
uchar keyscan()
{uchar temp,key;
P3=oxfe;
temp=P3;
temp=temp&oxf0;
if(temp!=oxf0)
{delayms(10);
temp=P3;
temp=temp&oxf0;
if(temp!=oxf0)
{temp=P3;
switch(temp)
{case oxee:key=1;break;
case oxde:key=2;break;
case oxbe:key=3;break;
case ox7e:key=4;break;
}
While(temp!=oxf0)
{temp=P3;
temp=temp&oxf0;
}
}
}
P3=oxfd;
temp=P3;
temp=temp&oxf0;
if(temp!=oxf0)
{delayms(10);
temp=P3;
temp=temp&oxf0;
if(temp!=oxf0)
{temp=P3;
switch(temp)
{case oxed:key=5;break;
case oxdd:key=6;break;
case oxbd:key=7;break;
case ox7d:key=8;break;
}
While(temp!=oxf0)
{temp=P3;
temp=temp&oxf0;
}
}
}
P3=oxfb;
temp=P3;
temp=temp&oxf0;
if(temp!=oxf0)
{delayms(10);
temp=P3;
temp=temp&oxf0;
if(temp!=oxf0)
{temp=P3;
switch(temp)
{case oxeb:key=9;break;
case oxdb:key=0;break;
case oxbb:key=‘.’;break;
case ox7b:key=‘+’;break;
}
While(temp!=oxf0)
{temp=P3;
temp=temp&oxf0;
}
}
}
P3=oxf7;
temp=P3;
temp=temp&oxf0;
if(temp!=oxf0)
{delayms(10);
temp=P3;
temp=temp&oxf0;
if(temp!=oxf0)
{temp=P3;
switch(temp)
{case oxe7:key=‘-’;break;
case oxd7:key=‘==’;break;
case oxb7:
case ox7e7:
}
While(temp!=oxf0)
{temp=P3;
temp=temp&oxf0;
}
}
}
void delay(uchar num)
{P0=table[10]:
}
uchar dat[4]={0,0,0,0};
void keypro(key)
{
switch(key)
{
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
dat[0]=dat[1];
dat[1]=dat[2];
dat[2]=dat[3];
dat[3]=key; //数码管位移
DisplayTemp=dat[0]*1000+dat[1]*100+dat[2]*10+dat[3];
break;
case '+':
XiuGai=1;
dat[0]=0;
dat[1]=0;
dat[2]=0;
dat[3]=0;
FuHao='+';
DisplayTemp=0;//总数码管显示0
break;
case '-':
XiuGai=1;
dat[0]=0;
dat[1]=0;
dat[2]=0;
dat[3]=0;
FuHao='-';
DisplayTemp=0;
break;
case '.':
dat[0]=0;
dat[1]=0;
dat[2]=0;
dat[3]=0;
DisplayTemp=0;
break;
case '==':
if(FuHao=='+')
{
YuE+=DisplayTemp;
DisplayTemp=YuE;
}
else if( FuHao=='-')
{
YuE=YuE-DisplayTemp;
DisplayTemp=YuE;
}
UpDisplay();
if(YuE>0)
{
if(IChkpsw_4442(0xff,0xff,0xff)==0)//如果IC卡密码为0XFF,0XFF,0XFF
{
ISenddat_4442(MAM,50,4,DisplayData);//则将数据发送给4442卡,MAM表达将数据发送给4442主存储器,起始地址为504个字节,更新显示
}
else
{
Bee=0;//若密码不是0XFF,0XFF,0XFF,则蜂鸣
}
}
else
{
Bee=0;//若所消费金额不不大于等于卡中金额,则蜂鸣
}
dat[0]=0;
dat[1]=0;
dat[2]=0;
dat[3]=0;
XiuGai=0;//不修改卡中金额
}
UpDisplay();
}
void main()
{
uchar rec[5];
Timer0Init();
IsCard=1;
while(1)
{
keypro(keyscan());
IsCard=1;
if(IsCard) //无卡
{
Bee=1;//无卡时,不蜂鸣
XiuGai=0;//无卡时,不修改
DisplayTemp=0xffff; //显示“----”
}
else
{
if(XiuGai==0)
{
IRcvdat_4442(MAM,50,4,rec); //若没有修改则读卡,数据放在4442卡主存储器以59为首地址rec数组中
DisplayTemp=rec[0]*1000+rec[1]*100+rec[2]*10+rec[3];
YuE=DisplayTemp;
}
}
UpDisplay();
}
}
void Time0Int() interrupt 1
{
if(TimeCount++==50)
{
TimeCount=0;
DisPort=DisplayCode[DisplayData[DisplayDig]];//段选。开始DisplayDig=0然后++,注意DisplayData中数据已经更新,然后找DisplayCode数组中相应数字
DigPort=Dig[DisplayDig];//位选。开始DisplayDig=0然后++,然后相应找位选数组Dig[4]={0x60,0xa0,0xc0,0xf0}
if(DisplayDig++==3)
{
DisplayDig=0;
}
展开阅读全文