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

標(biāo)題: 自己做的單片機(jī)密碼鎖課程設(shè)計(jì),內(nèi)附視頻,電路圖,keil及hex文件 [打印本頁]

作者: ALT306    時(shí)間: 2017-12-16 22:11
標(biāo)題: 自己做的單片機(jī)密碼鎖課程設(shè)計(jì),內(nèi)附視頻,電路圖,keil及hex文件
       分享一個(gè)自己上周做的課程設(shè)計(jì):密碼鎖不僅有基本的功能,還有實(shí)現(xiàn)密碼正確電機(jī)正轉(zhuǎn)三圈,反轉(zhuǎn)三圈。
以下是電路仿真截圖及工程文件截圖以及視頻演示。有需要的可以自行下載。

開機(jī)時(shí)實(shí)物照片


密碼正確時(shí)實(shí)物照片


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


單片機(jī)源程序(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. //用來存放按鍵狀態(tài)
  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);   //延時(shí)10ms
  18. void KeyDown();                 //檢測(cè)按鍵函數(shù)
  19. void test();         //密碼檢測(cè)函數(shù)
  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. * 函 數(shù) 名         : main
  32. * 函數(shù)功能                   : 主函數(shù)
  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. * 函 數(shù) 名         : KeyDown
  81. * 函數(shù)功能                   : 檢測(cè)有按鍵按下并讀取鍵值
  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.                         //測(cè)試列
  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.                         //測(cè)試行
  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))         //檢測(cè)按鍵松手檢測(cè)
  132.                         {
  133.                                 Delay10ms(1);
  134.                                 a++;
  135.                         }
  136.                         a=0;
  137.                 }
  138.         }
  139. }
  140. /*******************************************************************************
  141. * 函 數(shù) 名         : Delay10ms
  142. * 函數(shù)功能                   : 延時(shí)函數(shù),延時(shí)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. * 函 數(shù) 名         : test
  155. * 函數(shù)功能                   : 密碼檢測(cè)函數(shù)
  156. * 輸    入         : 無
  157. * 輸    出         : 無
  158. *******************************************************************************/
  159. void test()
  160. {        uint x;
  161.     INT8U N=3;
  162.         char i,j;
  163.         for(i=0;i<4;i++)//密碼檢測(cè)
  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);                                //電機(jī)
  176.                   TR0=1;
  177.                   for(j=0;j<16;j++)                 //倒計(jì)時(shí)
  178.               {   
  179.                         LcdWriteData(time[j]);}
  180.                 clock_write(0x80,second);        
  181.         }
  182.         else             //密碼錯(cuò)誤
  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)                //電機(jī)
  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)           //倒計(jì)時(shí)
  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. * 函 數(shù) 名         : Lcd1602_Delay1ms
  221. * 函數(shù)功能                   : 延時(shí)函數(shù),延時(shí)1ms
  222. * 輸    入         : c
  223. * 輸    出         : 無
  224. * 說    名         : 該函數(shù)是在12MHZ晶振下,12分頻單片機(jī)的延時(shí)。
  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. * 函 數(shù) 名         : LcdWriteCom
  240. * 函數(shù)功能                   : 向LCD寫入一個(gè)字節(jié)的命令
  241. * 輸    入         : com
  242. * 輸    出         : 無
  243. *******************************************************************************/
  244. #ifndef         LCD1602_4PINS         //當(dāng)沒有定義這個(gè)LCD1602_4PINS時(shí)
  245. void LcdWriteCom(uchar com)          //寫入命令
  246. {
  247.         LCD1602_E = 0;     //使能
  248.         LCD1602_RS = 0;           //選擇發(fā)送命令
  249.         LCD1602_RW = 0;           //選擇寫入
  250.         
  251.         LCD1602_DATAPINS = com;     //放入命令
  252.         Lcd1602_Delay1ms(1);                //等待數(shù)據(jù)穩(wěn)定

  253.         LCD1602_E = 1;                  //寫入時(shí)序
  254.         Lcd1602_Delay1ms(5);          //保持時(shí)間
  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;         //寫入時(shí)序
  266.         Lcd1602_Delay1ms(5);
  267.         LCD1602_E = 0;

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

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

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

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

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

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

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

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

  336. …………
  337. …………
  338. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

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



作者: lemon0210    時(shí)間: 2017-12-18 14:59
設(shè)計(jì)挺好的,下載了看看,謝謝分享
作者: psusxj    時(shí)間: 2018-6-16 14:16
不錯(cuò),下載學(xué)習(xí)!
作者: godqing    時(shí)間: 2018-6-16 15:13
挺好的,來自新手的膜拜
作者: SDBX    時(shí)間: 2018-6-22 13:13
學(xué)習(xí)學(xué)習(xí)。謝謝。
作者: SKU    時(shí)間: 2018-6-22 14:16
新人一個(gè),前來學(xué)習(xí)學(xué)習(xí)。
作者: 6278779JJJ    時(shí)間: 2018-7-7 14:50
厲害厲害,學(xué)習(xí)了,
作者: 15276691870    時(shí)間: 2018-7-9 12:19
可以改為六位密碼嗎
作者: picture    時(shí)間: 2019-1-2 11:03
想問下樓主用的什么板子呢

作者: 916478874    時(shí)間: 2019-1-2 11:25
看起來很厲害的樣子。。膜拜一下
作者: vdfdfsd    時(shí)間: 2019-1-6 18:29
很好  非常感謝
作者: 1397495212    時(shí)間: 2019-3-14 19:51
強(qiáng)的一批
作者: diedmen    時(shí)間: 2019-3-14 22:08
下載了看看,謝謝分享
作者: 小白202020    時(shí)間: 2019-5-19 19:41
下載看看謝謝

作者: SterneC    時(shí)間: 2019-5-30 22:20
感覺不錯(cuò)呀
作者: pengmen    時(shí)間: 2019-10-8 11:32
有沒有門磁
作者: pengmen    時(shí)間: 2019-10-8 11:33
如何加入生物識(shí)別模塊
作者: 莫超人    時(shí)間: 2019-10-27 18:40
對(duì)不起 是我看錯(cuò)了 里面有視頻的
作者: 51黑陳遠(yuǎn)灰    時(shí)間: 2019-11-26 08:39
感謝感謝,太優(yōu)秀了
作者: 51黑陳遠(yuǎn)灰    時(shí)間: 2019-11-26 10:10
學(xué)習(xí)觀察,發(fā)現(xiàn)好豐富啊




歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1