51串口通信程序.docx

上传人:b****6 文档编号:8466455 上传时间:2023-01-31 格式:DOCX 页数:7 大小:18.60KB
下载 相关 举报
51串口通信程序.docx_第1页
第1页 / 共7页
51串口通信程序.docx_第2页
第2页 / 共7页
51串口通信程序.docx_第3页
第3页 / 共7页
51串口通信程序.docx_第4页
第4页 / 共7页
51串口通信程序.docx_第5页
第5页 / 共7页
点击查看更多>>
下载资源
资源描述

51串口通信程序.docx

《51串口通信程序.docx》由会员分享,可在线阅读,更多相关《51串口通信程序.docx(7页珍藏版)》请在冰豆网上搜索。

51串口通信程序.docx

51串口通信程序

51单片机串口通信软件程序集

作者:

jdzj868 来源:

机电之家下载站 录入:

jdzj868 更新时间:

2009-9-1116:

46:

01 点击数:

0

【字体:

串口通信的单片机程序

beep    bit  p3.7                ;蜂鸣器定义

        org00h

      jmpmain

        org23h                      ;串行中断入口地址

      jmpcom_int                    ;串行中断服务程序

;***********  主程序开始    *******************

        org30h

  main:

  movsp,#30h                ;设置堆栈

            lcallrest            ;初始化

            lcallcomm            ;串口初始化

            jmp$                  ;原地等待

;  *************  初始化  *********************

  rest:

      movp0,#00h            ;禁止数码管显示

            movp2,#255

            clr  beep                ;禁止蜂鸣器

            movp1,#255              ;禁止LED显示

            RET                      ;返回

;**************  串口初始化  *****************

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

;波特率设置为  2400  ;

comm:

        movtmod,#20h          ;设置定时器T1工作方式2

              movtl1,#0f3h            ;定时器计数初值,波特率2400

              movth1,#0f3h            ;定时器重装值

              setbea                      ;允许总的中断

              setbes                      ;允许串行中断

              movpcon,#00h          ;波特率不倍增

              movscon,#50h          ;设置串口工作方式1,REN=1允许接收

              setbtr1                      ;定时器开始工作

              ret                              ;返回

;***************  串口中断服务程序  ***********

;  如果接收  0FF  表示上位机需要联机信号,单片机发送0FFH作为

;  应答信号,如果接收到数字1~n,表示相应的功能;

;  这里,如果收到1,则单片机向计算机发送字符  'H';

;            如果收到2,则单片机向计算机发送字符  'e';

;            如果收到其他的数据,则发送    'J';

com_int:

  clres                        ;禁止串行中断

                clrri                          ;清除接收标志位

                mova,sbuf              ;从缓冲区取出数据

                movp1,a

                movdptr,#tab

                cjnea,#0ffh,in_1      ;检查数据

                movsbuf,#255          ;收到联机信号,发送联机信号

                jnbti,$                      ;等待发送完毕

                clrti                          ;清除发送标志

                setbes                    ;允许串行中断

                reti                            ;中断返回

      in_1:

cjnea,#1H,in_2        ;如果收到1

                movca,@a+dptr

                movsbuf,a            ;发送'h'

                jnbti,$                      ;等待发送完毕

                clr  ti                        ;清除发送中断标志

                setbes                    ;允许串行中断

                reti                            ;中断返回

      in_2:

cjnea,#2,in_3        ;接收到  2

                movca,@a+dptr

                movsbuf,a            ;发送'e'

                jnbti,$                      ;等待发送完毕

                clr  ti                        ;清除发送中断

                setbes                    ;允许串行中断

                reti                            ;中断返回

      in_3:

    mova,#03h

                movca,@a+dptr

                movsbuf,a            ;发送'j'

                jnbti,$                      ;等待发送完毕

                clrti                          ;清除发送中断标志

                setbes                    ;允许串行中断

                reti                            ;返回

tab:

    db'2','h','e','j'

  end

51单片机串口调试程序一例

/*定义为中断方式串口处理*/

#defineINTERSENDSTR

/*不为8032系列芯片*/

//#defineCHIP_8032

#include

#include

#include

#include"err.h"

#ifdefINTERSENDSTR

