单片机串口电路
2010-04-19 13:55
190 查看
单片机串口电路
串口实验的源程序如下所示:
;这是一个S51单片机实验开发板向PC机的串口单向发送数据AF的演示程序
;采用
MAX232专用芯片作RS232/TTL电平转换.
;通讯波特率为4800KBPS,只要按下一次K1(就是P3.6引脚变成低电平)
;
就发送一个16进制的AF字符
ORG 0000H
MOV SCON,#50H;设置成串口1方式
MOV
TMOD,#20H;波特率发生器T1工作在模式2上
MOV PCON,#80H;波特率翻倍为2400x2=4800BPS
MOV
TH1,#0F3H;预置初值(按照波特率2400BPS预置初值)
MOV TL1,#0F3H;预置初值(按照波特率2400BPS预置初值)
SETB
TR1;启动定时器T1
;以上完成通讯初始化设置
WRIT:JB P3.6,$;判断K1是否按下,如果没有按下就等待
ACALL
DELAY10;延时10毫秒消触点抖动
JB P3.6,WRIT;去除干扰信号
JNB P3.6,$;等待按键松开
MOV
A,#0AFH;将16进制的字符AF发送到串口去
MOV SBUF,A;将AF通过串口发送出去
AJMP WRIT
;10
毫秒延时子程序
DELAY10:MOV R4,#20
D2:MOV R5,#248
DJNZ R5,$
DJNZ
R4,D2
RET
END
;=============两机串口通讯程序(主
机)=====================
;
; 功 能: 使用串行中断,接收数据并显示
; 硬件环境:
自制单片机实验板
; 软件环境: 伟福 V3.20
; Create date: 2004_07_26
; First
Modify: 2004_07_26
; second Modify:
; Last Modify: 2004_07_26
;
Author: Sujiande
;
;===========预定义===================
LED0 EQU
40H ;预定义数码管
LED1 EQU 41H ;预定义数码管
LED2 EQU 42H ;预定义数码管
LED3 EQU
43H ;预定义数码管
LED4 EQU 44H ;预定义数码管
LED5 EQU 45H ;预定义数码管
LED6 EQU
46H ;预定义数码管
LED7 EQU 47H ;预定义数码管
SDA BIT P0.1 ; 定义数据线引脚定义
SCL
BIT P0.0 ; 定义时钟线引脚定义
;---------------------------
ORG 0000H ;主程序入口
AJMP
MAIN ;跳转到主程序
ORG 0100H ;主程序在ROM中存放位置
;===============主程
序=====================
MAIN:
MOV LED0,#00H ;赋初值
MOV LED1,#00H
MOV
LED2,#16 ;赋初值为16, 数码管显示代码为: 灭
MOV LED3,#16
MOV LED4,#16
MOV
LED5,#16
MOV LED6,#16
MOV LED7,#16
;--------------------
;MOV
DPTR,#TABLE ; 赋显示代码首地址
MOV R1,#00H ; 给R1赋初值00H
ACALL DISPLAY ;
调显示子程序
MOV SP, #30H ; 给堆栈指针赋初值
;--------------------------
;
使用定时器1,作为波特率发生器,设定波特率=9600,
; 定时器初值为:FAH
;
串行控制器设置:SM0=0,SM1=1,SM2=0,REN=1,TB8=0,
; RB8=0,TI=0,RI=0 即0101 0000B
;
波特率加倍
;-----------------------------
MOV TMOD,#20H ;设置定时器1,工作方式2
MOV
TH1,#0FAh ;赋初值: FA
MOV TL1,#0FAh ;赋初值: FA
MOV SCON, #50h
;设置串行口控制寄存器
MOV PCON, #80h ;设置电源控制寄存器, 让波特率加倍(2X)
SETB TR1 ;启动定时
;*****************
主程序结束************************
LP8: MOV A,R1 ;将R1的数据装到A中
;-----------------------
MOV
SBUF,A ;将A的数据送到缓冲区
JNB TI,$ ;等待数据发送完毕
CLR TI ;清发送中断标志
;-----------------------
INC
R1
CJNE R1,#99,LP3
MOV R1,#00H
LP3: ACALL SEPERATE ;调拆分程序
ACALL
DISPLAY ;调显示子程序
ACALL DELAY_1S ;调延时子程序
AJMP LP8
;=================
拆分程序=====================
SEPERATE: ANL A,#0Fh ;与操作得到个位数据
MOV
LED0,A ;个位送LED0
MOV A,R1
ANL A,#0F0H ;与操作得到十位数据
SWAP A
MOV
LED1,A ;十位送LED1
RET
;===============显示子程序======================
DISPLAY:
MOV
DPTR,#TABLE ; 赋显示代码首地址
MOV A,LED0 ;查表数据送A
MOVC A,@A+DPTR
;查表,得到显示代码
ACALL SHIFT ;调移位子程序
MOV A,LED1
MOVC A,@A+DPTR
ACALL
SHIFT
MOV A,LED2
MOVC A,@A+DPTR
ACALL SHIFT
MOV
A,LED3
MOVC A,@A+DPTR
ACALL SHIFT
MOV A,LED4
MOVC
A,@A+DPTR
ACALL SHIFT
MOV A,LED5
MOVC A,@A+DPTR
ACALL
SHIFT
MOV A,LED6
MOVC A,@A+DPTR
ACALL SHIFT
MOV
A,LED7
MOVC A,@A+DPTR
ACALL SHIFT
RET
;---------显示代码表
---------
TABLE: DB 11H,0D7H,32H,92H,0D4H,98H,18H,0D3H,10H,90H
;0,1,2,3,4,5,6,7,8,9,
DB 50H,1CH,39H,16H,38H,78H, 0FFH,0FEH,0EFH
;10,11,12,13,14,15,灭,-
;================移位子程
序============================
SHIFT: PUSH A ; 进栈暂存A值
MOV R0,#8 ;
循环8次
CLR C ;清进位标志
CLR SCL ;时钟线,先钳位为0
LP2: RLC A
MOV SDA,C
NOP
NOP
SETB
SCL
NOP
NOP
CLR SCL
NOP
NOP
DJNZ R0,LP2
POP A ;
出栈恢复A值
RET
;=============延时子程序===============
DELAY_1S:
MOV
R7,#0ffH
LOOP7: MOV R6,#0ffH
LOOP6: NOP
NOP
NOP
NOP
NOP
NOP
DJNZ
R6,LOOP6
DJNZ R7,LOOP7
RET
;------------------------------
END
;=============
两机串口通讯程序(从机)=====================
;
; 功 能: 使用串行中断,接收数据并显示
;
硬件环境: 自制单片机实验板
; 软件环境: 伟福 V3.20
; Create date: 2004_07_26
;
First Modify: 2004_07_26
; second Modify:
; Last Modify:
2004_07_26
; Author: Sujiande
;
;===========预定
义===================
LED0 EQU 40H ;预定义数码管
LED1 EQU 41H ;预定义数码管
LED2
EQU 42H ;预定义数码管
LED3 EQU 43H ;预定义数码管
LED4 EQU 44H ;预定义数码管
LED5
EQU 45H ;预定义数码管
LED6 EQU 46H ;预定义数码管
LED7 EQU 47H ;预定义数码管
SDA
BIT P0.1 ; 定义数据线引脚定义
SCL BIT P0.0 ; 定义时钟线引脚定义
;---------------------------
ORG
0000H ;主程序入口
AJMP MAIN ;跳转到主程序
ORG 0023H ;中断入口地址
AJMP S_INT
;跳转到中断程序
ORG 0100H ;主程序在ROM中存放位置
;==============主程
序========================
MAIN:
MOV LED0,#00H ;赋初值
MOV
LED1,#00H
MOV LED2,#16 ;赋初值为16, 数码管显示代码为: 灭
MOV LED3,#16
MOV
LED4,#16
MOV LED5,#16
MOV LED6,#16
MOV LED7,#16
;------------------------------
MOV
DPTR,#TABLE ; 赋显示代码首地址
ACALL DISPLAY ; 调显示子程序
MOV SP, #30H ;
给堆栈指针赋初值
;--------------------------------------------
;
使用定时器1,作为波特率发生器,设定波特率=9600,
; 定时器初值为:FAH
;
串行控制器设置:SM0=0,SM1=1,SM2=0,REN=1,TB8=0,
; RB8=0,TI=0,RI=0 即0101 0000B
;
波特率加倍
;---------------------------------------------
MOV
TMOD,#20H ;设置定时器1,工作方式2
MOV TH1,#0FAh ;赋初值: FA
MOV TL1,#0FAh ;赋初值:
FA
MOV SCON, #50h ;设置串行口控制寄存器
MOV PCON, #80h ;设置电源控制寄存器,
让波特率加倍(2X)
;---------------------------------------
SETB EA ;
启动总中断
SETB ES ; 启动串行中断
SETB TR1 ;启动定时
AJMP $ ; 等待中断
;*****************
主程序结束************************
;===============中断服务程
序=============================
S_INT:
MOV R1, SBUF ;将缓冲区的数据送到R1
ACALL
SEPERATE ;调拆分程序
ACALL DISPLAY ;调显示子程序
CLR RI ;清接收中断标志
RETI
;中断返回
;=================拆分程序=====================
SEPERATE:
MOV A,R1
ANL A,#0Fh ;与操作得到个位数据
MOV LED0,A ;个位送LED0
MOV A,R1
ANL
A,#0F0H ;与操作得到十位数据
SWAP A ;
MOV LED1,A ;十位送LED1
RET
;===============
显示子程序======================
DISPLAY:
MOV A,LED0 ;查表数据送A
MOVC
A,@A+DPTR ;查表,得到显示代码
ACALL SHIFT ;调移位子程序
MOV A,LED1
MOVC
A,@A+DPTR
ACALL SHIFT
MOV A,LED2
MOVC A,@A+DPTR
ACALL
SHIFT
MOV A,LED3
MOVC A,@A+DPTR
ACALL SHIFT
MOV
A,LED4
MOVC A,@A+DPTR
ACALL SHIFT
MOV A,LED5
MOVC
A,@A+DPTR
ACALL SHIFT
MOV A,LED6
MOVC A,@A+DPTR
ACALL
SHIFT
MOV A,LED7
MOVC A,@A+DPTR
ACALL SHIFT
RET
;---------
显示代码表---------
TABLE: DB 11H,0D7H,32H,92H,0D4H,98H,18H,0D3H,10H,90H
;0,1,2,3,4,5,6,7,8,9,
DB 50H,1CH,39H,16H,38H,78H, 0FFH,0FEH,0EFH
;10,11,12,13,14,15,灭,-
;================移位子程
序============================
SHIFT: PUSH A ; 进栈暂存A值
MOV R0,#8 ;
循环8次
CLR C ;清进位标志
CLR SCL ;时钟线,先钳位为0
LP2: RLC A
MOV SDA,C
NOP
NOP
SETB
SCL
NOP
NOP
CLR SCL
NOP
NOP
DJNZ R0,LP2
POP A ;
出栈恢复A值
RET
;=============延时子程序===============
DELAY_1S:
MOV
R7,#0ffH
LOOP7: MOV R6,#0ffH
LOOP6: NOP
NOP
NOP
NOP
NOP
NOP
DJNZ
R6,LOOP6
DJNZ R7,LOOP7
RET
;------------------------------
END
分立元件构成的串口电路
screen.width-461)
window.open('http://www.hheet.com/bbs/attachment1/2004-11/200411164617942.jpg');"
src="http://www.hheet.com/bbs/attachment1/2004-11/200411164617942.jpg"
border=0>
串口实验的源程序如下所示:
;这是一个S51单片机实验开发板向PC机的串口单向发送数据AF的演示程序
;采用
MAX232专用芯片作RS232/TTL电平转换.
;通讯波特率为4800KBPS,只要按下一次K1(就是P3.6引脚变成低电平)
;
就发送一个16进制的AF字符
ORG 0000H
MOV SCON,#50H;设置成串口1方式
MOV
TMOD,#20H;波特率发生器T1工作在模式2上
MOV PCON,#80H;波特率翻倍为2400x2=4800BPS
MOV
TH1,#0F3H;预置初值(按照波特率2400BPS预置初值)
MOV TL1,#0F3H;预置初值(按照波特率2400BPS预置初值)
SETB
TR1;启动定时器T1
;以上完成通讯初始化设置
WRIT:JB P3.6,$;判断K1是否按下,如果没有按下就等待
ACALL
DELAY10;延时10毫秒消触点抖动
JB P3.6,WRIT;去除干扰信号
JNB P3.6,$;等待按键松开
MOV
A,#0AFH;将16进制的字符AF发送到串口去
MOV SBUF,A;将AF通过串口发送出去
AJMP WRIT
;10
毫秒延时子程序
DELAY10:MOV R4,#20
D2:MOV R5,#248
DJNZ R5,$
DJNZ
R4,D2
RET
END
;=============两机串口通讯程序(主
机)=====================
;
; 功 能: 使用串行中断,接收数据并显示
; 硬件环境:
自制单片机实验板
; 软件环境: 伟福 V3.20
; Create date: 2004_07_26
; First
Modify: 2004_07_26
; second Modify:
; Last Modify: 2004_07_26
;
Author: Sujiande
;
;===========预定义===================
LED0 EQU
40H ;预定义数码管
LED1 EQU 41H ;预定义数码管
LED2 EQU 42H ;预定义数码管
LED3 EQU
43H ;预定义数码管
LED4 EQU 44H ;预定义数码管
LED5 EQU 45H ;预定义数码管
LED6 EQU
46H ;预定义数码管
LED7 EQU 47H ;预定义数码管
SDA BIT P0.1 ; 定义数据线引脚定义
SCL
BIT P0.0 ; 定义时钟线引脚定义
;---------------------------
ORG 0000H ;主程序入口
AJMP
MAIN ;跳转到主程序
ORG 0100H ;主程序在ROM中存放位置
;===============主程
序=====================
MAIN:
MOV LED0,#00H ;赋初值
MOV LED1,#00H
MOV
LED2,#16 ;赋初值为16, 数码管显示代码为: 灭
MOV LED3,#16
MOV LED4,#16
MOV
LED5,#16
MOV LED6,#16
MOV LED7,#16
;--------------------
;MOV
DPTR,#TABLE ; 赋显示代码首地址
MOV R1,#00H ; 给R1赋初值00H
ACALL DISPLAY ;
调显示子程序
MOV SP, #30H ; 给堆栈指针赋初值
;--------------------------
;
使用定时器1,作为波特率发生器,设定波特率=9600,
; 定时器初值为:FAH
;
串行控制器设置:SM0=0,SM1=1,SM2=0,REN=1,TB8=0,
; RB8=0,TI=0,RI=0 即0101 0000B
;
波特率加倍
;-----------------------------
MOV TMOD,#20H ;设置定时器1,工作方式2
MOV
TH1,#0FAh ;赋初值: FA
MOV TL1,#0FAh ;赋初值: FA
MOV SCON, #50h
;设置串行口控制寄存器
MOV PCON, #80h ;设置电源控制寄存器, 让波特率加倍(2X)
SETB TR1 ;启动定时
;*****************
主程序结束************************
LP8: MOV A,R1 ;将R1的数据装到A中
;-----------------------
MOV
SBUF,A ;将A的数据送到缓冲区
JNB TI,$ ;等待数据发送完毕
CLR TI ;清发送中断标志
;-----------------------
INC
R1
CJNE R1,#99,LP3
MOV R1,#00H
LP3: ACALL SEPERATE ;调拆分程序
ACALL
DISPLAY ;调显示子程序
ACALL DELAY_1S ;调延时子程序
AJMP LP8
;=================
拆分程序=====================
SEPERATE: ANL A,#0Fh ;与操作得到个位数据
MOV
LED0,A ;个位送LED0
MOV A,R1
ANL A,#0F0H ;与操作得到十位数据
SWAP A
MOV
LED1,A ;十位送LED1
RET
;===============显示子程序======================
DISPLAY:
MOV
DPTR,#TABLE ; 赋显示代码首地址
MOV A,LED0 ;查表数据送A
MOVC A,@A+DPTR
;查表,得到显示代码
ACALL SHIFT ;调移位子程序
MOV A,LED1
MOVC A,@A+DPTR
ACALL
SHIFT
MOV A,LED2
MOVC A,@A+DPTR
ACALL SHIFT
MOV
A,LED3
MOVC A,@A+DPTR
ACALL SHIFT
MOV A,LED4
MOVC
A,@A+DPTR
ACALL SHIFT
MOV A,LED5
MOVC A,@A+DPTR
ACALL
SHIFT
MOV A,LED6
MOVC A,@A+DPTR
ACALL SHIFT
MOV
A,LED7
MOVC A,@A+DPTR
ACALL SHIFT
RET
;---------显示代码表
---------
TABLE: DB 11H,0D7H,32H,92H,0D4H,98H,18H,0D3H,10H,90H
;0,1,2,3,4,5,6,7,8,9,
DB 50H,1CH,39H,16H,38H,78H, 0FFH,0FEH,0EFH
;10,11,12,13,14,15,灭,-
;================移位子程
序============================
SHIFT: PUSH A ; 进栈暂存A值
MOV R0,#8 ;
循环8次
CLR C ;清进位标志
CLR SCL ;时钟线,先钳位为0
LP2: RLC A
MOV SDA,C
NOP
NOP
SETB
SCL
NOP
NOP
CLR SCL
NOP
NOP
DJNZ R0,LP2
POP A ;
出栈恢复A值
RET
;=============延时子程序===============
DELAY_1S:
MOV
R7,#0ffH
LOOP7: MOV R6,#0ffH
LOOP6: NOP
NOP
NOP
NOP
NOP
NOP
DJNZ
R6,LOOP6
DJNZ R7,LOOP7
RET
;------------------------------
END
;=============
两机串口通讯程序(从机)=====================
;
; 功 能: 使用串行中断,接收数据并显示
;
硬件环境: 自制单片机实验板
; 软件环境: 伟福 V3.20
; Create date: 2004_07_26
;
First Modify: 2004_07_26
; second Modify:
; Last Modify:
2004_07_26
; Author: Sujiande
;
;===========预定
义===================
LED0 EQU 40H ;预定义数码管
LED1 EQU 41H ;预定义数码管
LED2
EQU 42H ;预定义数码管
LED3 EQU 43H ;预定义数码管
LED4 EQU 44H ;预定义数码管
LED5
EQU 45H ;预定义数码管
LED6 EQU 46H ;预定义数码管
LED7 EQU 47H ;预定义数码管
SDA
BIT P0.1 ; 定义数据线引脚定义
SCL BIT P0.0 ; 定义时钟线引脚定义
;---------------------------
ORG
0000H ;主程序入口
AJMP MAIN ;跳转到主程序
ORG 0023H ;中断入口地址
AJMP S_INT
;跳转到中断程序
ORG 0100H ;主程序在ROM中存放位置
;==============主程
序========================
MAIN:
MOV LED0,#00H ;赋初值
MOV
LED1,#00H
MOV LED2,#16 ;赋初值为16, 数码管显示代码为: 灭
MOV LED3,#16
MOV
LED4,#16
MOV LED5,#16
MOV LED6,#16
MOV LED7,#16
;------------------------------
MOV
DPTR,#TABLE ; 赋显示代码首地址
ACALL DISPLAY ; 调显示子程序
MOV SP, #30H ;
给堆栈指针赋初值
;--------------------------------------------
;
使用定时器1,作为波特率发生器,设定波特率=9600,
; 定时器初值为:FAH
;
串行控制器设置:SM0=0,SM1=1,SM2=0,REN=1,TB8=0,
; RB8=0,TI=0,RI=0 即0101 0000B
;
波特率加倍
;---------------------------------------------
MOV
TMOD,#20H ;设置定时器1,工作方式2
MOV TH1,#0FAh ;赋初值: FA
MOV TL1,#0FAh ;赋初值:
FA
MOV SCON, #50h ;设置串行口控制寄存器
MOV PCON, #80h ;设置电源控制寄存器,
让波特率加倍(2X)
;---------------------------------------
SETB EA ;
启动总中断
SETB ES ; 启动串行中断
SETB TR1 ;启动定时
AJMP $ ; 等待中断
;*****************
主程序结束************************
;===============中断服务程
序=============================
S_INT:
MOV R1, SBUF ;将缓冲区的数据送到R1
ACALL
SEPERATE ;调拆分程序
ACALL DISPLAY ;调显示子程序
CLR RI ;清接收中断标志
RETI
;中断返回
;=================拆分程序=====================
SEPERATE:
MOV A,R1
ANL A,#0Fh ;与操作得到个位数据
MOV LED0,A ;个位送LED0
MOV A,R1
ANL
A,#0F0H ;与操作得到十位数据
SWAP A ;
MOV LED1,A ;十位送LED1
RET
;===============
显示子程序======================
DISPLAY:
MOV A,LED0 ;查表数据送A
MOVC
A,@A+DPTR ;查表,得到显示代码
ACALL SHIFT ;调移位子程序
MOV A,LED1
MOVC
A,@A+DPTR
ACALL SHIFT
MOV A,LED2
MOVC A,@A+DPTR
ACALL
SHIFT
MOV A,LED3
MOVC A,@A+DPTR
ACALL SHIFT
MOV
A,LED4
MOVC A,@A+DPTR
ACALL SHIFT
MOV A,LED5
MOVC
A,@A+DPTR
ACALL SHIFT
MOV A,LED6
MOVC A,@A+DPTR
ACALL
SHIFT
MOV A,LED7
MOVC A,@A+DPTR
ACALL SHIFT
RET
;---------
显示代码表---------
TABLE: DB 11H,0D7H,32H,92H,0D4H,98H,18H,0D3H,10H,90H
;0,1,2,3,4,5,6,7,8,9,
DB 50H,1CH,39H,16H,38H,78H, 0FFH,0FEH,0EFH
;10,11,12,13,14,15,灭,-
;================移位子程
序============================
SHIFT: PUSH A ; 进栈暂存A值
MOV R0,#8 ;
循环8次
CLR C ;清进位标志
CLR SCL ;时钟线,先钳位为0
LP2: RLC A
MOV SDA,C
NOP
NOP
SETB
SCL
NOP
NOP
CLR SCL
NOP
NOP
DJNZ R0,LP2
POP A ;
出栈恢复A值
RET
;=============延时子程序===============
DELAY_1S:
MOV
R7,#0ffH
LOOP7: MOV R6,#0ffH
LOOP6: NOP
NOP
NOP
NOP
NOP
NOP
DJNZ
R6,LOOP6
DJNZ R7,LOOP7
RET
;------------------------------
END
分立元件构成的串口电路
screen.width-461)
window.open('http://www.hheet.com/bbs/attachment1/2004-11/200411164617942.jpg');"
src="http://www.hheet.com/bbs/attachment1/2004-11/200411164617942.jpg"
border=0>
相关文章推荐
- STM32单片机串口一键下载电路与操作方法详解
- 扫描枪读条码数据在单片机串口电路的读取与显示
- 扫描枪读条码数据在单片机串口电路的读取与显示
- STC单片机串口硬件电路的设计
- 单片机GPIO口模拟串口的方法
- 使用单片机普通IO口模拟串口的三种方法
- [15单片机] STC15F104W开发入门及模拟串口程序
- 单片机外围电路(转载)
- 硬件工程师面试集锦 模拟电路 数字电路 IC设计基础 单片机 信号与系统 DSP 嵌入式
- 单片机无线串行接口电路设计
- PIC16单片机端C语言serial bootloader和PC端C#语言bootloader串口通信程序
- 51单片机单串口同时实现AT指令和调试信息输出
- 串口ISP方式下载单片机程序设计
- 单片机IO驱动继电器电路的误区
- 【单片机笔记】运放电流检测实用电路
- 在stm32 单片机程序中使用printf()进行串口调试
- 单片机C51串口中断接收和发送测试例程(含通信协议的实现)
- P89LPC925单片机串口封装
- 【单片机】串口输出字符串程序
- 单片机晶振电路详解