STC8学习6 ——串口

中断的小技巧,对新的中断,想要了解触发源和标志位可以直接去中断表里面去看,对应的中断。中断请求位和中断允许位。

1.串口通信,硬件上是通过 USB转TTL实现的,USB传输数据用 USB协议,TTL使用的是串口协议,不能直接进行通信,需要用CH340芯片进行转换。

2.STC-ISP上有串口配置生成器,下面就是按照35MHz,波特率115200,8位可变数据,定时器1自动重装产生的配置

SCON = 0b0101000; 配置串口工作模式8位数据可变波特率,允许串口接收数据

 常规的定时器配置    

    AUXR |= 0x40;        //定时器1时钟为Fosc,即1T
    AUXR &= 0xFE;        //串口1选择定时器1为波特率发生器
    TMOD &= 0x0F;        //设定定时器1为16位自动重装方式

按照用户手册上的计算公式 65536 -  35MHz/(4 * 波特率) = 65460 (有小数四舍五入,误差1可以接受哈) = 0xFFB4 

串口初始化完成后,电脑就可以通过ISP上的串口助手和单片机进行通信了。

第一种方法就是查询法进行通信,单片机收发8位数据会分别修改标志位RI,TI置为1,TI,RI都需要手动清0。用if(RI ==1)来判断是否有输入,接受的数据会存放到SBUF寄存器里面,对SBUF寄存器做取值操作就是取出接受到的数据。对SBFU寄存器输入数据,就会将数据通过串口发送出去。

注:关于SBUF寄存器

SBUF:51单片机中的特殊寄存器,串行数据缓冲器(一个接收一个发送),两个其实是共用的一个地址99H,但是两个在物理上面是分开的。

当发送使用时,就采用SBUF=XXX;  (XXX为需要传送的数据)

当接收使用时,采用XXX=SBUF;

如果要对接收的数据进行校验,就可以将数据取出后,进行比对。

    unsigned char b;
     .....
     .....
            b = SBUF ;
          ....
            if(b == 0x01)
         {

对应的将数据发送,就可以先将数据放置进去,while(! TI);循环确保数据发送完前没有其他操作

 SBUF = x;   

while(! TI);

TI = 0;


void UartInit(void)        //115200bps@35MHz
{
    SCON = 0x50;        //8位数据,可变波特率
    AUXR |= 0x40;        //定时器1时钟为Fosc,即1T
    AUXR &= 0xFE;        //串口1选择定时器1为波特率发生器
    TMOD &= 0x0F;        //设定定时器1为16位自动重装方式
    TL1 = 0xB4;        //设定定时初值
    TH1 = 0xFF;        //设定定时初值
    ET1 = 0;        //禁止定时器1中断
    TR1 = 1;        //启动定时器1
}

void UartSendByte(unsigned char a)
{
  SBUF = a;
    while(!TI);
    TI = 0;
    
}
    
void  main(void)
{        
    unsigned char b;
    P0M0 = 0x00;
    P0M1 = 0x00;


    UartInit();
    while(1)
    {
        
    if(RI == 1 )
        {
            RI = 0; //RI需要手动清零
            b = SBUF ;
            UartSendByte('b');
            if(b == 0x01)
         {
          LED_RED = !LED_RED;
          LED_GREEN = !LED_GREEN;    
         }
                
        }

        
    }
}

第二种方法,中断法。 串口也是有中断的。

啊,例程可以正常跑,我写的就根本跑不动,坑

只能先放放,后面在看看。

发送完数据,接收完数据,就会进入中断

对串口的初始化和前面一样。使能相关的中断之后,写中断服务函数就可以了。

EA = 1;使能总中断

ES = 1;使能串口1中断

void UART1_Isr(void) interrupt 4

{

       if(TI)    // 如果发送完数据
    {
        TI = 0;         //清除发送完成中断标志
        LED_R = !LED_R; //改变红色LED的显示状态
    }
    if(RI)   // 如果接收完数据
    {
        RI = 0;         //清除接收完成中断标志
        if(SBUF == 0X66) // 判断接收到的数据是不是0x66
            LED_Y = !LED_Y; //改变黄色LED的显示状态
    }

}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部