这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 单片机与计算机通讯

共3条 1/1 1 跳转至

单片机与计算机通讯

菜鸟
2005-09-16 15:26:20     打赏


单片机是8031,通讯用到三根线,TXD,RXD,GND

单片机与PC的通讯程序
现以RS-232C通讯协议为基础,介绍单片机与PC的通讯程序。
波特率为1200bit/s,8位有效位数,无较验位,PC用COM2。以介绍发送数据的程序为主
,把方扩号上面一行程序换成扩号内的程序,即成接收数据的程序。单片机串行数据寄
存器结构请参阅文献[6]。PC的串行口请参阅文献[7]。QBASIC语言请参阅它的帮助文件

单片机的程序(晶振为6MHz):
MOV PCON, #00H ;波特率不加倍
MOV TMOD, #20H ;设置控制波特率定时器的工作方式
MOV TH1, #0F3H ;设置波特率为1200bit/s
MOV TL1, #0F3H ;
CLR ET1 ;禁止此定时器中断
MOV SCON, #40H ;设置串行口工作方式为方式1
SETB TR1 ;启动定时器,准备通讯
SEND: MOV A, #DATA ;发送的数据先赋予A
[ RECEIVE: ;此行省略 ]
MOV SBUF, A ;发送
[ MOV A, SBUF ;接收 ]
JNB TI, $ ;等待发送完成
[ JNB TI, $ ;等待接收完成,此时A即为接收到的数据 ]
CLR TI
8086汇编语言(软件中断方式)
MOV AH, 0 ;初始化
MOV AL, 8BH ;初始化波特率参数为1200bit/s
MOV DX, 1 ;串行口号为COM2
INT 14H ;调用中断号(相当于C语言的int86(20))
MOV AH, 1 ;数据发送
[ MOV AH, 2 ;数据接收 ]
MOV AL, DATA ;发送的数据
[ ;此行可省 ]
INT 14H
[ INT 14H ;此时,AL即为接收到的数据 ]
C语言(读写I/O方式):
#include<io.h>
#include<stdio.h>
#include<conio.h>
#define tbr 0x2f8 //发送和接收缓冲器
#define baudLsb 0x2f8 //波特率高位
#define baudmsb 0x2f9 //波特率低位
#define ter 0x2f9 //中断允许
#define Lcr 0x2fb //控制寄存器
#define mcr 0x2fc //调制解调器
#define Lsr 0x2fd //通讯线路状态
main()
{
unsigned short int rcv, snd; //rcv为接收数据变量,snd为发送数据变量
snd=0xff; //要发送的数据
outportb (Lcr, 0x80); //给波特率寄存器赋值
outportb (baudlsb, 0x60); //波特率为1200bit/s
outportb (baudlsb, 0x00); //
outportb (Lcr, 0x03); //8位数据位,1位停止位
outportb (ter, 0x00); //禁止中断
outportb (mcr, 0x00); //不要应答
outportb (tbr, snd); //发送数据
[ r=inportb (tbr); //接收数据 ]
}
QBASIC语言(DOS6.22有自带):
OPEN "COM2:1200, N, 8, 1, RS, CS,DS, CD" AS #1
REM 设置并打开串行口
PRINT #1, CHR$ (SND)
REM 发送,BASIC把串行口的数据看成字符
[ RCV=ASC (INPUT$ (1, #1)) ]
[ REM 接收 ]
在Visual Basic中没有OPEN "COM:…"的语句,它另有一个用于串行通讯的控件MSCcomm
,读者可看一下它的帮助文件,即可以不费什么工夫编出WINDOWS的串行通讯程序。但是
大家如要求不高,最好用VB3.0编。因为VB5.0、VB6.0等32位语言采用的是Unicode(一
种双字节系统),它一次从串行口读入或写出16位的数据(VB3.0是8位),我现在没有
办法修改它。若坚持用高版本的VB,可以在单片机编程上花一些工夫,使它也能识别Un
icode;也可以先用C编出DLL库,再用VB来调用。而用MATLAB语言的话,可以把C语言由
MATLAB编译成MEX文件,具体请看我的老师高俊斌著的《MATLAB5.0语言与程序设计》。

最后我还想就RS-232C讲一个问题:在RS-232C中高速传输数据,单片机的晶振不能
用6MHz和12MHz的整数系列,要用11.0592MHz晶振,否则会造成误码率高。




关键词: 单片机     计算机     通讯     发送     数据    

工程师
2010-09-21 19:51:24     打赏
2楼
VB5.0、VB6.0等32位语言采用的是Unicode它一次从串行口读入或写出16位的数据(VB3.0是8位),现在又没有解决啊?

菜鸟
2010-10-15 16:41:25     打赏
3楼
看下

共3条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]