单片机中如何设置让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++;
} 展开
初始化:
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++;
} 展开
4个回答
展开全部
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++;
}
{
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 广告
2023-07-28 广告
单片机串口通信数据丢失的原因可能如下: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();
}
}
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 口 为接收 数据。
}
}
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 口 为接收 数据。
}
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你开启了串口中断,但是没有写串口中断程序,在运行过程中一旦进入串口中断程序就会跑飞
追问
是的,我关了ES了
追答
把你的所有程序贴出来看看,另外把GetTemp()放到中断函数中试试
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询