#define MAIN_Fosc 22118400L //定义主时钟
#define SysTick 10000 // 次/秒, 系统滴答频率, 在4000~16000之间
#include "STC15Fxxxx.H"
//========================================================================
#define Timer0_Reload (65536UL - ((MAIN_Fosc + SysTick/2) / SysTick)) //Timer 0 中断频率, 0.1ms
#define Baudrate1 115200L
#define UART1_BUF_LENGTH 32
//红外采样时间宏定义 不要随意修改
#define IR_SAMPLE_TIME (1000000UL/SysTick) //查询时间间隔, us, 红外接收要求在60us~250us之间
#if ((IR_SAMPLE_TIME <= 250) && (IR_SAMPLE_TIME >= 60))
#define D_IR_sample IR_SAMPLE_TIME //定义采样时间,在60us~250us之间 100
#endif
#define D_IR_SYNC_MAX (15000/D_IR_sample) //SYNC max time 15 ms
#define D_IR_SYNC_MIN (9700 /D_IR_sample) //SYNC min time 9.7 ms
#define D_IR_SYNC_DIVIDE (12375/D_IR_sample) //decide data 0 or 1 12.375 ms
#define D_IR_DATA_MAX (3000 /D_IR_sample) //data max time 3 ms
#define D_IR_DATA_MIN (600 /D_IR_sample) //data min time 0.6 ms
#define D_IR_DATA_DIVIDE (1687 /D_IR_sample) //decide data 0 or 1 1.687 ms
#define D_IR_BIT_NUMBER 32 //bit number
//========================================================================
void IO_Init(void);
void PWM_Init(void);
void SetTimer2Baudraye(u16 dat);
void UART1_config(u8 brt);
void PrintString1(u8 *puts);
void PrintString2(u8 puts);
void Send_Num(u8 NUM);
void IR_RX_NEC(void);
void TIME0_Init(void);
u8 Get_IR_Key(u8 KEY);
void IR_Control_PWM(void);
//========================================================================
//红外接收程序变量声明
sbit P_IR_RX = P5^5; //定义红外接收输入IO口
sbit LED1=P1^5;
u8 IR_SampleCnt; //采样计数
u8 IR_BitCnt; //编码位数
u8 IR_UserH; //用户码(地址)高字节
u8 IR_UserL; //用户码(地址)低字节
u8 IR_data; //数据原码
u8 IR_DataShit; //数据移位
bit P_IR_RX_temp; //Last sample
bit B_IR_Sync; //已收到同步标志
bit B_IR_Press; //安键动作发生
u8 IR_code; //红外键码
u16 UserCode; //用户码
u8 IRCNT=0;
bit B_1ms; //1ms //1ms标志
u8 cnt_1ms; //1ms基本计时
//串口变量
u8 TX1_Cnt; //发送计数
u8 RX1_Cnt; //接收计数
bit B_TX1_Busy; //发送忙
u8 idata RX1_Buffer[UART1_BUF_LENGTH]; //接收缓存
//PWM变量
volatile u16 PWM_Vale1=128;
volatile u16 PWM_Vale2=128;
volatile u8 Key_ON=0;
//========================================================================
void main(void)
{
IO_Init();
UART1_config(2);
PWM_Init();
TIME0_Init();
LED1=1;
cnt_1ms = SysTick / 1000;
EA = 1; //开总中断
while(1)
{
if(B_1ms==1)
{
B_1ms=0;
IR_Control_PWM();
Send_Num(IRCNT);
PrintString2(13);
PrintString2(10);
Send_Num(PWM_Vale1);
PrintString2(13);
PrintString2(10);
}
}
}
//========================================================================
void IO_Init(void)
{
P1M1 = 0; P1M0 = 0; //设置为准双向口
P3M1 = 0; P3M0 = 0; //设置为准双向口
P5M1 = 0; P5M0 = 0; //设置为准双向口
}
//========================================================================
void PWM_Init(void)
{
//PCA0
AUXR1 &= ~0x00;
AUXR1 |= 0x00; //切换IO口, 0x00: P1.2 P1.1 P1.0 P3.7, 0x10: P3.4 P3.5 P3.6 P3.7, 0x20: P2.4 P2.5 P2.6 P2.7
CCAPM0 = 0x42; //工作模式 PWM0
CCAPM1 = 0x42; //工作模式 PWM1
PCA_PWM0 = (PCA_PWM0 & ~0xc0) | 0x00; //PWM宽度, 0x00: 8bit, 0x40: 7bit, 0x80: 6bit
PCA_PWM1 = (PCA_PWM1 & ~0xc0) | 0x00; //PWM宽度, 0x00: 8bit, 0x40: 7bit, 0x80: 6bit
CMOD = (CMOD & ~0xe0) | 0; //选择时钟源, 0x00: 12T, 0x02: 2T, 0x04: Timer0溢出, 0x06: ECI, 0x08: 1T, 0x0A: 4T, 0x0C: 6T, 0x0E: 8T
CR = 1;
PWM0_OUT_0();
PWM1_OUT_0();
}
//========================================================================
void TIME0_Init(void)
{
AUXR |=1<<7; //Timer0 set as 1T, 16 bits timer auto-reload,
TH0 = (u8)(Timer0_Reload / 256);
TL0 = (u8)(Timer0_Reload % 256);
ET0 = 1; //Timer0 interrupt enable
TR0 = 1; //Tiner0 run
}
//========================================================================
// 函数: void PrintString1(u8 *puts)
// 描述: 串口1发送字符串函数。
// 参数: puts: 字符串指针.
// 返回: none.
//========================================================================
void PrintString1(u8 *puts) //发送一个字符串
{
for (; *puts != 0; puts++) //遇到停止符0结束
{
SBUF = *puts;
B_TX1_Busy = 1;
while(B_TX1_Busy);
}
}
//========================================================================
// 函数: void PrintString1(u8 *puts)
// 描述: 串口1发送字节函数。
// 参数: puts: 字节.
// 返回: none.
//========================================================================
void PrintString2(u8 puts)
{
SBUF=puts;
B_TX1_Busy = 1;
while(B_TX1_Busy);
}
void Send_Num(u16 NUM)
{
u8 B_Num,S_Num,G_Num;
if(NUM>99)
{
B_Num=NUM/100+48;
S_Num=NUM%100/10+48;
G_Num=NUM%100%10+48;
PrintString2(B_Num);
PrintString2(S_Num);
PrintString2(G_Num);
}
else if(NUM>9)
{
S_Num=NUM/10+48;
G_Num=NUM%10+48;
PrintString2(S_Num);
PrintString2(G_Num);
}
else
{
G_Num=NUM+48;
PrintString2(G_Num);
}
}
//========================================================================
// 函数: SetTimer2Baudraye(u16 dat)
// 描述: 设置Timer2做波特率发生器。
// 参数: dat: Timer2的重装值.
// 返回: none.
//========================================================================
void SetTimer2Baudraye(u16 dat) // 选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率.
{
AUXR &= ~(1<<4); //Timer stop
AUXR &= ~(1<<3); //Timer2 set As Timer
AUXR |= (1<<2); //Timer2 set as 1T mode
TH2 = dat / 256;
TL2 = dat % 256;
IE2 &= ~(1<<2); //禁止中断
AUXR |= (1<<4); //Timer run enable
}
//========================================================================
// 函数: void UART1_config(u8 brt)
// 描述: UART1初始化函数。
// 参数: brt: 选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率.
// 返回: none.
//========================================================================
void UART1_config(u8 brt) // 选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率.
{
/*********** 波特率使用定时器2 *****************/
if(brt == 2)
{
AUXR |= 0x01; //S1 BRT Use Timer2;
SetTimer2Baudraye(65536UL - (MAIN_Fosc / 4) / Baudrate1);
}
/*********** 波特率使用定时器1 *****************/
else
{
TR1 = 0;
AUXR &= ~0x01; //S1 BRT Use Timer1;
AUXR |= (1<<6); //Timer1 set as 1T mode
TMOD &= ~(1<<6); //Timer1 set As Timer
TMOD &= ~0x30; //Timer1_16bitAutoReload;
TH1 = (u8)((65536UL - (MAIN_Fosc / 4) / Baudrate1) / 256);
TL1 = (u8)((65536UL - (MAIN_Fosc / 4) / Baudrate1) % 256);
ET1 = 0; //禁止中断
INT_CLKO &= ~0x02; //不输出时钟
TR1 = 1;
}
/*************************************************/
SCON = (SCON & 0x3f) | 0x40; //UART1模式, 0x00: 同步移位输出, 0x40: 8位数据,可变波特率, 0x80: 9位数据,固定波特率, 0xc0: 9位数据,可变波特率
// PS = 1; //高优先级中断
ES = 1; //允许中断
REN = 1; //允许接收
P_SW1 &= 0x3f;
P_SW1 |= 0x00; //UART1 switch to, 0x00: P3.0 P3.1, 0x40: P3.6 P3.7, 0x80: P1.6 P1.7 (必须使用内部时钟)
// PCON2 |= (1<<4); //内部短路RXD与TXD, 做中继, ENABLE,DISABLE
B_TX1_Busy = 0;
TX1_Cnt = 0;
RX1_Cnt = 0;
}
//========================================================================
//Synchro: low=9ms, high=4.5 / 2.25ms, low=0.5626ms
//Bit0: high=0.5626ms, low=0.5626ms
//Bit1: high=1.6879ms, low=0.5626ms
//frame rate = 108ms ( pause 23 ms or 96 ms)
//========================================================================
void IR_RX_NEC(void)
{
u8 SampleTime;
IR_SampleCnt++; //Sample + 1
F0 = P_IR_RX_temp; //Save Last sample status
P_IR_RX_temp = P_IR_RX; //Read current status IO状态
if(F0 && !P_IR_RX_temp) //Pre-sample is hig
KEY_PWM.zip_pwm调频_stc15 remote_红外解码_红外遥控 PWM_遥控 PWM
版权申诉
159 浏览量
2022-09-23
01:53:18
上传
评论
收藏 69KB ZIP 举报
JaniceLu
- 粉丝: 78
- 资源: 1万+
最新资源
- 基于python实现的基于PyQt5和爬虫的小说阅读系统.zip
- 机械设计整经机上纱自动化sw20非常好的设计图纸100%好用.zip
- Screenshot_20240427_031602.jpg
- 网页PDF_2024年04月26日 23-46-14_QQ浏览器网页保存_QQ浏览器转格式(6).docx
- 直接插入排序,冒泡排序,直接选择排序.zip
- 在排序2的基础上,再次对快排进行优化,其次增加快排非递归,归并排序,归并排序非递归版.zip
- 实现了7种排序算法.三种复杂度排序.三种nlogn复杂度排序(堆排序,归并排序,快速排序)一种线性复杂度的排序.zip
- 冒泡排序 直接选择排序 直接插入排序 随机快速排序 归并排序 堆排序.zip
- 课设-内部排序算法比较 包括冒泡排序、直接插入排序、简单选择排序、快速排序、希尔排序、归并排序和堆排序.zip
- Python排序算法.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