当前位置: 东星资源网 > 阅读 > 正文

串口接收一帧函数

时间:2017-05-11 来源:东星资源网 本文已影响 手机版

篇一:串口发送与接收

串口的发送功能:数据通过串口由芯片向上位机发送

串口发送的时候是不能够用中断的,要使用查询模式,所以要从初始化串口开始一步一步的进行

/****************************************************************

/*函数功能: 串口发送字符串

/*函数说明:*DATA为发送缓存指针

/* len为发送字串的长度

/*只能是在初始化函数void initUARTtest(void)之后调用才有效。

/*返回值: 无 *

****************************************************************/

void UartTX_Send_String(char *Data,int len)

{

int j;

for(j=0;j<len;j++)

{

U0DBUF = *Data++;

while(UTX0IF == 0);

UTX0IF = 0;

}

}

void UartTX_Send_word(char word)

{

U0DBUF = word;

while(UTX0IF == 0);

UTX0IF = 0;

}

串口初始化

void initUARTtest(void)

{

CLKCON &= ~0x40; //

while(!(SLEEP & 0x40));//

CLKCON &= ~0x47; //

SLEEP |= 0x04;//

PERCFG = 0x00;

P0SEL = 0x3c;

U0CSR |= 0x80;

// //baud_e = 10; //U0GCR |= 10; U0BAUD |= 216;

UTX0IF = 1;

////

U0CSR |= 0X40;

IEN0 |= 0x84;

}

// //

串口接收:芯片通过串口从上位机接收数据

void URX0Init(void)

{

U0CSR |= UART_ENABLE_RECEIVE;URX0IF = 0;

IEN0 |= 0x04;

EA = 1;

}

#pragma vector=URX0_VECTOR __interrupt void URX0_IRQ(void) {

INT_GLOBAL_ENABLE(INT_OFF);

if(URX0IF == 1)

{

URX0IF = 0;

ch = U0DBUF;

}

INT_GLOBAL_ENABLE(INT_ON); }

篇二:51串口发送和接收程序

/********************************************************************

* 文件名 : 串口发送试验.c

* 描述 : 该文件实现通过串口把数据从单片机发送到电脑,通过串口调试助手显示出来。

***********************************************************************/ #include<reg52.h>

#include<intrins.h>

#define uchar unsigned char

#define uint unsigned int

/********************************************************************

* 名称 : Com_Init()

* 功能 : 初始化串口程序,晶振11.0592, 波特率9600

* 输入 : 无

* 输出 : 无

***********************************************************************/ void Com_Init(void)

{

TMOD = 0x20;

PCON = 0x00;

SCON = 0x50;

TH1 = 0xFd;

TL1 = 0xFd;

TR1 = 1;

}

/********************************************************************

* 名称 : Main()

* 功能 : 主函数

* 输入 : 无

* 输出 : 无

***********************************************************************/ void Main()

{

uchar i = 0;

uchar code Buffer[] = "当前时间"; //所要发送的数据

uchar *p;

Com_Init();

P2 = 0x00;

p = Buffer;

while(1)

{

SBUF = *p;

while(!TI) //如果发送完毕,硬件会置位TI { _nop_(); } p++;

if(*p == '\0') break; //在每个字符串的最后,会有一个'\0'

TI = 0;//TI清零

}

while(1);

}

/********************************************************************

* 文件名 : 串口接收试验.c

* 描述 : 该文件实现通过单片机从电脑接收数据。通过数码管显示

该试验使用的晶振是11.0592,如果使用12M晶振,会出现串口接收 不正常的情况。原因是用12M晶振,波特率9600时的误差率达 8% 当下载这个程序到单片机时,单片机的最高为为乱码,是正常现象, 按一下复位键便可。是由于单

串口接收一帧函数

片机下载也是通过串口下载引起的。 ***********************************************************************/ #include<reg52.h>

#include<intrins.h>

