标题: 密码锁源代码 [打印本页]
作者: 北极星18 时间: 2015-4-25 15:35
标题: 密码锁源代码
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define ulong unsigned long
#define uint unsigned int
sbit en=P2^6;
sbit rs=P2^4;
sbit rw=P2^5;
sbit fmq=P2^0;
sbit qd=P2^1;
sbit LA=P3^0; //定义两相,选择P2口的低四位输
sbit LB=P3^1; //LA为A,LB为B,LC为C,LD为D
sbit LC=P3^2;
sbit LD=P3^3;
sbit key2=P3^5;//定义按键3
sbit key1=P3^4;//定义按键4
/********函数声明*****/
void right(unsigned int Speed,unsigned int road);//正转
void left(unsigned int Speed,unsigned int road); //反转
void mDelay(unsigned int DelayTime);//延时函数
int MotorStep=0;//步进索引
/*****正转,两个参数代表转速和步进量**********/
void right(unsigned int Speed,unsigned int road)
{ //步进节拍:A-B-C-D
while(road)
{
switch(MotorStep)
{
case 0:LB=0;
LC=0;
LD=0;
LA=1;//A
MotorStep=1;break;
case 1:LA=0;
LC=0;
LD=0;
LB=1;//B
MotorStep=2;break;
case 2:LA=0;
LB=0;
LD=0;
LC=1;//C
MotorStep=3;break;
case 3:LA=0;
LB=0;
LC=0;
LD=1;//D
MotorStep=0;break;
}
mDelay(Speed);//这里的延时即控制转速
road--;//完成一步
}
P2&=0XF0;//将四个脚复位0,停止
}
/********反转,两个参数代表转速和步进量********/
void left(unsigned int Speed,unsigned int road)
{//步进节拍:D-C-B-A
while(road)
{
switch(MotorStep)
{
case 3:LA=0;LC=0;LD=0;LB=1;//B
MotorStep=2;break;
case 2:LB=0;LC=0;LD=0;LA=1; //A
MotorStep=1;break;
case 1:LA=0;LB=0;LC=0;LD=1; //D
MotorStep=0; break;
case 0:LA=0;LB=0;LD=0;LC=1;//C
MotorStep=3;break;
}
mDelay(Speed);//这里的延时即控制转速
road--;//完成一步
}
P2&=0XF0;//将四个脚复位0
}
/***********延时函数***************/
void mDelay(unsigned int DelayTime)
{
unsigned char j=0;
while(DelayTime--)
{
for(j=0;j<100;j++)
{}
}
}
void delay_1ms(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void delay()
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
bit busy(void) //读出函数是否处于忙状态
{
bit busy_flag=0;
rs=0;
rw=1;
en=1;
delay();
busy_flag=(bit)(P0&0x80);
en=0;
return busy_flag;
}
void write_com(uchar com) //写指令函数
{
while(busy());
rs=0; //选择指令寄存器
rw=0; //选择写操作
en=0;
delay();
P0=com;
delay();
en=1;
delay();
en=0;
}
void write_data(uchar date) //写数据函数
{
while(busy()); //
rs=1; //选择数据寄存器
rw=0;//选择读操作
en=0;
delay();
P0=date;
delay();
en=1;
delay();
en=0;
}
void l1602_init() // 初始化函数
{
write_com(0x38); //显示模式设置
delay_1ms(5); //延时5ms
write_com(0x08); //开显示
write_com(0x0f); //开光标显示且闪烁
write_com(0x01); //清屏
}
void l1602_char(uchar hang,uchar lie,char sign)
{
uchar a;
if(hang==1)a=0x80;
if(hang==2)a=0xc0;
a=a+lie-1;
write_com(a);
write_data(sign);
}
void l1602_string(uchar hang,uchar lie,uchar *p)
{
uchar a,b=0;
if(hang==1)a=0x80;
if(hang==2)a=0xc0;
a=a+lie-1;
while(1)
{write_com(a++);
b++;
if((*p=='\0')||(b==16))break;
write_data(*p);
p++;
}
}
uchar keyscan(void) //键盘函数
{
uchar i,j,temp,buffer[4]={0xfe,0xfd,0xfb,0xf7} ;
for(j=0;j<4;j++)
{
P1=buffer[j];
temp=0x10;
for(i=0;i<4;i++)
{
if(!(P1&temp))
{
return(i+j*4);
}
temp<<=1;
}
}
return 10;
}
void main(void)
{ uint k=1;
uchar i=6 ,j=0;
uchar SLED[6]={0};
ulong key_value;
ulong code6wei=0x123456;
ulong codebijiao=0;
l1602_init();
l1602_string(1,1,"The code is:");
fmq=0;
qd=1;
while(1)
{ key_value=10;
P1=0xf0;
if(P1!=0Xf0)
{delay_1ms(70);
if(P1!=0xf0)
{delay_1ms(70);
if(P1!=0Xf0)
{
key_value=keyscan();
}
}
}
if(key_value<10)
{
l1602_char(2,i,key_value+48);
codebijiao=codebijiao|(key_value<<((5-j)*4));
i++;
j++;
delay_1ms(200);
}
if(j==6)
{
if(codebijiao==code6wei)
{ qd=0;
write_com(0x01);
l1602_string(1,1,"right!");
l1602_string(2,1,"welcome back!");
P2&=0XF0;//因ULN2003A直接驱动,初始时为低电平
while(1) //循环
{
if(((k==1)||(k==2))&&key1==0) //1键按下正转
{ k=3;
if(k==4)
{P2=0X00;
while(1){}
}
right(10,200);//两个参数代表转速和步进量,以10的速度进200步
P2=0X00;
k=4;
}
if(((k==3)||(k==4))&&(key2==0))//2键按下反转
{ k=1;
if(k==2)
{P2=0X00;
while(1){}
}
left(10,200);
P2=0X00;
k=2;
}
}
}
else
{ fmq=1;
delay_1ms(2000);
write_com(0x01);
l1602_string(1,1,"wrong!");
l1602_string(2,1,"Input again!");
delay_1ms(1000);
j=0;
i=6;
write_com(0x01);
l1602_string(1,1,"The code is:");
main();
}
}
}
}
作者: ludaijin 时间: 2015-9-7 08:20
没有原理图啊
作者: 谭雅Ayom 时间: 2016-5-15 22:17
原理图不给一下吗?谢谢啊
作者: 神秘人 时间: 2016-5-22 10:27
看不懂这原理啊
作者: zxc5230 时间: 2016-5-22 12:49
能给出原理图和功能说明么不然直接这个程序也看不出所以然来
作者: sg116116 时间: 2016-5-22 14:44
有程序就好
作者: USA 时间: 2016-11-7 22:19
很不错的,有帮助
作者: 小邱y13 时间: 2016-11-8 21:16
有图就好了
作者: llllmmm 时间: 2016-12-30 19:55
可以的不错
作者: Mr_zhang 时间: 2017-1-1 16:37
怎么看着像步进电机的,,,不像密码锁的呢
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |