久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
STM8S單片機紅外接收解碼程序 帶1602顯示
[打印本頁]
作者:
叫我紅領(lǐng)巾
時間:
2019-5-12 22:36
標題:
STM8S單片機紅外接收解碼程序 帶1602顯示
這幾天在網(wǎng)上找了很多關(guān)于紅外接收解碼的程序,但都不是很理想。一般都是用延時來作為0和1的數(shù)據(jù),或者注釋不是很詳細的,所以自己鼓搗了一個。
本程序是采用外部中斷加定時器1來實現(xiàn)紅外解碼,STM8S單片機ABCD口都可作為外部中斷,使用的遙控器為市面上大多數(shù)的。
需要的朋友們可以作為參考。
制作出來的實物圖如下:
8286B9909FB661B2C6A1C45E32BB4B50.png
(956.78 KB, 下載次數(shù): 66)
下載附件
效果圖
2019-5-12 22:35 上傳
單片機源程序如下:
/***************可識別用戶碼 解碼成功后顯示在1602并LED閃爍一次*****************/
#include "iostm8s208mb.h"//主控芯片的頭文件
#define u8 unsigned char
#define u16 unsigned int
#define u32 unsigned long
#define LED PI_ODR_ODR3
#define IR_IN PC_IDR_IDR1
#define LCD_EN PF_ODR_ODR4
#define LCD_RS PF_ODR_ODR0
#define LCD_DATA PB_ODR
//#define BUSY PB_ODR_ODR7
u16 LowTime,HighTime; //存儲高低電平的寬度
u8 Counter_Time_H,Counter_Time_L;
u8 a[4]; //存放碼值 分別為用戶碼 用戶反碼 數(shù)據(jù)碼 數(shù)據(jù)反碼
u8 tab[ ]= {"1602IR-CODE TEST"};
void delay_us(u16 n)
{
n<<=2;
while(--n);
}
void delay_ms(u16 t)
{
while(t--)
{
delay_us(1000);
}
}
void GPIO_Init(void)
{
EXTI_CR1|=0x20;//配置PC為僅下降沿觸發(fā)
PI_DDR_DDR3=1;//LED
PI_CR1_C13=1;
PI_CR2_C23=1;
LED=1;
PC_DDR_DDR1=0;//IR_IN
PC_CR1_C11=1;
PC_CR2_C21=1;
PF_DDR_DDR4=1;//EN
PF_CR1_C14=1;
PF_CR2_C24=1;
PF_DDR_DDR0=1;//RS
PF_CR1_C10=1;
PF_CR2_C20=1;
PB_DDR=0xff;//DATA
PB_CR1=0xff;
PB_CR2=0xff;
}
void Write_Com(u8 com)
{
LCD_RS=0;
LCD_DATA=com;
delay_ms(5);
LCD_EN=1;
delay_ms(5);
LCD_EN=0;
}
void Write_Data(u8 data)
{
LCD_RS=1;
LCD_DATA=data;
delay_ms(5);
LCD_EN=1;
delay_ms(5);
LCD_EN=0;
}
void LCD_Init(void)
{
LCD_EN=0;
Write_Com(0x38);
Write_Com(0x0c);
Write_Com(0x06);
Write_Com(0x01);
}
void TIM1_Init(void)
{
TIM1_CR1=0x00; //close timer1
TIM1_IER = 0x01; //允許更新中斷
TIM1_PSCRH=0x00; //16Mhz/16=1us,16分頻
TIM1_PSCRL=0x0f;
// TIM1_CNTRH=0x00;
// TIM1_CNTRL=0x00;
TIM1_ARRH=0xff; //自動裝載最大值
TIM1_ARRL=0xff;
}
void Clock_Init(void)
{
CLK_CKDIVR=0x00; //16M
}
void LED_ACT(void) //延時時間太大會影響靈敏度
{
LED=0;
delay_ms(10);
LED=1;
delay_ms(10);
}
u8 DeCode(void)
{
u8 i,j;
u8 temp; //暫存變量
for(i=0;i<4;i++) //
{
for(j=0;j<8;j++) //
{
temp=temp>>1; //
TIM1_CNTRH=0;
TIM1_CNTRL=0;
TIM1_CR1|=0x01;
while(IR_IN==0); //先判斷是否為0
TIM1_CR1=0x00;
Counter_Time_H=TIM1_CNTRH;
Counter_Time_L=TIM1_CNTRL;
LowTime=Counter_Time_H*256+Counter_Time_L; //
TIM1_CNTRH=0;
TIM1_CNTRL=0;
TIM1_CR1|=0x01;
while(IR_IN==1); //再判斷是否為1
TIM1_CR1=0x00;
Counter_Time_H=TIM1_CNTRH;
Counter_Time_L=TIM1_CNTRL;
HighTime=Counter_Time_H*256+Counter_Time_L;
if((LowTime<420)||(LowTime>690))
return 0; //太大或太小舍去
if((HighTime>460)&&(HighTime<660))
temp=temp&0x7f; //"0" 560us+-100
if((HighTime>1480)&&(HighTime<1880))
temp=temp|0x80; //"1" 1680us+-500
}
a[i]=temp;
}
// if(a[2]==~a[3])
return 1;
}
void two_2_bcd(u8 data) //將二進制碼轉(zhuǎn)換為BCD碼
{
u8 temp; //暫存
temp=data;
data&=0xf0;
data>>=4;
data&=0x0f;
if(data<=0x09)
{
Write_Data(0x30+data); //顯示0-9
}
else
{
data=data-0x09;
Write_Data(0x40+data); //顯示A-F
}
data=temp;
data&=0x0f;
if(data<=0x09)
{
Write_Data(0x30+data);
}
else
{
data=data-0x09;
Write_Data(0x40+data);
}
Write_Data(0x48); //顯示“H”
}
void Disp_1(void) //顯示第二行:碼值
{
Write_Com(0x80+0x40);
two_2_bcd(a[0]);
Write_Data(0x20); //空格
two_2_bcd(a[1]);
Write_Data(0x20); //空格
two_2_bcd(a[2]);
Write_Data(0x20); //空格
two_2_bcd(a[3]);
}
void Disp_2(void) //顯示第一行:固定字符
{
u8 num; //
Write_Com(0x80);
for(num=0;num<16;num++)
{
Write_Data(tab[num]);
delay_ms(5);
}
}
void CHECK_User(void)
{
// if((a[0]==0x00)&&(a[1]==0xff)) //判別用戶碼及反碼
// {
LED_ACT();
// }
}
void main(void)
{
asm("sim");//MAIN程序的優(yōu)先級配置為3級(關(guān)總中斷)
GPIO_Init();
Clock_Init();
TIM1_Init();
LCD_Init();
// delay_ms(10);
Write_Com(0x01); //清屏
Disp_2();
asm("rim");//MAIN程序的優(yōu)先級由3級降低至0級(開總中斷)
while(1);//死循環(huán)
}
#pragma vector=0x07
__interrupt void EXTI_PORTC_IRQHandler(void)
{
PC_CR2_C21=0;//禁止PC0端口外部中斷
TIM1_CNTRH=0;
TIM1_CNTRL=0;
TIM1_CR1=0x01; //open timer1
while(IR_IN==0);
TIM1_CR1=0x00; //
Counter_Time_H=TIM1_CNTRH;
Counter_Time_L=TIM1_CNTRL;
LowTime=Counter_Time_H*256+Counter_Time_L;
TIM1_CNTRH=0; //
TIM1_CNTRL=0; //
TIM1_CR1=0x01; //
while(IR_IN==1); //
TIM1_CR1=0x00; //
Counter_Time_H=TIM1_CNTRH;
Counter_Time_L=TIM1_CNTRL;
HighTime=Counter_Time_H*256+Counter_Time_L;
if((LowTime>8500)&&(LowTime<9500)&&(HighTime>4000)&&(HighTime<5000)) //引導(dǎo)碼9000us+-500 4500us+-500
{
if(DeCode()==1)
{
Disp_1();
CHECK_User();
}
}
PC_CR2_C21=1;//使能PC0端口外部中斷
}
#pragma vector=0x0D
__interrupt void TIM1_UPD_OVF_TRG_BRK_IRQHandler(void)
{
TIM1_SR1&=0xfe;//清除溢出中斷標志位"UIF"
}
復(fù)制代碼
所有資料51hei提供下載:
hw-1602.rar
(274.26 KB, 下載次數(shù): 65)
2019-5-12 22:35 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
cvi670
時間:
2021-6-1 08:33
不錯,思路很重要
歡迎光臨 (http://m.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
91网在线观看
|
黄色免费小视频
|
日本一区二区在线播放
|
深夜福利网址
|
亚洲二区在线观看
|
国产一区二区在线观看视频
|
99精品网
|
日韩视频第一页
|
在线日韩视频
|
精品一区在线播放
|
日本不卡在线视频
|
中文字幕在线观看网站
|
国产视频黄色
|
日韩三级精品
|
亚洲国产欧美日韩在线
|
成人夜色
|
成人激情在线观看
|
性久久久久久久
|
在线观看黄色片
|
亚洲综合在线播放
|
99超碰在线观看
|
另类小说第一草
|
成人深夜视频
|
亚洲一区二区在线免费观看
|
国产精品一区在线播放
|
午夜在线观看免费视频
|
精品国产乱码久久久久久蜜柚
|
亚洲成人a v
|
99久久婷婷国产综合精品草原
|
99精品视频在线
|
免费网站观看www在线观看
|
特级毛片爽www免费版
|
黄色成年人网站
|
成人免费视屏
|
亚洲资源在线
|
日韩免费视频一区二区
|
日本在线看片
|
天天舔天天操
|
欧美一级做性受免费大片免费
|
天天爽天天爽
|
国产成人精品一区二区三区四区
|