找回密码
 立即注册

QQ登录

只需一步,快速开始

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

实训做的一个单片机密码锁程序及仿真,功能不多

[复制链接]
跳转到指定楼层
楼主


单片机源程序如下:
  1. #include<reg51.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit RS = P1^0;
  5. sbit RW = P1^1;
  6. sbit EN = P1^2;
  7. sbit ledg=P1^3;                   //绿灯
  8. sbit ledr=P1^4;                   //红灯
  9. sbit forward=P1^5;     //正转
  10. sbit reversal=P1^6;    //反转
  11. sbit braking=P1^7;           //制动
  12. char table0[]=" Unlock Failed ";
  13. char table1[]="Unlock Successed";
  14. char table2[]="Enter PS:";
  15. char table3[]="Wrong Password";
  16. int temp,ch,p;
  17. int n0,n1,n2,n3,n4,n5,n6; //6位密码数

  18. //***延时函数***//
  19. void delay(int time)
  20. {
  21.         int t=0;
  22.         for(;time>0;time--)
  23.         for(t=0;t<300;t++);
  24. }

  25. //=====键盘部分=====//
  26. keyscan()
  27. {
  28.         temp=P2&0xf0;         //第1行键盘数,P2输入
  29.         P2=0xfe;
  30.         delay(1);
  31.         temp=P2&0xf0;
  32.         while(temp!=0xf0)
  33.         {
  34.                 switch(temp)
  35.                 {
  36.                         case 0xe0:ch='1';break;
  37.                         case 0xd0:ch='2';break;
  38.                         case 0xb0:ch='3';break;
  39.                         default:ch=p; break;
  40.                  }
  41.                 while(temp!=0xf0)
  42.                 {
  43.                         temp=P2;
  44.                         temp=temp&0xf0;
  45.                  }
  46.         }
  47.         P2=0xfd;     //第2行键盘数
  48.         delay(1);
  49.         temp=P2&0xf0;
  50.         while(temp!=0xf0)
  51.         {
  52.                 switch(temp)
  53.                 {
  54.                         case 0xe0:ch='4';break;
  55.                         case 0xd0:ch='5';break;
  56.                         case 0xb0:ch='6';break;
  57.                         default:ch=p;break;
  58.                 }
  59.                 while(temp!=0xf0)
  60.                 {
  61.                         temp=P2;
  62.                         temp=temp&0xf0;
  63.                 }
  64.         }
  65.         P2=0xfb;      //第3行键盘数
  66.         delay(1);
  67.         temp=P2&0xf0;
  68.         while(temp!=0xf0)
  69.         {
  70.             switch(temp)
  71.                 {
  72.                         case 0xe0:ch='7';break;
  73.                         case 0xd0:ch='8';break;
  74.                         case 0xb0:ch='9';break;
  75.                         default:ch=p;break;
  76.                 }
  77.                 while(temp!=0xf0)
  78.                 {
  79.                         temp=P2;
  80.                         temp=temp&0xf0;
  81.                 }
  82.         }
  83.         P2=0xf7;                 //第4行键盘数
  84.         delay(1);
  85.         temp=P2&0xf0;
  86.         while(temp!=0xf0)
  87.         {
  88.                 switch(temp)
  89.                 {
  90.                         case 0xe0:ch='*';break;       
  91.                         case 0xd0:ch='0';break;
  92.                         case 0xb0:ch='#';break;       
  93.                         default:ch=p;break;
  94.                 }
  95.                 while(temp!=0xf0)
  96.                 {
  97.                         temp=P2;
  98.                         temp=temp&0xf0;
  99.                 }
  100.         }
  101.         return ch;
  102. }

  103. //=====LCD液晶部分=====//
  104. //***写指令函数***//
  105. void LCDWrite(uchar com)//显示
  106. {
  107.         P0=com;                  //送出指令
  108.         RS=0;RW=0;EN=1;   //写指令时序
  109.         delay(10);
  110.         EN=0;
  111. }

  112. //***写数据函数***//
  113. void LCDData(uchar dat)//输入
  114. {
  115.         P0=dat;                    //送出数据
  116.         RS=1;RW=0;EN=1; //写数据时序       
  117.         delay(10);
  118.         EN=0;
  119. }

  120. //***屏幕初始化函数***//
  121. void init()
  122. {
  123.         LCDWrite(0x01);         //清屏
  124.         LCDWrite(0x38);         //设置16*2显示,5*7点阵,8位数据接口
  125.         LCDWrite(0x0f);         //开显示,光标闪烁,显示光标
  126.         LCDWrite(0x06);         //地址加1,整屏右移       
  127. }

  128. //***数字变为'*'函数***//
  129. change(int m)                        //输入数字延时后变为*
  130. {
  131.         delay(200);
  132.         LCDWrite(m);
  133.         LCDData('*');
  134. }
  135.        
  136. //***字幕显示调用函数***//
  137. void ps()                                         //输入密码界面"Enter PS:"
  138. {
  139.         char d1;
  140.         LCDWrite(0x80);                         //第1行第1个字符开始显示
  141.         for(d1=0;d1<9;d1++)
  142.         {
  143.                 LCDData(table2[d1]);
  144.         }
  145. }
  146. void error()                                 //密码错误时调用显示"Unlock Failed"
  147. {   char d1;                 //液晶屏幕第1行
  148.         LCDWrite(0x01);                         //清屏
  149.         LCDWrite(0x81);          //第1行第1个字符开始显示
  150.         for(d1=0;d1<13;d1++)     //字符字数
  151.         {
  152.                 LCDData(table0[d1]); //显示调用table0
  153.         }
  154.        
  155. }
  156. void error1()                                 //密码错误时调用显示"Wrong Password"
  157. {   char d2;                 //液晶屏幕第2行
  158.         LCDWrite(0xc1);          //第2行第2个字符开始显示
  159.         for(d2=0;d2<14;d2++)      //字符字数
  160.         {
  161.                 LCDData(table3[d2]); //显示调用table3
  162.         }       
  163. }
  164. void open()                                         //密码正确时调用显示"Unlock Successed"
  165. {
  166.         char d2;                                 
  167.         LCDWrite(0xc0);                         //第2行第1个字符开始显示
  168.         for(d2=0;d2<16;d2++)
  169.         {
  170.                 LCDData(table1[d2]);
  171.         }
  172. }

  173. //===步进电机部分===//
  174. //***紧急制动子程序***//
  175. void stop()                              
  176. {
  177.         if(braking==0)
  178.         {  
  179.            if(braking==0)
  180.            while(!braking)
  181.              {P3=0xff;}
  182.          }  
  183. }

  184. //===正反转子程序===//
  185. void zfz()                              
  186. {  int i;
  187.    if(!forward&&ledg==1)                          //正转
  188.    { delay(10);
  189.      while(!forward)
  190.          { stop();
  191.            for(i=0,P3=0x01;i<4;i++)
  192.                   { delay(90);
  193.                     P3=P3<<1;
  194.                   }
  195.          }
  196.    }
  197.    if(!reversal&&ledg==1)                                //反转
  198.    { delay(10);
  199.      while(!reversal)
  200.          { stop();
  201.            for(i=0,P3=0xf7;i<4;i++)
  202.                   { delay(90);
  203.                     P3=P3>>1;
  204.                   }
  205.          }
  206.    }
  207. }

  208. //=====主函数=====//
  209. //***程序初始化***//
  210. void main()
  211. {
  212.         RW=0;
  213.         ledg=0;                   //绿灯
  214.         ledr=0;                   //红灯               
  215.         init();
  216.         stop();
  217.         zfz();
  218.         delay(5);
  219.         ps();

  220. //***按键,屏幕关联函数***//
  221. //*密码1*//
  222.         LCDWrite(0x89);            //第1行第10个字符位置显示
  223.         while(keyscan()==p)
  224.         {
  225.                 delay(3);
  226.                 keyscan();
  227.         }
  228.         LCDData(keyscan());        //第1行第10个字符位置输入
  229.         n0=keyscan();                //第1个密码
  230.         ch=p;
  231.         change(0x89);                //数字变*函数调用       
  232.     delay(1);
  233. //*密码2*//
  234.         LCDWrite(0x8a);               
  235.         while(keyscan()==p)
  236.         {
  237.                 delay(3);
  238.                 keyscan();
  239.         }
  240.         LCDData(keyscan());         
  241.         n1=keyscan();
  242.         ch=p;               
  243.         change(0x8a);
  244.         delay(1);
  245. //*密码3*//
  246.         LCDWrite(0x8b);               
  247.         while(keyscan()==p)
  248.         {
  249.                 delay(3);
  250.             keyscan();
  251.         }
  252.         LCDData(keyscan());   
  253.         n2=keyscan();                  
  254.     ch=p;
  255.         change(0x8b);
  256.         delay(1);
  257. //*密码4*//
  258.         LCDWrite(0x8c);                  
  259.         while(keyscan()==p)
  260.         {
  261.                 delay(3);
  262.                 keyscan();
  263.         }
  264.         LCDData(keyscan());       
  265.         n3=keyscan();
  266.         ch=p;
  267.         change(0x8c);
  268.         delay(1);       
  269. //*密码5*//
  270.         LCDWrite(0x8d);               
  271.         while(keyscan()==p)
  272.         {
  273.                 delay(3);
  274.                 keyscan();
  275.         }
  276.         LCDData(keyscan());       
  277.         n4=keyscan();
  278.         ch=p;
  279.         change(0x8d);
  280.         delay(1);               
  281. //*密码6*//
  282. ……………………

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

所有资料51hei提供下载:
程序及仿真.zip (43.75 KB, 下载次数: 25)



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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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