同时使用定时器0、1、2,定时器2做串口通信使用,部分代码如下
void main(){
uint numberR = 255, numberG = 0, numberB = 0;
int step = 1;
uchar startColor = 2;
/*定时器初始化*/
TMOD = 0x11;
TH0 = HighInitValue; TL0 = LowInitValue;
TH1 = HighInitValue; TL1 = LowInitValue;
EA = 1;
ET0 = 1; ET1 = 1;
TR0 = 1; TR1 = 1;
ConfigUART(9600); //配置波特率为 9600
while(1);
}
/*定时器T1*/
void time1_int(void) interrupt 3 using 1
{
t1++;
TH1 = HighInitValue; TL1 = LowInitValue; //设置初值 (问题代码)
//红灯亮
if (t1 == redValue) {
red = 0;
}
if (t1 == greenValue) {
green = 0;
}
if (t1 == blueValue) {
blue = 0;
}
}
/*定时器T0*/
void time0_int(void) interrupt 1 using 1
{
t0++;
numT++;
TH0 = HighInitValue; TL0 = LowInitValue; //设置初值
if (t0 == PERIOD) {
/* 灯灭 */
red = 1;
green = 1;
blue = 1;
t0 = 0;
t1 = 0;
}
if (numT == 30) {
if (numberCount > 0) {
P0 = table[number[numI]];
dula = 1;
dula = 0;
P0 = 0xff; // 全部重置
P0 = local[numI]; // 显示的位置
wela = 1;
wela = 0;
numT = 0;
if (numI < numberCount-1) {
numI++;
} else {
numI = 0;
}
}
}
}
void ConfigUART(unsigned int baud){
EA = 0;
SCON = 0x50; /* uart in mode 1 (8 bit), REN=1 */
T2CON &= 0xDC; /* EXEN2=0; TR2=0; C/T2#=0; CP/RL2#=0; */
T2CON |= 0x30; /* RCLK = 1; TCLK=1; */
RCAP2H=0xFF;
RCAP2L = 0xDC;
TI = 0;
RI = 0;
ES = 1; //for serial transmission
ET2 = 0;
TR2 = 1; //Timer 2 start
EA = 1;
}
/* UART 中断服务函数 */
void InterruptUART() interrupt 4{
if (RI){ //接收到字节
RI = 0; //手动清零接收中断标志位
SBUF = SBUF; //接收的数据+1 后发回,左边是发送 SBUF,右边是接收 SBUF
}
if (TI){ //字节发送完毕
TI = 0; //手动清零发送中断标志位
}
}
现在的问题就是当我去掉 定时器1的重载语句(TH1 = HighInitValue; TL1 = LowInitValue;)后,串口就会工作,但是语句存在时串口不工作。
想问问定时器1和定时器2之间有影响吗?是怎么影响的啊?
谢谢各位吧友!
void main(){
uint numberR = 255, numberG = 0, numberB = 0;
int step = 1;
uchar startColor = 2;
/*定时器初始化*/
TMOD = 0x11;
TH0 = HighInitValue; TL0 = LowInitValue;
TH1 = HighInitValue; TL1 = LowInitValue;
EA = 1;
ET0 = 1; ET1 = 1;
TR0 = 1; TR1 = 1;
ConfigUART(9600); //配置波特率为 9600
while(1);
}
/*定时器T1*/
void time1_int(void) interrupt 3 using 1
{
t1++;
TH1 = HighInitValue; TL1 = LowInitValue; //设置初值 (问题代码)
//红灯亮
if (t1 == redValue) {
red = 0;
}
if (t1 == greenValue) {
green = 0;
}
if (t1 == blueValue) {
blue = 0;
}
}
/*定时器T0*/
void time0_int(void) interrupt 1 using 1
{
t0++;
numT++;
TH0 = HighInitValue; TL0 = LowInitValue; //设置初值
if (t0 == PERIOD) {
/* 灯灭 */
red = 1;
green = 1;
blue = 1;
t0 = 0;
t1 = 0;
}
if (numT == 30) {
if (numberCount > 0) {
P0 = table[number[numI]];
dula = 1;
dula = 0;
P0 = 0xff; // 全部重置
P0 = local[numI]; // 显示的位置
wela = 1;
wela = 0;
numT = 0;
if (numI < numberCount-1) {
numI++;
} else {
numI = 0;
}
}
}
}
void ConfigUART(unsigned int baud){
EA = 0;
SCON = 0x50; /* uart in mode 1 (8 bit), REN=1 */
T2CON &= 0xDC; /* EXEN2=0; TR2=0; C/T2#=0; CP/RL2#=0; */
T2CON |= 0x30; /* RCLK = 1; TCLK=1; */
RCAP2H=0xFF;
RCAP2L = 0xDC;
TI = 0;
RI = 0;
ES = 1; //for serial transmission
ET2 = 0;
TR2 = 1; //Timer 2 start
EA = 1;
}
/* UART 中断服务函数 */
void InterruptUART() interrupt 4{
if (RI){ //接收到字节
RI = 0; //手动清零接收中断标志位
SBUF = SBUF; //接收的数据+1 后发回,左边是发送 SBUF,右边是接收 SBUF
}
if (TI){ //字节发送完毕
TI = 0; //手动清零发送中断标志位
}
}
现在的问题就是当我去掉 定时器1的重载语句(TH1 = HighInitValue; TL1 = LowInitValue;)后,串口就会工作,但是语句存在时串口不工作。
想问问定时器1和定时器2之间有影响吗?是怎么影响的啊?
谢谢各位吧友!