北京化工大学北方学院毕业设计(论文)
当程序运行时,会一直判断是否有按键被按下,当有按键被按下时,系统会确定键值,关将键值存入到密码数组里,然后将输入的密码与本身的密码做比较,若相同,则执行开门和显示正确信息的操作;若不相同,则执行报警和显示错误信息的操作
[16][17]
。
密码子程序核心程序代码如下所示:
P1=0x0f;
if(P1!=0x0f) compare(P1); for(n=0;n<10;n++)
if(input[n]!=password[n]) break; if(n==10)
{ if(m<10) continue; WriteLcdCom(0x01);
//清屏
WriteLcdCom(0x80); //第一行数据指针地址 for(s=0;s<16;s++) WriteLcdDat(str2[s]); LEDG=0; BUZ=0;
delay_10ms(20); LEDG=1; BUZ=1;
WriteLcdCom(0x01);
input[0]=\ \ } else if((n<10)&&(P1==0xbd)) { WriteLcdCom(0x01);
//清屏
WriteLcdCom(0x80); //第一行数据指针地址 for(s=0;s<16;s++)
WriteLcdDat(str4[s]); LEDR=0;
for(s=0;s<5;s++) { BUZ=0;
27
北京化工大学北方学院毕业设计(论文)
delay_10ms(20); BUZ=1;
delay_10ms(20); } LEDR=1; }
4.3.2数据采集子程序
执行程序之前,首先要设置串口波特率等相关串口参数,然后上位机通过串口向下位机发送命令,并进入串口中断。下位机根据接收SBUF的值做相应的处理。
数据采集子程序核心程序代码如下所示: uchar uart_process(void) {uchar cmd; uchar cstatus; cmd = g_crecebuf[1]; switch(cmd)
{case 0x20: // 寻卡,防冲突,选择卡返回卡系列号(4 bytes) cstatus =IicSendHY502(g_cReceBuf); // 发送寻卡命令 cstatus =IicReadHY502(cp);
// 读取卡号并存入到cP
if((cstatus==SUCCESS)&&(cp[1]==CARD_SN)) {memcpy(&g_crecebuf[0],&cp[2],4);
eeprom();}}//将读取到的卡序列号与E2PROM里存储的进行比较 return cstatus;}
4.3.3显示子程序
显示子程序的主要功能是对当前的门控状态进行显示,显示函数首先判断是写命令操作还是写数据操作,若是写命令操作,则根据命令进行相应的操作,如清屏、设置显示模式等;若是写数据操作,则在显示器上显示相应数据。
显示程序核心程序代码如下所示: void LcdShowError()
{ WriteLcdCom(0x38); //显示模式设置
WriteLcdCom(0x0c); //开显示,无光标,光标不闪烁 WriteLcdCom(0x06); //读写字符后地址指针加一设置
28
北京化工大学北方学院毕业设计(论文)
WriteLcdCom(0x80); //第一行数据指针地址 for(k=0;k<16;k++) {WriteLcdDat(str3[k]); delay(20); }
WriteLcdCom(0xc0); //第二行数据指针地址 for(k=0;k<16;k++) { WriteLcdDat(str4[k]); delay(20);}
WriteLcdCom(0x01); } void WriteLcdCom(unsigned char c) { LCDRW =00; LCDRS=0; P0=c; LCDE=1; LCDE=0; for(a=0;a<20;a++);}
void WriteLcdDat(unsigned char d) { LCDRW =00; LCDRS=1; P0=d; LCDE=1; LCDE=0;
for(a=0;a<20;a++);}
//切换到写数据
//切换到写命令
4.3.4存储子程序
本设计中数据的存储芯片选用的是AT24C04,该芯片是串行的E2PROM,支持I2C总线数据传送协议。
存储程序核心程序代码如下所示: void eeprom() {write_byte(0,0x1e);
write_byte(1,0xda); write_byte(2,0x62); write_byte(3,0xb6);
29
北京化工大学北方学院毕业设计(论文)
write_byte(4,0x25); write_byte(5,0xee); write_byte(6,0xde); write_byte(7,0xb6); write_byte(8,0x05); write_byte(9,0xc8); write_byte(10,0x43);write_byte(11,0xb8);write_byte(12,0x3a); write_byte(13,0x04);write_byte(14,0x5d);write_byte(15,0xb6);} bit shout(uchar write_data)// 从MCU移出数据到AT24C04 {uchar i; bit ack_bit;
for(i = 0; i < 8; i++) // 循环移入8个位 {SDA1 = (bit)(write_data & 0x80); _nop_(); SCL1 = 1; delayNOP(); SCL1 = 0;
write_data <<= 1; }
SDA1 = 1; // 读取应答 delayNOP(); SCL1 = 1; delayNOP(); ack_bit = SDA1; SCL1 = 0;
return ack_bit; // 返回AT24C04应答位 }
void write_byte(uchar addr, uchar write_data) // 在指定地址addr
处写入数据write_data
{start();
shout(OP_WRITE); shout(addr); shout(write_data); stop();
delay_10ms(1); }
4.3.5模块子程序编译调试
30
北京化工大学北方学院毕业设计(论文)
Keil软件是目前最流行开发MCS-51系列单片机的软件,这从近年来各个仿真机厂商纷纷宣布全面支持Keil即可看出。Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器在内的完整开发方案,通过一个集成开发环境(UVision)将这些部分组合在一起,本文中调试用的是Keil UVision2版本。
(1)建立工程项目
运行Keil UVision2程序后,点击Project->New Project菜单,输入工程名称,这里为RC500.uv2,在弹出的对话框中选择目标CPU(即你所用的CPU型号),Keil支持的芯片很多,这里我们选择Atmel公司的AT89C52芯片,确定后可以发现工程窗口出现“Target1” 和下一层“Source group1”的文件层次,我们只要Source group1下添加我们编写的程序[16][17][18]。见图4.3。
图4.3 建立工程RC500
(2)子程序的编译
31