C51单片机串口通信的C程序

时间:2025-04-03

例子1
#include <reg51.h>
#include <string.h>
unsigned char ch;

bit read_flag= 0 ;

void init_serialcom( void ) //串口通信初始设定
{
SCON = 0x50 ; //UART为模式1,8位数据,允许接收
TMOD |= 0x20 ; //定时器1为模式2,8位自动重装
PCON |= 0x80 ; //SMOD=1;
TH1 = 0xFD ; //Baud:19200 fosc="11".0592MHz
IE |= 0x90 ; //Enable Serial Interrupt
TR1 = 1 ; // timer 1 run
TI=1;
}

//向串口发送一个字符
void send_char_com( unsigned char ch)
{
SBUF=ch;
while (TI== 0);
TI= 0 ;
}

//串口接收中断函数
void serial () interrupt 4 using 3
{
if (RI)
{
RI = 0 ;
ch=SBUF;
read_flag= 1 ; //就置位取数标志
}

}



main()

{

init_serialcom(); //初始化串口

while ( 1 )

{

if (read_flag) //如果取数标志已置位,就将读到的数从串口发出

{

read_flag= 0 ; //取数标志清0

send_char_com(ch);

}

}

}
例子2
// 单片机串行口发送/接收程序,每接收到字节即发送出去
// 和微机相接后键入的字符回显示在屏幕上
// 可用此程序测试
//
#include <reg51.h>

#define XTAL 11059200 // CUP 晶振频率
#define baudrate 9600 // 通信波特率

void main(void)
{
unsigned char c;

TMOD = 0x20; // 定时器1工作于8位自动重载模式, 用于产生波特率
TH1=(unsigned char)(256 - (XTAL / (32L * 12L * baudrate)));
TL1=(unsigned char)(256 - (XTAL / (32L * 12L * baudrate))); // 定时器0赋初值

SCON = 0x50;
PCON = 0x00;

TR1 = 1;
IE = 0x00; // 禁止任何中断

while(1)
{
while(RI == 0);
RI = 0;
c = SBUF; // 从缓冲区中把接收的字符放入c中

SBUF = c; // 要发送的字符放入缓冲区
while(TI == 0);
TI = 0;
}
}
例子3
//////////////////////////////////////////////////////////////////////////////////////////////////
//E51Pro.c
//Easy 51Pro编程器主程序,负责通讯,管理编程操作
///////////////////////////////////////////////////////////////////////////////////////////////////

#include <E51Pro.h>

BYTE ComBuf[18];//串口通讯数据缓存,发送和接收都使用
UINT nAddress;//ROM中地址计数
UINT nTimeOut;//超时计数
ProWork pw;//编程器一般操作

void Delay_us(BYTE nUs)//微秒级延时<255us
{
T
H0=0;
TL0=0;
TR0=1;
while(TL0<nUs)//利用T0做定时计数器,循环采样,直到达到定时值
{
}
TR0=0;
}

void Delay_ms(UINT nMs)//豪秒级的延时<65535ms
{
UINT n=0;

TR0=1;
while(n<nMs)////利用T0做定时计数器,循环采样,直到达到定时值
{
TH0=0;
TL0=20;
while(TH0<4)
{
}
n++;
}
TR0=0;
}

BOOL WaitComm()//等待上位机的命令,18字节
{
BYTE n=0;
RI=0;
while(!RI){}//等待第一个字节
ComBuf[n]=SBUF;
RI=0;
n++;
for(n;n<=17;n++)
{
nTimeOut=0;
while(!RI)
{
nTimeOut++;
if(nTimeOut>10000)//后17个字节都有超时限制
return 0;
}
ComBuf[n]=SBUF;
RI=0;
}
return 1;
}

BOOL WaitResp()//等待上位机回应,1字节,有超时限制
{
nTimeOut=0;
RI=0;
while(!RI)
{
nTimeOut++;
if(nTimeOut>50000)
{
return 0;
}
}
RI=0;
ComBuf[0]=SBUF;
return 1;
}

BOOL WaitData()//写器件时等待上位机数据,18字节,有超时限制
{
BYTE n;
RI=0;
for(n=0;n<=17;n++)
{
nTimeOut=0;
while(!RI)
{
nTimeOut++;
if(nTimeOut>10000)
{
return 0;
}
}
RI=0;
ComBuf[n]=SBUF;
}
return 1;
}

void SendData()//发送数据或回应操作完成,18字节
{
BYTE n=0;
for(n;n<=17;n++)
{
TI=0;
SBUF=ComBuf[n];
while(!TI){}
TI=0;
}
}

void SendResp()//回应上位机1个字节,在写器件函数中使用
{
TI=0;
SBUF=ComBuf[0];
while(!TI){}
TI=0;
}

void SetVpp5V()//设置Vpp为5v
{
P3_4=0;
P3_3=0;
}

void SetVpp0V()//设置Vpp为0v
{
P3_3=0;
P3_4=1;
}

void SetVpp12V()//设置Vpp为12v
{
P3_4=0;
P3_3=1;
}

void RstPro()//编程器复位
{
pw.fpProOver();//直接编程结束
SendData();//通知上位机,表示编程器就绪,可以直接用此函数因为协议号(ComBuf[0])还没被修改,下同
}

void ReadSign()//读特征字
{
pw.fpReadSign();
SendData();//通知上位机,送出读出器件特征字
}

void Erase()//擦除器件
{
pw.fpErase();
SendData();//通知上位机,擦除了器件
}

void Write()//写器件
{
BYTE n;
pw.fpInitPro();//编程前的准备工作
SendData();//回应上位机表示进入写器件状态,可以发来数据
while(1)
{
if(WaitData())//如果等待数据成功
{
if(ComBuf[0]==0x07)//判断是否继续写
{
for(n=2;n<=17;n++)//ComBuf[2~17]为待写入数据块
{
if(!pw.fpWrite(ComBuf[n]))//<<<<<<<<<<<<<<<<<<<调用写该器件一个单元的函数< …… 此处隐藏:4050字,全部文档内容请下载后查看。喜欢就下载吧 ……

C51单片机串口通信的C程序.doc 将本文的Word文档下载到电脑

    精彩图片

    热门精选

    大家正在看

    × 游客快捷下载通道(下载后可以自由复制和排版)

    限时特价:7 元/份 原价:20元

    支付方式:

    开通VIP包月会员 特价:29元/月

    注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
    微信:fanwen365 QQ:370150219