单片机中如何设置让T1作为波特率发生器进行串口通信,同时T0作为定时器使用?100分奉上,解决再加!

以下是部分程序,老出问题,估计是T0,T1的用法错误,在线等,求高手指教!!初始化:voidsystem_Ini(){TMOD|=0x23;//定时器T1工作方式2(自动... 以下是部分程序,老出问题,估计是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++;
}
展开
 我来答
zhxiufan
推荐于2017-09-16 · 知道合伙人软件行家
zhxiufan
知道合伙人软件行家
采纳数:14923 获赞数:38387
国家科技进步奖

向TA提问 私信TA
展开全部
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++;
}
迪凯特科技(北京)有限公司
2023-07-28 广告
单片机串口通信数据丢失的原因可能如下:1. 按键通过串口发送对应命令,第一次按按键串口发送的指令正确且能把数据正确的显示出来,在第二次按按键串口发送的指令出现丢失的状况,可能是因为串口通信的波特率设置不正确。2. 如果单片机和外部设备的波特... 点击进入详情页
本回答由迪凯特科技(北京)有限公司提供
做而论道
高能答主

推荐于2017-09-22 · 把复杂的事情简单说给你听
知道大有可为答主
回答量:3万
采纳率:80%
帮助的人:1.2亿
展开全部
试试如下修改建议:

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();
}
}
追问
改了之后也只有在复位的时候才一次发挺多数据,平时串口助手接不到数据,怎么回事?
追答
你给出的程序不全,难说是怎么回事。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
GUEL86
2013-03-05 · TA获得超过5856个赞
知道大有可为答主
回答量:5538
采纳率:86%
帮助的人:2739万
展开全部
#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 口 为接收 数据。
}
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
993106193
2013-03-05 · TA获得超过280个赞
知道小有建树答主
回答量:926
采纳率:20%
帮助的人:522万
展开全部
你开启了串口中断,但是没有写串口中断程序,在运行过程中一旦进入串口中断程序就会跑飞
追问
是的,我关了ES了
追答
把你的所有程序贴出来看看,另外把GetTemp()放到中断函数中试试
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式