- <p>#include <reg52.h>
- #include <stdio.h> //printf头文件
- #define uc unsigned char
- #define uint unsigned int
- </p><p>uc readByteCounter=0;
-
- void init()
- {
- TMOD=0x20; //定时器工作方式,选择了定时器1,工作方式2 八位初值自动重装的8位定时器。
- TH1=0xfd; //定时器1初值 ,设置波特率为9600 晶振11.0529MHZ?
- TL1=0xfd;
- TR1=1; //开启定时器1
- </p><p><font color="red"> REN=1;</font> //允许串行口接收位
- <font color="red">SM0=0;</font>
- <font color="red"> SM1=1;</font> //10位异步接收,(8位数据)波特率可变
-
- EA=1; //允许中断(总闸)
- ES=1; //允许串口中断
- }
- void main()
- {
- init();
- while(1)
- {
-
- }
- }
-
-
- void ser() interrupt 4
- {
- if(RI) //接收数据,手动将RI清0
- { </p><p> RI=0;
- ES=0;
- SBUF=readByteCounter;
- while(ti==0);
- TI=0;
- ES=1;
- readByteCounter++;</p><p> }
- if(TI) //发送数据
- {
- }
- }
- </p>
复制代码
我先说现象在设置串行口工作方式SCON的时候,我用的是位寻址顺序为这样
REN=1;
SM0=0;
SM1=1;
每次复位,RI就自动置1,就,进入串口中断了
但是改为
SM0=0;
SM1=1;
REN=1;
就ok
我的理解是这样的:这三位都是串行口控制寄存器SCON里的,
单片机刚上电时SCON被清零,因为串口方式为0,穿行口为同步移位寄存器的输入/输出方式,当执行完REN = 1这条语句后,它便直接开始从RXD引脚接收数据,并不管它连接的系统有无发送数据这是SM0和SM1还未被操作,可单片机串口寄存器已经收到数据,并且已经产生了串口中断。
REN位置不同,产生的疑问
但是问题来了,我直接
SM0=0;
SM1=0;
REN=1;
或者
REN=1;
SM0=0;
SM1=0;
不会出现复位就进入串口中断的现象??既然是串口方式0所引起的,我直接设为串口方式0,但没有出现位就进入串口中断的现象??和困惑
这是STC自动生成的代码。
void UartInit(void) //9600bps@11.0592MHz
{
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
AUXR &= 0xBF; //定时器1时钟为Fosc/12,即12T
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TL1 = 0xFD; //设定定时初值
TH1 = 0xFD; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
}
一周热门 更多>