基于IC卡的用电管理系统.docx
《基于IC卡的用电管理系统.docx》由会员分享,可在线阅读,更多相关《基于IC卡的用电管理系统.docx(39页珍藏版)》请在冰点文库上搜索。
实验报告
题目:
基于IC卡的用电管理系统
组员A:
何桐桐10041258
组员B:
冯君杰10041256
班级:
电气09
2013-5-17
【摘要】在IC卡应用日益广泛的今天,IC卡用电管理系统以其管理的安全、可靠、高效、灵活、方便,已逐步取代传统的用电管理模式。
我们设计的IC卡用电管理系统可以方便地管理和控制应用场所的用户。
本系统以智能化小区为应用背景,通过上位机(电脑)与下位机(单片机)串行通信的联合操作,完成对刷卡用户信息的显示,记录与管理。
规定IC卡上存贮的内容由规定的特征码、卡号、姓名、卡内余额以及权限等级构成,特征码为判别该卡合法性的依据。
以单片机为核心的下位机系统,可以方便地对IC卡进行操作,判定卡的合法性,对非法卡予以报警,对刷卡成功后的合法卡在数码管上显示其卡号、卡内余额以及扣费操作。
上位机界面由C++中的MFC编写完成。
其对刷卡人基本信息详细显示,同时能进行充值电费,对于管理员权限用户,可查询所有用户的基本信息。
系统实现简单、便于扩展,给管理者和用户带来了极大的方便。
【关键词】IC24c01卡单片机串行通信MFC友好界面
目录
1、引言
2、实验目的及任务
3、具体工作内容
3.1技术要求
3.2工作要求
4、总体设计方案及分析
4.1总体结构设计框图
4.2系统模块分析
4.2.1单片机系统模块功能介绍
4.2.2单片机与上位机的串行通信
4.2.3上位机功能实现及界面设计
5、实验运行结果及调试
6、实验设计总结及感想
7、参考资料
8、附录
8.1源程序
8.2原理图及PCB图
1.引言
随着智能化住宅小区的兴起与迅速发展,对智能化住宅小区的现代化物业管理提出了更高的要求,例如用电管理。
传统的用电管理模式存在以下弊端:
(1)人工抄表误差大、费时、麻烦;
(2)先用电后付费,收费慢,加之各单位门户的防盗门,很不方便,甚至一部分电费收不回来。
迅速发展的IC卡技术引入用电管理可以解决以上问题,还可以记录各用户的用电情况,备份用电数据,实现有效的监督管理。
该类系统可以提高管理效率和可靠性。
通过预先收费,可以增加管理部门的可用资金,为居民提供优质服务,改变对资源先消费后收费的不合理状况。
对于用户而言,IC卡收费可消除收费人员入户的骚扰和准备现金零钱的烦恼;同时,还有利于用户根据自家用电情况,进行计划消费。
2.实验目的及任务
(1)通过查阅相关资料,深入了解IC卡的原理及与单片机接口方式;
(2)学习有关操作界面的设计方法及制作;
(3)复习“MCS-51单片机原理及C语言(或汇编语言)程序设计”;
(4)设计基于IC卡的用电管理系统的原理图,构建硬件平台;
(5)采用汇编或C语言编写应用程序,上位机可采用任一高级语言编写应用程序;
(6)制作出样机并测试达到功能(读、写的数据信息)和技术指标要求;
(7)写出设计报告和答辩PPT。
3.具体工作内容
3.1技术要求
(1)目标IC卡为24C01;
(2)IC卡的信息量不少于256字节;
(3)可识别是否用IC卡在线;
(4)显示用户的相关信息;
(5)能够鉴别非法IC卡;
(6)友好人性化操作界面;
(7)可读、写的数据信息;
(8)利用IC卡的信息可决定用户的权利和义务。
3.2工作要求
(1)组建基于单片机的IC卡用电管理系统的总体结构框图;
(2)设计详细的原理图,通过理论分析和计算选择电路参数;
(3)根据操作功能要求,确定操作界面的控制功能;
(4)按设计要求确定显示方式及信息量;
(5)编写应用程序并调试通过;
(6)对系统进行测试和结果分析;
(7)撰写设计报告和答辩PPT。
4.总体设计方案及分析
4.1总体结构设计框图
控制开关
单片机
上位机
RS232接口
串行通信
蜂鸣器
数码管显示
指示灯
IC卡
IIC总线
4.2系统模块分析
4.2.1单片机系统模块功能介绍
下位机系统的电路原理图如附录中所示,以下对该电路图的基本工作原理进行简述。
1、晶振发生器模块
两个输出端分别连接单片机XTAL.1,XTAL.2端口,通过晶振与电容产生固定频率的震荡周期信号,作为单片机的时钟信号。
XTAL.1,XTAL.2端外接石英晶体作定时元件时,内部反向放大器自激振荡,产生时钟。
时钟发生器对振荡脉冲二分频,即若石英频率为6MHz,则时钟频率为3MHz,本实验中,晶振频率为11.0592MHz。
构成石英振荡电路的电容通常取30pF,如图中所示。
2、复位信号发生模块
如图,VCC产生的信号直接连接至EA/VPP端口。
当该端口被置位为1时,地址0000H~0FFFH空间访问单片机内部ROM,或地址1000H~FFFFH空间访问单片机内部ROM,本次试验中该端口为12.5V。
电阻R1上的电压传送至单片机RST/VPD端口处。
当开关闭合时,在时钟电路作用下,在改引脚上出现两个机器周期以上的高电平,使其内部复位。
此外,VPD为备用电源输入。
当单片机上主电源VCC发生故障,降低到低电平规定值时,VPD将为RAM提供备用电源,以保障存储在RAM中的信号不会丢失。
3、外部开关触发装置
通过开关S1,S2,S3产生低电平信号,传送至单片机。
其中,S1,S3经过与门合成信号再与S2合成为INT0送至单片机INT0号中断接口,作为外部中断信号,设置为其下降沿有效。
即当INT0出现下降沿时,单片机进入中断子程序,在中断子程序中判断p3.3,p3.4,p3.5端口的输入电平就能识别是哪个开关按下,本次实验中开关S1按下时显示卡号,S2按下时显示余额,S3按下时可以实行减1扣费操作。
4、IC卡读写装置
本系统设计选用的IC卡为AT24C01,AT24C01是美国ATMEL公司的低功耗CMOS串行EEPROM,它是内含256×8位存储空间,具有工作电压宽(2.5~5.5V)、擦写次数多(大于10000次)、写入速度快(小于10ms)等特点。
每写入或读出一个数据字节后,该地址寄存器自动加1,以实现对下一个存储单元的操作。
所有字节都以单一操作方式读取。
为降低总的写入时间,一次操作可写入多达8字节的数据。
下图为AT24C系列芯片的封装图。
各引脚功能见下表:
其中,SDA控制连接单片机P1.6,SCL连接单片机P1.5,RST连接单片机P1.7。
(具体见原理图)
其工作原理为基本的I2C结构。
IIC总线技术是一种高性能的芯片间串行传输总线,它仅以两根连线实现了完善n的全双工同步数据传输,即SDA与SCL。
SDA是一根双向的数据线,SCL为一根时钟线,所有连接到IIC总线上的设备,其串行数据都要连接到总线的SDA上,而各设备的时钟均要连接到SCL线上。
在IIC总线进行数据传输是,在时钟信号为高电平期间,数据线上必须保持稳定的逻辑电平状态,高电平为数据1,低电平为数据0。
只有在时钟线为低电平期间,才允许数据线上的电平状态变化。
通过SDA与SCL的时序配合,达到传输与发送数据的目的。
RST为写保护位,在写IC卡之前需将RST位进行置1操作。
在数据传送过程中,必须确认数据传送的开始和结束。
在I2C总线技术规范中,开始和结束信号(也称启动和停止信号)的定义如下:
(1)开始信号:
当时钟总线SCL为高电平时,数据线SDA由高电平向低电平跳变,开始传送数据。
(2)结束信号:
当SCL线为高电平时,SDA线从低电平向高电平跳变,结束传送数据。
开始和结束信号都是由主器件产生。
在开始信号以后,总线即被认为处于忙状态,其它器件不能再产生开始信号。
主器件在结束信号以后退出主器件角色,经过一段时间过,总线被认为是空闲的。
IIC总线数据传送采用时钟脉冲逐位串行传送方式,在SCL的低电平期间,SDA线上高、低电平能变化,在高电平期间,SDA上数据必须保护稳定,以便接收器采样接收,时序如图所示。
IIC总线发送器送到SDA线上的每个字节必须为8位长,传送时高位在前,低位在后。
与之对应,主器件在SCL线上产生8个脉冲;第9个脉冲低电平期间,发送器释放SDA线,接收器把SDA线拉低,以给出一个接收确认位;第9个脉冲高电平期间,发送器收到这个确认位然后开始下一字节的传送,下一个字节的第一个脉冲低电平期间接收器释放SDA。
每个字节需要9个脉冲,每次传送的字节数是不受限制的。
IIC总线的数据传送格式是在I2C总线开始信号后,送出的第一字节数据是用来选择从器件地址的,其中前7位为地址码,第8位为方向位(R/W)。
方向位为“0”表示发送,即主器件把信息写到所选择的从器件中;方向位为“1”表示主器件将从器件读信息。
格式如下:
1010A2A1A0R/W
开始信号后,系统中的各个器件将自己的地址和主器件送到总线上的地址进行比较,如果与主器件发送到总线上的地址一致,则该器件即被主器件寻址的器件,其接收信息还是发送信息则由第8位(R/W)决定。
发送完第一个字节后再开始发数据信号。
数据传输必须带响应。
相关的响应时钟脉冲由主机产生,当主器件发送完一字节的数据后,接着发出对应于SCL线上的一个时钟(ACK)认可位,此时钟内主器件释放SDA线,一字节传送结束,而从器件的响应信号将SDA线拉成低电平,使SDA在该时钟的高电平期间为稳定的低电平。
从器件的响应信号结束后,SDA线返回高电平,进入下一个传送周期。
通常被寻址的接收器在接收到的每个字节后必须产生一个响应。
当从机不能响应从机地址时,从机必须使数据线保持高电平,主机然后产生一个停止条件终止传输或者产生重复起始条件开始新的传输。
如果从机接收器响应了从机地址但是在传输了一段时间后不能接收更多数据字节,主机必须再一次终止传输。
这个情况用从机在第一个字节后没有产生响应来表示。
从机使数据线保持高电平主机产生一个停止或重复起始条件。
具体的读卡及写卡操作步骤如下。
读卡操作流程
写卡操作流程
5.蜂鸣器报警装置
如图,由单片机P1.0发出的电平信号经与门处理后连接至蜂鸣器的一端,蜂鸣器另一端连接高电平信号Vcc。
当P1.0端口发出低电平信号时,蜂鸣器两端出现电位差,蜂鸣器导通鸣响;当P1.0端口电平信号重新拉高时蜂鸣器关闭,停止鸣响。
因此在本实验中通过单片机P1.0脚的信号来控制蜂鸣器进行工作。
6、工作状态提示灯
由单片机P1.1端口产生信号经与门U6B后传送至后级装置。
信号直接传至二极管D2。
当P1.1为低电平信号时,D2灯亮;当P1.1为高电平信号时,D2灯熄灭。
本实验中,设置D2灯位正常工作时的指示灯。
通过单片机控制判断其工作状态,并通过该装置进行外部显示。
7、七段数码管显示
其总体工作电路如上所示。
由两个74LS573寄存器从单片机数据总线上获取数据信号,其中寄存器U2为段码寄存器,控制每个数码管显示的内容。
寄存器U3为位码寄存器,通过连接译码器ULN2803A来控制哪个数码管亮灯。
在此定义寄存器U2的地址为0BFFFH,寄存器U3的地址为7FFFH。
8.单片机程序模块
插入IC卡
合法卡?
D2灯亮
蜂鸣器响
N
结束
减1扣费
显示余额
显示卡号
IC卡初始化
等待操作
Y
下位机程序流程图
下位机与上位机的通信
上位机与下位机之间的通信可以采用串行通讯和并行通讯二种方式。
由于串行通讯方式具有使用线路少、成本低,特别是在远程传输时,避免了多条线路特性的不一致而被广泛采用。
在串行通信时,数据一位一位地发送,此时要求通信双方都采用一个标准接口,RS-232C接口是单片机和PC机进行通信最常用的一种接口。
单片机与PC机进行串口通信最简单的三线制法(一根发送线,一根接受线,一根地线),即接收数据针脚(RXD)与发送数据针脚(TXD)相连,彼此交叉,信号地(GND)对应相接。
但是,串口还不能直接和单片机相连,可以选用MAX232进行电平转换。
MAX232用于RS-232C标准,RS-232C标准规定在码元畸变小于4%的情况下,传输电缆长度最大约为15米,最高传输速率为20kbit/s。
RS485标准最大传输距离约为1219米,最大传输速率约为10Mbit/s。
上位机与下位机接口电路
RS232标准总线接口(DB9插座):
单片机工作电平为TTL(0~5V),RS232
标准电平(逻辑1:
-15~-5V;逻辑0:
+5V~+15V)。
采用RS232标准总线与单片机通信时,常用MAX232作TTL与RS232的电平转换。
DB9插座信号含义如下:
MAX232芯片是美信公司专门为电脑的RS-232标准串口设计的接口电路,使用+5v单电源供电。
它是一种把电脑的串行口RS232信号电平(-10,+10v)转换为单片机所用到的TTL信号点平(0,+5)的芯片。
其结构如下图:
其内部结构基本可分三个部分:
第一部分是电荷泵电路。
由1、2、3、4、5、6脚和4只电容构成。
功能是产生+12v和-12v两个电源,提供给RS-232串口电平的需要。
第二部分是数据转换通道。
由7、8、9、10、11、12、13、14脚构成两个数据通道。
其中13脚(R1IN)、12脚(R1OUT)、11脚(T1IN)、14脚(T1OUT)为第一数据通道。
8脚(R2IN)、9脚(R2OUT)、10脚(T2IN)、7脚(T2OUT)为第二数据通道。
TTL/CMOS数据从T1IN、T2IN输入转换成RS-232数据从T1OUT、T2OUT送到电脑DB9插头;DB9插头的RS-232数据从R1IN、R2IN输入转换成TTL/CMOS数据后从R1OUT、R2OUT输出。
第三部分是供电。
15脚GND、16脚VCC(+5v)。
8051有一个可编程的全双工串行通信接口,它可作UART用,也可作同步移位寄存器,其帧格式可有8位、10位或ll位,并能设置各种波特率,给使用者带来很大的灵活性。
1、串行口控制字及控制寄存器
8051串行口是一个可编程接口,对它的编程只用两个控制字分别写入特殊功能寄存器:
串行口控制寄存器SCON(98H)和电源控制寄存器PCON(97H)即可。
8051串行通信的方式选择、接收和发送控制以及串行口的状态标志等均由特殊功能寄存器SCON控制和指示。
SCON控制字格式如下图:
(1)SM0和SMl串行口工作方式选择位。
(2)REN允许接收控制位。
(3)TB8发送数据的第9位(D8)装入TB8中。
(4)RB8接收数据的第9位。
(5)TI发送中断标志。
(6)RI接收中断标志。
2、串行通信工作方式
在本系统设计中,我们选择最常用的方式1作为串口工作方式,其数据字是8位异步通信串口,且波特率可变。
方式1以10位数据为一帧,设有一个起始位“0”和一个停止位“1”,中间是8位数据。
先发送或接收最低位。
串口方式1发送时,数据从引脚TXD端输出,当执行数据写入发送缓冲器SBUF的命令时.就启动了发送器开始发送。
发送时的定时信号,也就是发送移位时钟(TX时钟),是内部定时器T1送来的溢出信号经过16分频或32分频(取决SMOD的值)而取得的。
TX时钟就是发送波特率,可见方式1波特率是可变的。
发送开始的同时,SEND变为有效,将起始位向TXD输出,此后每过—个TX时钟周期(16分频计数器溢出一次为一个时钟周期,因此,TX时钟频率由波待率决定)产生一个移位脉冲,并由TXD输出一个数据位,8位数据位全部发送完后,置位TI,并申请中断。
再经一个时钟周期SEND失效。
3、串口方式1波特率
串行口工作之前,应对其进行初始化,主要是设置产生波特率的定时器1、串行口控制和中断控制。
具体步骤如下:
(1)确定T1的工作方式(编程TMOD寄存器);
(2)计算T1的初值,装载TH1、TL1;
(3)启动T1(编程TCON中的TR1位);
(4)确定串行口控制(编程SCON寄存器);
同时,串行口在中断方式工作时,要进行中断设置(编程IE、IP寄存器)。
串口方式1的移位时钟脉冲由定时器T1的溢出率决定,因此8051串行口方式1的波特率由定时器T1的溢出率与SMOD值同时决定。
方式1的波特率
定时器T1作波特率发生器使用时,通常选用定时器方式2(自动重装初值定时器)比较实用。
定时器方式2具有自动重新加载功能,即自动加载计数初值,因此也可以说方式2是自动重新加载工作方式。
在这种工作方式下,把16位计数器分为两部分,即以TL0作计数器,以TH0作预置寄存器。
初始化时把计数初值分别装入TL0和TH0中。
在初始化时,8位计数初值同时装入TL0和TH0中。
当TL0计数溢出时,置位TF0,同时把保存在预置寄存器TH0中的计数初值自动加载TL0,然后TL0重新计数,如此重复循环。
波特率与与定时器1的对应关系
在本次设计中,805l单片机时钟振荡频率为11.0592MHz,选用定时器T1模式2作波特率发生器,波持率为9600波特。
4.2.3上位机功能实现与界面设计
上位机界面使用C++中的MFC类库编写的,通过MSComm控件实现串行通信。
上位机界面
与下位机通信程序流程图
串口开启并初始化参数
设定握手方式,清空串口现有队列
读串口?
消息响应读串口
延时等待
读是否完成?
否
显示用户信息
(通过缓存区数据状况判断)
是
5.实验运行结果及调试
通过多次得运行程序及调试,使得上位机和下位机的功能实现较为完整,特别是MFC界面的充值电费和查询用户信息的设计,更加人性化。
下位机较好的完成了对于蜂鸣器、工作灯及数码管的控制显示。
上位机和下位机的串行通信也很成功。
6.实验设计总结及感想
本次设计实验的综合性较强,很多知识都需要我们自己查资料获得,这给我们设计的过程带来了极大的挑战。
在下位机程序的编写上,我们参考了教材上读写IC卡的模块,在主函数上通过中断进行相应操作。
在上位机的编程上,我们倾注了很大的精力,参考了很多书籍,使得MFC界面能较好地运行及与下位机连接。
通过本次的设计实验,我们不仅学到了关于51单片机的基础知识,同时也掌握了许多相关软件的操作,如DXP的绘图,KeilUvision的C语言编程,MFC的面板设计及与串口通信的模块设计。
当然,在平时的授课及实验过程中,三位老师的帮助和辅导给了我们很大的鼓励和信心。
谢谢!
7、参考资料
1.王建校、张虹、金印彬编著《电子系统设计与时间实验指导书》西安交通大学出版社
2.王建校杨建国等编著《51系列单片机及C51程序设计》科学出版社2002.4
3.侯殿友编著《单片机C语言程序设计》人民邮电出版社2010.11
8.附录
(1)下位机源程序:
#include
#include
#include
#include
#defineSEGMENTXBYTE[0XBFFF]
#defineBIT_LEDXBYTE[0X7FFF]
#definefosc11.0592
#definetime02500
sbita=P3^3;
sbitb=P3^4;
sbitc=P3^5;
sbitSCL_IC_CARD=P1^5;
sbitSDA_IC_CARD=P1^6;
sbitzhuangtai=P1^1;
sbitzaixian=P1^4;
sbitWP_IC_CARD=P1^7;
sbitwarning=P1^0;
intsw=0,control2=0;
unsignedchardatadisplay_bit;
unsignedchardatatime0_h,time0_l;
unsignedintidatatime0_times;
unsignedchardat,control,control1;
unsignedintsum,sum1,sum2,sum3,sum4;
bdatacharcom_data;
sbitmos_bit=com_data^7;
sbitlow_bit=com_data^0;
unsignedcharget_code(unsignedchari);
voiddisplay(void);
unsignedchardatadisplay_buffer[8],buffer[4];
voiddelay(intn);
voidxianshi();
voidInit_Com(void);
unsignedcharrd_24c01(chara);
voidwr_24c01(chara,charb);
voidchushi();
voidrd_kahao();
voidrd_name();
voidrd_left();
voidrd_class();
voidjifei();
voidrd_add();
///==========================================///
//内部地址分配//
//0-7:
识非法卡的密码;
//10-13:
余额;
//14-17:
卡号;
//20-30:
名字;
//30-31:
权限等级;
main()
{
unsignedchari,j;
EA=1;
EX0=ET0=ES=1;
while(!
zaixian);
zhuangtai=0;
chushi();
Init_Com();//串口初始化
while
(1)
{
if(zaixian==0)
{
zhuangtai=1;
}
elseif(zaixian==1)
{
zhuangtai=0;
WP_IC_CARD=1;
for(i=0;i<=7;i++) //读取并校验密码,若为非法卡,报警
{
j=rd_24c01(i);del