基于stc89c52的RIGD门禁卡的c语言程序
时间: 2024-03-11 07:43:54 浏览: 17
由于没有具体的RIGD门禁卡的硬件设计和接口定义,无法提供完整的程序设计。但是,以下是基于STC89C52单片机实现的一个简单的门禁系统的C语言程序示例,供参考:
```
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit beep=P1^5;
sbit led1=P1^0;
sbit led2=P1^1;
sbit led3=P1^2;
sbit led4=P1^3;
sbit led5=P1^4;
uchar code password[5]={0x01, 0x02, 0x03, 0x04, 0x05}; //预设密码
uchar code cardid[5][5]={
{0x12, 0x34, 0x56, 0x78, 0x9A}, //注册卡号1
{0x98, 0x76, 0x54, 0x32, 0x10}, //注册卡号2
{0x11, 0x22, 0x33, 0x44, 0x55}, //注册卡号3
{0x66, 0x77, 0x88, 0x99, 0xAA}, //注册卡号4
{0xBB, 0xCC, 0xDD, 0xEE, 0xFF} //注册卡号5
}; //注册卡号
uchar recv_data[5]; //接收卡号
uchar recv_count=0; //接收卡号计数器
uchar password_count=0; //输入密码计数器
void delay(uint n) //延时函数
{
uint i,j;
for(i=n;i>0;i--)
for(j=110;j>0;j--);
}
void send_byte(uchar dat) //发送一个字节
{
uchar i;
for(i=0;i<8;i++)
{
if(dat&0x01)
P2|=0x10;
else
P2&=0xEF;
dat>>=1;
P2|=0x08;
_nop_();
_nop_();
P2&=0xF7;
}
}
uchar recv_byte() //接收一个字节
{
uchar i,dat=0;
for(i=0;i<8;i++)
{
dat>>=1;
if(P2&0x01)
dat|=0x80;
P2>>=1;
}
return dat;
}
void send_cardid(uchar *cardid) //发送卡号
{
uchar i;
for(i=0;i<5;i++)
send_byte(cardid[i]);
}
uchar check_cardid(uchar *cardid) //比较卡号
{
uchar i;
for(i=0;i<5;i++)
if(cardid[i]!=recv_data[i])
return 0;
return 1;
}
uchar check_password() //比较密码
{
uchar i;
for(i=0;i<5;i++)
if(recv_data[i]!=password[i])
return 0;
return 1;
}
void main()
{
uchar i;
beep=1; //蜂鸣器初始化
led1=led2=led3=led4=led5=0; //LED灯初始化
ES=1; //开启串口中断
EA=1; //开启总中断
SCON=0x50; //设置串口工作模式
TMOD=0x20; //设置计时器工作模式
TH1=0xFD; //设置波特率
TL1=0xFD;
TR1=1; //开启计时器
while(1)
{
if(recv_count==5) //接收完整的卡号
{
if(check_password()) //输入密码正确
{
beep=0; //开启蜂鸣器
for(i=0;i<5;i++) //循环比较卡号
{
if(check_cardid(cardid[i]))
{
switch(i+1) //根据卡号开锁
{
case 1: led1=1;break;
case 2: led2=1;break;
case 3: led3=1;break;
case 4: led4=1;break;
case 5: led5=1;break;
}
delay(100); //延时100ms
led1=led2=led3=led4=led5=0; //关闭LED灯
break;
}
}
beep=1; //关闭蜂鸣器
recv_count=password_count=0; //清空计数器
}
else
{
beep=0; //开启蜂鸣器
delay(100); //延时100ms
beep=1; //关闭蜂鸣器
recv_count=password_count=0; //清空计数器
}
}
}
}
void serial() interrupt 4 //串口中断处理函数
{
if(RI==1) //接收到一个字符
{
RI=0; //清空接收标志
recv_data[recv_count++]=SBUF; //接收卡号
if(recv_count==5) //接收完整的卡号
password_count=0; //清空输入密码计数器
}
else //发送一个字符
{
TI=0; //清空发送标志
}
}
```
注:以上代码仅供参考,实际应用中需要根据具体的硬件设计和接口定义进行修改和优化。