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
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库毕业设计论文—基于单片机控制的射频ID卡考勤机的设计-精品 - 图(5)在线全文阅读。
相关推荐: