久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
STM8紅外程序(外中斷接收)
[打印本頁]
作者:
liuxin549521
時間:
2017-12-29 11:04
標題:
STM8紅外程序(外中斷接收)
STM8紅外程序
單片機源程序如下:
#include "stm8s.h"
#include "stm8s003f3p.h"
#include "STM8_IR.h"
#include "STM8_DELAY.h"
#define IR_READ (PC_IDR&(0x01<<7))
volatile uchar Flag_ir_start = 0;//啟動標志位
volatile uint IR_time = 0;
volatile unsigned long IR_data;
volatile uchar IR_temp[4];
void LED_Init(void)
{
PA_DDR |= (0x01<<3);//設置PA3為輸出
PA_CR1 |= (0x01<<3);//設置PA3為推挽輸出,速度為2MHz
PA_CR2 &=(uchar)(~(0x01<<3));
PA_ODR &=(uchar)(~(0x01<<3)); //關閉led
}
void TIM1_Init(void)
{
TIM1_CR1 = 0x00; //向上的計數方向,中斷計數不停
TIM1_IER = 0x01;
TIM1_PSCRH = 0x00; //進行16分頻
TIM1_PSCRL = 0x0f; //16Mhz/(15+1)=1Mhz-->1us
TIM1_ARRH = 0x00;
TIM1_ARRL = 20; //20us
TIM1_CR1 |=0x01;
}
//外中斷接收紅外數據
void EXIT_Init(void)
{
//01是PA,23是PB,45是PC,67是PD引腳
//P?IS[1:0] 設置觸發方式,00是下降沿觸發
EXTI_CR1 &=(uchar)(~(0x03<<4)); // PC下降沿觸發
EXTI_CR1 |= (0x01<<5);
}
void IR_Init(void)
{
PC_DDR &=(uchar)(~(0x01<<7));
PC_CR1 &=(uchar)(~(0x01<<7));
//PC_CR1 |= (0x01<<7);//上拉輸入
PC_CR2 |= (0x01<<7);//打開外部中斷
EXIT_Init();//RISING and falling EDGE
}
//位反轉算法
uchar reverse8( uchar c )
{
c = ( c & 0x55 ) << 1 | ( c & 0xAA ) >> 1;
c = ( c & 0x33 ) << 2 | ( c & 0xCC ) >> 2;
c = ( c & 0x0F ) << 4 | ( c & 0xF0 ) >> 4;
return c;
}
void IR_rx(void)
{
static uchar Flag_end=0;
static uchar IR_num = 0;
uchar i,temp;
//TIM1_CR1 &=(uchar)(~(0x01<<0));//關閉計數器
TIM1_CR1 |= (0x01<<0); //開啟計數器
//800us,17000us
if(IR_time<=40)////雜波
{
IR_data=0;
IR_num=0;
IR_time=0;
//TIM1_CR1 &=(uchar)(~(0x01<<0));//關閉計數器
return ;
}
//13000us
if(IR_time >= 650)//13ms則啟動成功
{
Flag_ir_start = 1;
IR_num = 0;
IR_data=0;
}
if((Flag_ir_start==1)&&(IR_time<=130))//2600us
{
IR_data<<=1;
if(IR_time>=85)//1700us
{
IR_data |= (0x01<<0);
}
IR_num++;
if(IR_num>31)
{
Flag_end = 1;
Flag_ir_start=0;
IR_time = 0;
}
}
if(Flag_end)
{
Flag_end = 0;
TIM1_CR1 &=(uchar)(~(0x01<<0));//關閉計數器
IR_temp[0] = (uchar)((IR_data>>0)&0xff);
IR_temp[1] = (uchar)((IR_data>>8)&0xff);
IR_temp[2] = (uchar)((IR_data>>16)&0xff);
IR_temp[3] = (uchar)((IR_data>>24)&0xff);
IR_data=0;
IR_num=0;
if(IR_temp[0]!=(uchar)(~IR_temp[1]))
{
//校驗失敗
//PA_ODR ^= (0x01<<3);
}
else
{
IR_temp[1] = reverse8(IR_temp[1]);//位反轉算法
if(IR_temp[1]==0x45)//0xa2
{
//PA_ODR ^= (0x01<<3);
PA_ODR |= (0x01<<3);
}
if(IR_temp[1]==0x46)
{
PA_ODR &=(uchar)(~(0x01<<3));
//PA_ODR |= (0x01<<3);
}
//PA_ODR &=(uchar)(~(0x01<<3));
}
}
IR_time = 0;
}
@far @interrupt void EXTI_PORTC_IRQHandler(void)
{
IR_rx();
}
//定時器1溢出中斷服務
@far @interrupt void timer1_isr(void) //10us
{
//TIM1_CR1 &=~(0x01<<0); //關閉計數器
TIM1_SR1 &=~(0x01<<0); //清除中斷標志
IR_time++;
//TIM1_CR1 |= (0x01<<0); //開啟計數器
//PA_ODR |= (0x01<<3);
//return ;
}
/*
void IR_rx(void)
{
static uchar Flag_end=0;
static uchar IR_num = 0;
TIM1_CR1 &=(uchar)(~(0x01<<0));//關閉計數器
//800us,17000us
if(IR_time<=80)////雜波
{
IR_data=0;
IR_num=0;
IR_time=0;
//PA_ODR ^= (0x01<<3);
return ;
}//
//13000us
if(IR_time >= 1300)//13ms則啟動成功
{
Flag_ir_start = 1;
IR_num = 0;
IR_data=0;
//
//PA_ODR |= (0x01<<3);
}
//
if((Flag_ir_start==1)&&(IR_time<=260))//2600us
{
IR_data<<=1;
if(IR_time>=170)//1700us
{
IR_data |= (0x01<<0);
}
IR_num++;
if(IR_num>31)
{
Flag_end = 1;
Flag_ir_start=0;
//PA_ODR ^= (0x01<<3);
}
}
if(Flag_end)
{
Flag_end = 0;
IR_temp[0] = (uchar)((IR_data>>0)&0xff);
IR_temp[1] = (uchar)((IR_data>>8)&0xff);
IR_temp[2] = (uchar)((IR_data>>16)&0xff);
IR_temp[3] = (uchar)((IR_data>>24)&0xff);
IR_data=0;
IR_num=0;
if(IR_temp[0]!=(uchar)(~IR_temp[1]))
{
}
else
{
//PA_ODR ^= (0x01<<3);
if(IR_temp[1]==0xa2)
{
//PA_ODR ^= (0x01<<3);
PA_ODR |= (0x01<<3);
}
if(IR_temp[1]<0x7f)
{
PA_ODR &=(uchar)(~(0x01<<3));
//PA_ODR |= (0x01<<3);
}
//PA_ODR &=(uchar)(~(0x01<<3));
}
}
IR_time = 0;
TIM1_CR1 |= (0x01<<0);//開計數器
}*/
復制代碼
/********************************************\
_ooOoo_
o8888888o
88" . "88
(| -_- |)
O\ = /O
____/`---'\____
.' \\| |// `.
/ \\||| : |||// \
/ _||||| -:- |||||- \
| | \\\ - /// | |
| \_| ''\---/'' | |
\ .-\__ `-` ___/-. /
___`. .' /--.--\ `. . __
."" '< `.___\_<|>_/___.' >'"".
| | : `- \`.;`\ _ /`;.`/ - ` : | |
\ \ `-. \_ __\ /__ _/ .-` / /
======`-.____`-.___\_____/___.-`____.-'======
`=---='
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
佛祖保佑 永無BUG
楠A407舍長出品
\********************************************/
#include "stm8s.h"
#include "stm8s003f3p.h"
#include "STM8_IR.h"
#define uchar unsigned char
#define uint unsigned int
_Bool Flag_ir = 0;
void STM8_CLK_Init(void)
{
CLK_HSICmd(ENABLE);//HSI = 16MHz
CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1); //f_psc = 16MHz/1
}
//--------------------主函數分割線---------------------
//
//
//-----------------------------------------------------
void main(void)
{
unsigned char re ;
unsigned char reg;
_asm("sim");//關全部中斷
STM8_CLK_Init();//內部HSI,16MHz
LED_Init();
IR_Init();
TIM1_Init();
_asm("rim");//開全部中斷
while(1)
{
//IR_test();
}
}
復制代碼
所有資料51hei提供下載:
STM8_IR_test.rar
(4.02 MB, 下載次數: 79)
2017-12-29 11:03 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
chengfgc
時間:
2018-4-26 10:42
學習下,不知道能不能用上
作者:
hefeng898961
時間:
2018-7-23 08:55
感謝分享
作者:
Null520
時間:
2019-5-22 15:54
樓主程序不對呀
作者:
INIT0
時間:
2019-6-1 15:48
Null520 發表于 2019-5-22 15:54
樓主程序不對呀
是不對。。定時器是不是開早了。而且沒見到差值或清0 CNTR
作者:
zhjf103
時間:
2019-7-9 21:58
不錯,學習學習!
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
成人精品国产
|
日韩激情网
|
日韩欧美一区二区三区免费观看
|
日韩一区二区在线观看
|
成人在线精品
|
最新国产视频
|
在线播放国产视频
|
欧美激情区
|
日本一区二区三区在线观看
|
精品国产视频在线观看
|
懂色一区二区三区免费观看
|
免费能直接在线观看黄的视频
|
中文字幕日韩一区
|
久久三级影院
|
成人欧美一区二区三区黑人孕妇
|
天堂中文字幕av
|
国产视频不卡一区
|
日韩一级在线
|
精品欧美乱码久久久久久
|
成人一级毛片
|
久久精品一区
|
久久久成人精品
|
天堂一区
|
国产成人高清在线观看
|
久久黄色
|
在线视频一区二区三区
|
手机在线观看
|
在线播放中文字幕
|
亚洲精品v
|
亚卅毛片
|
国产美女特级嫩嫩嫩bbb片
|
国产精品久久久久久一区二区三区
|
国产成人精品一区二区三区四区
|
久久精品亚洲精品国产欧美
|
精品三级在线观看
|
国产一区二区久久久
|
www.99热
|
国产精品国产三级国产aⅴ中文
|
人人干在线视频
|
亚洲不卡在线观看
|
国产午夜精品一区二区三区嫩草
|