赞助论坛
  • 3842阅读
  • 0回复

学习单片机之---c51单片机串行口操作 [复制链接]

楼层直达
jswr  
发帖
339
精华
1
金币
264
威望
8
贡献
7
好评
15
注册
2008-06-30
楼主    jswr 发表于: 2008-08-06 16:13:34 
c51单片机串行口操作
                         
#include "sonyinc.h"
#include "hyscreen.h"

void prscreen(uchar * id);
void serint(void);
void prscr(uchar *id);

main()
{
  uchar *p;
  // uchar j;
  serint();
// prscr(welcome);
  p=welcome;
  while(*p!=0xff)
  {
    SBUF=*p;
    while(TI==0);
    TI=0;
    p++;
  }
  while(1);
}

void serint(void)
{ SCON = 0x50;           /* SCON: mode 1, 8-bit UART, enable rcvr   0101 0000   */
  TMOD |= 0x20;           /* TMOD: timer 1, mode 2, 8-bit reload   00100000   */
  PCON |=0x80;
  TH1   = 253;           /* TH1: reload value for 1200 baud @ 16MHz   */
  TL1   = 253;
  TR1=1;
  }

以下为为COPY 91MCU blog

beep   bit   p3.7           ;蜂鸣器定义

        org 00h
        jmp main
        org 23h               ;串行中断入口地址
        jmp com_int           ;串行中断服务程序

;*********** 主程序开始   *******************
        org 30h
main:   mov sp,#30h       ;设置堆栈
        lcall rest           ;初始化
        lcall comm         ;串口初始化
        jmp $               ;原地等待

; *************   初始化   *********************
  rest:   mov p0,#00h       ;禁止数码管显示
        mov p2,#255
        clr beep             ;禁止蜂鸣器
        mov p1,#255       ;禁止LED显示
        RET                 ;返回

; ************** 串口初始化   *****************
;设置串行口工作方式1,定时器1作为波特率发生器
;波特率设置为   2400 ;

comm:   mov tmod,#20h       ;设置定时器T1工作方式2
        mov tl1,#0f3h         ;定时器计数初值,波特率 2400
        mov th1,#0f3h         ;定时器重装值
        setb ea               ;允许总的中断
        setb es               ;允许串行中断
        mov pcon,#00h       ;波特率不倍增
        mov scon,#50h       ;设置串口工作方式1,REN = 1 允许接收
        setb tr1               ;定时器开始工作
        ret                     ;返回
;*************** 串口中断服务程序   ***********
; 如果接收 0FF 表示上位机需要联机信号,单片机发送 0FFH作为
; 应答信号,如果接收到 数字 1~ n,表示相应的功能;
; 这里,如果收到 1 ,则单片机向计算机发送字符 'H';
;         如果收到 2 ,则单片机向计算机发送字符 'e';
;         如果收到其他的数据,则发送   'J';
com_int:   clr es                 ;禁止串行中断
          clr ri                 ;清除接收标志位
          mov a,sbuf           ;从缓冲区取出数据
          mov p1,a
          mov dptr,#tab
          cjne a,#0ffh,in_1     ;检查数据
          mov sbuf,#255       ;收到联机信号,发送联机信号
          jnb ti,$               ;等待发送完毕
          clr ti                 ;清除发送标志
          setb es               ;允许串行中断
          reti                   ;中断返回
    in_1:   cjne a,#1H, in_2       ;如果收到1
          movc a,@a+dptr
          mov sbuf,a         ;发送 'h'
          jnb ti,$               ;等待发送完毕
          clr ti                 ;清除发送中断标志
          setb es               ;允许串行中断
          reti                   ;中断返回
    in_2: cjne a,#2,in_3       ;接收到 2
          movc a,@a+dptr
          mov sbuf,a         ;发送 'e'
          jnb ti,$               ;等待发送完毕
          clr ti                 ;清除发送中断
          setb es               ;允许串行中断
          reti                   ;中断返回
    in_3:   mov a,#03h
          movc a,@a+dptr
          mov sbuf,a         ;发送 'j'
          jnb ti,$               ;等待发送完毕
          clr ti                 ;清除发送中断标志
          setb es               ;允许串行中断
          reti                   ;返回
tab:   db '2','h','e','j'
end