標(biāo)題:
51單片機(jī)密碼鎖提供斷電保護(hù)并控制舵機(jī) 仿真程序
[打印本頁(yè)]
作者:
戀戀的魚(yú)竿
時(shí)間:
2023-12-17 00:39
標(biāo)題:
51單片機(jī)密碼鎖提供斷電保護(hù)并控制舵機(jī) 仿真程序
嗯,這個(gè)是屬于學(xué)校社團(tuán)做的一個(gè)任務(wù)吧,也是很簡(jiǎn)單的一個(gè);
首先,密碼鎖離不開(kāi)矩陣鍵盤(pán)(具體可看b站江科大視頻來(lái)學(xué)習(xí))
然后就是舵機(jī),pwm控制傳輸信號(hào),鳴聲器,
斷電保護(hù)離不開(kāi)i2c和at89c52嗎,
具體代碼如下:
然后我在29行我對(duì)LCD_ShowNum(2,1,Key,4);這一段進(jìn)行了定義修改
如果你取消了,密碼就無(wú)法顯示,當(dāng)然密碼忘了就對(duì)這個(gè)定義添加回來(lái)
第一次使用建議添加回來(lái)因?yàn)槲乙餐涀詈笠淮蚊艽a修改成啥了(難受)
舵機(jī)電源,數(shù)據(jù)和接地的接口我放在芯片旁邊了
其次,密碼正確輸出顯示ok,舵機(jī)旋轉(zhuǎn)
密碼錯(cuò)誤顯示err,同時(shí)鳴聲器報(bào)警
s1到s10為1,2,3,4......,0
s11為確認(rèn)密碼鍵
s12為密碼清空鍵
s13為密碼重置鍵
說(shuō)難不難,說(shuō)簡(jiǎn)單不簡(jiǎn)單,畢竟剛剛學(xué)51單片機(jī)才2個(gè)月:)
代碼展示!
main.c文件如下
#include <REGX52.H>
#include "Delay.h"
#include "LCD1602.h"
#include "MatrixKey.h"
#include "Buzzer.h"
#include "timer0.h"
#include "at24c02.h"
unsigned char KeyNum,kount=0,PWM_kount=0;
unsigned int PassWord,Count,NewKey,Ncount,Key,i,Data,Num;
sbit SG_PWM=P2^0;
sbit Buzzer=P2^5;
void Delay_ms(unsigned int nms)
{
unsigned int i,j;
for(i=nms;i>0;i--)
for(j=113;j>0;j--);
}
void main()
{
Timer0_Init();
LCD_Init();
LCD_ShowString(1,1,"PassWord:");
Key=AT24C02_ReadByte(2);
Key=Key*100+AT24C02_ReadByte(1);
// LCD_ShowNum(2,1,Key,4);
while(1)
{
KeyNum=MatrixKey();
if(KeyNum)
{
if (KeyNum<=10)
{
if(Count<=3)
{
PassWord*=10;
PassWord+=KeyNum%10;
}
Count=Count+1;
}
if(Count==1)
{
LCD_ShowNum(2,1,PassWord,4);
Delay(4);
}
if(Count==2)
{
LCD_ShowNum(2,1,PassWord,4);
Delay(4);
}
if(Count==3)
{
LCD_ShowNum(2,1,PassWord,4);
Delay(4);
}
if(Count==4)
{
LCD_ShowNum(2,1,PassWord,4);
Delay(4);
}
if(KeyNum==11)
{
if(PassWord==Key)
{
LCD_ShowString(1,13,"ok ");
PassWord=0;
Count=0;
LCD_ShowNum(2,1,PassWord,4);
Delay(1000);
LCD_ShowString(1,13," ");
PWM_kount=1;
Delay(1000);
PWM_kount=2;
Delay(1000);
PWM_kount=3;
Delay(1000);
PWM_kount=4;
Delay(1000);
PWM_kount=5;
Delay(1000);
}
else
{
LCD_ShowString(1,13,"err");
for(i=0;i<200;i++)
{
Buzzer=!Buzzer;
Delay(1);
}
PassWord=0;
Count=0;
LCD_ShowNum(2,1,PassWord,4);
Delay(1000);
LCD_ShowString(1,13," ");
}
}
if(KeyNum==12)
{
PassWord=0;
Count=0;
LCD_ShowNum(2,1,PassWord,4);
}
if(KeyNum==13)
{
Count=0;
LCD_ShowString(1,1,"OldPassWord:");
while(1)
{
KeyNum=MatrixKey();
if(KeyNum)
{
if (KeyNum<=10)
{
if(Count<=3)
{
PassWord*=10;
Delay(8);
PassWord+=KeyNum%10;
}
Count=Count+1;
}
if(Count==1)
{
LCD_ShowNum(2,1,PassWord,4);
Delay(4);
}
if(Count==2)
{
LCD_ShowNum(2,1,PassWord,4);
Delay(4);
}
if(Count==3)
{
LCD_ShowNum(2,1,PassWord,4);
Delay(4);
}
if(Count==4)
{
LCD_ShowNum(2,1,PassWord,4);
Delay(4);
}
}
if(KeyNum==11)
{
if(PassWord==Key)
{
LCD_ShowString(1,1,"OldPassWord:OK");
Delay(1000);
LCD_Init();
PassWord=0;
LCD_ShowString(1,1,"NewPassWord:");
while(1)
{
KeyNum=MatrixKey();
if(KeyNum)
{
if (KeyNum<=10)
{
if(Ncount<=3)
{
PassWord*=10;
PassWord+=KeyNum%10;
NewKey=PassWord;
}
Ncount=Ncount+1;
}
LCD_ShowNum(2,1,PassWord,4);
if(KeyNum==11)
{
AT24C02_WriteByte(1,NewKey%100);
Delay(8);
AT24C02_WriteByte(2,NewKey/100);
Delay(8);
Key=AT24C02_ReadByte(2);
Key=Key*100+AT24C02_ReadByte(1);
Count=0;
PassWord=0;
LCD_ShowNum(2,1,PassWord,4);
LCD_Init();
LCD_ShowString(1,1,"PassWord:");
while(1)
{
KeyNum=MatrixKey();
if(KeyNum)
{
if (KeyNum<=10)
{
if(Count<=3)
{
PassWord*=10;
PassWord+=KeyNum%10;
}
Count=Count+1;
}
if(Count==1)
{
LCD_ShowNum(2,1,PassWord,4);
Delay(4);
}
if(Count==2)
{
LCD_ShowNum(2,1,PassWord,4);
Delay(4);
}
if(Count==3)
{
LCD_ShowNum(2,1,PassWord,4);
Delay(4);
}
if(Count==4)
{
LCD_ShowNum(2,1,PassWord,4);
Delay(4);
}
if(KeyNum==11)
{
if(PassWord==NewKey)
{
LCD_ShowString(1,13,"OK ");
PassWord=0;
Count=0;
LCD_ShowNum(2,1,PassWord,4);
Delay(1000);
LCD_ShowString(1,13," ");
PWM_kount=1;
Delay(1000);
PWM_kount=2;
Delay(1000);
PWM_kount=3;
Delay(1000);
PWM_kount=4;
Delay(1000);
PWM_kount=5;
Delay(1000);
}
else
{
LCD_ShowString(1,13,"Err");
for(i=0;i<200;i++)
{
Buzzer=!Buzzer;
Delay(1);
}
PassWord=0;
Count=0;
LCD_ShowNum(2,1,PassWord,4);
Delay(1000);
LCD_ShowString(1,13," ");
}
}
}
if(KeyNum==12)
{
PassWord=0;
Count=0;
LCD_ShowNum(2,1,PassWord,4);
}
}
}
}
}
}
}
if(KeyNum==12)
{
PassWord=0;
Count=0;
LCD_ShowNum(2,1,PassWord,4);
LCD_Init();
LCD_ShowString(1,1,"PassWord:");
}
}
}
}
}
}
void Timer0() interrupt 1
{
TL0 = 0x33;
TH0 = 0xFE;
kount++;
kount%=40;
if(kount<PWM_kount)
{
SG_PWM=1;
}
else
{
SG_PWM=0;
}
}
復(fù)制代碼
然后就是附件
我用到了這些
1.png
(71.8 KB, 下載次數(shù): 21)
下載附件
2023-12-17 00:37 上傳
仿真程序下載:
51單片機(jī)項(xiàng)目(考核).7z
(91.58 KB, 下載次數(shù): 17)
2023-12-17 00:52 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1