|
嗯,這個是屬于學校社團做的一個任務吧,也是很簡單的一個;
首先,密碼鎖離不開矩陣鍵盤(具體可看b站江科大視頻來學習)
然后就是舵機,pwm控制傳輸信號,鳴聲器,
斷電保護離不開i2c和at89c52嗎,
具體代碼如下:
然后我在29行我對LCD_ShowNum(2,1,Key,4);這一段進行了定義修改
如果你取消了,密碼就無法顯示,當然密碼忘了就對這個定義添加回來
第一次使用建議添加回來因為我也忘記最后一次密碼修改成啥了(難受)
舵機電源,數據和接地的接口我放在芯片旁邊了
其次,密碼正確輸出顯示ok,舵機旋轉
密碼錯誤顯示err,同時鳴聲器報警
s1到s10為1,2,3,4......,0
s11為確認密碼鍵
s12為密碼清空鍵
s13為密碼重置鍵
說難不難,說簡單不簡單,畢竟剛剛學51單片機才2個月:)
代碼展示!
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;
- }
- }
復制代碼 然后就是附件
我用到了這些
1.png (71.8 KB, 下載次數: 21)
下載附件
2023-12-17 00:37 上傳
仿真程序下載:
51單片機項目(考核).7z
(91.58 KB, 下載次數: 17)
2023-12-17 00:52 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|
評分
-
查看全部評分
|