找回密码
 立即注册

QQ登录

只需一步,快速开始

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

stc15单片机芯片换成52芯片 出现问题

[复制链接]
跳转到指定楼层
楼主
ID:1096616 发表于 2023-12-22 20:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
单片机实现电子密码锁功能
这个时我尝试实现论坛上的一个大佬文档的电子密码锁,希望将其的stc15芯片换成52单片机,所以修改了部分和删除了部分,但是为什么无法重现那个大佬的功能,问题是出在哪里?如果是都有错,请问我应该如何修改
  1. #include <reg52.h>      //包含52头文件
  2. #include "intrins.h"
  3. #define uint unsigned int //宏定义uint代替unsigned int
  4. #define uchar unsigned char //宏定义uchar代替unsigned char
  5. #define out P0
  6. sbit lcdrs=P2^4;//液晶的RS端接P2.4口
  7. sbit lcdrw=P2^5;//液晶的RW端接P2.5
  8. sbit lcden=P2^6;// 液晶的EN使能端接P2.6口
  9. sbit buzzer =P1^0;//蜂鸣器
  10. uchar code keyvalue[]={0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,
  11. 0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77};
  12. uint ver=0;
  13. void beep();
  14. void lcd_init();//初始化1602
  15. void write_data(uchar dat);
  16. void check_busy(void);
  17. void write_cmd(char cmd);  //写指令函数
  18. void lcd_clear();
  19. void xianshi(void);//LCD显示函数
  20. void right1(void);  //输入密码正确的显示函数
  21. void wrong1(void);  //输入密码错误后的显示函数
  22. void verify(); //验证密码
  23. void copy(); //复制密码
  24. void input();//输入密码
  25. void reset();//重置密码
  26. uchar keyscan(void);
  27. uchar RIGHT[]="pass";
  28. uchar WRONG[]="Password Error";
  29. uchar SHURU[]="aaaaaaaaaa";
  30. uchar SHUZU[]="aaaaaaaaaa";
  31. uchar MIMA[]="000aaaaaaa";
  32. void delayms (uint xms)     //毫秒函数定义
  33. {
  34.     uint i,j;
  35.     for(i=0;i<xms;i++)
  36.        for(j=0;j<120;j++);  
  37. }
  38. void main()
  39. {    lcd_init();
  40.      lcd_clear();

  41.              while(1)
  42.         { P1=0x0f;
  43.                
  44.                 if((P1&0x0f)!=0x0f)
  45.                 { delayms(15);
  46.                         if((P1&0x0f)!=0x0f)
  47.                         { lcd_clear();
  48.                                 copy(); //先对显示的数组进行赋值,以免出现显示错误
  49.                                 input(); //输入密码
  50.                                 if(keyscan()==12)
  51.                                 lcd_clear();
  52.                                 copy();
  53.                                 input(); //若按下重置键,则重新输入
  54.                                 if(keyscan()==13)
  55.                                 { verify(); //按下确认键,对密码进行验证
  56.                                         if(ver==0)
  57.                                         {lcd_clear();
  58.                                         right1(); //密码正确
  59.                                         }
  60.           else
  61.           {                                         lcd_clear();
  62.                                                 copy();
  63.                                                 wrong1();        //密码错误
  64.                                         }                                                
  65.                                 }
  66.                                 if(keyscan()==15)
  67.                                 {
  68.                                         lcd_clear();
  69.                                         copy();
  70.                                         verify();  //按下重置密码键之后,先确认之前输入的密码是否正确
  71.                                         if(ver==0)
  72.                                         reset(); //正确则重置密码
  73.                                   else
  74.                                         {lcd_clear();
  75.                                         wrong1();        
  76.                                         }
  77.                                 }
  78.                                 P1=0xf0;
  79.                                 while((P1&0xf0)!=0xf0)
  80.                                 { P1=0xf0;
  81.                                         beep();
  82.                                 }
  83.                         }
  84.                 }

  85.         }
  86.         
  87. }
  88. uchar keyscan(void)
  89. {
  90.     uchar j,temp,i;
  91.         uchar t=0xfe;
  92.         P1=0xf0;
  93.                 if((P1&0xf0)!=0xf0)
  94.                 {
  95.                         for(i=0;i<4;i++)
  96.                         { P1=t;
  97.                                 temp=P1;
  98.                    for(j=0;j<16;j++)
  99.                         { if(temp==keyvalue[j]) return(j);
  100.                         }
  101.        t=_crol_(t,1);
  102.                 }
  103.                
  104.         }
  105.         return(16);
  106. }
  107. void beep(void)
  108. {
  109.         uchar i;
  110.         for(i=0;i<10;i++)
  111.         {
  112.                 delayms(50);
  113.                 buzzer=~buzzer;
  114.         }
  115.         buzzer=1;
  116. }
  117. /**********************检查忙标志函数************************/
  118. void check_busy(void)
  119. {
  120.     uchar dt;
  121.         out=0xff;
  122.         do
  123.         {
  124.            lcden=0;
  125.            lcdrs=0;
  126.            lcdrw=1;
  127.            lcden=1;
  128.            dt=out;
  129.         }while(dt&0x80);
  130.         lcden=0;
  131. }
  132. /**************************1602显示****************************/
  133. void write_cmd(char cmd)  //写指令函数
  134. {
  135.         check_busy();
  136.         lcden=0;//再把EN拉低
  137.         lcdrs=0;
  138.         lcdrw=0;//先将RW拉低
  139.         out=cmd;
  140.         lcden=1;
  141.         lcden=0;
  142. }
  143. void write_data(uchar dat) //写数据函数
  144. {
  145.         check_busy();
  146.         lcden=0;//再把EN拉低
  147.         lcdrs=1;
  148.         lcdrw=0;//先将RW拉低
  149.         out=dat;
  150.         lcden=1;
  151.         lcden=0;        
  152. }

  153. /***************************初始化******************************/
  154. void lcd_init()//初始化1602
  155. {
  156.         write_cmd(0x38);//显示模式设置
  157.         write_cmd(0x0c);//显示开关,光标没有闪烁
  158.         write_cmd(0x06);//显示光标移动设置
  159.         write_cmd(0x01);//清除屏幕
  160.         delayms(1);
  161. }
  162. void lcd_clear()
  163. {     write_cmd(0x01);
  164.         delayms(5);
  165. }
  166. void input()
  167. {
  168.         uchar i=0,key;
  169.         for(;i<10;)
  170.         { P1=0xf0;
  171.                 if((P1&0xf0)!=0xf0)
  172.                 { delayms(15);
  173.                         if((P1&0xf0)!=0xf0)
  174.                         { if (keyscan()>=10) break; //确认有键按下后,如果按下的不是数字键0-9,则跳出循环
  175.                                 key=keyscan();
  176.                                 SHURU[i]=key+'0'; //将输入的数字转化为字符变量存入‘SHURU’和‘SHUZU'两个数组中
  177.                                 SHUZU[i]=SHURU[i];
  178.                                 SHURU[i+1]='a';  //对"SHURU"数组的下一位赋值为a,避免在验证密码时出错
  179.                                 xianshi(); //显示函数
  180.                                 i++;
  181.                                 
  182.                                 P1=0xf0;
  183.                                 while((P1&0xf0)!=0xf0)
  184.                                 { P1=0xf0;
  185.                                         beep();
  186.                                 }
  187.                         }
  188.                 }
  189.                
  190.         }
  191.         
  192. }
  193. void xianshi(void)
  194. { uchar m;
  195.          uchar n=0;
  196.         for (m=0x80;m<0x90;m++)
  197.         {
  198.           write_cmd(m);
  199.                 if(SHUZU[n]=='a'|| SHUZU[n]=='\0') break;
  200.                 write_data(SHUZU[n]);
  201.                 n++;
  202.         }
  203. }
  204. void right1(void)
  205. { uchar m;
  206.          uchar n=0;
  207.         for (m=0x80;m<0x90;m++)
  208.         {
  209.            write_cmd(m);
  210.                 if(RIGHT[n]=='\0') break;
  211.                 write_data(RIGHT[n]);
  212.                 n++;
  213.         }
  214. }
  215. void wrong1(void)
  216. { uchar m;
  217.          uchar n=0;
  218.         for (m=0x80;m<0x90;m++)
  219.         {
  220.                 write_cmd(m);
  221.                 if(WRONG[n]=='\0') break;
  222.                 write_data(WRONG[n]);
  223.                 n++;
  224.         }
  225. }
  226. void verify()
  227. {   uchar i;
  228.         ver=0;
  229.         for(i=0;MIMA[i]!='*' && MIMA[i]!='\0';i++)
  230.         { if(SHURU[i]!=MIMA[i] || SHURU[i+1]!=MIMA[i+1])  //验证密码是否正确
  231.           {ver=1;
  232.                         break;
  233.                 }
  234.         }
  235. }
  236. void copy()
  237. {    uchar i=0;
  238.         for(;i<10;i++)
  239.         { SHUZU[i]='*';
  240.         }
  241. }
  242. void reset()
  243. {  uchar i,key;
  244.         for(i=0;i<10;)
  245.         { P1=0xf0;
  246.                 if((P1&0xf0)!=0xf0)
  247.                 { delayms(15);
  248.                         if((P1&0xf0)!=0xf0 )
  249.                         { if(keyscan()!=15)
  250.                                 {
  251.                                 if (keyscan()==13) break; //再确认要重置密码后,把输入的新密码存入'SHUZU'数组中,若按下确认键则跳出
  252.                                 key=keyscan();
  253.                                 SHUZU[i]=key+'0';
  254.                                 xianshi();
  255.                                 i++;
  256.                                 }
  257.                                 P1=0xf0;
  258.                                 while((P1&0xf0)!=0xf0)
  259.                                 { P1=0xf0;
  260.                                         beep();
  261.                                 }
  262.                         }
  263.                 }
  264.                
  265.         }
  266.         for(i=0;i<9;i++)
  267.         {MIMA[i]=SHUZU[i];//将密码存入“MIMA”数组中
  268.         }
  269.         lcd_clear();
  270.         copy();
  271. }
复制代码

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

使用道具 举报

沙发
ID:364201 发表于 2023-12-23 08:32 | 只看该作者
不能直接移植的,15系列是8952系列的升级版本,15系列的很多寄存器8952系列是没有的
回复

使用道具 举报

板凳
ID:1096616 发表于 2023-12-23 17:56 | 只看该作者
597259498 发表于 2023-12-23 08:32
不能直接移植的,15系列是8952系列的升级版本,15系列的很多寄存器8952系列是没有的

好吧,我放弃这个思路
回复

使用道具 举报

地板
ID:57657 发表于 2023-12-23 20:04 | 只看该作者
597259498 发表于 2023-12-23 08:32
不能直接移植的,15系列是8952系列的升级版本,15系列的很多寄存器8952系列是没有的

部分寄存器和中断是STC专属的,其他品牌单片机是没有的。
楼主使用的 reg51.h 且没有用到STC专属寄存器或中断,因此可以尝试移植进去。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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