现在的位置: 首页嵌入式研究>正文
51单片机,串口演示程式(包含字符串发送)
2011年03月23日 嵌入式研究 暂无评论

使用串口的中断方式接收,查询发送完成标志.字符串的发送是使用固定的长度方式,没有使用 "\0".因为51的内存太小,如果字符串太长就完了. 详见程式如下:

 #include <reg51.h> 
 
#define string_len 17 //数据长度 
 
unsigned char inbuf[string_len];
unsigned char count;
bit read_flag= 0 ; 
 
void init_serialcomm( void )
{
    SCON = 0x50; //串口方式1,允许接收
    PCON |=0x80; //波特率加倍
    TMOD = 0x20; //定时器1工作方式2自动重装
    TH1= 0xFD;//波特率为19200,11.0592MHz单倍速,SMOD=1,实际波特率为19200.0,误差率为0.00%
    TL1= 0xFD;
TR1 = 1;
IE |= 0x90 ; //Enable Serial Interrupt
TR1 = 1 ; // timer 1 run
} 
 
//向串口发送一个字符  没有使用中断方式
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==0xff )
                {
                count= 0 ;
                }
        else
                { 
 
                inbuf[count]=ch;
                count++;
                if (count==(string_len- 1 ))
                        {
                        read_flag= 1 ;  //如果串口接收的数据达到string_len个,
                                                        //就置位取数标志
                        }
                }
        }
} 
 
main()
{
init_serialcomm();         //初始化串口
while ( 1 )
        {
        if (read_flag)         //如果取数标志已置位(接收到的数据串够了),就将读到的数从串口发出
                {
                read_flag= 0 ; //取数标志清0
                send_string_com(inbuf,string_len);
                }
        }
}

串口波特率如何计算?请看此文章:51MCU串口计算工具



给我留言

留言无头像?


无觅相关文章插件,快速提升流量