收藏 分销(赏)

基于单片机的食堂售饭收费专业系统设计.doc

上传人:a199****6536 文档编号:2494702 上传时间:2024-05-30 格式:DOC 页数:37 大小:1.47MB 下载积分:12 金币
下载 相关 举报
基于单片机的食堂售饭收费专业系统设计.doc_第1页
第1页 / 共37页
基于单片机的食堂售饭收费专业系统设计.doc_第2页
第2页 / 共37页


点击查看更多>>
资源描述
基于单片机食堂售饭系统设计 姓名:刘磊 学号: 班级:电气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; }
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 研究报告 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服