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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 1124|回復(fù): 3
打印 上一主題 下一主題
收起左側(cè)

stc15單片機(jī)芯片換成52芯片 出現(xiàn)問(wèn)題

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:1096616 發(fā)表于 2023-12-22 20:33 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
單片機(jī)實(shí)現(xiàn)電子密碼鎖功能
這個(gè)時(shí)我嘗試實(shí)現(xiàn)論壇上的一個(gè)大佬文檔的電子密碼鎖,希望將其的stc15芯片換成52單片機(jī),所以修改了部分和刪除了部分,但是為什么無(wú)法重現(xiàn)那個(gè)大佬的功能,問(wèn)題是出在哪里?如果是都有錯(cuò),請(qǐng)問(wèn)我應(yīng)該如何修改
  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);  //寫(xiě)指令函數(shù)
  18. void lcd_clear();
  19. void xianshi(void);//LCD顯示函數(shù)
  20. void right1(void);  //輸入密碼正確的顯示函數(shù)
  21. void wrong1(void);  //輸入密碼錯(cuò)誤后的顯示函數(shù)
  22. void verify(); //驗(yàn)證密碼
  23. void copy(); //復(fù)制密碼
  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)     //毫秒函數(shù)定義
  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(); //先對(duì)顯示的數(shù)組進(jìn)行賦值,以免出現(xiàn)顯示錯(cuò)誤
  49.                                 input(); //輸入密碼
  50.                                 if(keyscan()==12)
  51.                                 lcd_clear();
  52.                                 copy();
  53.                                 input(); //若按下重置鍵,則重新輸入
  54.                                 if(keyscan()==13)
  55.                                 { verify(); //按下確認(rèn)鍵,對(duì)密碼進(jìn)行驗(yàn)證
  56.                                         if(ver==0)
  57.                                         {lcd_clear();
  58.                                         right1(); //密碼正確
  59.                                         }
  60.           else
  61.           {                                         lcd_clear();
  62.                                                 copy();
  63.                                                 wrong1();        //密碼錯(cuò)誤
  64.                                         }                                                
  65.                                 }
  66.                                 if(keyscan()==15)
  67.                                 {
  68.                                         lcd_clear();
  69.                                         copy();
  70.                                         verify();  //按下重置密碼鍵之后,先確認(rèn)之前輸入的密碼是否正確
  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. /**********************檢查忙標(biāo)志函數(shù)************************/
  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)  //寫(xiě)指令函數(shù)
  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) //寫(xiě)數(shù)據(jù)函數(shù)
  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);//顯示模式設(shè)置
  157.         write_cmd(0x0c);//顯示開(kāi)關(guān),光標(biāo)沒(méi)有閃爍
  158.         write_cmd(0x06);//顯示光標(biāo)移動(dòng)設(shè)置
  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; //確認(rèn)有鍵按下后,如果按下的不是數(shù)字鍵0-9,則跳出循環(huán)
  175.                                 key=keyscan();
  176.                                 SHURU[i]=key+'0'; //將輸入的數(shù)字轉(zhuǎn)化為字符變量存入‘SHURU’和‘SHUZU'兩個(gè)數(shù)組中
  177.                                 SHUZU[i]=SHURU[i];
  178.                                 SHURU[i+1]='a';  //對(duì)"SHURU"數(shù)組的下一位賦值為a,避免在驗(yàn)證密碼時(shí)出錯(cuò)
  179.                                 xianshi(); //顯示函數(shù)
  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])  //驗(yàn)證密碼是否正確
  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; //再確認(rèn)要重置密碼后,把輸入的新密碼存入'SHUZU'數(shù)組中,若按下確認(rèn)鍵則跳出
  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”數(shù)組中
  268.         }
  269.         lcd_clear();
  270.         copy();
  271. }
復(fù)制代碼

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:364201 發(fā)表于 2023-12-23 08:32 | 只看該作者
不能直接移植的,15系列是8952系列的升級(jí)版本,15系列的很多寄存器8952系列是沒(méi)有的
回復(fù)

使用道具 舉報(bào)

板凳
ID:1096616 發(fā)表于 2023-12-23 17:56 | 只看該作者
597259498 發(fā)表于 2023-12-23 08:32
不能直接移植的,15系列是8952系列的升級(jí)版本,15系列的很多寄存器8952系列是沒(méi)有的

好吧,我放棄這個(gè)思路
回復(fù)

使用道具 舉報(bào)

地板
ID:57657 發(fā)表于 2023-12-23 20:04 | 只看該作者
597259498 發(fā)表于 2023-12-23 08:32
不能直接移植的,15系列是8952系列的升級(jí)版本,15系列的很多寄存器8952系列是沒(méi)有的

部分寄存器和中斷是STC專(zhuān)屬的,其他品牌單片機(jī)是沒(méi)有的。
樓主使用的 reg51.h 且沒(méi)有用到STC專(zhuān)屬寄存器或中斷,因此可以嘗試移植進(jìn)去。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 91在线免费视频观看 | 九色在线视频 | 成人h片在线观看 | av手机天堂 | 欧美精品久久久久久久多人混战 | 久久一区二区三区四区 | 黄色大片免费观看 | 亚洲欧美日韩一区 | 欧美成人一区二区三区 | 在线观看中文字幕 | 中文字幕日本在线 | 超碰成人网 | 另类专区亚洲 | 狠狠操夜夜操 | 宅男噜噜噜66一区二区 | 精品国产91 | 欧美日韩免费在线观看 | 日韩精品网站 | 国产黄色免费 | 手机成人在线视频 | 久久午夜精品 | 国产一区免费视频 | 国产成人精品视频 | 日韩免费看 | 日本成人一区二区三区 | 国产成人精品av在线观 | 一区二区三区四区国产 | 在线一区二区视频 | 日韩在线不卡视频 | 日韩国产一区二区三区 | 亚洲伊人影院 | 日韩一区二区在线观看视频 | 九九热在线精品视频 | 天天搞天天搞 | 欧美一区二区三区成人 | 欧美精品成人一区二区在线观看 | 欧美人与野 | 福利网站在线观看 | 精品免费在线观看 | 中文字幕黄色片 | 午夜av在线播放 |