C51单片机和电脑串口通信电路图与源码.docx
《C51单片机和电脑串口通信电路图与源码.docx》由会员分享,可在线阅读,更多相关《C51单片机和电脑串口通信电路图与源码.docx(11页珍藏版)》请在冰豆网上搜索。
![C51单片机和电脑串口通信电路图与源码.docx](https://file1.bdocx.com/fileroot1/2023-1/30/d2c590eb-ef7b-4c62-b654-c951d7a9e5aa/d2c590eb-ef7b-4c62-b654-c951d7a9e5aa1.gif)
C51单片机和电脑串口通信电路图与源码
C51单片机和电脑串口通信电路图与源码
51单片机有一个全双工的串行通讯口,所以单片机和电脑之间可以方便地进行串口通讯。
进行串行通讯时要满足一定的条件,比如电脑的串口是RS232电平的,而单片机的串口是TTL电平的,两者之间必须有一个电平转换电路,我们采用了专用芯片MAX232进行转换,虽然也可以用几个三极管进行模拟转换,但是还是用专用芯片更简单可靠。
我们采用了三线制连接串口,也就是说和电脑的9针串口只连接其中的3根线:
第5脚的GND、第2脚的RXD、第3脚的TXD。
这是最简单的连接方法,但是对我们来说已经足够使用了,电路如下图所示,MAX232的第10脚和单片机的11脚连接,第9脚和单片机的10脚连接,第15脚和单片机的20脚连接。
串口通讯的硬件电路如上图所示
在制作电路前我们先来看看要用的MAX232,这里我们不去具体讨论它,只要知道它是TTL和RS232电平相互转换的芯片和基本的引脚接线功能就行了。
通常我会用两个小功率晶体管加少量的电路去替换MAX232,可以省一点,效果也不错,下图就是MAX232的基本接线图。
按图7-3加上MAX232就可以了。
这大热天的拿烙铁焊焊,还真的是热气迫人来呀:
P串口座用DB9的母头,这样就可以用买来的PC串口延长线进行和电脑相连接,也可以直接接到电脑com口上。
为了能够在电脑端看到单片机发出的数据,我们必须借助一个WINDOWS软件进行观察,这里我们利用一个免费的电脑串口调试软件。
本串口软件在本网站可以找到
软件界面如上图,我们先要设置一下串口通讯的参数,将波特率调整为4800,勾选十六进制显示。
串口选择为COM1,当然将网站提供的51单片机实验板的串口也要和电脑的COM1连接,将烧写有以下程序的单片机插入单片机实验板的万能插座中,并接通51单片机实验板的电源。
串口实验的源程序如下所示:
;这是一个S51单片机实验开发板向PC机的串口单向发送数据AF的演示程序
;采用MAX232专用芯片作RS232/TTL电平转换.
;通讯波特率为4800KBPS,只要按下一次K1(就是P3.6引脚变成低电平)
;就发送一个16进制的AF字符
ORG0000H
MOVSCON,#50H;设置成串口1方式
MOVTMOD,#20H;波特率发生器T1工作在模式2上
MOVPCON,#80H;波特率翻倍为2400x2=4800BPS
MOVTH1,#0F3H;预置初值(按照波特率2400BPS预置初值)
MOVTL1,#0F3H;预置初值(按照波特率2400BPS预置初值)
SETBTR1;启动定时器T1
;以上完成通讯初始化设置
WRIT:
JBP3.6,$;判断K1是否按下,如果没有按下就等待
ACALLDELAY10;延时10毫秒消触点抖动
JBP3.6,WRIT;去除干扰信号
JNBP3.6,$;等待按键松开
MOVA,#0AFH;将16进制的字符AF发送到串口去
MOVSBUF,A;将AF通过串口发送出去
AJMPWRIT
;10毫秒延时子程序
DELAY10:
MOVR4,#20
D2:
MOVR5,#248
DJNZR5,$
DJNZR4,D2
RET
END
;=============两机串口通讯程序(主机)=====================
;功能:
使用串行中断,接收数据并显示
;硬件环境:
自制单片机实验板
;软件环境:
伟福V3.20
;Createdate:
2004_07_26
;FirstModify:
2004_07_26
;secondModify:
;LastModify:
2004_07_26
;Author:
Sujiande
;
;===========预定义===================
LED0EQU40H;预定义数码管
LED1EQU41H;预定义数码管
LED2EQU42H;预定义数码管
LED3EQU43H;预定义数码管
LED4EQU44H;预定义数码管
LED5EQU45H;预定义数码管
LED6EQU46H;预定义数码管
LED7EQU47H;预定义数码管
SDABITP0.1;定义数据线引脚定义
SCLBITP0.0;定义时钟线引脚定义
;---------------------------
ORG0000H;主程序入口
AJMPMAIN;跳转到主程序
ORG0100H;主程序在ROM中存放位置
;===============主程序=====================
MAIN:
MOVLED0,#00H;赋初值
MOVLED1,#00H
MOVLED2,#16;赋初值为16,数码管显示代码为:
灭
MOVLED3,#16
MOVLED4,#16
MOVLED5,#16
MOVLED6,#16
MOVLED7,#16
;--------------------
;MOVDPTR,#TABLE;赋显示代码首地址
MOVR1,#00H;给R1赋初值00H
ACALLDISPLAY;调显示子程序
MOVSP,#30H;给堆栈指针赋初值
;--------------------------
;使用定时器1,作为波特率发生器,设定波特率=9600,
;定时器初值为:
FAH
;串行控制器设置:
SM0=0,SM1=1,SM2=0,REN=1,TB8=0,
;RB8=0,TI=0,RI=0即01010000B
;波特率加倍
;-----------------------------
MOVTMOD,#20H;设置定时器1,工作方式2
MOVTH1,#0FAh;赋初值:
FA
MOVTL1,#0FAh;赋初值:
FA
MOVSCON,#50h;设置串行口控制寄存器
MOVPCON,#80h;设置电源控制寄存器,让波特率加倍(2X)
SETBTR1;启动定时
;*****************主程序结束************************
LP8:
MOVA,R1;将1的数据装到A中
;-----------------------
MOVSBUF,A;将A的数据送到缓冲区
JNBTI,$;等待数据发送完毕
CLRTI;清发送中断标志
;-----------------------
INCR1
CJNER1,#99,LP3
MOVR1,#00H
LP3:
ACALLSEPERATE;调拆分程序
ACALLDISPLAY;调显示子程序
ACALLDELAY_1S;调延时子程序
AJMPLP8
;=================拆分程序=====================
SEPERATE:
ANLA,#0Fh;与操作得到个位数据
MOVLED0,A;个位送LED0
MOVA,R1
ANLA,#0F0H;与操作得到十位数据
SWAPA
MOVLED1,A;十位送LED1
RET
;===============显示子程序=====================
DISPLAY:
MOVDPTR,#TABLE;赋显示代码首地址
MOVA,LED0;查表数据送A
MOVCA,@A+DPTR;查表,得到显示代码
ACALLSHIFT;调移位子程序
MOVA,LED1
MOVCA,@A+DPTR
ACALLSHIFT
MOVA,LED2
MOVCA,@A+DPTR
ACALLSHIFT
MOVA,LED3
MOVCA,@A+DPTR
ACALLSHIFT
MOVA,LED4
MOVCA,@A+DPTR
ACALLSHIFT
MOVA,LED5
MOVCA,@A+DPTR
ACALLSHIFT
MOVA,LED6
MOVCA,@A+DPTR
ACALLSHIFT
MOVA,LED7
MOVCA,@A+DPTR
ACALLSHIFT
RET
;---------显示代码表---------
TABLE:
DB11H,0D7H,32H,92H,0D4H,98H,18H,0D3H,10H,90H;0,1,2,3,4,5,6,7,8,9,
DB50H,1CH,39H,16H,38H,78H,0FFH,0FEH,0EFH;10,11,12,13,14,15,灭,-
;================移位子程序============================
SHIFT:
PUSHA;进栈暂存A值
MOVR0,#8;循环8次
CLRC;清进位标志
CLRSCL;时钟线,先钳位为0
LP2:
RLCA
MOVSDA,C
NOP
NOP
SETBSCL
NOP
NOP
CLRSCL
NOP
NOP
DJNZR0,LP2
POPA;出栈恢复A值
RET
;=============延时子程序===============
DELAY_1S:
MOVR7,#0ffH
LOOP7:
MOVR6,#0ffH
LOOP6:
NOP
NOP
NOP
NOP
NOP
NOP
DJNZR6,LOOP6
DJNZR7,LOOP7
RET
;------------------------------
END
;=============两机串口通讯程序(从机)=====================
;功能:
使用串行中断,接收数据并显示
;硬件环境:
自制单片机实验板
;软件环境:
伟福V3.20
;Createdate:
2004_07_26
;FirstModify:
2004_07_26
;secondModify:
;LastModify:
2004_07_26
;Author:
Sujiande
;===========预定义===================
LED0EQU40H;预定义数码管
LED1EQU41H;预定义数码管
LED2EQU42H;预定义数码管
LED3EQU43H;预定义数码管
LED4EQU44H;预定义数码管
LED5EQU45H;预定义数码管
LED6EQU46H;预定义数码管
LED7EQU47H;预定义数码管
SDABITP0.1;定义数据线引脚定义
SCLBITP0.0;定义时钟线引脚定义
;---------------------------
ORG0000H;主程序入口
AJMPMAIN;跳转到主程序
ORG0023H;中断入口地址
AJMPS_INT;跳转到中断程序
ORG0100H;主程序在ROM中存放位置
;==============主程序========================
MAIN:
MOVLED0,#00H;赋初值
MOVLED1,#00H
MOVLED2,#16;赋初值为16,数码管显示代码为:
灭
MOVLED3,#16
MOVLED4,#16
MOVLED5,#16
MOVLED6,#16
MOVLED7,#16
;------------------------------
MOVDPTR,#TABLE;赋显示代码首地址
ACALLDISPLAY;调显示子程序
MOVSP,#30H;给堆栈指针赋初值
;--------------------------------------------
;使用定时器1,作为波特率发生器,设定波特率=9600,
;定时器初值为:
FAH
;串行控制器设置:
SM0=0,SM1=1,SM2=0,REN=1,TB8=0,
;RB8=0,TI=0,RI=0即01010000B
;波特率加倍
;---------------------------------------------
MOVTMOD,#20H;设置定时器1,工作方式2
MOVTH1,#0FAh;赋初值:
FA
MOVTL1,#0FAh;赋初值:
FA
MOVSCON,#50h;设置串行口控制寄存器
MOVPCON,#80h;设置电源控制寄存器,让波特率加倍(2X)
;---------------------------------------
SETBEA;启动总中断
SETBES;启动串行中断
SETBTR1;启动定时
AJMP$;等待中断
;*****************主程序结束************************
;===============中断服务程序=============================
S_INT:
MOVR1,SBUF;将缓冲区的数据送到R1
ACALLSEPERATE;调拆分程序
ACALLDISPLAY;调显示子程序
CLRRI;清接收中断标志
RETI;中断返回
;=================拆分程序=====================
SEPERATE:
MOVA,R1
ANLA,#0Fh;与操作得到个位数据
MOVLED0,A;个位送LED0
MOVA,R1
ANLA,#0F0H;与操作得到十位数据
SWAPA;
MOVLED1,A;十位送LED1
RET
;===============显示子程序======================
DISPLAY:
MOVA,LED0;查表数据送A
MOVCA,@A+DPTR;查表,得到显示代码
ACALLSHIFT;调移位子程序
MOVA,LED1
MOVCA,@A+DPTR
ACALLSHIFT
MOVA,LED2
MOVCA,@A+DPTR
ACALLSHIFT
MOVA,LED3
MOVCA,@A+DPTR
ACALLSHIFT
MOVA,LED4
MOVCA,@A+DPTR
ACALLSHIFT
MOVA,LED5
MOVCA,@A+DPTR
ACALLSHIFT
MOVA,LED6
MOVCA,@A+DPTR
ACALLSHIFT
MOVA,LED7
MOVCA,@A+DPTR
ACALLSHIFT
RET
;---------显示代码表---------
TABLE:
DB11H,0D7H,32H,92H,0D4H,98H,18H,0D3H,10H,90H;0,1,2,3,4,5,6,7,8,9,
DB50H,1CH,39H,16H,38H,78H,0FFH,0FEH,0EFH;10,11,12,13,14,15,灭,-
;================移位子程序============================
SHIFT:
PUSHA;进栈暂存A值
MOVR0,#8;循环8次
CLRC;清进位标志
CLRSCL;时钟线,先钳位为0
LP2:
RLCA
MOVSDA,C
NOP
NOP
SETBSCL
NOP
NOP
CLRSCL
NOP
NOP
DJNZR0,LP2
POPA;出栈恢复A值
RET
;=============延时子程序===============
DELAY_1S:
MOVR7,#0ffH
LOOP7:
MOVR6,#0ffH
LOOP6:
NOP
NOP
NOP
NOP
NOP
NOP
DJNZR6,LOOP6
DJNZR7,LOOP7
RET
;------------------------------
END