找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2325|回复: 0
打印 上一主题 下一主题
收起左侧

关于AT89S52单片机芯片的电子锁设计

[复制链接]
跳转到指定楼层
楼主
                         最近的一个作业 电子锁的设计-20171202
                               张刘清
                            学号16131422


图一:At89S52芯片的  简介说明



图二:lcd160显示显示屏的 简介说明




图三:晶振电路图 + 复位电路图 简介说明




图四: at24c02存储模块 简介说明 电路图



图五:器件简要清单



图六:作品的最后展示


最后是代码的设计
单片机源程序如下:
  1. #include <reg52.h>
  2. #include <stdio.h>  
  3. #include <intrins.h>
  4. #define uchar unsigned char
  5. #define uint unsigned int
  6. sbit scl=P3^6;  //24C02时钟线的接口
  7. sbit sda=P3^7; //24C02数据线的接口
  8. sbit fmp=P1^7;
  9. sbit RS=P1^0;  //pin4
  10. sbit E=P1^1;  // pin6
  11. #define Data P0  //数据端口
  12. sbit Key_Data=P3^3; //d定义keyboard引脚
  13. sbit Key_CLK=P3^2;  //使用中断
  14. bit BF;
  15. bit Shift;  //定义上档键标志
  16. bit Key_up; //定义通码断码标志
  17. unsigned char Keyv;
  18. unsigned char IntNum;
  19. unsigned char DisNum;
  20. char code cs[]="new mima";
  21. char code sr[]="enter mima";
  22. char code f[]="Data Error";
  23. static uchar data csmm[20];
  24. static uchar data srmm[20];
  25. static int t1=1,t2=1,t3=1,t4=1,t5=1,t6=1,num=0;

  26. //微秒延时函数
  27. void DelayUs(unsigned char us)
  28. {
  29.               unsigned char uscnt;
  30.               uscnt=us>>1;  /12mhz频率
  31.               while(--uscnt);
  32. }

  33. //毫秒函数的声明
  34. void DelayMs(unsigned char ms)
  35. {
  36.               while(--ms)
  37.               {
  38.                             DelayUs(250);
  39.                             DelayUs(250);
  40.                             DelayUs(250);
  41.                             DelayUs(250);
  42.               }
  43. }

  44. void delay()
  45. {
  46.    ;;
  47. }

  48. ////////存储芯片

  49. //开始信号
  50. void start()
  51. {
  52.               sda=1;
  53.               delay();
  54.               scl=1;
  55.               delay();
  56.               sda=0;
  57.               delay();
  58. }

  59. //停止
  60. void stop()
  61. {
  62.               sda=0;
  63.               delay();
  64.               scl=1;
  65.               delay();
  66.               sda=0;
  67.               delay();
  68. }

  69. //应答信号
  70. void respons()
  71. {
  72.               uchar i;
  73.               scl=1;
  74.               delay();
  75.               while((sda==1)&&(i<50)) i++;
  76.               scl=0;
  77.               delay();
  78. }

  79. //初始化
  80. void init()
  81. {
  82.               sda=1;
  83.               delay();
  84.               scl=1;
  85.               delay();
  86. }

  87. void write_byte(uchar date)
  88. {
  89.               uchar i,temp;
  90.               temp=date;
  91.               for(i=0;i<8;i++)
  92.               {
  93.                             temp=temp<<1;
  94.                             scl=0;
  95.                             delay();
  96.                             sda=CY;
  97.                             delay();
  98.                             scl=1;
  99.                             delay();
  100.               }
  101.               scl=0;
  102.               delay(0);
  103.               sda=1;
  104.               delay();
  105. }

  106. uchar read_byte()
  107. {
  108.               uchar i, k;
  109.               scl=0;
  110.               delay();
  111.               sda=1;
  112.               delay();
  113.               for(i=0;i<8;i++)
  114.               {
  115.                             scl=1;
  116.                             delay();
  117.                             k=(k<<1) | sda;
  118.                             scl=0;
  119.                             delay();
  120.               }
  121.               return k;
  122. }

  123. void write_add(uchar address,uchar date)
  124. {
  125.               start();
  126.               write_byte(0xa0);
  127.               respons();
  128.               write_byte(address);
  129.               respons();
  130.               write_byte(date);
  131.               respons();
  132.               stop();
  133. }

  134. void read_add(uchar address)
  135. {
  136.               uchar date;
  137.               start();
  138.               write_byte(0xa0);
  139.               respons();
  140.               write_byte(address);
  141.               respons();
  142.               start();
  143.               write_byte(0xa1);
  144.               respons();
  145.               date=read_byte();
  146.               stop();
  147.               return date;
  148. }


  149. ////////液晶

  150. //写命令函数
  151. void WriteCommand(unsigned char c)
  152. {
  153.               DelayMs(5);//保证信号稳定
  154.               E=0;
  155.               RS=0;
  156.               _nop_();
  157.               E=1;
  158.               Data=c;
  159.               E=0;
  160. }

  161. //写数据函数
  162. void WriteData(unsigned char c)
  163. {
  164.               DelayMs(5);//保证信号稳定
  165.               E=0;
  166.               RS=1;
  167.               _nop_();
  168.               E=1;
  169.               Data=c;
  170.               E=0;
  171.               RS=0;
  172. }

  173. //写入字节函数
  174. void ShowChar(unsigned char pos, unsigned char c)
  175. {
  176.               unsigned char p;
  177.               if(pos>=0x10)
  178.                             p=pos+0xb0; //是第二行则命令代码高四位为0xc
  179.               else
  180.                             p=pos+0x80; //是第二行则命令代码高四位为0x8
  181.               WriteCommand(p);  //写命令
  182.               WriteData();               //写数据              
  183. }

  184. //写入字符串函数
  185. void ShowString(unsigned char line,char *ptr )
  186. {
  187.               unsigned char l,i;
  188.               l=line<<4;
  189.               for(i=0;i<16;i++)
  190.               {
  191.                             Show (l++,*(ptr+i)); //循环显示16个字符                           
  192.               }
  193. }

  194. //初始化函数
  195. void InitLcd()
  196. {
  197.               DelayMs(15);
  198.               WriteCommand(0x38);  //display mode
  199.               WriteCommand(0x38);  //display mode
  200.               WriteCommand(0x38);  //display mode
  201.               WriteCommand(0x06);  //显示光标移动的位置
  202.               WriteCommand(0x0f);  //显示开及光标设置
  203.               WriteCommand(0x01);  //清屏            
  204. }

  205. ///////////键盘



  206. #include <reg52.h>
  207. #include <stdio.h>  
  208. #include <intrins.h>
  209. #define uchar unsigned char
  210. #define uint unsigned int
  211. sbit scl=P3^6;  //24C02时钟线的接口
  212. sbit sda=P3^7; //24C02数据线的接口
  213. sbit fmp=P1^7;
  214. sbit RS=P1^0;  //pin4
  215. sbit E=P1^1;  // pin6
  216. #define Data P0  //数据端口
  217. sbit Key_Data=P3^3; //d定义keyboard引脚
  218. sbit Key_CLK=P3^2;  //使用中断
  219. bit BF;
  220. bit Shift;  //定义上档键标志
  221. bit Key_up; //定义通码断码标志
  222. unsigned char Keyv;
  223. unsigned char IntNum;
  224. unsigned char DisNum;
  225. char code cs[]="new mima";
  226. char code sr[]="enter mima";
  227. char code f[]="Data Error";
  228. static uchar data csmm[20];
  229. static uchar data srmm[20];
  230. static int t1=1,t2=1,t3=1,t4=1,t5=1,t6=1,num=0;

  231. //微秒延时函数
  232. void DelayUs(unsigned char us)
  233. {
  234.               unsigned char uscnt;
  235.               uscnt=us>>1;  /12mhz频率
  236.               while(--uscnt);
  237. }

  238. //毫秒函数的声明
  239. void DelayMs(unsigned char ms)
  240. {
  241.               while(--ms)
  242.               {
  243.                             DelayUs(250);
  244.                             DelayUs(250);
  245.                             DelayUs(250);
  246.                             DelayUs(250);
  247.               }
  248. }

  249. void delay()
  250. {
  251.    ;;
  252. }

  253. ////////存储芯片

  254. //开始信号
  255. void start()
  256. {
  257.               sda=1;
  258.               delay();
  259.               scl=1;
  260.               delay();
  261.               sda=0;
  262.               delay();
  263. }

  264. //停止
  265. void stop()
  266. {
  267.               sda=0;
  268.               delay();
  269.               scl=1;
  270.               delay();
  271.               sda=0;
  272.               delay();
  273. }

  274. //应答信号
  275. void respons()
  276. {
  277.               uchar i;
  278.               scl=1;
  279.               delay();
  280.               while((sda==1)&&(i<50)) i++;
  281.               scl=0;
  282.               delay();
  283. }

  284. //初始化
  285. void init()
  286. {
  287.               sda=1;
  288.               delay();
  289.               scl=1;
  290.               delay();
  291. }

  292. void write_byte(uchar date)
  293. {
  294.               uchar i,temp;
  295.               temp=date;
  296.               for(i=0;i<8;i++)
  297.               {
  298.                             temp=temp<<1;
  299.                             scl=0;
  300.                             delay();
  301.                             sda=CY;
  302.                             delay();
  303.                             scl=1;
  304.                             delay();
  305.               }
  306.               scl=0;
  307.               delay(0);
  308.               sda=1;
  309.               delay();
  310. }

  311. uchar read_byte()
  312. {
  313.               uchar i, k;
  314.               scl=0;
  315.               delay();
  316.               sda=1;
  317.               delay();
  318.               for(i=0;i<8;i++)
  319.               {
  320.                             scl=1;
  321.                             delay();
  322.                             k=(k<<1) | sda;
  323.                             scl=0;
  324.                             delay();
  325.               }
  326.               return k;
  327. }

  328. void write_add(uchar address,uchar date)
  329. {
  330.               start();
  331.               write_byte(0xa0);
  332.               respons();
  333.               write_byte(address);
  334.               respons();
  335.               write_byte(date);
  336.               respons();
  337.               stop();
  338. }

  339. void read_add(uchar address)
  340. {
  341.               uchar date;
  342.               start();
  343.               write_byte(0xa0);
  344.               respons();
  345.               write_byte(address);
  346.               respons();
  347.               start();
  348.               write_byte(0xa1);
  349.               respons();
  350.               date=read_byte();
  351.               stop();
  352.               return date;
  353. }


  354. ////////液晶

  355. //写命令函数
  356. void WriteCommand(unsigned char c)
  357. {
  358.               DelayMs(5);//保证信号稳定
  359.               E=0;
  360.               RS=0;
  361.               _nop_();
  362.               E=1;
  363.               Data=c;
  364.               E=0;
  365. }

  366. //写数据函数
  367. void WriteData(unsigned char c)
  368. {
  369.               DelayMs(5);//保证信号稳定
  370.               E=0;
  371.               RS=1;
  372.               _nop_();
  373.               E=1;
  374.               Data=c;
  375.               E=0;
  376.               RS=0;
  377. }

  378. //写入字节函数
  379. void ShowChar(unsigned char pos, unsigned char c)
  380. {
  381.               unsigned char p;
  382.               if(pos>=0x10)
  383.                             p=pos+0xb0; //是第二行则命令代码高四位为0xc
  384.               else
  385.                             p=pos+0x80; //是第二行则命令代码高四位为0x8
  386.               WriteCommand(p);  //写命令
  387.               WriteData();               //写数据              
  388. }

  389. //写入字符串函数
  390. void ShowString(unsigned char line,char *ptr )
  391. {
  392.               unsigned char l,i;
  393.               l=line<<4;
  394.               for(i=0;i<16;i++)
  395.               {
  396.                             Show (l++,*(ptr+i)); //循环显示16个字符                           
  397.               }
  398. }

  399. //初始化函数
  400. void InitLcd()
  401. {
  402.               DelayMs(15);
  403.               WriteCommand(0x38);  //display mode
  404.               WriteCommand(0x38);  //display mode
  405.               WriteCommand(0x38);  //display mode
  406.               WriteCommand(0x06);  //显示光标移动的位置
  407.               WriteCommand(0x0f);  //显示开及光标设置
  408.               WriteCommand(0x01);  //清屏            
  409. }

  410. ///////////键盘







  411. #include <reg52.h>
  412. #include <stdio.h>  
  413. #include <intrins.h>
  414. #define uchar unsigned char
  415. #define uint unsigned int
  416. sbit scl=P3^6;  //24C02时钟线的接口
  417. sbit sda=P3^7; //24C02数据线的接口
  418. sbit fmp=P1^7;
  419. sbit RS=P1^0;  //pin4
  420. sbit E=P1^1;  // pin6
  421. #define Data P0  //数据端口
  422. sbit Key_Data=P3^3; //d定义keyboard引脚
  423. sbit Key_CLK=P3^2;  //使用中断
  424. bit BF;
  425. bit Shift;  //定义上档键标志
  426. bit Key_up; //定义通码断码标志
  427. unsigned char Keyv;
  428. unsigned char IntNum;
  429. unsigned char DisNum;
  430. char code cs[]="new mima";
  431. char code sr[]="enter mima";
  432. char code f[]="Data Error";
  433. static uchar data csmm[20];
  434. static uchar data srmm[20];
  435. static int t1=1,t2=1,t3=1,t4=1,t5=1,t6=1,num=0;

  436. //微秒延时函数
  437. void DelayUs(unsigned char us)
  438. {
  439.               unsigned char uscnt;
  440.               uscnt=us>>1;  /12mhz频率
  441.               while(--uscnt);
  442. }

  443. //毫秒函数的声明
  444. void DelayMs(unsigned char ms)
  445. {
  446.               while(--ms)
  447.               {
  448.                             DelayUs(250);
  449.                             DelayUs(250);
  450.                             DelayUs(250);
  451.                             DelayUs(250);
  452.               }
  453. }

  454. void delay()
  455. {
  456.    ;;
  457. }

  458. ////////存储芯片

  459. //开始信号
  460. void start()
  461. {
  462.               sda=1;
  463.               delay();
  464.               scl=1;
  465.               delay();
  466.               sda=0;
  467.               delay();
  468. }

  469. //停止
  470. void stop()
  471. {
  472.               sda=0;
  473.               delay();
  474.               scl=1;
  475.               delay();
  476.               sda=0;
  477.               delay();
  478. }

  479. //应答信号
  480. void respons()
  481. {
  482.               uchar i;
  483.               scl=1;
  484.               delay();
  485.               while((sda==1)&&(i<50)) i++;
  486.               scl=0;
  487.               delay();
  488. }

  489. //初始化
  490. void init()
  491. {
  492.               sda=1;
  493.               delay();
  494.               scl=1;
  495.               delay();
  496. }

  497. void write_byte(uchar date)
  498. {
  499.               uchar i,temp;
  500.               temp=date;
  501.               for(i=0;i<8;i++)
  502.               {
  503.                             temp=temp<<1;
  504.                             scl=0;
  505.                             delay();
  506.                             sda=CY;
  507.                             delay();
  508.                             scl=1;
  509.                             delay();
  510.               }
  511.               scl=0;
  512.               delay(0);
  513.               sda=1;
  514.               delay();
  515. }

  516. uchar read_byte()
  517. {
  518.               uchar i, k;
  519.               scl=0;
  520.               delay();
  521.               sda=1;
  522.               delay();
  523.               for(i=0;i<8;i++)
  524.               {
  525.                             scl=1;
  526.                             delay();
  527.                             k=(k<<1) | sda;
  528.                             scl=0;
  529.                             delay();
  530.               }
  531.               return k;
  532. }

  533. void write_add(uchar address,uchar date)
  534. {
  535.               start();
  536.               write_byte(0xa0);
  537.               respons();
  538.               write_byte(address);
  539.               respons();
  540.               write_byte(date);
  541.               respons();
  542.               stop();
  543. }

  544. void read_add(uchar address)
  545. {
  546.               uchar date;
  547.               start();
  548.               write_byte(0xa0);
  549.               respons();
  550.               write_byte(address);
  551.               respons();
  552.               start();
  553.               write_byte(0xa1);
  554.               respons();
  555.               date=read_byte();
  556.               stop();
  557.               return date;
  558. }


  559. ////////液晶

  560. //写命令函数
  561. void WriteCommand(unsigned char c)
  562. {
  563.               DelayMs(5);//保证信号稳定
  564.               E=0;
  565.               RS=0;
  566.               _nop_();
  567.               E=1;
  568.               Data=c;
  569.               E=0;
  570. }

  571. //写数据函数
  572. void WriteData(unsigned char c)
  573. {
  574.               DelayMs(5);//保证信号稳定
  575.               E=0;
  576.               RS=1;
  577.               _nop_();
  578.               E=1;
  579. ……………………

  580. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
电子锁的制作20171202.docx (3.52 MB, 下载次数: 16)
1205.zip (6.69 KB, 下载次数: 14)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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