最近在研究STC8的单片机的串口中断,研究出来了,但是怕自己记忆力不好,所以把自己的学习内容记录一下,留着以后再用的时候可以找得到。
首先是串口的初始化配置,第一步是串口的初始化,对串口的相应寄存器进行配置,使用的单片机型号是STC8A8K64D4,该单片机有四个串口,这里使用的是串口二。
void Uart2Init(void)
{
P_SW2=0X87;
S2CON &=0X7F;
S2CON |= 0x10;
T2L = 0xE8;
T2H = 0xFF;
AUXR |= 0x10;
IE2 |=1;
wptr=0x00;
}
串口中断部分的程序主要是通过判断串口接收数据的第四位和第五位是否和程序的判断一致,通过第六位控制不同的引脚发送PWM波
void Uart2Isr() interrupt 8 using 1
{
if(S2CON&0x01)
{
S2CON&=~0x01;
buffer[wptr++]=S2BUF;
wptr&=0x0f;
P73=!P73;
}
//uart_tx_string("CCHUANKOUHONGDUAN");
}
主程序中会对串口接收到的数据进行判断
while(1)
{
if((buffer[3]==0x01)&&(buffer[4]=0x03))
{
bin=buffer[5];
}
P70=0;
if(bin==0x00)
{
can=0;
}
if(bin==0x01)
{
can=1;
}
if(bin==0x02)
{
can=2;
}
if(bin==0x03)
{
can=3;
}
if(bin==0x04)
{
can=4;
}
}
之后就是通过定时器0的中断控制引脚产生10Hz的PWM波
void int_Timer0(void) interrupt 1 using 0 //???0 ??????
{
u16 count_time0;
count_time0++; //50ms
P73=!P73;
// if(can==0)
{
if(count_time0%2==1) //
{
P11=0;
// P06=0;
// P62=0;
// P07=0;
}
else
{
P11=1;
// P06=1;
// P62=1;
// P07=1;
}
}
if(can==1)
{
if(count_time0%2==1) //
{
//P11=0;
P06=0;
// P62=0;
// P07=0;
}
else
{
// P11=1;
P06=1;
// P62=1;
// P07=1;
}
}
if(can==2)
{
if(count_time0%2==1) //
{
// P11=0;
// P06=0;
P62=0;
// P07=0;
}
else
{
// P11=1;
// P06=1;
P62=1;
// P07=1;
}
}
if(can==3)
{
if(count_time0%2==1) //
{
//P11=0;
// P06=0;
// P62=0;
P07=0;
}
else
{
//P11=1;
// P06=1;
// P62=1;
P07=1;
}
}
if(can==4)
{
if(count_time0%2==1) //
{
P11=0;
P06=0;
// P62=0;
// P07=0;
}
else
{
P11=1;
P06=1;
// P62=1;
// P07=1;
}
}
}
版权声明:本文为CSDN博主「kafukasudu」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/kafukasudu/article/details/122495604
最近在研究STC8的单片机的串口中断,研究出来了,但是怕自己记忆力不好,所以把自己的学习内容记录一下,留着以后再用的时候可以找得到。
首先是串口的初始化配置,第一步是串口的初始化,对串口的相应寄存器进行配置,使用的单片机型号是STC8A8K64D4,该单片机有四个串口,这里使用的是串口二。
void Uart2Init(void)
{
P_SW2=0X87;
S2CON &=0X7F;
S2CON |= 0x10;
T2L = 0xE8;
T2H = 0xFF;
AUXR |= 0x10;
IE2 |=1;
wptr=0x00;
}
串口中断部分的程序主要是通过判断串口接收数据的第四位和第五位是否和程序的判断一致,通过第六位控制不同的引脚发送PWM波
void Uart2Isr() interrupt 8 using 1
{
if(S2CON&0x01)
{
S2CON&=~0x01;
buffer[wptr++]=S2BUF;
wptr&=0x0f;
P73=!P73;
}
//uart_tx_string("CCHUANKOUHONGDUAN");
}
主程序中会对串口接收到的数据进行判断
while(1)
{
if((buffer[3]==0x01)&&(buffer[4]=0x03))
{
bin=buffer[5];
}
P70=0;
if(bin==0x00)
{
can=0;
}
if(bin==0x01)
{
can=1;
}
if(bin==0x02)
{
can=2;
}
if(bin==0x03)
{
can=3;
}
if(bin==0x04)
{
can=4;
}
}
之后就是通过定时器0的中断控制引脚产生10Hz的PWM波
void int_Timer0(void) interrupt 1 using 0 //???0 ??????
{
u16 count_time0;
count_time0++; //50ms
P73=!P73;
// if(can==0)
{
if(count_time0%2==1) //
{
P11=0;
// P06=0;
// P62=0;
// P07=0;
}
else
{
P11=1;
// P06=1;
// P62=1;
// P07=1;
}
}
if(can==1)
{
if(count_time0%2==1) //
{
//P11=0;
P06=0;
// P62=0;
// P07=0;
}
else
{
// P11=1;
P06=1;
// P62=1;
// P07=1;
}
}
if(can==2)
{
if(count_time0%2==1) //
{
// P11=0;
// P06=0;
P62=0;
// P07=0;
}
else
{
// P11=1;
// P06=1;
P62=1;
// P07=1;
}
}
if(can==3)
{
if(count_time0%2==1) //
{
//P11=0;
// P06=0;
// P62=0;
P07=0;
}
else
{
//P11=1;
// P06=1;
// P62=1;
P07=1;
}
}
if(can==4)
{
if(count_time0%2==1) //
{
P11=0;
P06=0;
// P62=0;
// P07=0;
}
else
{
P11=1;
P06=1;
// P62=1;
// P07=1;
}
}
}
版权声明:本文为CSDN博主「kafukasudu」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/kafukasudu/article/details/122495604
暂无评论