51单片机从电脑串口接收10字节的数据,程序用c语言

51单片机从电脑串口接收10字节的数据,程序用c语言,第1张

可靠的接受程序!!从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语言程序,要求从串口接收一组数据,然后将其通过串口输出等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/9872530.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存