这是我毕业设计的一部分,目前只是要求能有单片机a向b发送一个字节即可,剩下的就能整明白了,但是我的单片机b怎么也收不到信息呀。发送端只是发送一个字节,接受端节收到这个字节后将把字节显示在LCD1602上,程序源代码如下:(我现在不明白为什么接收不到,可能是因为时钟设置的有问题吧,请高手帮帮忙,我已经调试了一个礼拜了,还不好使)
//---------------------------------------------------
//发送端源代码:
//---------------------------------------------------
#include
//宏定义
#define uchar unsigned char
#define uint unsigned int
#define SYSCLK 3062500
#define BAUDRATE 4800
#define SMODVAL 0
#define PCONVAL 0X00
#define TXVAL (256-SYSCLK*(SMODVAL+1)/BAUDRATE/384)
//定义全局变量
uchar one='a';
//--------------------------------------------------------------------------------
//延时函数
//--------------------------------------------------------------------------------
void Delay(int t)
{
int i;
int j;
for(i=0;i
{
for(j=0;j<100;)
{
j++;
}
}
}
//-----------------------------------------------------------------------------
//端口初始化程序
//-----------------------------------------------------------------------------
void PORT_Init(void)
{
XBR0 = 0x04; //允许UART0,RX,TX连到2个端口引脚. XBR0=0000,0100
XBR1 = 0x00;
XBR2 = 0x40; //交*开关使能
P0MDOUT = 0x03; //P0.0为推拉方式输出,即TX0,RX0所在的端口 0000,0011
}
//------------------------------------------------------------------------------
//串口初始化程序
//------------------------------------------------------------------------------
void UART0_Init(void)
{
SCON0 = 0x50; //选择串口方式1,波特率可变 SCON0=0101,0000
TMOD = 0x20; //选择T1,方式2,自动再装入8位计数器
ES0 = 1; //UART0中断开启
TR1 = 1; //启动定时器T1
PCON |= PCONVAL; //PCON=0x00,SMOD = 0 ; PCON=0x80,SMOD=1
TI0 = 1; //声明TX0就绪,可以发送
TH1 = (int)TXVAL; //T1初值,根据波特率,时钟等计算. 0xF4, bps=4800bps
TL1 = (int)TXVAL;
TR0 = 1;
}
//-------------------------------------------------------------------------------
//发送一个字节程序
//-------------------------------------------------------------------------------
void Send_Char(uchar ch)
{
SBUF0 = ch; //送入缓冲区
while(TI0 == 0); //等待发送完毕
TI0 = 0; //软件清零
}
//--------------------------------------------------------------------------------
//串口中断响应程序
//--------------------------------------------------------------------------------
void UART0_ISR(void) interrupt 4 using 1
{
if(TI0==1) //中断标志 TI0=1 数据发送完毕
{
Delay(10);
TI0=0;
Delay(10);
}
return;
}
//--------------------------------------------------------------------------------
//主方法
//--------------------------------------------------------------------------------
main()
{
WDTCN = 0xde; //禁止看门狗
WDTCN = 0xad;
SFRPAGE = CONFIG_PAGE;
PORT_Init(); //端口初始化
SFRPAGE = UART0_PAGE;
UART0_Init(); //串口初始化
EA = 1; //开全局中断
SFRPAGE = LEGACY_PAGE;
Delay(100);
while(1)
{
Send_Char(one);
Delay(10);
}
}
//--------------------------------------------------------------------------------
//程序结束
//--------------------------------------------------------------------------------
接受端的端口配置基本和a芯片相同,接收中断函数如下:
//--------------------------------------------------------------------------------
//串口中断响应程序
//--------------------------------------------------------------------------------
void UART0_ISR(void) interrupt 4 using 1
{
uchar one;
BYTE LCDOUT;
if(RI0) //中断标志 RI0=1 数据完整接收
{
RI0 = 0; //软件清零
one = SBUF0; //读缓冲
LCDOUT=(BYTE)one;//
Delay(1);
lcd_wdat(LCDOUT);//显示字符在LCD1602上
Delay(1);
}
while(1);
}
建议调试步骤如下:
1. 先确认A和B的串口配置是否正确,引脚,波特率,数据位,校验位,停止位。
2. 先确认A有没有发出数据。方法:1)经过RS232电路转换,接到PC机,用串口工具看。2)用示波器抓波形。
3. 确认B能不能正确接收数据。方法: 经过RS232电路转换,接到PC机,用串口工具发送数据,B接收到数据后,控制某个IO口变化电压,以此判断。
PORT_Init()中,
P0MDOUT = 0x03; //P0.0为推拉方式输出,即TX0,RX0所在的端口 0000,0011
什么意思?TX.RX都配成输出吗?如果是这样,那RX应该配置输入。
同意楼上。先和上位机通信试试,如果能发送数据,那证明串口初始化已经成功。接收也就好做了。
欢迎大家到我的博客看看
http://c8051fmcu.blog.sohu.com