毕业设计论文—基于单片机控制的射频ID卡考勤机的设计-精品 - 图(5)

2019-06-11 21:29

3 软件设计

本设计的软件部分主要由显示模块、时钟模块、射频识别模块、外部数据存储模块和开关控制模块组成。整个系统的硬件需要软件的驱动,才能实现相应的功能。软件控制着硬件,让其按照指定的要求,执行相应的功能。

3.1 主程序流程图

主程序的流程图如图3-1所示。由该流程图可以看出,在主程序中,对各模块先进行初始化,通过对开关控制模块的查询以及各标志位的查询进入相应功能模块,完成相关功能后将结果在液晶屏上进行显示。其中,时钟模块和射频识别模块涉及中断服务。

开始各模块初始化是否有射频识别信号标志?NY射频识别模块S5按下奇数次?Y时间校准模块N刷卡查询模块数据存储模块显示模块

图3-1 主程序流程图

中断服务包括定时中断和外部中断2种:定时中断使用的是定时计数器0,用于时钟模块的秒针的走时,其流程如图3-2 a)所示;外部中断使用了外部中断0和外部中断1,用于拾取射频识别信号,之后利用射频识别子程序进行密码对比,其流程如图3-2 b)所示。

15

定时中断开始外部中断开始计数加1N射频信号拾取是否达到1S?NY退出时钟程序退出是否结束?Y产生射频识别标志

a) 定时中断

图3-2 中断服务程序流程

b) 外部中断

中断服务程序段如下:

/*************定时中断************/ /*************外部中断************/ //定时计数器0定时为1s void timer(void) interrupt 1 {

TH0=0x3c; TL0=0xb0;

//定时满1S后就调用时钟子程序 if(count++>=20) {count=0; }

clock(); }

//外部中断0(记录数据0线上负脉冲) void int0(void) interrupt 0 {if(cnt<26&&flag==0) temp[cnt++]=0;

else{cnt=0;flag=1;}//产生识别标志 }

//外部中断1(记录数据1线上负脉冲) void int1(void) interrupt 2 {if(cnt<26&&flag==0) temp[cnt++]=1;

else{cnt=0;flag=1;}//产生识别标志 }

3.2 各个模块的设计

3.2.1 显示模块

液晶显示模块工作时显示一个字符的主要流程是先设定工作模式,再检测忙信号,最后传送数据。其流程如图3-3所示。

16

初始化 检查忙碌 送命令 N 写数据 写完否? Y 显示 图3-3 显示模块流程图

图3-4 显示模块写数据时序图

液晶TS12864在并行8为数据线写数据时的时序如图3-4所示。 显示模块的核心程序片段如下:

/************************按指定位置显示一串字符************************/ void DisplayListChar(unsigned char X, unsigned char Y, unsigned char data *DData)

//X、Y分别为行列坐标,DData为待写入字符串

//定义相关变量

{unsigned char ListLength,X2; ListLength = 0; X2=X; if(Y<1) if(Y>4)

Y=1; Y=4;

X &= 0x0F; switch(Y){

//限制X不大于16,Y不大于4 //根据行数Y来选择相应地址

case 1:X2|=0X80; break; case 2:X2|=0X90; break; case 3:X2|=0X88; break; case 4:X2|=0X98; break; }

17

WriteCommandLCD(X2, 1);

//发送地址码 //若到达字串尾则退出

while (DData[ListLength]>=0x20) {if (X <= 0x0F)

//在指定的行上写入长度不大于16的字符串

{WriteDataLCD(DData[ListLength]); //在指定坐标(X,Y)处写入字符 ListLength++; X++; } }}

3.2.2 时钟模块

时钟储模块流程图如图3-5所示:

开始 //移动坐标到下一个待写入的位置

秒加1秒≥60?Y分加1秒置0N分≥60?Y时加1分置0N时≥24?Y日加1时置0N大月小月二月N日≥31?日≥30?日≥28?YN退出年加1月置1Y月≥12?月加1日置1 图3-5 时钟模块流程图 18

用软件编写的时钟其缺点在于掉电后时钟不能再走,每次上电后需对当前时间和日期进行调整。

时钟模块的程序片段如下:

/*******************************时钟+日期******************************/ void clock(void) {?? time.sec++;

//秒针跳动一格

if(time.month==1||time.month==3||time.month==5||time.month==7||time.month==8||time.month==10||time.month==12) flag1=1;

//设定大月的标志 //设定二月的标志 //设定小月的标志

//当秒针达到60,分针进位,秒针清0

else if(time.month==2) flag1=2; else

flag1=0;

if(time.sec>=60)

{time.min++; time.sec=0; ??

if(time.min>=60)

{time.hour++; time.min=0; ??

//当分针达到60,时针进位,分针清0

if(time.hour>=24) {time.day++;

time.hour=0; ??

//当时针达到24,日期进位,时针清0

switch(flag1)

//不同的月份选择不同的天数

//小月30天 //大月30天 //二月30天

{case 0 : mon=30; case 1 : mon=31; case 2 : mon=28;

break; break; break;

19


毕业设计论文—基于单片机控制的射频ID卡考勤机的设计-精品 - 图(5).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:课程概论论述题参考模版

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: