本帖最后由 zwm111 于 2017-5-5 17:55 编辑
<div class="blockcode"><blockquote>#include "reg51.h"
#include "intrins.h"
typedef unsigned char BYTE;
typedef unsigned int WORD;
sfr AUXR = 0x8e; //辅助寄存器
sfr S2CON = 0x9a; //UART2 控制寄存器
sfr S2BUF = 0x9b; //UART2 数据寄存器
sfr T2H = 0xd6; //定时器2高8位
sfr T2L = 0xd7; //定时器2低8位
sfr IE2 = 0xaf; //中断控制寄存器2
WORD vel=0;
sbit P10=P1^0;
bit busy;
void UartInit(void) //9600bps@11.0592MHz
{
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x04; //定时器2时钟为Fosc,即1T
T2L = 0xE0; //设定定时初值
T2H = 0xFE; //设定定时初值
AUXR |= 0x01; //串口1选择定时器2为波特率发生器
AUXR |= 0x10; //启动定时器2
}
void Timer0Init(void) //10微秒@11.0592MHz
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x02; //设置定时器模式
TL0 = 0x91; //设置定时初值
TH0 = 0x91; //设置定时重载值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
}
/*----------------------------
发送串口数据
----------------------------*/
void SendData(BYTE dat)
{
while (busy); //等待前面的数据发送完成
busy = 1;
SBUF = dat; //写数据到UART数据寄存器
}
void main()
{
UartInit();
Timer0Init();
while(1);
}
void timer0 (void) interrupt 1
{
if(vel==200)
{
P10=~P10;
SendData(P10);
vel=0;
}
vel++;
}
void Uart() interrupt 4 using 1
{
if (RI)
{
RI = 0; //清除RI位
}
if (TI)
{
TI = 0; //清除TI位
busy = 0; //清忙标志
}
}
我想开启两个定时器,定时器0和定时器2,单个定时器我都能成功开通,但两个一起开,串口能正常工作,定时器0不能正常工作。串口信号送不出P10的值,单独开通串口能正常工作,不知我那里写错了,高手能指导下一二。 |