C51单片机串口通信的C程序
时间:2025-04-03
时间: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字,全部文档内容请下载后查看。喜欢就下载吧 ……
下一篇:高纯硼酸制备过程中的结晶动力学