找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3189|回复: 3
收起左侧

红外电子锁

[复制链接]
ID:85234 发表于 2015-7-21 18:14 | 显示全部楼层 |阅读模式
自己做的,实测可用,用的是carMP3这种的21键的遥控器

红外电子锁(不复位,改密码).zip

42.45 KB, 下载次数: 37, 下载积分: 黑币 -5

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的积分奖励!

查看全部评分

回复

使用道具 举报

ID:1 发表于 2015-7-22 00:14 | 显示全部楼层
  1. #include "reg51.h"
  2. #include "intrins.h"
  3. #include"absacc.h"
  4. #include"math.h"
  5. #include"string.h"
  6. typedef unsigned char BYTE;
  7. typedef unsigned int   WORD;
  8. BYTE hdata=0x10;
  9. BYTE ldata=0x10;
  10. BYTE Ir_Buf[4]; //用于保存解码结果
  11. BYTE temp;
  12. BYTE key=0;
  13. BYTE num;
  14. BYTE dis_buf;
  15. BYTE Userpassword[10]="123";
  16. BYTE inputpassword[10]="";
  17. BYTE RXDDATA[]={0x00,0x00,0x00,0x00};
  18. BYTE code RecvData[]={0x16,0x0C,0x18,0x5E,0x08,0x1C,0x5A,0x42,0x52,0x4A};
  19. BYTE IRCOM[7];
  20. int a;a=0;
  21. int j;j=4;
  22. int w=0;
  23. int o=4;
  24. int c=0;
  25. sbit Ir_Pin=P3^3;
  26. sbit led2=P2^2;
  27. sbit led1=P2^1;
  28. sbit beep=P2^0;
  29. /*  液晶1602口地址*/
  30. #define wr_com XBYTE[0xC000] //写命令
  31. #define wr_data XBYTE[0xC100] //写数据
  32. #define rd_com XBYTE[0xC200] //读命令
  33. #define rd_data XBYTE[0xC300] //读数据
  34. void Delay(WORD n);
  35. void Delay2(WORD n);
  36. void ShowResult(BYTE ch);
  37. void lcd_init(void); // lcd初始化
  38. void write_cmd(BYTE cmd); // lcd写命令
  39. //void write_string(unsigned char *s); // 写字符串
  40. void write_data(BYTE dat) ; // 写数据
  41. void set_display_place(BYTE line,column);
  42. void write_string_lcd(BYTE line,column,unsigned char *string);
  43. /********************************************************************
  44. Function name: write_cmd
  45. Descriptions:  向lcd输入指令
  46. ********************************************************************/
  47. void write_cmd(BYTE cmd)
  48. {
  49. BYTE dl;
  50. do {
  51. dl=rd_com;
  52. } while((dl&0x80)!=0); //判忙
  53. wr_com= cmd;
  54. Delay(1);
  55. }
  56. /*******************************************************************
  57. Function name: write_data
  58. Descriptions:  写入数据
  59. *******************************************************************/
  60. void write_data(BYTE dat)  
  61. {
  62. BYTE dl;
  63. do {
  64. dl=rd_com;
  65. } while((dl&0x80)!=0); //判忙
  66. wr_data= dat;
  67. Delay(1);
  68. }
  69. /********************************************************************
  70. Function name: write_string
  71. Descriptions:  写入字符串
  72. ********************************************************************/
  73. void write_string(BYTE *s)
  74. {
  75. while(*s != '\0') //'\0'为字符串结束标志
  76. {
  77. write_data(*s);
  78. s++;
  79. }
  80. }
  81. /***************************************************************
  82. Function name: set_display_place
  83. Descriptions:  设置字符的显示位置
  84. **************************************************************/
  85. void set_display_place(BYTE line,column)
  86. {
  87. BYTE address;
  88. if(line == 1)
  89. {
  90. address = 0x80 + column;
  91. }
  92. else if(line == 2)
  93. {
  94. address = 0xc0 + column;
  95. }
  96. write_cmd(address);
  97. }
  98. /*****************************************************************
  99. Function name:  将字符串写到指定的位置
  100. Descriptions:  将字符串显示在lcd的特定位置
  101. *****************************************************************/
  102. void write_string_lcd(BYTE line,column,unsigned char *string)
  103. {
  104. set_display_place(line,column);
  105. write_string(string);
  106. Delay(1);
  107. }
  108. /***************************************************
  109. ************液晶模块初始化******************************
  110. ****************************************************/
  111. void lcd_init(void)
  112. {
  113. write_cmd(0x38);//
  114. write_cmd(0x38);//
  115. write_cmd(0x06);//
  116. write_cmd(0x0c);//
  117. write_cmd(0x01);//
  118. }
  119. void crti(unsigned long dat)  
  120. {
  121. unsigned char dhi;
  122. unsigned char dli;
  123. unsigned char ddi;
  124. unsigned char dei;
  125. unsigned long datah;
  126. unsigned long datal;
  127. datah=dat;
  128. dhi=0;
  129. if (datah>=10)
  130. {
  131. do
  132. {
  133. datah/=10;
  134. dhi++;
  135. }while(datah>=10);
  136. datah=dat;
  137. ddi=dhi;
  138. for (dli=0;dli<dhi;dli++)
  139. {
  140. datal=1;
  141. for (dei=0;dei<ddi;dei++)
  142. {
  143. datal*=10;
  144. }
  145. datah=dat/datal;
  146. dat=dat%datal;
  147. datah+=0x30;
  148. write_data(datah);
  149. ddi--;
  150. }
  151. dat+=0x30;
  152. write_data(dat);
  153. }
  154. else
  155. {
  156. dat=dat+0x30;
  157. write_data(dat);
  158. }
  159. }
  160. void Delay(WORD n)
  161. {
  162. WORD x;
  163. while(n--)
  164. {
  165. x=500;  while(x--);
  166. }
  167. }
  168. void Delay2(WORD n)
  169. {
  170. WORD x;
  171. while(n--)
  172. {
  173. x=5000;  while(x--);
  174. }
  175. }
  176. void clear()
  177. {write_string_lcd(2,4, "               ");
  178. }

  179. ////////////////////////////////////////
  180. void int1_init(void)
  181. {
  182. IT1 = 1; //下降沿有效
  183. EX1 = 1;
  184. EA = 1;
  185. TMOD = 0x01;
  186. }
  187. /*获取低电平时间*/
  188. unsigned int Ir_Get_Low()
  189. {
  190. TL0 = 0;
  191. TH0 = 0;
  192. TR0 = 1;
  193. while (!Ir_Pin && (TH0&0x80)==0);  
  194.               
  195. TR0 = 0;           
  196. return (TH0 * 256 + TL0);
  197. }
  198. /* 获取高电平时间*/
  199. unsigned int Ir_Get_High()
  200. {
  201. TL0 = 0;
  202. TH0 = 0;
  203. TR0 = 1;
  204. while (Ir_Pin && (TH0&0x80)==0);
  205. TR0 = 0;
  206. return (TH0 * 256 + TL0);
  207. }
  208. int fuwei()
  209. {Delay2(15);
  210. //
  211. //

  212.         if(key==16)
  213.         return 0;
  214.         else return 1;
  215.        
  216. }
  217. //*******************************************
  218. void PC838()
  219. { int1_init();

  220. }
  221. void int1_isr() interrupt 2
  222. {
  223. unsigned int temp;
  224. char i,j;


  225. temp = Ir_Get_Low();
  226. if ((temp < 7833) || (temp > 8755))  //引导脉冲低电平8500~9500us
  227. return;
  228. temp = Ir_Get_High();
  229. if ((temp < 3686) || (temp > 4608))  //引导脉冲高电平4000~5000us
  230. return;
  231. for (i=0; i<4; i++) //4个字节
  232. {
  233. for (j=0; j<8; j++) //每个字节8位
  234. {
  235. temp = Ir_Get_Low();
  236. if ((temp < 184) || (temp > 737)) //200~800us
  237. return;
  238. temp = Ir_Get_High();
  239. if ((temp < 184) || (temp > 1843)) //200~2000us
  240. return;
  241. Ir_Buf[ i] >>= 1;
  242. if (temp > 1032) //1120us
  243. Ir_Buf[ i] |= 0x80;
  244. }
  245. }
  246. if( Ir_Buf[2]=~ Ir_Buf[3])  //验证键数据码和其反码是否相等,一般情况下不必验证用户码
  247. {
  248. if(Ir_Buf[2]==0x16)  key=0; //a[0]=00h;a[1]=ffh
  249. if(Ir_Buf[2]==0x0c)  key=1; //a[0]=00h;a[1]=ffh
  250. if(Ir_Buf[2]==0x18)  key=2; //a[0]=00h;a[1]=ffh
  251. if(Ir_Buf[2]==0x5E)  key=3;
  252. if(Ir_Buf[2]==0x08)  key=4;
  253. if(Ir_Buf[2]==0x1C)  key=5;
  254. if(Ir_Buf[2]==0x5A)  key=6;
  255. if(Ir_Buf[2]==0x42)  key=7;
  256. if(Ir_Buf[2]==0x52)  key=8;
  257. if(Ir_Buf[2]==0x4A)  key=9;
  258. if(Ir_Buf[2]==0x45)  key=10; //ON/OFF
  259. if(Ir_Buf[2]==0x46)  key=11; //MODE
  260. if(Ir_Buf[2]==0x47)  key=12; //静音
  261. if(Ir_Buf[2]==0x44)  key=13; //暂停
  262. if(Ir_Buf[2]==0x40)  key=14; //下一曲
  263. if(Ir_Buf[2]==0x43)  key=15; //上一曲
  264. if(Ir_Buf[2]==0x07)  key=16; //EQ
  265. dis_buf = key;                     //键值入显示缓存
  266.      //dis_buf = dis_buf & 0x0f;
  267. if(dis_buf>9)               //转换为ASCII码
  268.       dis_buf = dis_buf+0x37;
  269.      else
  270.           dis_buf = dis_buf+0x30;
  271.   //  beep();        //蜂鸣器响一声 提示解码成功



  272. }

  273. switch(key)
  274.         {case 0:case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9:
  275.         {inputpassword[a]=key+'0';
  276.         inputpassword[a+1]='\0';
  277.         a++;
  278.         set_display_place(2,o);
  279.         write_data(dis_buf);
  280.         o++;
  281.         }break;
  282.         case 10:
  283.          o++;
  284.                         if(strcmp(inputpassword,Userpassword)==0)
  285.                         {
  286.                                                         write_string_lcd(2,0, "Unlock  OK!        ");
  287.                                                         write_string_lcd(1,0, "Welcome         ");

  288.                                                         c=1;
  289.                                                         inputpassword[0]="a";                                                                       
  290.                                                         a=0;
  291.                                                         led1=0;               
  292.                                                         o=4;
  293.                                                         w=0;
  294.                                                         Delay2(200);
  295.                                                         clear();
  296.                                                         led1=1;
  297.                                                         //write_string_lcd(1,0, "hello!             ");
  298.                                                 //        write_string_lcd(2,0, "key:              ");
  299.                                                        
  300.                         }
  301.                         else {w++;
  302.                                        
  303.                                         if(w<3)
  304.                                         {        write_string_lcd(2,4, " error          ");
  305.                                         inputpassword[10]="";
  306.                                         a=0;
  307.                                         led2=0;
  308.                                         Delay2(60);clear();o=4;c=0;led2=1;}
  309.                                         else{//
  310.                                         while(fuwei()!=0)
  311.                                         //while(1)
  312.                                         {
  313.                                         write_string_lcd(2,4, " shutdown!!!          ");beep=0;
  314.                                         //
  315.                                         }                                       
  316.                                         inputpassword[10]="";
  317.                                         clear();
  318.                                         beep=1;
  319.                                         a=0;       
  320.                                         o=4;
  321.                                         w=0;
  322.                                         c=0;}
  323.                                         //Delay2(60);
  324.                                         }
  325.                                         //clear();
  326.                                         break;
  327.           case 12:
  328.                 if(c==0) {write_string_lcd(2,4, "can't change  ");Delay2(60);clear();o=4;a=0;}
  329.                 else
  330.         {       
  331.                
  332.                 Userpassword[0]=inputpassword[0];
  333.                 Userpassword[1]=inputpassword[1];
  334.                 Userpassword[2]=inputpassword[2];
  335.                         Userpassword[3]=inputpassword[3];
  336.                                 Userpassword[4]=inputpassword[4];
  337.                                         Userpassword[5]=inputpassword[5];
  338.                                                 Userpassword[6]=inputpassword[6];
  339.                                                         Userpassword[7]=inputpassword[7];
  340.                                                                 Userpassword[8]=inputpassword[8];
  341.                                                                         Userpassword[9]=inputpassword[9];
  342.                                                                                 Userpassword[10]=inputpassword[10];
  343.                 beep=1;
  344.                 o=4;
  345.                 w=0;
  346.                 c=0;
  347.                         a=0;write_string_lcd(2,4, "change ok! "); Delay2(60);clear();o=4;}
  348.                 break;
  349.         case 11:
  350.         {clear();
  351.         inputpassword[10]="";
  352.         c=0;
  353.         o=4;
  354.         a=0;}break;
  355.        

  356.         }


  357. //EX1=0;
  358. }
  359. ////////////////////////////////////////




  360. void main()
  361. {j=4;
  362. lcd_init();
  363. //SP=0x60;
  364. beep= 1;
  365. PC838();                                       //设定外部中断1为低边缘触发类型
  366.                                               //总中断开启


  367.   while(1)
  368. {
  369. if(c==1) write_string_lcd(1,7, "C");
  370.         else write_string_lcd(1,7, " ");       
  371.         write_string_lcd(1,10, "warn:");
  372. set_display_place(1,15);
  373.         write_data(0x30+w);
  374. write_string_lcd(1,0, "hello! ");   
  375. write_string_lcd(2,0, "key:");
  376. write_string_lcd(2,o, "_");//光标闪烁
  377. Delay2(15);
  378. write_string_lcd(2,o," ");
  379. Delay2(15);

  380. //
  381. //
  382. //
  383. //if               
  384.        
  385. //
  386.        
  387.         //write_data(ldata+0x30);
  388.         // j++;        
  389.                                
  390.        
  391.                          }
  392.                          }

复制代码
回复

使用道具 举报

ID:241829 发表于 2017-10-29 11:09 | 显示全部楼层
有没有仿真图?
回复

使用道具 举报

ID:221012 发表于 2017-10-31 19:31 | 显示全部楼层
谢谢分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表