#define uchar unsigned char

#define uint unsigned int

uchar code table[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

uchar LED_Buffer[8] = {0};//从串口接收的数据

/********************************************************************

* 名称 : Delay_1ms()

* 功能 : 延时子程序,延时时间为 1ms * x

* 输入 : x (延时一毫秒的个数)

* 输出 : 无

***********************************************************************/ void Delay_1ms(uint i)//1ms延时

{

uchar x,j;

for(j=0;j<i;j++)

for(x=0;x<=148;x++);

}

/********************************************************************

* 名称 : Com_Int()

* 功能 : 串口中断子函数

* 输入 : 无

* 输出 : 无

***********************************************************************/ void Com_Int(void) interrupt 4

{

static uchar i = 7; //定义为静态变量,当重新进入这个子函数时 i 的值不会发生改变 EA = 0;

if(RI == 1)//当硬件接收到一个数据时,RI会置位

{

LED_Buffer[i] = SBUF - 48; //这里减去48是因为从电脑中发送过来的数据是ASCII码。RI = 0;

if(i==0) i = 8;

i--;

}

EA = 1;

}

/********************************************************************

* 名称 : Com_Init()

* 功能 : 串口初始化,晶振11.0592,波特率9600,使能了串口中断

* 输入 : 无

* 输出 : 无

***********************************************************************/ void Com_Init(void)

{

TMOD = 0x20;

PCON = 0x00;

SCON = 0x50;

TH1 = 0xFd; //设置波特率 9600

TL1 = 0xFd;

TR1 = 1; //启动定时器1

ES = 1; //开串口中断

EA = 1; //开总中断

}

/********************************************************************

* 名称 : Main()

* 功能 : 主函数

* 输入 : 无

* 输出 : 无

***********************************************************************/ void Main()

{

uchar i = 0;

Delay_1ms(100);

Com_Init();

P2 = 0x80; //这里把P2口的最高为置1,进入循环后 循环左移 一位正好是P2 最低为置1

while(1)

{

P0 = table[LED_Buffer[i]];

P2 = i++;

Delay_1ms(1);

if(i == 8) i=0;

}

}

篇三:单片机C51串口中断接收和发送范例

//这是一个单片机C51串口接收(中断)和发送例程,可以用来测试51单片机的中断接收 //和查询发送,另外我觉得发送没有必要用中断,因为程序的开销是一样

#include <reg52.h>

#include <string.h>

#define INBUF_LEN 4//数据长度

unsigned char inbuf1[INBUF_LEN];

unsigned char checksum,count3;

bit read_flag=0;

void init_serialcomm(void)

{

SCON = 0x50; //SCON: serail mode 1, 8-bit UART, enable ucvr

TMOD |= 0x20; //TMOD: timer 1, mode 2, 8-bit reload

PCON |= 0x80; //SMOD=1;

TH1= 0xF4; //Baud:4800 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;

}

//向串口发送一个字符串,strlen为该字符串长度

void send_string_com(unsigned char *str,unsigned int strlen)

{

unsigned int k=0;

do

{

send_char_com(*(str + k));

k++;

} while(k < strlen);

}

//串口接收中断函数

void serial () interrupt 4 using 3

{

if(RI)

{

unsigned char ch;

RI = 0;

ch="SBUF";

if(ch>127)

{

count3=0;

inbuf1[count3]=ch;

checksum= ch-128;

}

else

{

count3++;

inbuf1[count3]=ch;

checksum ^= ch;

if( (count3==(INBUF_LEN-1)) && (!checksum) )

{

read_flag=1; //如果串口接收的数据达到INBUF_LEN个,且校验没错,//就置位取数标志

}

}

}

}

main()

{

init_serialcomm(); //初始化串口

while(1)

{

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

{

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

send_string_com(inbuf1,INBUF_LEN);

}

}

}

标签:串口 函数 接收 串口接收中断函数 串口 帧接收