51串口通信程序.docx
《51串口通信程序.docx》由会员分享,可在线阅读,更多相关《51串口通信程序.docx(7页珍藏版)》请在冰豆网上搜索。
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置位,启动定时器。