51串口通信程序.docx
- 文档编号:8466455
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:7
- 大小:18.60KB
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置位,启动定时器。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 51 串口 通信 程序