可靠的接受程序!!从LZ 的display(a1a10)看出来这程序就不咋样,如果显示函数 还是 用 延时做的,可靠的接受程序给LZ 也是 白瞎……
以下是 UART 驱动程序
/10位异步收发串口通讯驱动——火柴天堂作品-20130119/
/源程序硬件环境:52单片机,110592MHz晶振,定时器1作为波特率发生器,通讯波特率9600 bit/s/
//
#define UART_H
#include"REG52h" //包含52头文件
#include"UARTh" //包含串口头文件
#define th1 0xfa //651us at 110592MHz Fosc for 8bit auto reload mode
static uchar UART_DataR; //串口接收数据寄存器
static uchar bdata Flag=0; //标志位 寄存器
sbit UART_ReFlag=Flag^0; //串口接收标志位 0:无数据 1:新数据
sbit UART_SendFlag=Flag^1; //串口发送标志位 0:空闲中 1:发送中
void UART()interrupt 4 //串口中断函数
{
if(RI) //若串口接收完成
{
RI=0; //清 串口接收溢出位
UART_DataR=SBUF; //将串口收到的数据存进 UART_DataR
UART_ReFlag=TRUE; //串口接收标志位 置位(有新数据)
}
if(TI) //若串口发送完成
{
TI=0; //清 串口发送溢出位
UART_SendFlag=FALSE; //清串口发送标志位(空闲中)
}
}
void UART_Init() //串口初始化函数
{
SCON=0x50; //选择通讯方式:10位异步收发,串口中断使能
PCON=0x80; //波特率倍频
TMOD&=0x0f; //定时器1控制位清0
TMOD|=0x20; //定时器1工作模式2(8位自重装,做波特率发生器)
TH1=th1; //定时器初值
TL1=th1; //定时器初值
TR1=1; //开始计时
ES=1; //允许串口中断
EA=1; //允许系统中断
}
bit UART_SendByte(uchar send_data) //串口发送字节函数,发送内容send_data,返回值:0 *** 作失败,1 *** 作成功
{
if(!UART_SendFlag) //若串口空闲中,则
{
SBUF=send_data; //将发送内容 送到 串口寄存器
UART_SendFlag=TRUE; //置位串口发送标志位(进入忙态)
return TRUE; //返回1, *** 作成功
}
return FALSE; //否则,返回0, *** 作失败
}
uchar ASCII_ToHex(uchar ascii_data) //ASCII 转 Hex 函数
{
uchar hex_data=0; //定义 Hex变量存储转换结果
if(ascii_data>='0' && ascii_data<='9') hex_data=ascii_data-'0'; //若 转换内容为 字符'0-9',则转成对应数字0-9
else if(ascii_data>='a' && ascii_data<='f') hex_data=ascii_data-'a'+10; //若 转换内容为 字符'a-f',则转成数字10-15
else if(ascii_data>='A' && ascii_data<='F') hex_data=ascii_data-'A'+10; //若 转换内容为 字符'A-F',则转成数字10-15
return hex_data; //返回转换结果,非以上字符,不在Hex(0-F)范围内,默认0
}
bit UART_ReadByte(uchar p_data,bit data_mode) //串口读字节函数,返回值0 无数据,1 有数据,将data_mode模式(ASCII_Mode或HEX_Mode)转成Hex结果存到p_data指向地址
{
if(!UART_ReFlag) return FALSE; //若无新数据,则返回 0(无数据)
UART_ReFlag=FALSE; //否则,清 串口接收标志位
if(data_mode==HEX_Mode) p_data=UART_DataR; //Hex模式,将串口接收结果存到p_data指向地址
if(data_mode==ASCII_Mode) p_data=ASCII_ToHex(UART_DataR); //ASCII模式,将串口接收结果转成Hex后,存到p_data指向地址
return TRUE; //返回 1(有数据)
}
楼主,发送与接收不要放在同一个中断服务程序中,Rx_Data[i]=SBUF;
SBUF=Rx_Data[i];
这两句不应放在同一个中断服务程序中啊,都放在main()
{
while(1)
{
SBUF=Rx_Data[i];
…………
}
}
Rx_Data[i]=SBUF,放在中断服务程序中;
#include <AT89X51H>//单片机51头文件,存放着单片机的寄存器
unsigned char dat; //用于存储单片机接收发送缓冲寄存器SBUF里面的内容
sbit gewei=P2^2; //个位选通定义
sbit shiwei=P2^3; //十位选通定义
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67,0x77,0x7c,0x39,0x5e,0x79,0x71};
//{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67,};// 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
void Delay(unsigned int tc) //延时程序
{
while( tc != 0 )
{unsigned int i;
for(i=0; i<100; i++);
tc--;}
}
void LED() //LED显示接收到的数据
{
shiwei=0;
P0=~table[dat/16];
Delay(8);
shiwei=1;
gewei=0;
P0=~table[dat%16];
Delay(5);
gewei=1;
}
void Init_Com(void)//功能:串口初始化,波特率9600,方式1
{
TMOD = 0x20;
PCON = 0x00;
SCON = 0x50;
TH1 = 0xFd;
TL1 = 0xFd;
TR1 = 1;
}
void main()//主程序功能:实现接收数据并把接收到的数据原样发送回去///////
{
Init_Com();//串口初始化
// P1=0xf0;
while(1)
{
if ( RI ) //扫描判断是否接收到数据,
{
dat = SBUF; //接收数据SBUF赋与dat
RI=0; //RI清零。
SBUF = dat; //在原样把数据发送回去
}
LED(); //显示接收到的数据
}
}
修改如下:
#include<reg52h>
sbit shuru=P1^0;
unsigned char PuZh[16] = "a";
unsigned char BuZh[16] = "b";
bit flaga=0,flagb=0;
void UsartConfiguration();
void Delay10ms(unsigned int c); //误差 0us
void main()
{
unsigned char i;
UsartConfiguration();
while(1)
{
if(shuru==0 && flaga==0)
{
for(i=0; i<16; i++)
{
SBUF = PuZh[i]; //将要发送的数据放入到发送寄存器
while(!TI); //等待发送数据完成
TI=0; //清除发送完成标志位
TR1 = 0;
ES = 0;
EA = 0;
}
flaga=1;
flagb=0;
Delay10ms(500); //延时一下再发
}
else if(shuru==1 && flagb==0)
{
for(i=0; i<16; i++)
{
SBUF = BuZh[i]; //将要发送的数据放入到发送寄存器
while(!TI); //等待发送数据完成
TI=0; //清除发送完成标志位
TR1 = 0;
ES = 0;
EA = 0;
}
flaga=0;
flagb=1;
Delay10ms(500); //延时一下再发
}
}
/
函 数 名 :UsartConfiguration()
函数功能 :设置串口
输 入 : 无
输 出 : 无
/
void UsartConfiguration()
{
SCON=0X50; //设置为工作方式1
TMOD=0X20; //设置计数器工作方式2
PCON=0X80; //波特率加倍
TH1=0XFA; //计数器初始值设置,注意波特率是4800的
TL1=0XFA;
// ES=1; //打开接收中断
// EA=1; //打开总中断
TR1=1; //打开计数器
}
void Delay10ms(unsigned int c) //误差 0us
{
unsigned char a, b;
for (;c>0;c--)
{
for (b=38;b>0;b--)
{
for (a=130;a>0;a--);
}
}
}
#include<reg51h>
#define uchar unsigned char
uchar com1[]={0xef,0x01,0xff,0xff,0xff,0xff,0x01,0x00,0x03,0x01,0x00,0x05};
uchar red1[]={0xef,0x01,0xff,0xff,0xff,0xff,0x07,0x00,0x03,0x02,0x00,0x0c};
uchar red2[]={0xef,0x01,0xff,0xff,0xff,0xff,0x07,0x00,0x03,0x02,0x00,0};
uchar red3[]={0xef,0x01,0xff,0xff,0xff,0xff,0x07,0x00,0x03,0x02,0x80,0};
sbit p17=P1^7;
sbit p10=P1^0;
sbit p11=P1^1;
sbit p12=P1^2;
main()
{
uchar i,rdat[12];
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
TR1=1;
SCON=0x50;
while(1)
{
for(i=0;i<12;i++)
{
SBUF=com1[i];
while(!TI);
TI=0;
}
i=0;
while(i<12)
{
if(RI)
{
RI=0;
rdat[i]=SBUF;
i++;
}
}
for(i=0;i<12;i++)
{
if(rdat[i]!=red1[i])p17=1;
}
for(i=0;i<12;i++)
{
SBUF=com1[i];
while(!TI);
TI=0;
}
i=0;
while(i<12)
{
if(RI)
{
RI=0;
rdat[i]=SBUF;
i++;
}
for(i=0;i<12;i++)
{
if(rdat[i]!=red2[i])p10=1;
else if(rdat[i]!=red2[i])p11=1;
else p12=1;
}
}
}
}
以上就是关于51单片机从电脑串口接收10字节的数据,程序用c语言全部的内容,包括:51单片机从电脑串口接收10字节的数据,程序用c语言、51单片机串口通信程序问题、求一个基于51单片机的C语言程序,要求从串口接收一组数据,然后将其通过串口输出等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)