篇一:串口发送与接收
串口的发送功能:数据通过串口由芯片向上位机发送
串口发送的时候是不能够用中断的,要使用查询模式,所以要从初始化串口开始一步一步的进行
/****************************************************************
/*函数功能: 串口发送字符串
/*函数说明:*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);
}
}
}