甲乙机以方式1进行串行通信,其波特率设为1200,甲机发送,发送数据在外部RAM 4000H~401FH单元中。乙机接收,并把接收到的数据块首末地址及数据依次存入外部RAM5000H开始的区域中。
第一步:波特率所对应的计数初值设定。假定晶振频率是6MHz,且是以方式1进行通信,T1设为工作方式2.则计数初值:X=(11110011)B
可以通过以下C语言程序得到计数初值,条件是:晶振频率是6MHz,T1设为工作方式2。
#include "iostream"
#include <bitset>
using namespace std;
using std::bitset;
void main()
{
int i,j;
cin>>i;
j=256-6000000/384/i;
bitset<16> bitvec2(j);
cout << "bitvec2: " << bitvec2 << endl;
}
输入值为波特率,输出即为计数初值。
甲机发送主程序:
//中断跳转程序
ORG 0023H //串行中断的入口地址
AJMP ACINT
//计数器TI初始化程序
ORG 8030H
MOV TMOD, #20H;设置计数器1为工作方式2
MOV TH1, #0F3H;
MOV TL1, #0F3H;
//中断设置
SETB EA ;中断总允许
CLR ES ;关串行中断
MOV PCON, #00H;I波特率不倍增
SETB TR1 ;启动定时器1
MOV SCON, #40H;设置串行口方式1工作
MOV SBUF, #40H;发送首地址高位
SOUT1: JNB TI, $ ;等待发送完成
CLR TI ;串行口中断标志位需要手动清0
MOV SBUF, #00H;发送首地址低位
SOUT2: JNB TI, $ ;等待发送完成
CLR TI
MOV SBUF, #40H
SOUT3: JNB TI, $
CLR TI
MOV SUBF, #1FH;
SOUT4: JNB TI, $
CLR TI
MOV DPTR, #4000H;装首地址指针
MOV R7, #20H
;一共有32个数据需要发送
送
SETB ES
AHALT: AJMP $
//中断服务子程序
ACINT: MOV A, @DPTR
CLR TI
MOV SBUF, A ;将RAM中的数据送出
CJNE R7,#00H,AEND1 ;发送完跳转
DEC R7
INC DPTR
AJMP ANED2
AEND1: CLR ES ;关闭串行中断
CLR TR1 ;关闭定时器
ANED2: RETI
文章评论(0条评论)
登录后参与讨论