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

📄 51单片机串口调试程序一列(不错)--单片机坐标.txt

📁 51单片机串口调试程序一列(不错)--单片机坐标
💻 TXT
字号:
51单片机串口调试程序一列(不错)--单片机坐标 

            /*定义为中断方式串口处理*/
            #define INTERSENDSTR
            /*不为8032系列芯片 */ 
            //#define CHIP_8032 

            #include <absacc.h>
            #include <reg51.h>
            #include <string.h>
            #include "err.h"


            #ifdef INTERSENDSTR
            unsigned char xdata sSendComBuf[256],sRecComBuf[256];
            unsigned char data bOut,bIn,bSout,bSin;
            #else
            #define DEFSENDCHAR TI=0;SBUF=ACC;while(!TI);TI=0;
            #endif
            //bps设置 9600就是 PSetBps(96)(11.0592Mhz) 

            unsigned char  PSetBps(unsigned int bps) SMALL
            {
            unsigned int t1;
            unsigned char t2;
            #ifdef INTERSENDSTR
            /*如果使用中断方式发送数据,必须等待发送数据完毕才能更换波特率 */
            while(bSin!=bSout)
            {
            ;
            }
            ES=0;
            #endif 

            #ifdef CHIP_8032
            if(3456%bps)
            {
            return ERR_SET_BPS;
            }
            t1=3456/bps;
            t1--;t1=~t1;
            RCAP2H=t1/256;RCAP2L=t1;
            T2MOD=0x00;
            /*使用定时器2做波特率发生器 */
            T2CON=0x34;/*TF2=0;EXF2=0;RCLK=1;TCLK=1;EXEN2=0;TR2=1;C/T2=0;CP/RL2=0
            */
            #else
            t1=576/bps;
            if((576%bps)||((t1==0))||(t1>=2*256)) 
            {
            return ERR_SET_BPS;
            }
            if(t1>256)
            {
            PCON=00;
            t2=256-(288/bps);
            }
            else
            {
            PCON=0x80;
            t2=256-t1;
            }
            TH1=t2;TL1=t2;
            TR1=1;
            #endif 
            /*模式3*/
            SM0=0;
            RI=0;TI=0;
            REN=1;
            SM1=1;
            SM2=1;
            #ifdef INTERSENDSTR 
            bOut=bIn;
            bSout=bSin;
            ES=1;
            #endif 
            return OK;
            }
            void PSendChar(unsigned char ch) SMALL
            {

            #ifdef INTERSENDSTR
            unsigned char tch;

            tch=bSin+1;
            while(tch==bSout)
            {
            ;
            }
            sSendComBuf[bSin]=ch;
            ES=0;
            if((bSout==bSin))
            {
            SBUF=sSendComBuf[bSin];
            bSin++;
            }
            else
            {
            bSin++;               
            }
            ES=1;
            #else 
            ACC=ch;
            DEFSENDCHAR;
            #endif 
            }
            unsigned char PGetChar() SMALL
            {
            unsigned char ch;
            #ifdef  INTERSENDSTR
            ch=sRecComBuf[bOut];
            bOut++;
            return ch;
            #else
            ch=SBUF;
            RI=0;
            #endif 
            }
            bit PCharInCom() SMALL
            {
            #ifdef  INTERSENDSTR
            if(bIn!=bOut)
            {
            return 1;
            }
            return 0;
            #else
            return RI;
            #endif
            }
            void PSendString(unsigned char *st) SMALL
            {
            while(*st)
            {
            PSendChar(*st);
            st++;
            }
            }
            void PSendArray(unsigned char  *st,unsigned int  len) SMALL
            {
            unsigned int ii;
            for(ii=0;ii<len;ii++)
            {
            PSendChar(st[ii]);
            }
            }
            #ifdef  INTERSENDSTR
            void PSerialInt() interrupt 4
            {
            if(RI) 
            {
            sRecComBuf[bIn]=SBUF;
            bIn++;
            RI=0;
            }
            if(TI)
            {
            TI=0;
            if(bSout!=bSin)
            {
            bSout++;
            }
            if(bSout!=bSin)
            {
            SBUF=sSendComBuf[bSout];
            }
            }
            }
            #endif




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 + -