標(biāo)題:
用STM32做的紅外遙控器密碼鎖源程序
[打印本頁]
作者:
卿如陌上塵
時(shí)間:
2017-8-4 16:04
標(biāo)題:
用STM32做的紅外遙控器密碼鎖源程序
0.png
(40.78 KB, 下載次數(shù): 42)
下載附件
2017-8-4 21:54 上傳
實(shí)驗(yàn)?zāi)康?
學(xué)習(xí)紅外遙控器的使用.
硬件資源:
1,DS0(連接在PA8)
2,串口1(波特率:9600,PA9/PA10連接在板載USB轉(zhuǎn)串口芯片CH340上面)
3,ALIENTEK 2.8/3.5/4.3/7寸TFTLCD模塊(通過GPIO驅(qū)動,連接關(guān)系見lcd.h)
4,定時(shí)器5(TIM5),使用TIM5_CH2(PA1)的輸入捕獲,來解碼紅外信號.
5,ALIENTEK紅外遙控器
實(shí)驗(yàn)現(xiàn)象:
本實(shí)驗(yàn)開機(jī)在LCD上顯示一些信息之后,即進(jìn)入等待紅外觸發(fā),如過接收到正確的紅外信號,則解碼,并在LCD上顯示
鍵值和所代表的意義,以及按鍵次數(shù)等信息。同樣我們也是用DS0來指示程序正在運(yùn)行。
注意事項(xiàng):
1,4.3寸和7寸屏需要比較大電流,USB供電可能不足,請用外部電源供電(5V電源,接VOUT2即可).
2,本例程在LCD_Init函數(shù)里面(在ILI93xx.c),用到了printf,如果不初始化串口1,將導(dǎo)致液晶無法顯示!!
3,LCD模塊在開發(fā)板的LCD接口上面,必須靠右插
4,紅外遙控器尾部默認(rèn)帶了一個(gè)小塑料片擋住電池供電,正常使用之前,請抽出這個(gè)塑料墊片.
單片機(jī)源程序如下:
#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "lcd.h"
#include "remote.h"
#include "string.h"
//ALIENTEK Mini STM32開發(fā)板范例代碼22
//紅外遙控實(shí)驗(yàn)
u8 *in_pwd1=0;
u8 *in_pwd2=0;
u8 *in_pwd3=0;
u8 *in_pwd4=0;
u8 *in_pwd5=0;
u8 *in_pwd6=0;
u8 *str=0;
int fall_time=0;
u8 open_pwd[6]="123456";//初始密碼
u8 root_pwd[6]="666666";//管理員密碼
int in_time=0;
int mykey=0;//控制in_time每按一個(gè)按鍵只加一次的坎兒
void re_in(void);//重置/重新輸入
void root_h(void);//管理員函數(shù)
int main(void)
{
u8 key;
u8 t=0;
delay_init(); //延時(shí)函數(shù)初始?
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 設(shè)置中斷優(yōu)先級分組2
uart_init(9600); //串口初始化為9600
LED_Init(); //初始化與LED連接的硬件接口
LCD_Init();
Remote_Init(); //紅外接收初始化
POINT_COLOR=BLACK;//設(shè)置字體為紅色
LCD_ShowString(30,50,200,16,16,"---ordinary mode---");
LCD_ShowString(30,70,200,16,16,"Please enter 6 password");
//LCD_ShowString(60,90,200,16,16,"ATOM@ALIENTEK");
//LCD_ShowString(60,110,200,16,16,"2014/3/12");
// LCD_ShowString(60,130,200,16,16,"KEYVAL:");
// LCD_ShowString(60,150,200,16,16,"KEYCNT:");
// LCD_ShowString(60,170,200,16,16,"SYMBOL:");
LCD_ShowString(60,200,200,16,16,"PASSWD:");
//LCD_ShowxNum(116,220,0,6,16,1);
while(1)
{
key=Remote_Scan();
if(key)
{
// LCD_ShowNum(116,130,key,3,16); //顯示鍵值
// LCD_ShowNum(116,150,RmtCnt,3,16); //顯示按鍵次數(shù)
switch(key)
{
case 0:str="ERROR";break;
case 162:str="POWER";re_in();break;
case 98:str="UP";break;
case 2:str="PLAY";break;
case 226:str="ALIENTEK";break;
case 194:str="RIGHT";break;
case 34:str="LEFT";break;
case 224:str="VOL-";break;
case 168:str="DOWN";break;
case 144:str="VOL+";break;
case 104:str="1";break;
case 152:str="2";break;
case 176:str="3";break;
case 48:str="4";break;
case 24:str="5";break;
case 122:str="6";break;
case 16:str="7";break;
case 56:str="8";break;
case 90:str="9";break;
case 66:str="0";break;
case 82:str="DELETE";break;
}
// LCD_Fill(116,170,116+8*8,170+16,WHITE); //清楚之前的顯示
// LCD_ShowString(116,170,200,16,16,str); //顯示SYMBOL
if(RmtCnt==1&&mykey==0)
{
in_time++;
//LCD_Fill(116,220,116+8*8,220+16,WHITE);//清除顯示輸入了多少位
//LCD_ShowxNum(116,220,in_time,6,16,1);//顯示輸入了多少位
if(in_time==1)
{
LCD_Fill(116,130,240,200+16,WHITE);//清除之前輸入的密碼以及open the door
}
if(str=="0"||//限制:只有數(shù)字才能作為密碼輸入
str=="1"||
str=="2"||
str=="3"||
str=="4"||
str=="5"||
str=="6"||
str=="7"||
str=="8"||
str=="9")
{
switch(in_time)
{
case 1:in_pwd1=str;LCD_ShowString(116,200,200,16,16,in_pwd1);delay_ms(200);LCD_ShowString(116,200,200,16,16,"*");break;
case 2:in_pwd2=str;LCD_ShowString(116+8,200,200,16,16,in_pwd2);delay_ms(200);LCD_ShowString(116+8,200,200,16,16,"*");break;
case 3:in_pwd3=str;LCD_ShowString(116+16,200,200,16,16,in_pwd3);delay_ms(200);LCD_ShowString(116+16,200,200,16,16,"*");break;
case 4:in_pwd4=str;LCD_ShowString(116+24,200,200,16,16,in_pwd4);delay_ms(200);LCD_ShowString(116+24,200,200,16,16,"*");break;
case 5:in_pwd5=str;LCD_ShowString(116+32,200,200,16,16,in_pwd5);delay_ms(200);LCD_ShowString(116+32,200,200,16,16,"*");break;
case 6:in_pwd6=str;LCD_ShowString(116+40,200,200,16,16,in_pwd6);delay_ms(200);LCD_ShowString(116+40,200,200,16,16,"*");break;
}
}
mykey=1;//設(shè)置為1防止再次進(jìn)入
}
if(in_time==6)
{
if(*in_pwd1==open_pwd[0]&&//普通用戶配對成功
*in_pwd2==open_pwd[1]&&
*in_pwd3==open_pwd[2]&&
*in_pwd4==open_pwd[3]&&
*in_pwd5==open_pwd[4]&&
*in_pwd6==open_pwd[5])
{
LED1=0;
fall_time=0;
LCD_Fill(116,200,116+64,200+16,WHITE);//清除之前輸入的密碼
LCD_ShowString(116,200,200,16,16,"Welcome");
LCD_ShowString(116,130,200,16,16,"open the door!");
}
else if(*in_pwd1==root_pwd[0]&&//管理員用戶配對成功
*in_pwd2==root_pwd[1]&&
*in_pwd3==root_pwd[2]&&
*in_pwd4==root_pwd[3]&&
*in_pwd5==root_pwd[4]&&
*in_pwd6==root_pwd[5])
{
root_h();
}
else//配對失敗
{
LED1=1;
LCD_Fill(116,200,240,200+16,WHITE);//清除之前輸入的密碼
LCD_ShowString(116,200,200,16,16,"wrong password");
fall_time++;
LED0=!LED0;//紅燈閃爍提示
delay_ms(300);
LED0=!LED0;
delay_ms(300);
LED0=!LED0;
delay_ms(300);
LED0=!LED0;
LCD_Fill(116,200,240,200+16,WHITE);//清除wrong password
LED0=1;
}
in_time=0;
}
if(fall_time==5)
{
fall_time=0;
LCD_Fill(116,200,240,200+16,WHITE);//清除準(zhǔn)備顯示鎖定
LCD_ShowString(60,200,200,16,16,"Has been locked please wait 1 min");
fall_for_1min();
LED0=1;
LCD_Fill(116,200,240,200+16,WHITE);//清除Has been locked please wait 1 minute
LCD_ShowString(60,200,200,16,16,"PASSWD:");
}
}else
{
delay_ms(10);
mykey=0;//放手時(shí),歸零以便下次重新計(jì)數(shù)
}
t++;
if(t==20)
{
t=0;
//LED0=!LED0;
}
}
}
void re_in(void)//重置/重新輸入
{
LCD_Fill(116,200,116+64,200+16,WHITE);//清除之前輸入的密碼
//LCD_Fill(116,220,116+8*8,220+16,WHITE);
LCD_ShowString(116,130,200,16,16,"close the door!");//提示關(guān)門
delay_ms(800);
LCD_Fill(116,130,240,200+16,WHITE);//清除之前輸入的密碼
in_time=0;
LED1=0;
delay_ms(200);
LED1=1;
}
void root_h(void)//管理員用戶函數(shù)
{
u8 key;
in_time=0;
mykey=0;
in_pwd1="0";
in_pwd2="0";
in_pwd3="0";
in_pwd4="0";
in_pwd5="0";
in_pwd6="0";
LED1=!LED1;//綠燈閃爍提示
delay_ms(100);
LED1=!LED1;
delay_ms(100);
LED1=!LED1;
delay_ms(100);
LED1=!LED1;
LCD_Fill(30,50,240,110,WHITE);// 清除普通用戶界面提示
LCD_ShowString(60,50,200,16,16,"---root mode---");
LCD_ShowString(60,70,200,16,16,"you can change");
LCD_ShowString(60,90,200,16,16,"password here");
LCD_Fill(0,200,240,200+16,WHITE);//清除輸入密碼提示以及密碼
LCD_ShowString(60,200,200,16,16,"NEWPWD:");//提示輸入新密碼
do
{
//LCD_ShowString(60,70,200,16,16,"REMOTE TEST");
//LCD_ShowString(60,90,200,16,16,"ATOM@ALIENTEK");
//LCD_ShowString(60,110,200,16,16,"2014/3/12");
key=Remote_Scan();
if(key)
{
//LCD_ShowNum(116,130,key,3,16); //顯示鍵值
//LCD_ShowNum(116,150,RmtCnt,3,16); //顯示按鍵次數(shù)
switch(key)
{
case 0:str="ERROR";break;
case 162:str="POWER";re_in();break;
case 98:str="UP";break;
case 2:str="PLAY";break;
case 226:str="ALIENTEK";break;
case 194:str="RIGHT";break;
case 34:str="LEFT";break;
case 224:str="VOL-";break;
case 168:str="DOWN";break;
case 144:str="VOL+";break;
case 104:str="1";break;
case 152:str="2";break;
case 176:str="3";break;
case 48:str="4";break;
case 24:str="5";break;
case 122:str="6";break;
case 16:str="7";break;
case 56:str="8";break;
case 90:str="9";break;
case 66:str="0";break;
case 82:str="DELETE";break;
}
//LCD_Fill(116,170,116+8*8,170+16,WHITE); //清楚之前的顯示
//LCD_ShowString(116,170,200,16,16,str); //顯示SYMBOL
if(RmtCnt==1&&mykey==0)
{
in_time++;
//LCD_Fill(116,220,116+8*8,220+16,WHITE);//清除顯示輸入了多少位
//LCD_ShowxNum(116,220,in_time,6,16,1);//顯示輸入了多少位
if(in_time==1)
{
LCD_Fill(116,200,116+64,200+16,WHITE);//清除之前輸入的密碼
}
if(str=="0"||//限制:只有數(shù)字才能作為密碼輸入
str=="1"||
str=="2"||
str=="3"||
str=="4"||
str=="5"||
str=="6"||
str=="7"||
str=="8"||
str=="9")
{
switch(in_time)
{
case 1:in_pwd1=str;open_pwd[0]=*str;LCD_ShowString(116,200,200,16,16,in_pwd1);delay_ms(200);LCD_ShowString(116,200,200,16,16,"*");break;//第一次輸入
case 2:in_pwd2=str;open_pwd[1]=*str;LCD_ShowString(116+8,200,200,16,16,in_pwd2);delay_ms(200);LCD_ShowString(116+8,200,200,16,16,"*");break;//第二次輸入
case 3:in_pwd3=str;open_pwd[2]=*str;LCD_ShowString(116+16,200,200,16,16,in_pwd3);delay_ms(200);LCD_ShowString(116+16,200,200,16,16,"*");break;//第三次輸入
case 4:in_pwd4=str;open_pwd[3]=*str;LCD_ShowString(116+24,200,200,16,16,in_pwd4);delay_ms(200);LCD_ShowString(116+24,200,200,16,16,"*");break;//第四次輸入
case 5:in_pwd5=str;open_pwd[4]=*str;LCD_ShowString(116+32,200,200,16,16,in_pwd5);delay_ms(200);LCD_ShowString(116+32,200,200,16,16,"*");break;//第五次輸入
case 6:in_pwd6=str;open_pwd[5]=*str;LCD_ShowString(116+40,200,200,16,16,in_pwd6);delay_ms(200);LCD_ShowString(116+40,200,200,16,16,"*");break;//第六次輸入
}
}
if(in_pwd1=="6"&&in_pwd2=="6"&&in_pwd3=="6"&&in_pwd4=="6"&&in_pwd5=="6"&&in_pwd6=="6")
{
LCD_Fill(0,200,240,200+16,WHITE);//清除輸入新密碼提示以及新密碼
LCD_ShowString(60,200,200,16,16,"coudle not same as root");
LCD_ShowString(60,220,200,16,16,"password has been back to ");
LCD_ShowString(60,240,200,16,16,"123456");
open_pwd[0]=*"1";
open_pwd[1]=*"2";
open_pwd[2]=*"3";
open_pwd[3]=*"4";
open_pwd[4]=*"5";
open_pwd[5]=*"6";
delay_ms(1500);
LCD_Fill(0,200,240,260,WHITE);
}
mykey=1;//設(shè)置為1防止再次進(jìn)入
}
if(in_time==6)
{
in_time=0;
LCD_Fill(0,200,240,200+16,WHITE);//清除輸入新密碼提示以及新密碼
LCD_ShowString(60,200,200,16,16,"reset complete");
delay_ms(700);
LCD_Fill(60,50,240,110,WHITE);// 清除管理員用戶界面提示
LCD_ShowString(60,50,200,16,16,"---ordinary mode---");
LCD_Fill(0,200,240,200+16,WHITE);//清除Password reset complete
LCD_ShowString(60,200,200,16,16,"PASSWD:");
key=82;
}
}
else
{
delay_ms(10);
mykey=0;//放手時(shí),歸零以便下次重新計(jì)數(shù)
}
}while(key!=82);
LCD_Fill(60,50,240,110,WHITE);// 清除管理員用戶界面提示
LCD_ShowString(60,50,200,16,16,"---ordinary mode---");
LCD_Fill(0,200,240,200+16,WHITE);//清除Password reset complete
LCD_ShowString(60,200,200,16,16,"PASSWD:");
}
復(fù)制代碼
所有資料51hei提供下載:
紅外遙控器密碼鎖.rar
(378.81 KB, 下載次數(shù): 65)
2017-8-4 21:57 上傳
點(diǎn)擊文件名下載附件
紅外遙控
下載積分: 黑幣 -5
作者:
杜鵑花的心臟
時(shí)間:
2019-10-30 09:39
這個(gè)寫法很像學(xué)校要交的實(shí)驗(yàn)報(bào)告,就差手畫簡單原理圖了
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1