單片機(jī)與RS232串口通信C51程序
/*************************************************************************/
#include"iom16v.h"
#include<macros.h>
#definebaud9600//波特率
#definefosc8000000//晶振8mhz
/*************************初始化函數(shù)**********************/
voidusart_init(void)
{
/*設(shè)置波特率*/
//ubrr=51;
//ubrrh=(unsignedchar)(baud>>8);
//ubrrl=(unsignedchar)(baud);
ubrrl=(fosc/16/baud-1)%256;
ubrrh=(fosc/16/baud-1)/256;
/*接收器和發(fā)送器使能*/
ucsrb=(1<<rxen)|(1<<txen);
/*設(shè)置數(shù)據(jù)幀格式*/
ucsrc="/blog/(1<";<ursel)|(1<<usbs)|(3<<ucsz0);//8個(gè)數(shù)據(jù)位,2個(gè)停止位
}
/********************數(shù)據(jù)發(fā)送函數(shù)(5~8位)*********************/
voidusart_transmit(unsignedchardata)
{
/*等待發(fā)送緩沖器為空*/
while(!(ucsra&(1<<udre)))//udre為時(shí)緩沖器為空
;
/*將數(shù)據(jù)放入緩沖器,發(fā)送數(shù)據(jù)*/
udr=data;
}
/********************數(shù)據(jù)接受函數(shù)(5~8位)*********************/
unsignedcharusart_receive(void)
{
/*等待接受數(shù)據(jù)*/
while(!(ucsra&(1<<rxc)))//接受緩沖器中有未讀出的數(shù)據(jù)時(shí)rxc置位,否則清零
;
/*從緩沖器中獲取并返回?cái)?shù)據(jù)*/
returnudr;
}
/********************字符串發(fā)送函數(shù)(不含回車(chē)換行)***********************/
voidusart_transmit_string(unsignedchar*s)
{
while(*s)
{
usart_transmit(*s);
s++;
}
}
voidmain()
{
unsignedchari;
unsignedchar*p1,*p2;
unsignedchara[]={"thekeyis:"};
unsignedcharb[]={"pleasepressanykey"};
p1=a;
p2=b;
usart_init();
//usart_transmit_string(p2);
//usart_transmit(0x0d);//回車(chē)換行
//usart_transmit(0x0a);
while(1)
{
i=usart_receive();
if(i!=0)
{
//usart_transmit_string(p1);
usart_transmit(i);
//usart_transmit(0x0d);//回車(chē)換行
//usart_transmit(0x0a);
}
}
}
/*************************************************************************/
#include"iom16v.h"
#include<macros.h>
#definebaud9600//波特率
#definefosc8000000//晶振8mhz
/*************************初始化函數(shù)**********************/
voidusart_init(void)
{
/*設(shè)置波特率*/
//ubrr=51;
//ubrrh=(unsignedchar)(baud>>8);
//ubrrl=(unsignedchar)(baud);
ubrrl=(fosc/16/baud-1)%256;
ubrrh=(fosc/16/baud-1)/256;
/*接收器和發(fā)送器使能*/
ucsrb=(1<<rxen)|(1<<txen);
/*設(shè)置數(shù)據(jù)幀格式*/
ucsrc="/blog/(1<";<ursel)|(1<<usbs)|(3<<ucsz0);//8個(gè)數(shù)據(jù)位,2個(gè)停止位
}
/********************數(shù)據(jù)發(fā)送函數(shù)(5~8位)*********************/
voidusart_transmit(unsignedchardata)
{
/*等待發(fā)送緩沖器為空*/
while(!(ucsra&(1<<udre)))//udre為時(shí)緩沖器為空
;
/*將數(shù)據(jù)放入緩沖器,發(fā)送數(shù)據(jù)*/
udr=data;
}
/********************數(shù)據(jù)接受函數(shù)(5~8位)*********************/
unsignedcharusart_receive(void)
{
/*等待接受數(shù)據(jù)*/
while(!(ucsra&(1<<rxc)))//接受緩沖器中有未讀出的數(shù)據(jù)時(shí)rxc置位,否則清零
;
/*從緩沖器中獲取并返回?cái)?shù)據(jù)*/
returnudr;
}
/********************字符串發(fā)送函數(shù)(不含回車(chē)換行)***********************/
voidusart_transmit_string(unsignedchar*s)
{
while(*s)
{
usart_transmit(*s);
s++;
}
}
voidmain()
{
unsignedchari;
unsignedchar*p1,*p2;
unsignedchara[]={"thekeyis:"};
unsignedcharb[]={"pleasepressanykey"};
p1=a;
p2=b;
usart_init();
//usart_transmit_string(p2);
//usart_transmit(0x0d);//回車(chē)換行
//usart_transmit(0x0a);
while(1)
{
i=usart_receive();
if(i!=0)
{
//usart_transmit_string(p1);
usart_transmit(i);
//usart_transmit(0x0d);//回車(chē)換行
//usart_transmit(0x0a);
}
}
}