⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uart.c

📁 单片机的部分源代码
💻 C
字号:
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

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -