久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4055|回復(fù): 4
收起左側(cè)

根據(jù)別人的密碼鎖改成的紅外遙控密碼鎖單片機(jī)源碼

[復(fù)制鏈接]
ID:276654 發(fā)表于 2018-2-7 18:43 | 顯示全部樓層 |閱讀模式
可以使用鍵盤和紅外遙控器切換使用

0.png

單片機(jī)源程序如下:
  1. /***************************************************************
  2. 此程序是在電子密碼鎖的基礎(chǔ)上增加的紅外遙控功能
  3. 采用STC89C52單片機(jī)
  4. 外中斷口P3.2為紅外接收頭接口
  5. 紅外和鍵盤兩種模式轉(zhuǎn)換用P2.3控制,0為鍵盤模式,1為紅外輸入
  6. 遙控器使用常用的HT6122核心的
  7. 液晶用1602         引腳定義在I2C_drive.h中
  8. 存儲器采用的24C04 引腳定義在I2C_drive.h中
  9. P1口接4X4矩陣按鍵
  10. ****************************************************************/
  11. #include <reg51.h>
  12. #include <string.h>
  13. #include "I2C_drive.h"                        //包含I2C總線驅(qū)動程序軟件包
  14. #include "LCD_drive.h"                        //包含I2C總線驅(qū)動程序軟件包
  15. #define uchar unsigned char
  16. #define uint unsigned int
  17. uchar code_buf[6];                                //存儲器密碼緩沖區(qū)
  18. uchar incode_buf[6];                                //輸入密碼緩沖區(qū)
  19. uchar IR_buf[4]={0x00,0x00,0x00,0x00};//IR_buf[0]、IR_buf[1]為用戶碼低位、用戶碼高位接收緩沖區(qū)
  20.                                                 // IR_buf[2]、IR_buf[3]為鍵數(shù)據(jù)碼和鍵數(shù)據(jù)碼反碼接收緩沖區(qū)
  21. uchar  key;                               //鍵順序碼
  22. uchar  temp;                                        //暫存
  23. sbit  BEEP=P3^7;                                //蜂鳴器
  24. sbit  RELAY=P3^6;                                //繼電器
  25. sbit IRIN = P3^2;                         //遙控輸入腳   紅外
  26. sbit panduan=P2^3;         //紅外,鍵盤轉(zhuǎn)換引腳,接地為鍵盤模式,懸空為紅外模式

  27. uchar count_5ms,sec;                                //5ms和1s計數(shù)器
  28. bit flag_2s=0;                                        //2s標(biāo)志位,2s時間到,該位置1
  29. bit flag_comp=0;                                //比較對錯標(biāo)志位,比較正確,該標(biāo)志位置1
  30. bit biaozhi=0;
  31. bit hongwai=1;
  32. bit jianpan=1;
  33. /******************************************************************************/
  34. void Delay(int num){//延時函數(shù)
  35.         while(num--) ;
  36. }       



  37. void  beep(){//-揚(yáng)聲器--按鍵音
  38.         unsigned char a;//定義變量用于發(fā)聲的長度設(shè)置
  39.         for(a=100;a>0;a--){//聲音的長度
  40.                 BEEP = ~BEEP;
  41.                 Delay(50);//音調(diào)設(shè)置延時
  42.         }
  43.         BEEP = 1;//音樂結(jié)束后揚(yáng)聲器拉高關(guān)閉
  44. }               
  45. /********以下是0.14ms的x倍延時函數(shù)********/
  46. void delayy(uchar x)            //延時x*0.14ms
  47. {
  48. uchar i;
  49. while(x--)
  50.    for (i = 0; i<13; i++);
  51. }
  52. /********以下是矩陣按鍵掃描函數(shù)********/
  53. void  MatrixKey()
  54. {
  55.         P1=0xff;                               
  56.         P1=0xef;                                //置第1行P1.4為低電平,開始掃描第1行
  57.         temp=P1;                                //讀P1口按鍵
  58.         temp=temp & 0x0f;                        //判斷低4位是否有0,即判斷列線(P1.0~P1.3)是否有0
  59.         if (temp!=0x0f)                        //若temp不等于0x0f,說明有鍵按下
  60.         {
  61.                 Delay_ms(20);                //延時10ms去抖               
  62.                 temp=P1;                        //再讀取P1口按鍵
  63.                 temp=temp & 0x0f;                //再判斷列線(P1.0~P1.3)是否有0
  64.                 if (temp!=0x0f)                //若temp不等于0x0f,說明確實(shí)有鍵按下
  65.                 {
  66.                         temp=P1;                        //讀取P1口按鍵,開始判斷鍵值
  67.                         biaozhi=1;
  68.                         hongwai=1;
  69.          jianpan=0;
  70.                         switch(temp)
  71.                         {
  72.                                 case 0xee:key=1;break;
  73.                                 case 0xed:key=2;break;
  74.                                 case 0xeb:key=3;break;
  75.                                 case 0xe7:key=10;break;
  76.                         }
  77.                         temp=P1;                        //將讀取的鍵值送temp
  78.                         beep();                        //蜂鳴器響一聲
  79.                         temp=temp & 0x0f;                //取出列線值(P1.0~P1.3)
  80.                         while(temp!=0x0f)                //若temp不等于0x0f,說明按鍵還沒有釋放,繼續(xù)等待
  81.                         {
  82.                   biaozhi=0;
  83.             jianpan=1;
  84.                                 temp=P1;                //若按鍵釋放,再讀取P1口
  85.                                 temp=temp & 0x0f;// 判斷列線(P1.0~P1.3)是否有0
  86.                         }
  87.                 }
  88.         }
  89.         P1=0xff;
  90.         P1=0xdf;                                        //置第2行P1.5為低電平,開始掃描第2行
  91.         temp=P1;
  92.         temp=temp & 0x0f;
  93.         if (temp!=0x0f)
  94.         {
  95.                 Delay_ms(20);       
  96.                 temp=P1;
  97.                 temp=temp & 0x0f;
  98.                 if (temp!=0x0f)
  99.                 {
  100.                         temp=P1;
  101.                         biaozhi=1;
  102.          hongwai=1;
  103.          jianpan=0;
  104.                         switch(temp)
  105.                         {
  106.                                 case 0xde:key=4;break;
  107.                                 case 0xdd:key=5;break;
  108.                                 case 0xdb:key=6;break;
  109.                                 case 0xd7:key=11;break;
  110.                         }
  111.                         temp=P1;
  112.                         beep();
  113.                         temp=temp & 0x0f;
  114.                         while(temp!=0x0f)
  115.                         {
  116.                           biaozhi=0;
  117.            jianpan=1;
  118.                                 temp=P1;
  119.                                 temp=temp & 0x0f;
  120.                         }
  121.                 }
  122.         }
  123.         P1=0xff;
  124.         P1=0xbf;                                                //置第3行P1.6為低電平,開始掃描第3行
  125.         temp=P1;
  126.         temp=temp & 0x0f;
  127.         if (temp!=0x0f)
  128.         {
  129.                 Delay_ms(20);       
  130.                 temp=P1;
  131.                 temp=temp & 0x0f;
  132.                 if (temp!=0x0f)
  133.                 {
  134.                         temp=P1;
  135.                         biaozhi=1;
  136.          hongwai=1;
  137.          jianpan=0;
  138.                         switch(temp)
  139.                         {
  140.                                 case 0xbe:key=7;break;
  141.                                 case 0xbd:key=8;break;
  142.                                 case 0xbb:key=9;break;
  143.                                 case 0xb7:key=12;break;
  144.                         }
  145.                         temp=P1;
  146.                         beep();
  147.                         temp=temp & 0x0f;
  148.                         while(temp!=0x0f)
  149.                         {
  150.                           biaozhi=0;
  151.                           jianpan=1;
  152.                                 temp=P1;
  153.                                 temp=temp & 0x0f;
  154.                         }
  155.                 }
  156.         }
  157.         P1=0xff;
  158.         P1=0x7f;                                        //置第4行P1.7為低電平,開始掃描第4行
  159.         temp=P1;
  160.         temp=temp & 0x0f;
  161.         if (temp!=0x0f)
  162.         {
  163.                 Delay_ms(20);
  164.                 temp=P1;
  165.                 temp=temp & 0x0f;
  166.                 if (temp!=0x0f)
  167.                 {
  168.                         temp=P1;
  169.                         biaozhi=1;
  170.          hongwai=1;
  171.                         jianpan=0;
  172.                         switch(temp)
  173.                         {
  174.                                 case 0x7e:key=15;break;
  175.                                 case 0x7d:key=0;break;
  176.                                 case 0x7b:key=14;break;
  177.                                 case 0x77:key=13;break;
  178.                         }
  179.                         temp=P1;
  180.                         beep();
  181.                         temp=temp & 0x0f;
  182.                         while(temp!=0x0f)
  183.                         {
  184.                           biaozhi=0;
  185.                           jianpan=1;
  186.                                 temp=P1;
  187.                                 temp=temp & 0x0f;
  188.                         }
  189.                 }
  190.         }
  191. }
  192. /*********************紅外按鍵矩陣函數(shù)*************************************************************************************************/
  193. void hongwaijvzhen ()
  194. {

  195.   if(hongwai==0)
  196.    {
  197.        switch (IR_buf[2]){
  198.                                                  case 0x12: key = 0 ;break;        //POWER        //ON                       
  199.                                                  case 0x09: key = 1 ;break;        //MUTE //OFF
  200.                                                  case 0x1d: key = 2 ;break;        //0-9鍵控制
  201.                                                  case 0x1F: key = 3 ;break;        //

  202.                                                  case 0x0d: key = 4 ;break;                                       
  203.                                                  case 0x19: key = 5 ;break;
  204.                                                  case 0x1b: key = 6 ;break;
  205.                         case 0x11: key = 7 ;break;
  206.                                
  207.                                                  case 0x15: key = 8 ;break;       
  208.                                                  case 0x17: key = 9 ;break;       
  209.                                                  case 0x14: key = 10;break;        //A
  210.                                                  case 0x57: key = 11;break; //B
  211.                                        
  212.                                              case 0x53: key = 12;break;
  213.                                //                case 0x41: key = 13;break; //D
  214.                         case 0x46: key = 14;break; //#
  215.                                               case 0x52: key = 15;break;
  216.                        }
  217.                                          biaozhi=0;
  218.                                          hongwai=1;
  219.      
  220.      }

  221. }
  222. /********以下是開機(jī)畫面信息********/
  223. uchar code jianpan1_data[] = {"    << KEY >>   "};           //定義第1行顯示的字符                              
  224. uchar code jianpan2_data[] = {"   PATTERN(1)   "};                 //定義第2行顯示的字符  

  225. uchar code hongwai1_data[] = {"  << REMOTE >>  "};           //定義第1行顯示的字符                              
  226. uchar code hongwai2_data[] = {"   PATTERN(2)   "};                 //定義第2行顯示的字符  

  227.   
  228. /***************************************/
  229. uchar code line1_data[] = {"   KEY  LOCK    "};           //定義第1行顯示的字符                              
  230. uchar code line2_data[] = {" MADE IN CHINA  "};                 //定義第2行顯示的字符      
  231. /********以下是輸入密碼畫面信息********/
  232. uchar code in_line1[] = {"  PLEASE INPUT  "};           //定義第1行顯示的字符                              
  233. uchar code in_line2[] = {"PASSWORD:------ "};                 //定義第2行顯示的字符      
  234. /********以下是密碼輸入正確信息********/
  235. uchar code inok_line1[] = {"INPUT PASSWORD "};           //定義第1行顯示的字符                              
  236. uchar code inok_line2[] = {"   INOPUT OK    "};         //定義第2行顯示的字符  
  237. /********以下是密碼輸入錯誤信息********/
  238. uchar code inerr_line1[] = {"INPUT PASSWORD "};           //定義第1行顯示的字符                              
  239. uchar code inerr_line2[] = {"   INPUT ERR    "};                 //定義第2行顯示的字符      
  240. /********以下是密碼設(shè)置畫面信息********/
  241. uchar code modify_line1[] = {"MODIFY PASSWORD "};           //定義第1行顯示的字符                              
  242. uchar code modify_line2[] = {"PASSWORD:------ "};                 //定義第2行顯示的字符      
  243. /********以下是密碼設(shè)置正確信息********/
  244. uchar code setok_line1[] = {"MODIFY PASSWORD "};           //定義第1行顯示的字符                              
  245. uchar code setok_line2[] = {"   MODIFY OK     "};                 //定義第2行顯示的字符      
  246. /********以下是開機(jī)畫面顯示函數(shù)********/
  247. void StartDisp()
  248. {
  249.         uchar i;
  250.         lcd_clr();                                                  //調(diào)清屏函數(shù)
  251.         lcd_wcmd(0x00|0x80);                           //設(shè)置顯示位置為第1行第0列
  252.           i = 0;                                                               
  253.           while(line1_data[i] != '\0')                      //若沒有到達(dá)第1行字符串尾部
  254.           {                             
  255.                   lcd_wdat(line1_data[i]);               //顯示第1行字符   
  256.                   i++;                               //指向下一字符                                         
  257.           }                                                                     
  258.           lcd_wcmd(0x40|0x80);                  //設(shè)置顯示位置為第2行第0列            
  259.           i = 0;                                                               
  260.           while(line2_data[i] != '\0')                  //若沒有到達(dá)第2行字符串尾部
  261.           {                                                                     
  262.                   lcd_wdat(line2_data[i]);               //顯示第2行字符   
  263.                    i++;                                       //指向下一字符
  264.         }
  265. }
  266. /********以下是密碼輸入畫面顯示函數(shù)********/
  267. void CodeInDisp()
  268. {
  269.         uchar i;
  270.         lcd_clr();                                          //調(diào)清屏函數(shù)
  271.         lcd_wcmd(0x00|0x80);                   //設(shè)置顯示位置為第1行第0列
  272.           i = 0;                                                               
  273.           while(in_line1[i] != '\0')              //若沒有到達(dá)第1行字符串尾部
  274.           {                             
  275.                   lcd_wdat(in_line1[i]);      //顯示第1行字符   
  276.                   i++;                     //指向下一字符                                         
  277.           }                                                                     
  278.           lcd_wcmd(0x40|0x80);          //設(shè)置顯示位置為第2行第0列            
  279.           i = 0;                                                               
  280.           while(in_line2[i] != '\0')                  //若沒有到達(dá)第2行字符串尾部
  281.           {                                                                     
  282.                   lcd_wdat(in_line2[i]);     //顯示第2行字符   
  283.                    i++;                               //指向下一字符
  284.         }
  285. }
  286. /********以下是密碼輸入錯誤顯示函數(shù)********/
  287. void CodeInErr()
  288. {
  289.         uchar i;
  290.         lcd_clr();                                                  //調(diào)清屏函數(shù)
  291.         lcd_wcmd(0x00|0x80);                           //設(shè)置顯示位置為第1行第0列
  292.           i = 0;                                                               
  293.           while(inerr_line1[i] != '\0')                      //若沒有到達(dá)第1行字符串尾部
  294.           {                             
  295.                   lcd_wdat(inerr_line1[i]);       //顯示第1行字符   
  296.                   i++;                               //指向下一字符                                         
  297.           }                                                                     
  298.           lcd_wcmd(0x40|0x80);                  //設(shè)置顯示位置為第2行第0列            
  299.           i = 0;                                                               
  300.           while(inerr_line2[i] != '\0')                  //若沒有到達(dá)第2行字符串尾部
  301.           {                                                                     
  302.                   lcd_wdat(inerr_line2[i]);               //顯示第2行字符   
  303.                    i++;                                       //指向下一字符
  304.         }
  305. }
  306. /********以下是密碼輸入正確顯示函數(shù)********/
  307. void CodeInOk()
  308. {
  309.         uchar i;
  310.         lcd_clr();                                                  //調(diào)清屏函數(shù)
  311.         lcd_wcmd(0x00|0x80);                           //設(shè)置顯示位置為第1行第0列
  312.           i = 0;                                                               
  313.           while(inok_line1[i] != '\0')                      //若沒有到達(dá)第1行字符串尾部
  314.           {                             
  315.                   lcd_wdat(inok_line1[i]);       //顯示第1行字符   
  316.                   i++;                               //指向下一字符                                         
  317.           }                                                                     
  318.           lcd_wcmd(0x40|0x80);                  //設(shè)置顯示位置為第2行第0列            
  319.           i = 0;                                                               
  320.           while(inok_line2[i] != '\0')                  //若沒有到達(dá)第2行字符串尾部
  321.           {                                                                     
  322.                   lcd_wdat(inok_line2[i]);       //顯示第2行字符   
  323.                    i++;                                       //指向下一字符
  324.         }
  325. }
  326. /********以下是密碼設(shè)置畫面顯示函數(shù)********/
  327. void CodeSetDisp()
  328. {
  329.         uchar i;
  330.         lcd_clr();                                                  //調(diào)清屏函數(shù)
  331.         lcd_wcmd(0x00|0x80);                           //設(shè)置顯示位置為第1行第0列
  332.           i = 0;                                                               
  333.           while(modify_line1[i] != '\0')              //若沒有到達(dá)第1行字符串尾部
  334.           {                             
  335.                   lcd_wdat(modify_line1[i]);       //顯示第1行字符   
  336.                   i++;                               //指向下一字符                                         
  337.           }                                                                     
  338.           lcd_wcmd(0x40|0x80);                  //設(shè)置顯示位置為第2行第0列            
  339.           i = 0;                                                               
  340.           while(modify_line2[i] != '\0')                  //若沒有到達(dá)第2行字符串尾部
  341.           {                                                                     
  342.                   lcd_wdat(modify_line2[i]);       //顯示第2行字符   
  343.                    i++;                                       //指向下一字符
  344.         }
  345. }
  346. /********以下是密碼設(shè)置正確顯示函數(shù)********/
  347. void CodeSetOk()
  348. {
  349.         uchar i;
  350.         lcd_clr();                                                  //調(diào)清屏函數(shù)
  351.         lcd_wcmd(0x00|0x80);                           //設(shè)置顯示位置為第1行第0列
  352.           i = 0;                                                               
  353.           while(setok_line1[i] != '\0')                      //若沒有到達(dá)第1行字符串尾部
  354.           {                             
  355.                   lcd_wdat(setok_line1[i]);       //顯示第1行字符   
  356.                   i++;                               //指向下一字符                                         
  357.           }                                                                     
  358.           lcd_wcmd(0x40|0x80);                  //設(shè)置顯示位置為第2行第0列            
  359.           i = 0;                                                               
  360.           while(setok_line2[i] != '\0')                  //若沒有到達(dá)第2行字符串尾部
  361.           {                                                                     
  362.                   lcd_wdat(setok_line2[i]);       //顯示第2行字符   
  363.                    i++;                                       //指向下一字符
  364.         }
  365. }
  366. /********以下是密碼輸入函數(shù)********/
  367. void PassIn()
  368. {
  369.         static        uchar lcd_x=0;                        //顯示指針,注意是靜態(tài)局部變量
  370.         static         uchar count=0;                        //密碼計數(shù)器        ,注意是靜態(tài)局部變量
  371.         static uchar code_n=0;                        //密碼次數(shù)
  372. PASSWORD:        lcd_clr();                          //調(diào)清屏函數(shù)
  373.         CodeInDisp();//密碼輸入畫面函數(shù)
  374.         do{  
  375. /**********修改1***********/
  376.                 P1=0xf0;
  377.                 if(P1!=0xf0)                                //若有按鍵按下
  378.                 {
  379.                         MatrixKey();                        //調(diào)矩陣按鍵掃描函數(shù)
  380.                         P1=0xf0;               
  381.                         while(P1!=0xf0);//等待按鍵松開
  382. /***************************/
  383.                         if((key>=0)&&(key<=9))        //若按下是的0~9鍵(即密碼只能是數(shù)字,字母鍵A~F無效)
  384.                         {
  385.                                 incode_buf[count]=key;        //將鍵值存入數(shù)組
  386.                                 lcd_wcmd((0x49+lcd_x)|0x80);   //設(shè)置顯示位置為第2行第9+lcd_x列
  387.                                 lcd_wdat(0x2a);                           //顯示為"*",0x2a是"*"的LCD顯示碼
  388.                                         count++;                                //輸入下一位密碼
  389.                                         lcd_x++;                                //指向LCD的下一位置
  390.                                 }
  391.                         }
  392.                 }while(count<6);        //密碼設(shè)置為6位
  393.                 if(count>=6){count=0;lcd_x=0;}       
  394.                 if(memcmp(incode_buf,code_buf,6)==0)        //若兩個數(shù)組相等,則返回值為0,注意這里不能用strcmp函數(shù)進(jìn)行比較
  395.                 {
  396.                         CodeInOk();                                //若輸入的密碼正確,則顯示輸入正確的信息
  397.                         beep();beep();beep();                //輸入正確后,蜂鳴器響三聲
  398.                         flag_comp=1;                        //密碼比較標(biāo)志位置1
  399.                         code_n=0;                                //密碼計數(shù)器清0
  400.                         RELAY=0;                                //打開繼電器,開鎖
  401.                 }
  402.                 else if(memcmp(incode_buf,code_buf,6)!=0)//若輸入的密碼不正確
  403.                 {
  404.                         code_n++;                                //密碼計數(shù)器加1       
  405.                         if(code_n>=3)                        //有三次輸入的機(jī)會
  406.                         {
  407.                                 CodeInErr();                        //若三次輸入均錯誤,顯示密碼錯誤信息
  408.                                 flag_comp=0;                //密碼比較標(biāo)志位清0
  409.                                 code_n=0;                        //密碼計數(shù)器清0
  410.                         }
  411.                         else goto PASSWORD;                        //若還有機(jī)會輸入密碼,則跳轉(zhuǎn)到標(biāo)號PASSWORD處繼續(xù)輸入
  412.                 }       
  413. }
  414. /********以下是紅外線密碼輸入函數(shù)**********************************************************************************/

  415. void PassInhongwai()
  416. {
  417.         static        uchar lcd_x=0;                        //顯示指針,注意是靜態(tài)局部變量
  418.         static         uchar count=0;                        //密碼計數(shù)器        ,注意是靜態(tài)局部變量
  419.         static uchar code_n=0;                        //密碼次數(shù)
  420. PASSWORD:        lcd_clr();                          //調(diào)清屏函數(shù)
  421.         CodeInDisp();//密碼輸入畫面函數(shù)
  422.         do{  
  423. /**********修改1***********/
  424.        
  425.                 if(hongwai==0)                                //若有按鍵按下
  426.                 {
  427.                   hongwaijvzhen();                        //調(diào)矩陣按鍵掃描函數(shù)
  428.                                
  429.                         while(!hongwai);//等待按鍵松開
  430. /***************************/
  431.                         if((key>=0)&&(key<=9))        //若按下是的0~9鍵(即密碼只能是數(shù)字,字母鍵A~F無效)
  432.                         {
  433.                                 incode_buf[count]=key;        //將鍵值存入數(shù)組
  434.                                 lcd_wcmd((0x49+lcd_x)|0x80);   //設(shè)置顯示位置為第2行第9+lcd_x列
  435.                                 lcd_wdat(0x2a);                           //顯示為"*",0x2a是"*"的LCD顯示碼
  436.                                         count++;                                //輸入下一位密碼
  437.                                         lcd_x++;                                //指向LCD的下一位置
  438.                beep();
  439.                                 }
  440.                         }
  441.                 }while(count<6);        //密碼設(shè)置為6位
  442.                 if(count>=6){count=0;lcd_x=0;}       
  443.                 if(memcmp(incode_buf,code_buf,6)==0)        //若兩個數(shù)組相等,則返回值為0,注意這里不能用strcmp函數(shù)進(jìn)行比較
  444.                 {
  445.                         CodeInOk();                                //若輸入的密碼正確,則顯示輸入正確的信息
  446.                         beep();beep();beep();                //輸入正確后,蜂鳴器響三聲
  447.                         flag_comp=1;                        //密碼比較標(biāo)志位置1
  448.                         code_n=0;                                //密碼計數(shù)器清0
  449.                         RELAY=0;                                //打開繼電器,開鎖
  450.                 }
  451.                 else if(memcmp(incode_buf,code_buf,6)!=0)//若輸入的密碼不正確
  452.                 {
  453.                         code_n++;                                //密碼計數(shù)器加1       
  454.                         if(code_n>=3)                        //有三次輸入的機(jī)會
  455.                         {
  456.                                 CodeInErr();                        //若三次輸入均錯誤,顯示密碼錯誤信息
  457.                                 flag_comp=0;                //密碼比較標(biāo)志位清0
  458.                                 code_n=0;                        //密碼計數(shù)器清0
  459.                         }
  460.                         else goto PASSWORD;                        //若還有機(jī)會輸入密碼,則跳轉(zhuǎn)到標(biāo)號PASSWORD處繼續(xù)輸入
  461.                 }       
  462. }

  463. /********以下是密碼設(shè)置函數(shù)*******************************************************************************************************/
  464. void PassSet()
  465. {
  466.         static        uchar  lcd_x=0;                        //顯示指針,注意是靜態(tài)局部變量
  467.         static         uchar count=0;                        //密碼計數(shù)器        ,注意是靜態(tài)局部變量
  468.         lcd_clr();                                          //調(diào)清屏函數(shù)
  469.         CodeSetDisp();                                //密碼設(shè)置畫面函數(shù)
  470.         do{
  471. /********修改2**************/
  472.                 P1=0xf0;
  473.                 if(P1!=0xf0)                                //若有按鍵按下
  474.                 {
  475.                         MatrixKey();                        //調(diào)矩陣按鍵掃描函數(shù)
  476.                         P1=0xf0;               
  477.                         while(P1!=0xf0);//等待按鍵松開
  478. /**********************/
  479.                         if((key>=0)&&(key<=9))        //若按下是的0~9鍵(即密碼只能是數(shù)字,字母鍵A~F無效)
  480.                         {
  481.                                 code_buf[count]=key;                //將鍵值存入數(shù)組code_buf[]中
  482.                                 lcd_wcmd((0x49+lcd_x)|0x80);   //設(shè)置顯示位置為第2行第9+lcd_x列
  483.                                 lcd_wdat(code_buf[count]+0x30);        //將輸入的密碼通過LCD顯示出來       
  484.                                 count++;                                //輸入下一位密碼
  485.                                 lcd_x++;                                //指向LCD的下一位置
  486.               
  487.                         }
  488.                 }
  489.         }while(count<6);                //密碼設(shè)置為6位
  490.         if(count>=6){count=0;lcd_x=0;}
  491.         beep();beep();beep();        //輸入完畢后,蜂鳴器響三聲
  492.         write_nbyte(0xa0,0x00,code_buf,6);        //將數(shù)組code_buf[]中的6位密碼寫入24cxx從00開始的單元中
  493.         lcd_clr();                                          //調(diào)清屏函數(shù)
  494.         CodeSetOk();                                        //密碼設(shè)置正確畫面函數(shù)
  495. }
  496. /********************************************紅外密碼設(shè)置函數(shù)****************************************************************/
  497. void PassSethongwai()

  498. {
  499.         static        uchar  lcd_x=0;                        //顯示指針,注意是靜態(tài)局部變量
  500.         static         uchar count=0;                        //密碼計數(shù)器        ,注意是靜態(tài)局部變量
  501.         lcd_clr();                                          //調(diào)清屏函數(shù)
  502.         CodeSetDisp();                                //密碼設(shè)置畫面函數(shù)
  503.         do{
  504. /********修改2**************/
  505.        
  506.                 if(hongwai==0)                                //若有按鍵按下
  507.                 {
  508.                   hongwaijvzhen();                        //調(diào)矩陣按鍵掃描函數(shù)
  509.                                
  510.                         while(!hongwai);//等待按鍵松開
  511. /**********************/
  512.                         if((key>=0)&&(key<=9))        //若按下是的0~9鍵(即密碼只能是數(shù)字,字母鍵A~F無效)
  513.                         {
  514.                                 code_buf[count]=key;                //將鍵值存入數(shù)組code_buf[]中
  515.                                 lcd_wcmd((0x49+lcd_x)|0x80);   //設(shè)置顯示位置為第2行第9+lcd_x列
  516.                                 lcd_wdat(code_buf[count]+0x30);        //將輸入的密碼通過LCD顯示出來       
  517.                                 count++;                                //輸入下一位密碼
  518.                                 lcd_x++;                                //指向LCD的下一位置
  519.                                 beep();
  520.                         }
  521.                 }
  522.         }while(count<6);                //密碼設(shè)置為6位
  523.         if(count>=6){count=0;lcd_x=0;}
  524.         beep();beep();beep();        //輸入完畢后,蜂鳴器響三聲
  525.         write_nbyte(0xa0,0x00,code_buf,6);        //將數(shù)組code_buf[]中的6位密碼寫入24cxx從00開始的單元中
  526.         lcd_clr();                                          //調(diào)清屏函數(shù)
  527.         CodeSetOk();                                        //密碼設(shè)置正確畫面函數(shù)
  528. }
  529. /****************開機(jī)初始模式顯示函數(shù)******************************************/
  530. void kaijimoshi()
  531.     {

  532.     if(panduan==0) //如果P2.3腳接地顯示《KEY》
  533.            {           //                 PATTERN(1)

  534.         uchar i;
  535.         lcd_clr();                                                  //調(diào)清屏函數(shù)
  536.         lcd_wcmd(0x00|0x80);                           //設(shè)置顯示位置為第1行第0列
  537.           i = 0;                                                               
  538.           while(jianpan1_data[i] != '\0')                      //若沒有到達(dá)第1行字符串尾部
  539.           {                             
  540.                   lcd_wdat(jianpan1_data[i]);               //顯示第1行字符   
  541.                   i++;                               //指向下一字符                                         
  542.           }                                                                     
  543.           lcd_wcmd(0x40|0x80);                  //設(shè)置顯示位置為第2行第0列            
  544.           i = 0;                                                               
  545.           while(jianpan2_data[i] != '\0')                  //若沒有到達(dá)第2行字符串尾部
  546.           {                                                                     
  547.                   lcd_wdat(jianpan2_data[i]);               //顯示第2行字符   
  548.                    i++;                                       //指向下一字符
  549.         }
  550.    Delay_ms(3000);     //延時3秒
  551.    lcd_clr();
  552.       
  553.                 }

  554.                
  555.           if(panduan==1)   //如果P2.3腳懸空顯示《REMOTE》
  556.             {             //                  PATTERN(2)
  557.         uchar i;
  558.         lcd_clr();                                                  //調(diào)清屏函數(shù)
  559.         lcd_wcmd(0x00|0x80);                           //設(shè)置顯示位置為第1行第0列
  560.           i = 0;                                                               
  561.           while(hongwai1_data[i] != '\0')                      //若沒有到達(dá)第1行字符串尾部
  562.           {                             
  563.                   lcd_wdat(hongwai1_data[i]);               //顯示第1行字符   
  564.                   i++;                               //指向下一字符                                         
  565.           }                                                                     
  566.           lcd_wcmd(0x40|0x80);                  //設(shè)置顯示位置為第2行第0列            
  567.           i = 0;                                                               
  568.           while(hongwai2_data[i] != '\0')                  //若沒有到達(dá)第2行字符串尾部
  569.           {                                                                     
  570.                   lcd_wdat(hongwai2_data[i]);               //顯示第2行字符   
  571.                    i++;                                       //指向下一字符
  572.         }
  573.       Delay_ms(3000);      //延時3秒
  574.        lcd_clr();

  575.                
  576.                 }

  577. }
  578. /********以下是主函數(shù)********/
  579. void main()
  580. {
  581.         EA=1;EX0=1;                 //允許總中斷中斷,使能 INT0 外部中斷
  582.   IT0 = 1;                               //觸發(fā)方式為脈沖負(fù)邊沿觸發(fā)
  583.   IRIN=1;                            //遙控輸入腳置1

  584.         TMOD=0x01;                         //定時器T0方式1
  585.   TH0=0xee; TL0=0x00;              //5ms定時初值
  586.    ET0=1;                        //開總中斷,開定時器T0中斷
  587.         Delay_ms(10);                                                            
  588.         lcd_init();                                  //調(diào)LCD初始化函數(shù)
  589.   I2C_init();                                //調(diào)I2C總線初始化函數(shù)(在I2C總線驅(qū)動程序軟件包中)

  590.    kaijimoshi();
  591. START:        RELAY=1;                        //繼電器關(guān)斷
  592.         lcd_clr();
  593.         StartDisp();                                //開機(jī)畫面顯示函數(shù)
  594.         read_nbyte (0xa0,0x00,code_buf,6);//從24Cxx的0x00開始的單元中讀出6個密碼存入code_buf[]數(shù)組中
  595.         P1=0xf0;

  596.         while((P1==0xf0)&&(hongwai==0));                        //如果紅外和鍵盤不是同時按下,就進(jìn)入到下一步,否則等待
  597. MatrixKey();

  598. /*******************************執(zhí)行紅外模式密碼鎖方式****************************************************************************/
  599. if(panduan==1)
  600.   {
  601.      SCAN:        hongwaijvzhen ();                        //調(diào)矩陣按鍵掃描函數(shù)
  602.         if(key!=0x0a)goto SCAN;                //若按下的不是A鍵,跳轉(zhuǎn)到標(biāo)號SCAN處繼續(xù)掃描
  603.         TR0=1;                                //啟動定時器T0
  604.         Delay_ms(500);                        //延時500ms               
  605.         beep();                                //蜂鳴器響一聲
  606.         if(flag_2s==1)flag_2s=0;                //若2s到,則將 2s標(biāo)志位清0
  607.         else goto SCAN;                        //若2s未到,則跳轉(zhuǎn)到標(biāo)號SCAN處繼續(xù)掃描       
  608.          PassInhongwai();                                          //調(diào)紅外密碼輸入函數(shù)
  609.         while(1)
  610.         {
  611.                 if(flag_comp==1)                //若輸入的密碼正確
  612.                 {       
  613.          hongwaijvzhen ();
  614.                         if(key==0x0b)        //在密碼正確的情況下若按下了B鍵
  615.                         {                       
  616.           PassSethongwai();          //        調(diào)紅外密碼設(shè)置函數(shù)               
  617.             hongwaijvzhen ();
  618.                                 if(key==0x0e)goto START;//若按下了E鍵,則跳轉(zhuǎn)到標(biāo)志START處重新開始
  619.                         }
  620.                         if(key==0x0e)goto START;        //若按下了E鍵,則跳轉(zhuǎn)到標(biāo)志START處重新開始
  621.                 }
  622.                 if(flag_comp==0)                                //若輸入的密碼不正確
  623.                 {                       
  624.         hongwaijvzhen ();
  625.                         if(key==0x0e)goto START;//若按下的是E鍵,跳轉(zhuǎn)到標(biāo)號START處重新開始
  626.                 }
  627.         }
  628. }
  629. /************************執(zhí)行鍵盤輸入密碼鎖模式**********************************************************************************************/
  630. if(panduan==0)
  631.   {

  632.    DSCAN:        MatrixKey();                        //調(diào)矩陣按鍵掃描函數(shù)
  633.         if(key!=0x0a)goto DSCAN;                //若按下的不是A鍵,跳轉(zhuǎn)到標(biāo)號SCAN處繼續(xù)掃描
  634.         TR0=1;                                //啟動定時器T0
  635.         Delay_ms(500);                        //延時500ms               
  636.         beep();                                //蜂鳴器響一聲
  637.         if(flag_2s==1)flag_2s=0;                //若2s到,則將 2s標(biāo)志位清0
  638.         else goto  DSCAN;                        //若2s未到,則跳轉(zhuǎn)到標(biāo)號SCAN處繼續(xù)掃描
  639.         PassIn();                                //調(diào)密碼輸入函數(shù)
  640.         /******************************************/
  641.         while(1)
  642.         {
  643.                 if(flag_comp==1)                //若輸入的密碼正確
  644.                 {
  645.                         MatrixKey();                //掃描按鍵
  646.                         if(key==0x0b)        //在密碼正確的情況下若按下了B鍵
  647.                         {
  648.                                 PassSet();        //若按下的是B鍵,調(diào)密碼設(shè)置函數(shù)
  649.                                 MatrixKey();        //掃描按鍵
  650.                                 if(key==0x0e)goto START;//若按下了E鍵,則跳轉(zhuǎn)到標(biāo)志START處重新開始
  651.                         }
  652.                         if(key==0x0e)goto START;        //若按下了E鍵,則跳轉(zhuǎn)到標(biāo)志START處重新開始
  653.                 }
  654.                 if(flag_comp==0)                                //若輸入的密碼不正確
  655.                 {
  656.                         MatrixKey();                        //掃描按鍵
  657.                         if(key==0x0e)goto START;//若按下的是E鍵,跳轉(zhuǎn)到標(biāo)號START處重新開始
  658.                 }
  659.         }

  660. }
  661. }
  662. /********以下是定時器T0中斷函數(shù)********/
  663. void timer0() interrupt 1
  664. {
  665.         TH0=0xee;TL0=0x00;                //重裝5ms定時初值
  666.   count_5ms++;                        //5ms 計數(shù)值加1
  667.   if(count_5ms==200)                //若count_5ms為200,說明1s到(200×0ms=1000ms)
  668.   {
  669.           count_5ms=0;                // count_5ms清0
  670.                 sec++;                           //秒計數(shù)器加1
  671.         }
  672.   if(sec==2)
  673.         {
  674.                 flag_2s=1;                        //若2s到,將2s標(biāo)志位置1
  675.                 TR0=0;                        //關(guān)斷定時器T0
  676.         }
  677. }
  678. /********以下是外中斷0函數(shù)********/
  679. void IR_decode() interrupt 0
  680. {
  681.         uchar j,k,count=0;
  682.   EX0 = 0;                           //暫時關(guān)閉外中斷0中斷請求



  683.         delayy(20);                        //延時20*0.14=2.8ms
  684.         if (IRIN==1)                         //等待 IRIN低電平出現(xiàn)
  685.   {
  686.                 EX0 =1;                //開外中斷0
  687.                    return;                //中斷返回
  688.         }                                                           
  689.   while (!IRIN) delayy(1);   //等待IRIN變?yōu)楦唠娖剑^9ms的低電平引導(dǎo)碼
  690.         for (j=0;j<4;j++)         //收集四組數(shù)據(jù),即用戶碼低位、用戶碼高位、鍵值數(shù)據(jù)碼和鍵值數(shù)碼反碼
  691.         {
  692.           for (k=0;k<8;k++)                        //每組數(shù)據(jù)有8位
  693.           {
  694.                    while (IRIN)            //等待IRIN變?yōu)榈碗娖剑^4.5ms的高電平引導(dǎo)碼信號。
  695.                      delayy(1);
  696.                         while (!IRIN)          //等待IRIN變?yōu)楦唠娖?br />
  697.                      delayy(1);
  698.                      while (IRIN)           //對IRIN高電平時間進(jìn)行計數(shù)
  699.                       {
  700.                             delayy(1);                //延時0.14ms
  701.                             count++;          //對0.14ms延時時間進(jìn)行計數(shù)
  702.                             if (count>=30)       
  703.                                  {
  704.                                         EX0=1;                //開外中斷0
  705.                                          return;        //0.14ms計數(shù)過長則返回
  706.                                 }                  
  707.                       }   
  708.                      IR_buf[j]=IR_buf[j] >> 1;                  //若計數(shù)小于6,數(shù)據(jù)最高位補(bǔ)"0",說明收到的是"0"
  709.                      if (count>=6) {IR_buf[j] = IR_buf[j] | 0x80;}  //若計數(shù)大于等于6,數(shù)據(jù)最高位補(bǔ)"1",說明收到的是"1"
  710.                      count=0;                                        //計數(shù)器清0       
  711.           }
  712. }
  713.         if (IR_buf[2]!=~IR_buf[3])                //將鍵數(shù)據(jù)反碼取反后與鍵數(shù)據(jù)碼碼比較,若不等,表示接收數(shù)據(jù)錯誤,放棄
  714.         {
  715.        
  716.      EX0 = 1;                         //開外中斷0
  717.         return;
  718. }

  719.   
  720. /******************************************************************/
  721.   hongwai=0;
  722. ……………………

  723. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
1602_lock.rar (7.2 KB, 下載次數(shù): 102)


回復(fù)

使用道具 舉報

ID:244988 發(fā)表于 2019-3-12 11:50 | 顯示全部樓層
我是直接復(fù)制程序過來的,一編譯就這樣了。。。求教

錯誤提示截圖

錯誤提示截圖
回復(fù)

使用道具 舉報

ID:244988 發(fā)表于 2019-3-12 14:04 | 顯示全部樓層
大佬,能不能教我解決這個問題呀,超出了限制我要改哪里呀??是改工程還是改程序?程序我就真的不會了,我現(xiàn)在是用的AT89C52來創(chuàng)建的工程。

微信圖片_20190312114700.png
回復(fù)

使用道具 舉報

ID:362792 發(fā)表于 2019-11-10 12:18 來自手機(jī) | 顯示全部樓層
這個程序的密碼存入了202可是沒找到密碼到底是多少
回復(fù)

使用道具 舉報

ID:842473 發(fā)表于 2020-11-18 09:27 來自手機(jī) | 顯示全部樓層
能發(fā)一下proteus的仿真圖嘛
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 我想看一级黄色毛片 | 日日夜夜狠狠操 | 日韩精品一区二区三区中文在线 | 欧美性猛片aaaaaaa做受 | 观看av| 五月激情六月婷婷 | 久久久激情 | 亚洲毛片 | 69亚洲精品 | 国产一区二区 | 日韩欧美二区 | 亚洲高清视频一区二区 | 91精品91久久久 | 久久成人免费 | av在线播放网址 | 国产成人网 | 综合精品 | 这里有精品 | 久久国产精品免费一区二区三区 | 91精品国产91久久久久久吃药 | 日韩精品色网 | 刘亦菲国产毛片bd | 国产探花在线精品一区二区 | av日韩在线播放 | 久久精品国产免费高清 | 国产精品二区三区在线观看 | 99久久精品一区二区毛片吞精 | 草久在线视频 | 亚洲成人免费观看 | www狠狠爱com | 成人精品视频在线 | 中文字幕高清av | 夜久久 | 女同久久另类99精品国产 | 日韩在线观看 | 成人一区二 | 日本视频一区二区三区 | 亚洲高清一区二区三区 | 久久久久久亚洲欧洲 | 国产无套一区二区三区久久 | 亚洲午夜av |