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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1015|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 免费在线h视频 | 鲁一鲁资源影视 | 日韩视频91| 日本一二三区在线观看 | 色综合一区| 国产精品一区二区视频 | 曰韩一二三区 | www.av7788.com| 国产清纯白嫩初高生在线播放视频 | 91精品国产一区二区在线观看 | 国内精品一区二区三区 | 91视视频在线观看入口直接观看 | 亚洲精品白浆高清久久久久久 | 免费国产一区二区视频 | 中文亚洲视频 | 色一情一乱一伦一区二区三区 | 不卡视频一区 | 欧美九九 | 久久久久久国产精品久久 | a免费视频 | 亚欧洲精品在线视频免费观看 | 男女视频在线观看网站 | 在线观看国产 | 色视频欧美 | 精品在线 | 最新91在线 | 久久国产精品久久 | av免费网站在线观看 | 久久久精品网站 | 欧美日韩中文字幕 | 毛片在线看片 | 欧美国产精品一区二区三区 | 欧美日韩精品专区 | 欧美白人做受xxxx视频 | 国产美女在线观看 | 欧美日韩成人在线 | 成人av免费网站 | 精品视频一区二区三区在线观看 | 污视频在线免费观看 | 欧美福利久久 | 日韩精品一区二区三区中文在线 |