unsignedcharxdatasSendComBuf[256],sRecComBuf[256];

unsignedchardatabOut,bIn,bSout,bSin;

#else

#defineDEFSENDCHARTI=0;SBUF=ACC;while(!

TI);TI=0;

#endif

//bps设置9600就是PSetBps(96)(11.0592Mhz)

unsignedchar  PSetBps(unsignedintbps)SMALL

{

unsignedintt1;

unsignedchart2;

#ifdefINTERSENDSTR

/*如果使用中断方式发送数据,必须等待发送数据完毕才能更换波特率*/

while(bSin!

=bSout)

{

;

}

ES=0;

#endif

#ifdefCHIP_8032

if(3456%bps)

{

returnERR_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))

{

returnERR_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;

#ifdefINTERSENDSTR

bOut=bIn;

bSout=bSin;

ES=1;

#endif

returnOK;

}

voidPSendChar(unsignedcharch)SMALL

{

#ifdefINTERSENDSTR

unsignedchartch;

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

}

unsignedcharPGetChar()SMALL

{

unsignedcharch;

#ifdef  INTERSENDSTR

ch=sRecComBuf[bOut];

bOut++;

returnch;

#else

ch=SBUF;

RI=0;

#endif

}

bitPCharInCom()SMALL

{

#ifdef  INTERSENDSTR

if(bIn!

=bOut)

{

return1;

}

return0;

#else

returnRI;

#endif

}

voidPSendString(unsignedchar*st)SMALL

{

while(*st)

{

PSendChar(*st);

st++;

}

}

voidPSendArray(unsignedchar  *st,unsignedint  len)SMALL

{

unsignedintii;

for(ii=0;ii

{

PSendChar(st[ii]);

}

}

#ifdef  INTERSENDSTR

voidPSerialInt()interrupt4

{

if(RI)

{

sRecComBuf[bIn]=SBUF;

bIn++;

RI=0;

}

if(TI)

{

TI=0;

if(bSout!

=bSin)

{

bSout++;

}

if(bSout!

=bSin)

{

SBUF=sSendComBuf[bSout];

}

}

}

#endif

 

51单片机的定时/计数器

2010-09-2417:

09

16位定时/计数器

MCS51的定时/计数器的基本部件是两个8位的计数器(TH1、TL1是T1的计数器,TH0、TL0是T0的计数器)拼装而成。

在作定时器使用时,输入的时钟脉冲是由晶振的输出经12分频后得到的。

所以定时器也可看作是对计算机机器周期的计数器。

如果晶振频率为12MHz,则定时器每接收一个输入脉冲捍间为1us。

当它用作对外部事计数时,接相应的外部输入引脚T0(P3.4)或T1(P3.5)。

很少工作在此种模式。

MCS51定时/计数器相关的寄存器

MCS51定时/计数器有四种工作方式,其工作方式的选择及控制都由两个特殊功能寄存器(TMOD、TCON)的内容来决定。

定时器的方式寄存器TMOD

高4位用于定时器1,低4位用于定时器0。

工作方式选择(M1,M0)

00:

13位定时器/计数器

01:

16位定时器/计数器

10:

自动装入时间常数的8位定时器/计数器

11:

对T0分为两个8位独立计数器,对T1置方式3时停止工作

定时器/计数器方式选择位C/T

C/T:

为1时,是计数器方式,为0时,定时器方式。

定时器/计数器运行控制位GATE

用来确定对应的外部中断请求引脚的操作控制。

GATE=0时,只要定时器控制寄存器TCON中的TR0(或TR1)被置1时,T0(或T1)被允许开始计数;GATE=1时,不仅要TCON中的TR0(或TR1)被置位,还需要P3口的相应引脚为高电平,才允许计数和。

MCS51定时器使用频骤(工作于方式1)

1)初始化TMOD,设置工作模式。

2)根据定时间隔,计算并初始化TH0与TL0的数值;

    计算公式:

TH0:

TL0=(2^16-1)-晶振频率/12

3)如果中断方式使用定时器,则需要置位中断允许控制寄存器(IE)中的ET0或ET1,而且要打开全局中断(EA=1)。

同时要写好中断服务函数。

4)将TCON的TR0或TR1置位,启动定时器。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 工作计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1