蓝桥杯单片机学习过程记录(二十一)第三届国赛门禁系统
此部分少写了一个超声波模块。
使用到的模块:
矩阵按键
数码管、继电器、蜂鸣器
EEprom的读写
DS1302时钟芯片的初始化和读取
由于多了一个超声波模块,在家板子上没有,没法验证就偷懒没写,后续会补一下,其他部分感觉还可以,有一个问题在EEPROm的写入上,一开始因为中间加的延时太短,导致一直都不到写入的数值,后来加了一个5ms延时,就没有问题了。通过6个eeprom寄存器存取密码,直接写一个6的循环就可以了,一开始的写入有点麻烦了,但是容易理解。
代码如下:
#include
#include
#include
unsigned char ack_i,ack_count,bell_count;
unsigned char eep_i,input_i=6,input_temp;
unsigned char flag_yemian;
unsigned char eep_read[6],input_word[]={11,11,11,11,11,11,11,11};
unsigned char seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff};
unsigned char yi,er,san,si,wu,liu,qi,ba;
unsigned char time_init[]={0,59,6,0,0,0,0};
unsigned char time_read[7];
void delayms(int ms);
void allinit();
void display_12(yi,er);
void display_34(san,si);
void display_56(wu,liu);
void display_78(qi,ba);
void ds1302_init();
void ds1302_read();
void key_scan();
unsigned char EEPROM_READ(unsigned char add);
void EEPROM_write(unsigned char add,unsigned char dat);
void main(){
allinit();
ds1302_init();
yi=10;er=10;san=10;si=10;wu=10;liu=10;qi=10;ba=10;
while(1){
ds1302_read();
eep_read[0]=EEPROM_READ(0x01);delayms(1);eep_read[1]=EEPROM_READ(0x02);delayms(1);eep_read[2]=EEPROM_READ(0x03);delayms(1);
eep_read[3]=EEPROM_READ(0x04);delayms(1);eep_read[4]=EEPROM_READ(0x05);delayms(1);eep_read[5]=EEPROM_READ(0x06);delayms(1);
if(time_read[2]<7|time_read[2]>22){
yi=time_read[2]/10;er=time_read[2]%10;san=10;si=time_read[1]/10;wu=time_read[1]%10;liu=10;qi=time_read[0]/10;ba=time_read[0]%10;
}
else{
if(flag_yemian==0){
input_word[input_i]=input_temp;
yi=10;er=10;san=input_word[5];si=input_word[4];wu=input_word[3];liu=input_word[2];qi=input_word[1];ba=input_word[0];
}
else if(flag_yemian==1){
input_word[input_i]=input_temp;
yi=11;er=10;san=input_word[5];si=input_word[4];wu=input_word[3];liu=input_word[2];qi=input_word[1];ba=input_word[0];
}
else if(flag_yemian==2){
input_word[input_i]=input_temp;
yi=10;er=11;san=input_word[5];si=input_word[4];wu=input_word[3];liu=input_word[2];qi=input_word[1];ba=input_word[0];
}
}
key_scan();
display_12(yi,er);
display_34(san,si);
display_56(wu,liu);
display_78(qi,ba);
}
}
void key_scan(){
unsigned char temp;
P44=0;P42=1;P3=0XFF;
temp=P3;
temp=temp&0x0f;
if(temp!=0x0f){
delayms(5);
temp=P3;temp=temp&0x0f;
if(temp!=0x0f){
temp=P3;
switch(temp){
case 0xfe:input_temp=0;break;
case 0xfd:input_temp=4;break;
case 0xfb:input_temp=8;break;
case 0xf7:break;
}
while(temp!=0x0f){
temp=P3;temp=temp&0x0f;
}
if(flag_yemian==0|flag_yemian==1|flag_yemian==2){input_i--;}
}
}
P44=1;P42=0;P3=0XFF;
temp=P3;
temp=temp&0x0f;
if(temp!=0x0f){
delayms(5);
temp=P3;temp=temp&0x0f;
if(temp!=0x0f){
temp=P3;
switch(temp){
case 0xfe:input_temp=1;break;
case 0xfd:input_temp=5;break;
case 0xfb:input_temp=9;break;
case 0xf7:break;
}
while(temp!=0x0f){
temp=P3;temp=temp&0x0f;
}
if(flag_yemian==0|flag_yemian==1|flag_yemian==2){input_i--;}
}
}
P44=1;P42=1;P3=0XDF;
temp=P3;
temp=temp&0x0f;
if(temp!=0x0f){
delayms(5);
temp=P3;temp=temp&0x0f;
if(temp!=0x0f){
temp=P3;
switch(temp){
case 0xde:input_temp=2;break;
case 0xdd:input_temp=6;break;
case 0xdb:
flag_yemian=1;
for(ack_i=0;ack_i<6;ack_i++){
input_word[ack_i]=11;
}
input_i=7;
break;
case 0xd7:
if(flag_yemian==2){
for(ack_i=0;ack_i<6;ack_i++){
eep_read[ack_i]=input_word[ack_i];
EEPROM_write(0x01+ack_i,input_word[ack_i]);delayms(5);
input_word[ack_i]=11;
}
input_i=7;
flag_yemian=0;
}
else{
for(ack_i=0;ack_i<6;ack_i++){
if(input_word[ack_i]==eep_read[ack_i])
ack_count++;
}
if(ack_count==6){
if(flag_yemian==0){
P2=0XA0;P0=0X10;P2=P2&0X2F;
delayms(5000);
P2=0XA0;P0=0X00;P2=P2&0X2F;
for(ack_i=0;ack_i<6;ack_i++){
input_word[ack_i]=11;
}
input_i=7;
}
else if(flag_yemian==1){
flag_yemian=2;
for(ack_i=0;ack_i<6;ack_i++){
input_word[ack_i]=11;
}
input_i=7;
}
}
else{
bell_count++;
if(bell_count==3)
{
P2=0XA0;P0=0X40;
delayms(3000);
P2=0XA0;P0=0X00;
if(flag_yemian==1){flag_yemian=0;}
bell_count=0;
}
for(ack_i=0;ack_i<6;ack_i++){
input_word[ack_i]=11;
}
input_i=7;
}
ack_count=0;
}
break;
}
while(temp!=0x0f){
temp=P3;temp=temp&0x0f;
}
if(flag_yemian==0|flag_yemian==1|flag_yemian==2){input_i--;}
}
}
P44=1;P42=1;P3=0XEF;
temp=P3;
temp=temp&0x0f;
if(temp!=0x0f){
delayms(5);
temp=P3;temp=temp&0x0f;
if(temp!=0x0f){
temp=P3;
switch(temp){
case 0xee:input_temp=3;break;
case 0xed:input_temp=7;break;
case 0xeb:
flag_yemian=0;
EEPROM_write(0x01,1);delayms(5);EEPROM_write(0x02,2);delayms(5);EEPROM_write(0x03,3);delayms(5);
EEPROM_write(0x04,4);delayms(5);EEPROM_write(0x05,5);delayms(5);EEPROM_write(0x06,6);delayms(5);
for(ack_i=0;ack_i<6;ack_i++){
input_word[ack_i]=11;
}
input_i=7;
break;
case 0xe7:
flag_yemian=0;
for(ack_i=0;ack_i<6;ack_i++){
input_word[ack_i]=11;
}
input_i=7;
break;
}
while(temp!=0x0f){
temp=P3;temp=temp&0x0f;
}
if(flag_yemian==0|flag_yemian==1|flag_yemian==2){input_i--;}
}
}
}
unsigned char EEPROM_READ(unsigned char add){
unsigned char temp;
IIC_Start();
IIC_SendByte(0xa0);
IIC_WaitAck();
IIC_SendByte(add);
IIC_WaitAck();
IIC_Stop();
IIC_Start();
IIC_SendByte(0xa1);
IIC_WaitAck();
temp=IIC_RecByte();
IIC_Stop();
return temp;
}
void EEPROM_write(unsigned char add,unsigned char dat){
IIC_Start();
IIC_SendByte(0xa0);
IIC_WaitAck();
IIC_SendByte(add);
IIC_WaitAck();
IIC_SendByte(dat);
IIC_WaitAck();
IIC_Stop();
}
void ds1302_init(){
unsigned char i,add=0x80;
Write_Ds1302_Byte(0x8e,0x00);
for(i=0;i<7;i++){
Write_Ds1302_Byte(add,time_init[i]);
add=add+2;
}
Write_Ds1302_Byte(add,0x80);
}
void ds1302_read(){
unsigned char i,add=0x81;
Write_Ds1302_Byte(0x8e,0x00);
for(i=0;i<7;i++){
time_read[i]=Read_Ds1302_Byte(add);
add=add+2;
}
Write_Ds1302_Byte(add,0x80);
}
void delayms(int ms){
int q,w;
for(q=0;q<ms;q++)
for(w=0;w<845;w++);
}
void allinit(){
P2=0XA0;P0=0X00;
P2=0XC0;P0=0XFF;P2=0XE0;P0=0XFF;
P2=0X80;P0=0XFF;
}
void display_12(yi,er){
P2=0XC0;P0=0X01;P2=0XE0;P0=seg[yi];delayms(1);
P2=0XC0;P0=0X02;P2=0XE0;P0=seg[er];delayms(1);
}
void display_34(san,si){
P2=0XC0;P0=0X04;P2=0XE0;P0=seg[san];delayms(1);
P2=0XC0;P0=0X08;P2=0XE0;P0=seg[si];delayms(1);
}
void display_56(wu,liu){
P2=0XC0;P0=0X10;P2=0XE0;P0=seg[wu];delayms(1);
P2=0XC0;P0=0X20;P2=0XE0;P0=seg[liu];delayms(1);
}
void display_78(qi,ba){
P2=0XC0;P0=0X40;P2=0XE0;P0=seg[qi];delayms(1);
P2=0XC0;P0=0X80;P2=0XE0;P0=seg[ba];delayms(1);
P2=0XC0;P0=0XFF;P2=0XE0;P0=0XFF;delayms(1);
}