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