📄 red_tran.c
字号:
/****************************************************************************************************/
#include <REG2051.H>
/****************************************************************************************************/
//端口定义
sbit led =P1^6; //指示灯
sbit wave_bit=P1^7; //红外载波输出端
sbit key_1 =P3^2; //按键一
sbit key_2 =P3^3; //按键二(高级按键)
/****************************************************************************************************/
//标志位及全局变量
bit key1_bit=0; //按键1(普通用户)标志位
bit key2_bit=0; //按键2(高级用户)标志位
unsigned char normal_user_code[3]={0x55,0x03,0xaa}; //普通用户红外代码
unsigned char senior_user_code[3]={0x00}; //高级用户红外代码
/****************************************************************************************************/
//函数名称:ini_51
//函数功能:对51单片机的初始状态进行设置,供监控程序调用
//入口参数:无
//出口参数:无
//****备注:本函数中对51单片机初始状态进行设置的有:SCON,T0,T1,INT0,INT1
void ini_51(void)
{
wave_bit=0; //初始状态中不产生载波
PCON = PCON&0x7f; //取消波特率倍增位
SCON = 0x40; //串口工作在模式1
TMOD = 0x22; //T0,T1均工作在自重装的方式下
TL0 = 0xf4; //T0产生40KHz载波
TH0 = 0xf4;
TL1 = 0xe8; //波特率为1200
TH1 = 0xe8;
ET0 = 1 ; //允许T0中断
EX0 = 1 ; //允许外部中断0中断
EX1 = 1 ; //允许外部中断1中断
EA = 1 ; //开中断
TR1 = 1 ; //启动定时器1
}
/****************************************************************************************************/
//函数名称:t0_sev
//函数功能:定时器0中断服务程序
//入口参数:无
//出口参数:无
//****备注:用于产生40KHz载波
void t0_sev(void) interrupt 1
{
wave_bit=!wave_bit; //在单片机模拟载波的端口上产生40KHz的载波
}
/****************************************************************************************************/
//函数名称:int0_sev
//函数功能:外部中断0的中断服务函数
//入口参数:无
//出口参数:无
//****备注:用来将按键1(普通用户)标志位置位
void int0_sev(void) interrupt 0
{
EA=0;
key1_bit=1; //置按键1(普通用户)位
EA=1;
}
/****************************************************************************************************/
//函数名称:int1_sev
//函数功能:外部中断1的中断服务函数
//入口参数:无
//出口参数:无
//****备注:用来将按键2(高级用户)标志位置位
void int1_sev(void) interrupt 2
{
EA=0;
key2_bit=1; //置按键2(高级用户)位
EA=1;
}
/****************************************************************************************************/
//函数名称:delay
//函数功能:软件产生延迟时间
//入口参数:具体需要延时时间的参数
//出口参数:无
//****备注:无
void delay(unsigned int N)
{
unsigned int i;
for(i=0;i<N;i++);
}
/****************************************************************************************************/
//函数名称:uart_tran
//函数功能:串口数据发送
//入口参数:指向地址的指针
//出口参数:无
//****备注:无
void uart_tran(unsigned char *p)
{
SBUF=*p; //发送数据
while(TI==0) //未发送完成,等待
{;}
if(TI) //发送完成
{
TI=0; //清发送中断标志位
}
}
/****************************************************************************************************/
//函数名称:key1_manage
//函数功能:按键1(普通用户)处理程序
//入口参数:无
//出口参数:无
//****备注:无
void key1_manage(void)
{
unsigned char i,j;
unsigned char start_byte=0x55; //数据包的开始字节,用于同步数据的传送
unsigned char end_byte=0xaa; //数据包的结束字节,用于结束数据的传送
normal_user_code[0]=start_byte;
normal_user_code[2]= end_byte;
led=0; //点亮指示灯
for(j=0;j<3;j++) //按键一次发送三次
{
for(i=0;i<3;i++)
{
EA =1; //允许中断,制造载波
TR0=1; //启动T0,制造载波
uart_tran(normal_user_code+i); //一次发送三个字节
TR0=0; //一个字节的数据发送完毕,停止载波的制造
EA =0; //关中断,避免按键中断的触发
wave_bit=0; //禁止红外的输出
}
delay(1500); //延时约30MS
}
led=1; //动作完毕后,关闭指示灯
}
/****************************************************************************************************/
//函数名称:key2_manage
//函数功能:按键2(普通用户)处理程序
//入口参数:无
//出口参数:无
//****备注:无
void key2_manage(void)
{
;
}
/****************************************************************************************************/
//函数名称:main
//函数功能:监控程序
//入口参数:无
//出口参数:无
//****备注:无
void main(void)
{
ini_51();
while(1)
{
if(key1_bit)
{
EA=0; //关中断,禁止按键的再次中断
key1_bit=0; //清按键1(普通用户)标志位
delay(1000); //延时20MS左右
if(key_1==0) //若此时按键1(普通用户)的状态仍为0,表示确实有键按下
{
while(key_1==0)
{;} //在按键松开前一直等待
key1_manage(); //在按键松开后即执行按键相应的处理程序
}
else {break;} //无键按下,空动作
EA =1; //一次按键的动作执行完毕,开中断等待下次中断的到来
}
if(key2_bit)
{
key2_bit=0; //清按键2(高级用户)标志位
}
}
}
/****************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -