三、单片机的串行通信实验
下面给出笔者实验时编写的单片机串行通信源程序:
org 00h
jmp main
org 23h ;串行中断入口地址
jmp com-int ;串行中断服务程序
org 30h
main :mov sp , # 30h ;设置堆栈
lcall comm ;串口初始化
jmp $ ;原地等待
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 t r1 ;定时器
ret ;返回
com-int :clr es ;关串行中断
clr ri ;清接收标志
mov a ,sbuf ;从缓冲区取数据
mov sbuf ,a
jnb ti , $ ;等待发送完毕
clr ti ;清发送标志
setb es ;允许串行中断
reti ;中断返回
end
该程序将MCU 的串口初始化为2400bps 的波特率,然后等待中断。中断服务程
序的功能是将所接收的数据发给计算机。笔者最初用C 语言编写的通信程序如下:
# include″dos. h″
# include″BIOS. h″
main0
{int i ;
bioscom(0 ,0xa3 ,0) ;
for (i = 0 ;i < 256 ;i + + )
{bioscom(1 ,i ,0) ;
printf (″%c″,i) ;
while ( ! (bioscom(3 ,0 ,0) &0x0100) ) ;
printf (″- %c″,bioscom(2 ,0 ,0) &0x00ff) ;
}
printf (″\ n″) ;
getch0 ;
}
该程序无法实现与单片机的串口通信,用int86 函数直接调用14H 功能调用也不
行,所以笔者剖析了bioscom 函数的执行过程,发现了问题所在。
笔者用右图所示的连接线将计算机的COM1和COM2连接起来,具体如左图所示,然后执行下列程序对bioscom函数的1号发送功能进行测试。
# include″dos. h″
# include″bios. h″
# define COM 3
main ()
{outportb (0x3fc ,0) ;
outportb (0x2fc ,0) ;
bioscom(0 ,0xa3 ,0) ;
bioscom(0 ,0xa3 ,1) ;
outportb (0x2fc ,COM) ;
printf (″%X″,bioscom(1 ,65 ,0) &0x8000) ;
printf (″\ n″) ;
getch () ;
}