以下是部分程序,老出问题,估计是T0,T1的用法错误,在线等,求高手指教!!
初始化:
void system_Ini()
{
TMOD|=0x23 ; //定时器T1工作方式2(自动装载初值的8位定时器),T0方式3
SCON = 0x50; //REN=1允许串行接受状态,串口工作模式1 (全双工方式)
PCON|=0x80; //SMOD=1,波特率加倍
TH1=0xF3; //baud*2 /* 波特率4800、数据位8、停止位1。效验位无 (12M)
TL1=0xF3;
//TR1 = 1;
TH0 = 0xD8; //10ms
TL0 = 0xF0;
ET0=1;
TR0 = 1;
ES= 1; //开串口中断
EA=1;
//ET1=0;
}
main()
{ unsigned char i;
system_Ini();
while(1)
{
SBUF=0x20;
while(!TI);// // 等特数据传送(TI发送中断标志)
TI=0;
GetTemp()
}
T0在以下用到:
void GetTemp()
{
if(TIM==100) //每隔 1000ms 读取温度
{ TIM=0;
TemperatuerResult();
}
}
void T0zd(void) interrupt 1 //1表示定时器0中断
{
TH0 = 0xD8; //10ms
TL0 = 0xF0;
TIM++;
}
void system_Ini()
{
TMOD=0x21 ; //定时器T1工作方式2(自动装载初值的8位定时器),T0方式1
SCON = 0x50; //REN=1允许串行接受状态,串口工作模式1 (全双工方式含销)
PCON=0x80; //SMOD=1,
波特率加倍
TH1=0xF3; //baud*2 /* 波特闷启率4800、数据位8、停止位1。效验位无 (12M)
TL1=0xF3;
TR1 = 1;
TH0 = (65536-10000)/256; //10ms
TL0 = (65536-10000)%256;
ET0=1;
TR0 = 1;
ES= 1; //开串口中断
EA=1;
}
main()
{ unsigned char i;
system_Ini();
while(1)
{
SBUF=0x20;
while(!TI);// //蚂老如 等特数据传送(TI发送中断标志)
TI=0;
GetTemp();
}
}
T0在以下用到:
void GetTemp()
{
if(TIM==100) //每隔 1000ms 读取温度
{ TIM=0;
TemperatuerResult();
}
}
void T0zd(void) interrupt 1 //1表示定时器0中断
{
TH0 = 0xD8; //10ms
TL0 = 0xF0;
TIM++;
}
试试如下修改建议:
void system_Ini()
{
SCON = 0x50; //REN=1允许串行接受状态,串口工作姿嫌模式1 (全双工方式)
PCON |= 0x80; //SMOD=1,波特率加倍
TMOD |= 0x21; //定时器T1工作方式2(自动装载初值的8位定时器),T0方式1
// T0 不应该使用方式3
TH1 = 0xF3; //baud*2 波特率4800、数据位8、停止位1。效验位无 (12M)
// 晶振是 12MHz,波特率,就迹饥手不要用的这么高
TL1 = 0xF3;
TR1 = 1;
TH0 = 0xD8; //D8F0 在方式3 时,并不是 10ms。
TL0 = 0xF0;
TR0 = 1;
ET0 = 1;
// ES = 1; //开串口中断
EA = 1;
}
……
void GetTemp()
{
if(TIM >= 100) { //改成大于等于。原来的等于,要求的太严格肢辩了
TIM = 0;
TemperatuerResult();
}
}
#include <reg52.h> // 改了一下 试试, 主要是 串口
void system_Ini() // 可以试试 自发 自收 TXD 与 RXD 连接起来谨虚埋
{ // P2 口 接 8 路 开关 信号 , P1 口输出 接收信号
TMOD|=0x21 ; //定时器T1工作方式2(自动装载初值的8位定时器),T0方式1
SCON = 0x50; //REN=1允许串行接受状态,串口工作模式1 (全祥蚂双工方式)
PCON|=0x80; //SMOD=1,波特率加倍
TH1=0xF3; //baud*2 /* 波特率4800、数据位8、停止位1。效验位无 (12M)
TL1=0xF3;
TR1 = 1;
TH0 = 0xD8; //10ms
TL0 = 0xF0;
ET0=1;
TR0= 1;
ES= 1; //开串口中断
EA=1;
}
void main()
{
system_Ini();
while(1)
{
SBUF=P2; // 把P2 口的 数据 发送
while(!TI); // 等特数据传送(TI发送中断标志)
TI=0;
}
}
void T0zd(void) interrupt 1 //定时器0中断
{
TH0 = 0xD8; //10ms
TL0 = 0xF0;
}
void ser() interrupt 4 // 串口中断
{
if(RI)
{
RI=0;
P1=SBUF; // P1 口 为誉姿接收 数据。
}
}
你开启了串口中断,但是没有写串口中断程序,在运行过程中一旦进入串口中断程序就会跑飞