STC单片机与PC通信,怎么PC显示的不正确,应该怎样做,高手请给一个这样的代码或方法,谢谢!
4个回答
展开全部
enum Baud_t
{
BAUD_9600 = 0x0c,
BAUD_19200 = 0x06,
BAUD_38400 = 0x03,
BAUD_57600 = 0x02,
BAUD_115200 = 0x01
};
enum Com_t
{
COM0 = 0xc0,
COM1 = 0xc1,
};
enum Mod_t
{
MOD0 = 0x00,
MOD1 = 0x01,
MOD2 = 0x02,
MOD3 = 0x03
};
enum Interrupt_Prio
{
Prio_0 = 0,
Prio_1 = 1,
Prio_2 = 2,
Prio_3 = 3
};
unsigned char SerialOpen (enum Mod_t Mod, enum Baud_t Baud, enum Interrupt_Prio Prio)
{
unsigned char result;
result = 0;
//设置串口工作模式和波特率
switch(Mod)
{
//8位同步移位模式,RXD:数据输入输出;TXD:同步移位时钟;低位在前
case(MOD0):
SM0 = 0;
SM1 = 0;
REN = 1;
// 波特率固定为Fosc/12
result = OK;
break;
//1起始位+8数据位(BT0-BT7)+1停止位
case(MOD1):
SM0 = 0;
SM1 = 1;
REN = 1; //允许串口0接收
AUXR |= 0x40; //T1*12 = 1,定时器1采用12倍频,工作在1T模式
TMOD = 0x21; //设置定时器1为8位自动重装计数器
if(Baud == BAUD_9600)
{
TH1 = 0xdc;
TL1 = 0xdc;
}
if(Baud == BAUD_19200)
{
TH1 = 0xee;
TL1 = 0xee;
}
if(Baud == BAUD_38400)
{
TH1 = 0xf7;
TL1 = 0xf7;
}
if(Baud == BAUD_57600)
{
TH1 = 0xfa;
TL1 = 0xfa;
}
if(Baud == BAUD_115200)
{
TH1 = 0xfd;
TL1 = 0xfd;
}
TR1 = 1; //开启定时器1
result = OK;
break;
//1位起始位+8位数据位+第九位编程位(SCON中的TB8/RB8)+1位停止位
case(MOD2):
SM0 = 1;
SM1 = 0;
REN = 1;
//当SMOD=0时,波特率 = 溢出率/64
//当SMOD=1时,波特率 = 溢出率/32
result = OK;
break;
//同模式2相同,区别在于波特率可以设置
case(MOD3):
SM0 = 0;
SM1 = 0;
REN = 1;
AUXR |= 0x40; //T1*12 = 1,定时器1采用12倍频,工作在1T模式
TMOD = 0x21; //设置定时器1为8位自动重装计数器
if(Baud == BAUD_9600)
{
TH1 = 0x00;
TL1 = 0xdc;
}
if(Baud == BAUD_19200)
{
TH1 = 0x00;
TL1 = 0xee;
}
if(Baud == BAUD_38400)
{
TH1 = 0x00;
TL1 = 0xf7;
}
if(Baud == BAUD_57600)
{
TH1 = 0x00;
TL1 = 0xfa;
}
if(Baud == BAUD_115200)
{
TH1 = 0x00;
TL1 = 0xfd;
}
TR1 = 1; //开启定时器1
result = OK;
break;
default:
result = ERR;
break;
}
//设置中断优先级
if(result == OK)
{
if(Prio == Prio_0)
{
// IP = ; //采用系统默认值
// IPH = ; //采用系统默认值
ES = 1; //开串口中断
EA = 1; //开总的中断控制位
}
if(Prio == Prio_1)
{
IP |= 0x10;
// IPH = ; //采用系统默认值
ES = 1;
EA = 1;
}
if(Prio == Prio_2)
{
// IP = ; //采用默认值
IPH |= 0x10;
ES = 1;
EA = 1;
}
if(Prio == Prio_3)
{
IP |= 0x10;
IPH |= 0x10;
ES = 1;
EA = 1;
}
}
return(result);
}
注意,以上是晶振为11.0592MHZ的参数配置。
你在下载程序的时候要注意:下载软件上要配置成外部晶振,且下一栏选择LOW
否则你的通信是不成功的
{
BAUD_9600 = 0x0c,
BAUD_19200 = 0x06,
BAUD_38400 = 0x03,
BAUD_57600 = 0x02,
BAUD_115200 = 0x01
};
enum Com_t
{
COM0 = 0xc0,
COM1 = 0xc1,
};
enum Mod_t
{
MOD0 = 0x00,
MOD1 = 0x01,
MOD2 = 0x02,
MOD3 = 0x03
};
enum Interrupt_Prio
{
Prio_0 = 0,
Prio_1 = 1,
Prio_2 = 2,
Prio_3 = 3
};
unsigned char SerialOpen (enum Mod_t Mod, enum Baud_t Baud, enum Interrupt_Prio Prio)
{
unsigned char result;
result = 0;
//设置串口工作模式和波特率
switch(Mod)
{
//8位同步移位模式,RXD:数据输入输出;TXD:同步移位时钟;低位在前
case(MOD0):
SM0 = 0;
SM1 = 0;
REN = 1;
// 波特率固定为Fosc/12
result = OK;
break;
//1起始位+8数据位(BT0-BT7)+1停止位
case(MOD1):
SM0 = 0;
SM1 = 1;
REN = 1; //允许串口0接收
AUXR |= 0x40; //T1*12 = 1,定时器1采用12倍频,工作在1T模式
TMOD = 0x21; //设置定时器1为8位自动重装计数器
if(Baud == BAUD_9600)
{
TH1 = 0xdc;
TL1 = 0xdc;
}
if(Baud == BAUD_19200)
{
TH1 = 0xee;
TL1 = 0xee;
}
if(Baud == BAUD_38400)
{
TH1 = 0xf7;
TL1 = 0xf7;
}
if(Baud == BAUD_57600)
{
TH1 = 0xfa;
TL1 = 0xfa;
}
if(Baud == BAUD_115200)
{
TH1 = 0xfd;
TL1 = 0xfd;
}
TR1 = 1; //开启定时器1
result = OK;
break;
//1位起始位+8位数据位+第九位编程位(SCON中的TB8/RB8)+1位停止位
case(MOD2):
SM0 = 1;
SM1 = 0;
REN = 1;
//当SMOD=0时,波特率 = 溢出率/64
//当SMOD=1时,波特率 = 溢出率/32
result = OK;
break;
//同模式2相同,区别在于波特率可以设置
case(MOD3):
SM0 = 0;
SM1 = 0;
REN = 1;
AUXR |= 0x40; //T1*12 = 1,定时器1采用12倍频,工作在1T模式
TMOD = 0x21; //设置定时器1为8位自动重装计数器
if(Baud == BAUD_9600)
{
TH1 = 0x00;
TL1 = 0xdc;
}
if(Baud == BAUD_19200)
{
TH1 = 0x00;
TL1 = 0xee;
}
if(Baud == BAUD_38400)
{
TH1 = 0x00;
TL1 = 0xf7;
}
if(Baud == BAUD_57600)
{
TH1 = 0x00;
TL1 = 0xfa;
}
if(Baud == BAUD_115200)
{
TH1 = 0x00;
TL1 = 0xfd;
}
TR1 = 1; //开启定时器1
result = OK;
break;
default:
result = ERR;
break;
}
//设置中断优先级
if(result == OK)
{
if(Prio == Prio_0)
{
// IP = ; //采用系统默认值
// IPH = ; //采用系统默认值
ES = 1; //开串口中断
EA = 1; //开总的中断控制位
}
if(Prio == Prio_1)
{
IP |= 0x10;
// IPH = ; //采用系统默认值
ES = 1;
EA = 1;
}
if(Prio == Prio_2)
{
// IP = ; //采用默认值
IPH |= 0x10;
ES = 1;
EA = 1;
}
if(Prio == Prio_3)
{
IP |= 0x10;
IPH |= 0x10;
ES = 1;
EA = 1;
}
}
return(result);
}
注意,以上是晶振为11.0592MHZ的参数配置。
你在下载程序的时候要注意:下载软件上要配置成外部晶振,且下一栏选择LOW
否则你的通信是不成功的
展开全部
串口通信吗? 注意你的晶振 是不是11.0592 如果你用的是12M的 必须用2400通信 T1装的初值要重新计算 我记得大概是0xf3吧 这样 你看我的一个源程序 C的
#include <AT89X52.H>
#define uint unsigned int
#define uchar unsigned char
uchar flag,a,i;
uchar code table[]="I get ";
void init()
{
TMOD=0x20;
TH1=0xf3;
TL1=0xf3;// 2400 rate
TR1=1;
SM0=0;
SM1=1;
REN=1;
EA=1;
ES=1;
}
void main()
{
init();
while(1)
{
if(flag==1)
{
ES=0;
for(i=0;i<6;i++)
{
SBUF=table[i];
while(!TI);
TI=0;
}
SBUF=a;
while(!TI);
TI=0;
ES=1;
flag=0;
}
}
}
void ser() interrupt 4
{
RI=0;
a=SBUF;
flag=1;
}
#include <AT89X52.H>
#define uint unsigned int
#define uchar unsigned char
uchar flag,a,i;
uchar code table[]="I get ";
void init()
{
TMOD=0x20;
TH1=0xf3;
TL1=0xf3;// 2400 rate
TR1=1;
SM0=0;
SM1=1;
REN=1;
EA=1;
ES=1;
}
void main()
{
init();
while(1)
{
if(flag==1)
{
ES=0;
for(i=0;i<6;i++)
{
SBUF=table[i];
while(!TI);
TI=0;
}
SBUF=a;
while(!TI);
TI=0;
ES=1;
flag=0;
}
}
}
void ser() interrupt 4
{
RI=0;
a=SBUF;
flag=1;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
应该是接口设置方面问题
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
初值、波特率设置问题,
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询