| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1391 人关注过本帖
标题:C8051F020编程UART串口收发数据
只看楼主 加入收藏
alading514
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2007-4-23
收藏
 问题点数:0 回复次数:0 
C8051F020编程UART串口收发数据

我编了一个 老是编译不过去 求高手改正
我用的是UART0端口 方式2
程序如下
//>>UART0串口编程--向PC发送和接受字符串<<
//

//--------------------------------------------------------------------------
#include <C8051F020.h>
#include <string.h>

#define uchar unsigned char
#define uint unsigned int

//----------------------------------------------------------------------
//参数设置区
//----------------------------------------------------------------------
#define BAUDRATE 138240 //波特率bps
#define SYSCLK 22118400 //外部晶振,修改也要修改OSCXCN
#define T4VAL (65536-SYSCLK/BAUDRATE/32) //定时器4初值


uchar idata reaeice_flag=0;
extern uchar idata timer_sec;

uchar idata send_buffer[10]; //数据缓冲区
uchar idata receive_buffer[20];//接收数据队列


uchar time = 0; //软件计时次数
uchar period = 25; //定时间隔 20ms * 25 =500ms

//----------------------------------------------------------------------
//子函数声明
//----------------------------------------------------------------------
void SYSCLK_Init(void); //系统时钟初始化
void PORT_Init(void); //端口初始化
void UART0_Init(void); //串口UART0初始化
void Send_Char(uchar ch); //发送单个字符
void Send_String(uchar * send_buffer, uint S_len); //发送一个字符串
void Receive_Char(uchar ch); //接收单个字符
void Receive_String(uchar * receive_buffer, uint R_len); //接受一个字符串
void Delay(uint t); //延迟

//----------------------------------------------------------------------
//主函数
//----------------------------------------------------------------------
void main(void)
{
EA = 0; //关全局中断
WDTCN = 0xde; //禁止看门狗
WDTCN = 0xad;

SYSCLK_Init(); //时钟初始化
PORT_Init(); //端口初始化
UART0_Init(); //串口初始化
EA = 1; //开中断
while(1)
{
if(TI0)

Send_String(send_buffer,S_len(send_buffer)); //发送字符串

else
Recieve_String(receive_buffer,R_len(receive_buffer));
Delay(1000); //延迟
}
}

//----------------------------------------------------------------------
//子函数具体实现
//----------------------------------------------------------------------

//系统时钟初始化
void SYSCLK_Init(void)
{
uint i;
OSCXCN = 0x67;
//采用外部晶振22.1184MHz,不分频. 选型OSCXCN=0110,0111
for(i=0;i<256;i++); //等待>1ms
while(!(OSCXCN&0x80)); //查询直到XTLVLD=1,晶振稳定
OSCICN = 0x88;
//切换到外部振荡器,允许时钟失效监测器. OSCICN=1000,1000
}

//端口初始化
void PORT_Init(void)
{
XBR0 = 0x04; //开启UART0
XBR1 = 0x00;
XBR2 = 0x44;
//交叉开关使能,启用UART0,分配到P0.0 P0.1
P0MDOUT |= 0x01;
//P0.0为推拉方式输出,即TX0所在的端口
P1MDOUT |=0x02;
//P0.1为推拉方式输出,即RX0所在的端口
}

//串口0初始化
void UART0_Init(void)
{
SCON0 = 0xBC; //SCON0:模式2,9位UART,使能RX
PCON = 0x10; //使能UART0 的波特率/2 功能
SCON0 |= 0x02; //声明准备就绪,可以发送(TI0=1)
SCON0 = 0x01; //声明准备就绪,可以接受(RI0=1)
}

//发送单个字符
void Send_Char(uchar ch)
{
SBUF0 = ch; //送入缓冲区
while((SCON0&0x02) == 0x00); //等待发送完毕
SCON0 &=0xBC; //软件清零 TI1 = 0
}

//发送字符串,调用Send_Char() len字符串长度
void Send_String(uchar * send_buffer,uint S_len)
{
uint k = 0;
do
{
Send_Char(*(send_buffer + k));
k++;
} while(k < S_len);

}
//接收单个字符
void Recieve_char(uchar sh)
{
SBUF0 = sh;
while((SCON0&0x01)== 0x00);
SCON0 &=0xBC;
}

void Recieve_String(uchar * receive_buffer,uint R_len)
{
uint j = 0;
do
{Recieve_char(*(receive_buffer + j));
j++;
}while(j < R_len)
}

//延迟
void Delay(uint x)
{
uint i;
do{
x--;
for(i=0;i<14;i++){;}
}while(x);
}
//-------------------------------------------------------------
//程序结束

搜索更多相关主题的帖子: UART 串口 收发 数据 define 
2007-04-26 16:57
快速回复:C8051F020编程UART串口收发数据
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.011779 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved