stc12c5604ad T0中断与串口不能同时使用,求高人分析。
程序结构为时间片轮转方式,5ms一个中断,中断里刷数码管。
在程序进入串口前P13设高电位,完成串口程序后P13设低电位
,用逻辑分析仪捕捉P13口后看高电位宽度宽达7ms,这是不正常的,也就
是说发送一字节用了7ms时间
把T0中断屏蔽了用大循环方式串口就正常了,串口发送一字节数据也就1ms不到,
如下代码,是大概样子
void Ini_Timer0(void) //5ms中断
{
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0x00; //设置定时初值
TH0 = 0x28; //设置定时初值
TF0 = 0; //清除TF0标志TR0 = 1;
EA = 1;
ET0 = 1;
TR0 = 1;
}
//串口初始化
void InitUART(void) //9600bps 11.0592mhz
{
TMOD |= 0x20;
SCON = 0x40;
TH1 = 0xDC;
TL1 = TH1;
PCON = 0x00;
TR1 = 1;
}
//串口发送一位数据
void SendOneByte(u8 c)
{
SBUF = c;
while(!TI);
TI = 0;
}
void Timer0() interrupt 1
{
P14 = 1; //中断开始测试
TL1 = 0x00; //设置定时初值
TH1 = 0x00; //设置定时初值
if(work_count1)work_count1--; //每节拍对任务延时变量减1,减至0后,任务就绪。
if(work_count2)work_count2--;
if(work_count3)work_count3--;
if(++weicon>3) weicon=0; //显示位置轮流,需要严格限制范围为0-7
P2=0; //关段码显示 74LS245
switch(weicon)
{
case 0: //第1位显示内容
P2=LED_tab[bai]; //显示内容 74ls245
P17=0;P15=0;P16=1; //位选 74lLS138
break;
case 1: //第2位显示内容
P2=LED_tab[shi]; //显示内容
P17=1;P15=0;P16=1; //位选
break;
case 2: //第3位显示内容
P2=LED_tab[ge]; //显示内容
P20=1; //在各位上显示小数点
P17=0; P15=1;P16=1; //位选
break;
case 3: //第4位显示内容
P2=LED_tab[xiaoshu]; //显示内容
P17=1; P15=1;P16=1; //位选
break;
default:break;
}
P14=0; //中断结束测试端
}
void main(void)
{
P2=0; //关显示
P17=1; //数码管74ls138位选
P15=1; //
P16=1; //
P14=0; //测试端口
P13=0; //测试端口
P12=0; //测试端口
P11=0; //测试端口
AUXR = AUXR|0x80; // T0, 1T Mode
AUXR = AUXR|0x40; // T1, 1T Mode
convert_T(); //开机先转换一次温度
Ini_Timer0(); //初始化定时器0
InitUART();
while(1)
{ P12=1;
convert_T(); //启动温度转换
if(work_count2++==)
{ P13=1;
SendOneByte(temp>>4); //发送串口
work_count2=0;
P13=0;
}
if(work_count1++==100)
{
P14=1;
read_T(); //读转换温度数字
P14=0;
}
work_temp(temp); //处理温度数据
P12=0;
}
}
|