51 串口通信程序

汇编
ORG 0000h;指定rom地址
ajmp main   ;跳转到main
org 0023h   ;指定rom地址为0023h串口中断程序
ajmp serial   串口中断程序
org 0030h ; 指定rom地址0030h
main:   ;main程序段
mov th1,#0fdh   ;12mhz,波特率9600 x=0xfd
mov tl1,#0fdh
mov tmod,#20h   ;定时器1模式2
setb tr1     ;允许定时器1
mov scon,#50h   ;serial 1,ren=1  
mov pcon, #00h ;smod=0
MOV P0,#00H    
SETB ES    ;允许串口中断
SETB EA   ;中断总开关

LOOP:
JMP LOOP   ;死循环,等待串口中断


serial:
MOV A,SBUF   ;第一次引起串口中断的是rxd,
MOV P0,A    
MOV SBUF,A   ;发送数据txd
JNB TI,$     ;jnb 等于0则转移。此处知道发送一帧数据完毕,ti=1才执行下一条语句
CLR TI  
CLR RI
RETI


c语言

#include <reg51.h>
#include <string.h> 
unsigned char ch;

bit read_flag= 0 ; 

void init_serialcom( void ) //串口通信初始设定

  

    SCON = 0x50 ;   //UART为模式1,8位数据,允许接收

    TMOD |= 0x20 ; //定时器1为模式2,8位自动重装

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

    TH1 = 0xFD ;   //Baud:19200 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 ; 

         



//串口接收中断函数 

void serial () interrupt 4 using 3 



    if (RI) 

         

                 RI = 0 ; 

                 ch=SBUF;             

                 read_flag= 1 ; //就置位取数标志 

              }





main() 

   

           init_serialcom(); //初始化串口 

                  while ( 1 ) 

                       

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

                                   

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

                                      send_char_com(ch); 

                                         

                           

       }

 

例子2

 

// 单片机串行口发送/接收程序,每接收到字节即发送出去
// 和微机相接后键入的字符回显示在屏幕上
// 可用此程序测试
//
#include <reg51.h>

#define XTAL 11059200    // CUP 晶振频率
#define baudrate 9600    // 通信波特率

void main(void)
{
unsigned char c;

TMOD = 0x20;   // 定时器1工作于8位自动重载模式, 用于产生波特率
TH1=(unsigned char)(256 - (XTAL / (32L * 12L * baudrate)));
TL1=(unsigned char)(256 - (XTAL / (32L * 12L * baudrate)));                // 定时器0赋初值

SCON = 0x50;
PCON = 0x00;   

TR1 = 1;
IE = 0x00;    // 禁止任何中断

while(1)
{
while(RI == 0);
RI = 0;
c = SBUF;            // 从缓冲区中把接收的字符放入c中

SBUF = c;            // 要发送的字符放入缓冲区 
while(TI == 0);
TI = 0;
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值