80C52中的串口通过SCON寄存器配置波特率位可变的,因此,需要通过计算定时器1的参与,在定时器配置过程中选择定时器的相关寄存器TMOD来配置定时器的模式为模式2(8位自动重装定时器,如上图,TL1为计数器,TH1为保存重装的值,TL1当从0计数到255时,接下来就会产生溢出,溢出时,硬件就会自动触发一个中断事件,其标志位TF1就会被置1,去执行相应的中断服务函数,)在触发时间发生的过程中,此时TH1会被装载TL1上一次保留的数据,也就是说在原来的计数周期上继续计数,保持一个连续性,例如,我们用十进制计数,当TL1记满为10,此时TL1继续累计到11(溢出了),就会触发一个中断事件,TL1的这个数值10就会被保存到TH1中,然后,TL1在执行的时候就会从10开始计数。就相当于TH1的值装入了TL1,然后接下来的重装值就会从TH1重新加载,一般情况下,TL1和TH1的值一样,(前几个实验我们的定时器0配置是采用的16位没有重装的,每一次进入中断还要把初始值恢复配置的初始值,如下图代码0 = 0x66; //设置定时初值
TH0 = 0xFC; //设置定时初值 ,,还要重新赋初值),而自动重装就时自动完成,无需人工干预,硬件自动完成。方便的一批(Whappy个人理解,如有不好请各路神仙指教)
/*定时器中断函数模板
void Timer0_Rountine(void) interrupt 1
{
static unsigned int T0Count ; //Timer0_Rountine(void) 函数结束之后T0Count保留其原来的值
TL0 = 0x66; //设置定时初值
TH0 = 0xFC; //设置定时初值
T0Count++;
if(T0Count >= 1000)
{
T0Count = 0;
P2_0 = ~P2_0;
}
}
*/
(电脑向串口助手发送数据不接收)
main.c
#include <REGX52.H>
#include "Delay.h"
unsigned char Sec;
//软件生成
//void UartInit(void) //9600bps@11.0592MHz
//{
// PCON |= 0x80; //使能波特率倍速位SMOD
// SCON = 0x50; //8位数据,可变波特率
// TMOD &= 0x0F; //清除定时器1模式位
// TMOD |= 0x20; //设定定时器1为8位自动重装方式
// TL1 = 0xFA; //设定定时初值
// TH1 = 0xFA; //设定定时器重装值
// ET1 = 0; //禁止定时器1中断
// TR1 = 1; //启动定时器1
//}
//通过PCON设置SMOD设置串口通信的波特率(通过数据手册观察发现只能选择定时器1,因此,我们需要配置定时器1)
void UART_Init()
{
//串口配置
SCON = 0X50;
PCON |= 0X80;
//定时器1的配置
TMOD &= 0x0F; //设置定时器模式
TMOD |= 0x20; //设置定时器模式
TL1 = 0xFA; //设置定时初值
TH1 = 0xFA; //设置定时初值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //定时器0开始计时
}
void UART_SendByte(unsigned char Byte)
{
SBUF = Byte; //写入数据后,硬件自动把TI置1,我们必须手动清零
while(!TI) ; //检测数据是否写入成功,没写入成功TI一直时0,就会一直执行空语句,直到接受数据
TI = 0; //软件置位
}
void main(void)
{
UART_Init(); //串口初始化
while(1)
{
UART_SendByte(Sec);
Sec++;
Delay1ms(1000);
}
}