这个nop指令我明白了,但是我有一个新问题,就是如果我要100个机器周期,我如何循环用nop呢
在51单片机里,你可以通过使用循环语句来循环NOP指令,以实现100个机器周期的操作:
Loop:
MOV R0,#100 ;设置R0的值为100,这样会在下面的循环里生成100个机器周期
MOV R1,#0
Loop1:
NOP ;NOP指令
INC R1 ;使R1的值自增1
CJNE R1,R0,Loop1 ;如果R1的值不等于R0的值,就循环回Loop1
SJMP Loop ;跳转到Loop标签处,重新开始循环
这会在51单片机上运行100个机器周期。
不知道你这个问题是否已经解决, 如果还没有解决的话:得先说一下串口相关寄存器的基本知识(参考普中开发攻略):
(1)串口控制寄存器 SCO
SM0 和 SM1 为工作方式选择:
SM2(暂时咱们用不到):多机通信控制位,主要用于方式 2 和方式 3。当 SM2=1 时可以利用收到
的 RB8 来控制是否激活 RI(RB8=0 时不激活 RI,收到的信息丢弃;RB8=1 时收
到的数据进入 SBUF,并激活 RI,进而在中断服务中将数据从 SBUF 读走)。当
SM2=0 时,不论收到的 RB8 为 0 和 1,均可以使收到的数据进入 SBUF,并激活 RI
(即此时 RB8 不具有控制 RI 激活的功能)。通过控制 SM2,可以实现多机通信)
REN:允许串行接收位。由软件置 REN=1,则启动串行口接收数据;若软件置
REN=0,则禁止接收。
TB8:在方式 2 或方式 3 中,是发送数据的第 9 位,可以用软件规定其作用。
可以用作数据的奇偶校验位,或在多机通信中,作为地址帧/数据帧的标志位。
在方式 0 和方式 1 中,该位未用到。
RB8:在方式 2 或方式 3 中,是接收到数据的第 9 位,作为奇偶校验位或地
址帧/数据帧的标志位。在方式 1 时,若 SM2=0,则 RB8 是接收到的停止位。
TI:发送中断标志位。在方式 0 时,当串行发送第 8 位数据结束时,或在其
它方式,串行发送停止位的开始时,由内部硬件使 TI 置 1,向 CPU 发中断申请。
在中断服务程序中,必须用软件将其清 0,取消此中断申请。
RI:接收中断标志位。在方式 0 时,当串行接收第 8 位数据结束时,或在其
它方式,串行接收停止位的中间时,由内部硬件使 RI 置 1,向 CPU 发中断申请。
也必须在中断服务程序中,用软件将其清 0,取消此中断申请。
如何单片机单方面向PC端发送字符串:
参考以下代码:
u8 Buf[]="TIME IS UP!\n";//串口发送的字符串。
/*开启定时器1*/
void UART_init(void)
{
SCON = 0x50; //串口方式1
TMOD|= 0x20; // 定时器使用方式2自动重载
TH1 = 0xFD; //9600波特率对应的预设数,定时器方式2下,TH1=TL1
TL1 = 0xFD;
TR1 = 1;//开启定时器,开始产生波特率
}
void UART_send_byte(u8 dat) //仅是发送一个字符
{
SBUF = dat; //把数据放到SBUF中
while (TI == 0);//未发送完毕就等待
TI=0; //发送完毕后,要把TI重新置0
}
void UART_send_string(u8 *buf)//发送一个字符串
{
while (*buf != '\0')
{
UART_send_byte(*buf++);
}
}