欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7684|回復: 19
打印 上一主題 下一主題
收起左側

自己做的單片機密碼鎖課程設計,內附視頻,電路圖,keil及hex文件

  [復制鏈接]
跳轉到指定樓層
樓主
       分享一個自己上周做的課程設計:密碼鎖不僅有基本的功能,還有實現密碼正確電機正轉三圈,反轉三圈。
以下是電路仿真截圖及工程文件截圖以及視頻演示。有需要的可以自行下載。

開機時實物照片


密碼正確時實物照片


仿真電路原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機源程序(hex文件):

  1. #include<reg51.h>
  2. #include"lcd.h"

  3. #define GPIO_KEY P1
  4. #define uint unsigned int
  5. #define INT8U unsigned char
  6. unsigned char KeyValue,flag,key;
  7. //用來存放讀取到的鍵值
  8. unsigned char KeyState;
  9. //用來存放按鍵狀態
  10. unsigned char PuZh[]="H082";
  11. unsigned char time[]=" TIME5 ";
  12. unsigned char key_right[]="right";
  13. unsigned char key_error[]="error";
  14. unsigned char right_dat[]="9999";
  15. unsigned char dat[]="0123456789HBCDEF";
  16. unsigned char key_dat[4]={0};
  17. void Delay10ms(char time);   //延時10ms
  18. void KeyDown();                 //檢測按鍵函數
  19. void test();         //密碼檢測函數
  20. void STEP_MOTOR_FFW(INT8U n);
  21. void STEP_MOTOR_REV(INT8U n);

  22. void clock_write(uchar ad,uint s);
  23. sbit   LED0= P2^3;
  24. sbit   BEEP= P2^2;
  25. unsigned char FFW[]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};
  26. unsigned char REV[]={0X09,0X08,0X0C,0X04,0X06,0X02,0X03,0X01};
  27. INT8U second;
  28. INT8U        second=5;
  29. INT8U int_time;
  30. /*******************************************************************************
  31. * 函 數 名         : main
  32. * 函數功能                   : 主函數
  33. * 輸    入         : 無
  34. * 輸    出         : 無
  35. *******************************************************************************/
  36. void main(void)
  37. {
  38.         unsigned char i,j;
  39.         LcdInit();
  40.         KeyState=0;
  41.         TMOD=0X01;
  42.         EA=1;
  43.         ET0=1;
  44.         TH0=(65536-46083)/256;
  45.     TL0=(65536-46083)%256;
  46.         TR0=0;
  47.         int_time=0;
  48.         for(i=0;i<16;i++)
  49.         {
  50.          LcdWriteData(PuZh[i]);}
  51.          Delay10ms(3000);                //等待3秒
  52.            LcdWriteCom(0x01);        
  53.         while(1)
  54.         {
  55.                 KeyDown();
  56.                 if(KeyValue==11)   //  密碼不顯示
  57.                 {
  58.                         LcdWriteCom(0x01);
  59.                         LcdWriteCom(0x80+0x40);
  60.                         key=0;
  61.                 }
  62.                 if(KeyState)
  63.                 {
  64.                         KeyState=0;
  65.                         LcdWriteCom(0x80+0x40+key);
  66.                         if(KeyValue<11)
  67.                         {
  68.                                 LcdWriteData(dat[KeyValue]);
  69.                                 key_dat[key]=dat[KeyValue];
  70.                                 key++;
  71.                                 if(key==4)
  72.                             {        
  73.                                     test();key=0;
  74.                                         }
  75.                             }
  76.                 }
  77.          }                                
  78. }
  79. /*******************************************************************************
  80. * 函 數 名         : KeyDown
  81. * 函數功能                   : 檢測有按鍵按下并讀取鍵值
  82. * 輸    入         : 無
  83. * 輸    出         : 無
  84. *******************************************************************************/
  85. void KeyDown(void)
  86. {
  87.         char a,j;
  88.         GPIO_KEY=0x0f;
  89.         if(GPIO_KEY!=0x0f)
  90.         {
  91.                 Delay10ms(1);
  92.                 if(GPIO_KEY!=0x0f)
  93.                 {
  94.                         KeyState=1;
  95.                         //測試列
  96.                         GPIO_KEY=0X0F;
  97.                         switch(GPIO_KEY)
  98.                         {
  99.                                 case(0X07):        KeyValue=0;break;
  100.                                 case(0X0b):        KeyValue=1;break;
  101.                                 case(0X0d): KeyValue=2;break;
  102.                                 case(0X0e):        KeyValue=3;break;
  103.                         }
  104.                         //測試行
  105.                         GPIO_KEY=0XF0;
  106.                         Delay10ms(1);
  107.                         switch(GPIO_KEY)
  108.                         {
  109.                                 case(0X70):        KeyValue=KeyValue;break;
  110.                                 case(0Xb0):        KeyValue=KeyValue+4;break;
  111.                                 case(0Xd0): KeyValue=KeyValue+8;break;
  112.                                 case(0Xe0):        KeyValue=KeyValue+12;break;
  113.                         }
  114.                         if(KeyValue==12) //密碼顯示
  115.                         {
  116.                            LcdWriteCom(0x80);
  117.                            for(j=0;j<10;j++)  LcdWriteData(PuZh[j]);        
  118.                            for(j=0;j<4;j++)
  119.                            {
  120.                              LcdWriteCom(0x80+0x40+j);
  121.                                  LcdWriteData(key_dat[j]);
  122.                            }
  123.                         }
  124.                         if(KeyValue==13)   // 重新輸入密碼
  125.                         {
  126.                                 LcdWriteCom(0x01);
  127.                                 LcdWriteCom(0x80); key=0;flag=0;
  128.                                 for(j=0;j<10;j++) LcdWriteData(PuZh[j]);
  129.                                 for(j=0;j<4;j++)  key_dat[j]=0;
  130.                         }
  131.                         while((a<50)&&(GPIO_KEY!=0xf0))         //檢測按鍵松手檢測
  132.                         {
  133.                                 Delay10ms(1);
  134.                                 a++;
  135.                         }
  136.                         a=0;
  137.                 }
  138.         }
  139. }
  140. /*******************************************************************************
  141. * 函 數 名         : Delay10ms
  142. * 函數功能                   : 延時函數,延時10ms
  143. * 輸    入         : 無
  144. * 輸    出         : 無
  145. *******************************************************************************/
  146. void Delay10ms(char time)   //誤差 0us
  147. {
  148.     unsigned char a,b,c;
  149.     for(c=time;c>0;c--)
  150.         for(b=38;b>0;b--)
  151.             for(a=130;a>0;a--);
  152. }
  153. /*******************************************************************************
  154. * 函 數 名         : test
  155. * 函數功能                   : 密碼檢測函數
  156. * 輸    入         : 無
  157. * 輸    出         : 無
  158. *******************************************************************************/
  159. void test()
  160. {        uint x;
  161.     INT8U N=3;
  162.         char i,j;
  163.         for(i=0;i<4;i++)//密碼檢測
  164.         {
  165.             if(right_dat[i]==key_dat[i]) flag++;
  166.         }
  167.         if(flag==4)  //密碼正確
  168.         {   
  169.                
  170.             for(j=0;j<5;j++)  LcdWriteData(key_right[j]);               
  171.                   for(x=0;x<100;x++)                                //光聲控制
  172.                   {Delay10ms(1);BEEP=~BEEP;}
  173.                   BEEP=1;   
  174.                   LED0=0;
  175.                   STEP_MOTOR_FFW(N);                                //電機
  176.                   TR0=1;
  177.                   for(j=0;j<16;j++)                 //倒計時
  178.               {   
  179.                         LcdWriteData(time[j]);}
  180.                 clock_write(0x80,second);        
  181.         }
  182.         else             //密碼錯誤
  183.         {
  184.             flag=0;
  185.             LcdWriteCom(0x80+0x46);
  186.             Delay10ms(50);
  187.             for(j=0;j<5;j++)  LcdWriteData(key_error[j]);
  188.         }
  189. }

  190. void STEP_MOTOR_FFW(INT8U n)                //電機
  191. { INT8U i,j;
  192. for(i=0;i<5*n;i++)
  193. { for(j=0;j<8;j++)
  194.    {P3=FFW[j];
  195.    Delay10ms(25);}}        }
  196. void STEP_MOTOR_REV(INT8U n)
  197. { INT8U i,j;
  198. for(i=0;i<5*n;i++)
  199. { for(j=0;j<8;j++)
  200.    {P3=REV[j];
  201.    Delay10ms(25);}}        }


  202. void clock_write(uchar ad,uint second)           //倒計時
  203. { LcdWriteCom(ad);
  204.   LcdWriteData(second);
  205.   Delay10ms(100);}
  206. void T0_interserve(void) interrupt 1
  207. {         INT8U N=3;
  208.    TH0=(65536-46083)/256;
  209.    TL0=(65536-46083)%256;
  210.    int_time++;
  211.   if(int_time==20)
  212.    { int_time=0;
  213.      second--;}
  214.          if(second==0)
  215.          {STEP_MOTOR_REV(N);}
  216.   
  217.    }
  218.     #include"lcd.h"

  219. /*******************************************************************************
  220. * 函 數 名         : Lcd1602_Delay1ms
  221. * 函數功能                   : 延時函數,延時1ms
  222. * 輸    入         : c
  223. * 輸    出         : 無
  224. * 說    名         : 該函數是在12MHZ晶振下,12分頻單片機的延時。
  225. *******************************************************************************/

  226. void Lcd1602_Delay1ms(uint c)   //誤差 0us
  227. {
  228.     uchar a,b;
  229.         for (; c>0; c--)
  230.         {
  231.                  for (b=199;b>0;b--)
  232.                  {
  233.                           for(a=1;a>0;a--);
  234.                  }      
  235.         }
  236.             
  237. }

  238. /*******************************************************************************
  239. * 函 數 名         : LcdWriteCom
  240. * 函數功能                   : 向LCD寫入一個字節的命令
  241. * 輸    入         : com
  242. * 輸    出         : 無
  243. *******************************************************************************/
  244. #ifndef         LCD1602_4PINS         //當沒有定義這個LCD1602_4PINS時
  245. void LcdWriteCom(uchar com)          //寫入命令
  246. {
  247.         LCD1602_E = 0;     //使能
  248.         LCD1602_RS = 0;           //選擇發送命令
  249.         LCD1602_RW = 0;           //選擇寫入
  250.         
  251.         LCD1602_DATAPINS = com;     //放入命令
  252.         Lcd1602_Delay1ms(1);                //等待數據穩定

  253.         LCD1602_E = 1;                  //寫入時序
  254.         Lcd1602_Delay1ms(5);          //保持時間
  255.         LCD1602_E = 0;
  256. }
  257. #else
  258. void LcdWriteCom(uchar com)          //寫入命令
  259. {
  260.         LCD1602_E = 0;         //使能清零
  261.         LCD1602_RS = 0;         //選擇寫入命令
  262.         LCD1602_RW = 0;         //選擇寫入

  263.         LCD1602_DATAPINS = com;        //由于4位的接線是接到P0口的高四位,所以傳送高四位不用改
  264.         Lcd1602_Delay1ms(1);

  265.         LCD1602_E = 1;         //寫入時序
  266.         Lcd1602_Delay1ms(5);
  267.         LCD1602_E = 0;

  268. //        Lcd1602_Delay1ms(1);
  269.         LCD1602_DATAPINS = com << 4; //發送低四位
  270.         Lcd1602_Delay1ms(1);

  271.         LCD1602_E = 1;         //寫入時序
  272.         Lcd1602_Delay1ms(5);
  273.         LCD1602_E = 0;
  274. }
  275. #endif
  276. /*******************************************************************************
  277. * 函 數 名         : LcdWriteData
  278. * 函數功能                   : 向LCD寫入一個字節的數據
  279. * 輸    入         : dat
  280. * 輸    出         : 無
  281. *******************************************************************************/                  
  282. #ifndef         LCD1602_4PINS                  
  283. void LcdWriteData(uchar dat)                        //寫入數據
  284. {
  285.         LCD1602_E = 0;        //使能清零
  286.         LCD1602_RS = 1;        //選擇輸入數據
  287.         LCD1602_RW = 0;        //選擇寫入

  288.         LCD1602_DATAPINS = dat; //寫入數據
  289.         Lcd1602_Delay1ms(1);

  290.         LCD1602_E = 1;   //寫入時序
  291.         Lcd1602_Delay1ms(5);   //保持時間
  292.         LCD1602_E = 0;
  293. }
  294. #else
  295. void LcdWriteData(uchar dat)                        //寫入數據
  296. {
  297.         LCD1602_E = 0;          //使能清零
  298.         LCD1602_RS = 1;          //選擇寫入數據
  299.         LCD1602_RW = 0;          //選擇寫入

  300.         LCD1602_DATAPINS = dat;        //由于4位的接線是接到P0口的高四位,所以傳送高四位不用改
  301.         Lcd1602_Delay1ms(1);

  302.         LCD1602_E = 1;          //寫入時序
  303.         Lcd1602_Delay1ms(5);
  304.         LCD1602_E = 0;

  305.         LCD1602_DATAPINS = dat << 4; //寫入低四位
  306.         Lcd1602_Delay1ms(1);

  307.         LCD1602_E = 1;          //寫入時序
  308.         Lcd1602_Delay1ms(5);
  309.         LCD1602_E = 0;
  310. }
  311. #endif
  312. /*******************************************************************************
  313. * 函 數 名       : LcdInit()
  314. * 函數功能                 : 初始化LCD屏
  315. * 輸    入       : 無
  316. * 輸    出       : 無
  317. *******************************************************************************/                  
  318. #ifndef                LCD1602_4PINS
  319. void LcdInit()                                                  //LCD初始化子程序
  320. {
  321.          LcdWriteCom(0x38);  //開顯示
  322.         LcdWriteCom(0x0c);  //開顯示不顯示光標
  323.         LcdWriteCom(0x06);  //寫一個指針加1
  324.         LcdWriteCom(0x01);  //清屏
  325.         LcdWriteCom(0x80);  //設置數據指針起點
  326. }
  327. #else
  328. void LcdInit()                                                  //LCD初始化子程序
  329. {
  330.         LcdWriteCom(0x32);         //將8位總線轉為4位總線
  331.         LcdWriteCom(0x28);         //在四位線下的初始化
  332.         LcdWriteCom(0x0c);  //開顯示不顯示光標
  333.         LcdWriteCom(0x06);  //寫一個指針加1
  334.         LcdWriteCom(0x01);  //清屏
  335.         LcdWriteCom(0x80);  //設置數據指針起點

  336. …………
  337. …………
  338. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

全部資料51hei下載地址:
多功能密碼鎖.rar (14.8 MB, 下載次數: 210)


評分

參與人數 3黑幣 +108 收起 理由
waitc + 3 絕世好帖!
Amazing云山 + 5
admin + 100 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏4 分享淘帖 頂2 踩
回復

使用道具 舉報

沙發
ID:87193 發表于 2017-12-18 14:59 | 只看該作者
設計挺好的,下載了看看,謝謝分享

評分

參與人數 1黑幣 +1 收起 理由
10072805 + 1 贊一個!

查看全部評分

回復

使用道具 舉報

板凳
ID:352858 發表于 2018-6-16 14:16 | 只看該作者
不錯,下載學習!
回復

使用道具 舉報

地板
ID:350392 發表于 2018-6-16 15:13 | 只看該作者
挺好的,來自新手的膜拜
回復

使用道具 舉報

5#
ID:275175 發表于 2018-6-22 13:13 | 只看該作者
學習學習。謝謝。
回復

使用道具 舉報

6#
ID:356605 發表于 2018-6-22 14:16 | 只看該作者
新人一個,前來學習學習。
回復

使用道具 舉報

7#
ID:365788 發表于 2018-7-7 14:50 | 只看該作者
厲害厲害,學習了,
回復

使用道具 舉報

8#
ID:361206 發表于 2018-7-9 12:19 來自觸屏版 | 只看該作者
可以改為六位密碼嗎
回復

使用道具 舉報

9#
ID:459850 發表于 2019-1-2 11:03 | 只看該作者
想問下樓主用的什么板子呢
回復

使用道具 舉報

10#
ID:459880 發表于 2019-1-2 11:25 | 只看該作者
看起來很厲害的樣子。。膜拜一下
回復

使用道具 舉報

11#
無效樓層,該帖已經被刪除
12#
ID:463109 發表于 2019-1-6 18:29 | 只看該作者
很好  非常感謝
回復

使用道具 舉報

13#
ID:467270 發表于 2019-3-14 19:51 | 只看該作者
強的一批
回復

使用道具 舉報

14#
ID:121195 發表于 2019-3-14 22:08 | 只看該作者
下載了看看,謝謝分享
回復

使用道具 舉報

15#
ID:542290 發表于 2019-5-19 19:41 | 只看該作者
下載看看謝謝
回復

使用道具 舉報

16#
ID:549713 發表于 2019-5-30 22:20 | 只看該作者
感覺不錯呀
回復

使用道具 舉報

17#
ID:617814 發表于 2019-10-8 11:32 | 只看該作者
有沒有門磁
回復

使用道具 舉報

18#
ID:617814 發表于 2019-10-8 11:33 | 只看該作者
如何加入生物識別模塊
回復

使用道具 舉報

19#
無效樓層,該帖已經被刪除
20#
ID:599674 發表于 2019-10-27 18:40 | 只看該作者
對不起 是我看錯了 里面有視頻的
回復

使用道具 舉報

21#
ID:649596 發表于 2019-11-26 08:39 | 只看該作者
感謝感謝,太優秀了
回復

使用道具 舉報

22#
ID:649596 發表于 2019-11-26 10:10 | 只看該作者
學習觀察,發現好豐富啊
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表