標(biāo)題: 密碼鎖源代碼 [打印本頁(yè)]
作者: 北極星18 時(shí)間: 2015-4-25 15:35
標(biāo)題: 密碼鎖源代碼
#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
/********函數(shù)聲明*****/
void right(unsigned int Speed,unsigned int road);//正轉(zhuǎn)
void left(unsigned int Speed,unsigned int road); //反轉(zhuǎn)
void mDelay(unsigned int DelayTime);//延時(shí)函數(shù)
int MotorStep=0;//步進(jìn)索引
/*****正轉(zhuǎn),兩個(gè)參數(shù)代表轉(zhuǎn)速和步進(jìn)量**********/
void right(unsigned int Speed,unsigned int road)
{ //步進(jìn)節(jié)拍: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);//這里的延時(shí)即控制轉(zhuǎn)速
road--;//完成一步
}
P2&=0XF0;//將四個(gè)腳復(fù)位0,停止
}
/********反轉(zhuǎn),兩個(gè)參數(shù)代表轉(zhuǎn)速和步進(jìn)量********/
void left(unsigned int Speed,unsigned int road)
{//步進(jìn)節(jié)拍: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);//這里的延時(shí)即控制轉(zhuǎn)速
road--;//完成一步
}
P2&=0XF0;//將四個(gè)腳復(fù)位0
}
/***********延時(shí)函數(shù)***************/
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) //讀出函數(shù)是否處于忙狀態(tài)
{
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) //寫(xiě)指令函數(shù)
{
while(busy());
rs=0; //選擇指令寄存器
rw=0; //選擇寫(xiě)操作
en=0;
delay();
P0=com;
delay();
en=1;
delay();
en=0;
}
void write_data(uchar date) //寫(xiě)數(shù)據(jù)函數(shù)
{
while(busy()); //
rs=1; //選擇數(shù)據(jù)寄存器
rw=0;//選擇讀操作
en=0;
delay();
P0=date;
delay();
en=1;
delay();
en=0;
}
void l1602_init() // 初始化函數(shù)
{
write_com(0x38); //顯示模式設(shè)置
delay_1ms(5); //延時(shí)5ms
write_com(0x08); //開(kāi)顯示
write_com(0x0f); //開(kāi)光標(biāo)顯示且閃爍
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) //鍵盤(pán)函數(shù)
{
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直接驅(qū)動(dòng),初始時(shí)為低電平
while(1) //循環(huán)
{
if(((k==1)||(k==2))&&key1==0) //1鍵按下正轉(zhuǎn)
{ k=3;
if(k==4)
{P2=0X00;
while(1){}
}
right(10,200);//兩個(gè)參數(shù)代表轉(zhuǎn)速和步進(jìn)量,以10的速度進(jìn)200步
P2=0X00;
k=4;
}
if(((k==3)||(k==4))&&(key2==0))//2鍵按下反轉(zhuǎn)
{ 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 時(shí)間: 2015-9-7 08:20
沒(méi)有原理圖啊
作者: 譚雅Ayom 時(shí)間: 2016-5-15 22:17
原理圖不給一下嗎?謝謝啊
作者: 神秘人 時(shí)間: 2016-5-22 10:27
看不懂這原理啊
作者: zxc5230 時(shí)間: 2016-5-22 12:49
能給出原理圖和功能說(shuō)明么不然直接這個(gè)程序也看不出所以然來(lái)
作者: sg116116 時(shí)間: 2016-5-22 14:44
有程序就好
作者: USA 時(shí)間: 2016-11-7 22:19
很不錯(cuò)的,有幫助
作者: 小邱y13 時(shí)間: 2016-11-8 21:16
有圖就好了
作者: llllmmm 時(shí)間: 2016-12-30 19:55
可以的不錯(cuò)
作者: Mr_zhang 時(shí)間: 2017-1-1 16:37
怎么看著像步進(jìn)電機(jī)的,,,不像密碼鎖的呢
歡迎光臨 (http://www.torrancerestoration.com/bbs/) |
Powered by Discuz! X3.1 |