⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mnck.asm

📁 51单片机模拟串口
💻 ASM
字号:
;本程序为51系列单片机汇编语言源程序,可以在所有51系列(或兼容)单片机中运行。
;完成功能:使用任意1个引脚模拟串行接口,实现对KY系列智能液晶终端进行控制.
;程序中给出了设计方法,通过修改TIMEzq使本程序适用于各种晶振及各种波特率.
;本例为:当通讯波特率=9600Hz,单片机晶振=18.432MHz时,TIMEzq=22
;        使用P1.1模拟串口,使用P1.2检测"忙"信号.
;本程序在Wave For windows ver 2.80仿真软件编译成功。
;在AT89C51(9600Hz,18.432MHz)中运行通过.运行结果是:每隔1秒,显示3个字母.
;=====================================================================================
ZD_DATA  EQU     P1.1    ;向液晶终端输出串行数据,可以连接于任意一位输出引脚上.
ZD_BUSY  EQU     P1.2    ;接收液晶终端发来的"忙"(BUSY)信号,可以连接于任意一位输入引脚上.
;=====================================================================================
TIMEzq   EQU     22      ;通过修改TIMEzq使本程序适用于各种晶振及各种波特率.计算方法见后.
;=====================================================================================
          ORG     0
MAIN:     MOV    A,#'A' ;显示字母A
          LCALL  FSA
          MOV    A,#55H ;显示字母U
          LCALL  FSA
          MOV    A,#0AAH;显示字母γ
          LCALL  FSA
          MOV    A,#' ' ;空格
          LCALL  FSA
          MOV    A,#1BH ;延时1秒
          LCALL  FSA
          MOV    A,#'l'
          LCALL  FSA
          MOV    A,#10
          LCALL  FSA
          LJMP   MAIN
;=============================================================================
FSA:    JB      ZD_BUSY,FSA     ;如果终端"忙",则等待(输出A中的数据)
    	CLR	ZD_DATA		;起始位0
	LCALL	TIME
	RRC	A
	MOV	ZD_DATA,C	;D0位  
	LCALL	TIME
	RRC	A
	MOV	ZD_DATA,C	;D1位
	LCALL	TIME
	RRC	A
	MOV	ZD_DATA,C	;D2位
	LCALL	TIME
	RRC	A
	MOV	ZD_DATA,C	;D3位
	LCALL	TIME
	RRC	A
	MOV	ZD_DATA,C	;D4位
	LCALL	TIME
	RRC	A
	MOV	ZD_DATA,C	;D5位
	LCALL	TIME
	RRC	A
	MOV	ZD_DATA,C	;D6位
	LCALL	TIME
	RRC	A
	MOV	ZD_DATA,C	;D7位
	LCALL	TIME
	CLR	ZD_DATA		;奇偶位=0,终端不检测奇偶位.
	LCALL	TIME
	SETB	ZD_DATA		;停止位=1
	LCALL	TIME
        RET
;=====================================================================================
;====	精确延时子程序
TIME:   MOV	B,#TIMEzq
TIME1:	NOP
	NOP
	NOP
	NOP
	NOP
	DJNZ	B,TIME1
	RET
;/=========================================================================================
;/例1:当通讯波特率F=9.6KHz,单片机晶振Z=18.432MHz时,TIMEzq=22
;/计算方法:
;/当波特率为9.6KHz时,每个二进制位的宽度为104uS.振荡周期数zq=(1000/9.6)*18.432MHz=1920个振荡周期
;/调用本函数的其它指令执行时间为(12+24+24+12+24)=96个振荡周期.
;/执行每个循环需要(12*5+24=84)个振荡周期,则TIMEzq=(zq-96)/84=(1920-96)/84=22
;/即:TIMEzq=[((1000/F)*Z)-96]/84=[((1000/9.6)*18.432)-96]/84=22
;/-------------
;/例2:当通讯波特率F=4.8KHz,单片机晶振Z=18.432MHz时:
;/     TIMEzq=[((1000/F)*Z)-96]/84=[((1000/4.8)*18.432)-96]/84=44
;/-------------
;/例3:当通讯波特率F=19.2KHz,单片机晶振Z=18.432MHz时:
;/     TIMEzq=[((1000/F)*Z)-96]/84=[((1000/19.2)*18.432)-96]/84=10
;/-------------
;/例4:当通讯波特率F=9.6KHz,单片机晶振Z=12.000MHz时:
;/     TIMEzq=[((1000/F)*Z)-96]/84=[((1000/9.6)*12.000)-96]/84=14
;/-------------
;/例5:当通讯波特率F=4.8KHz,单片机晶振Z=12.000MHz时:
;/     TIMEzq=[((1000/F)*Z)-96]/84=[((1000/4.8)*12.000)-96]/84=28
;/-------------
;/例6:当通讯波特率F=19.2KHz,单片机晶振Z=12.000MHz时:
;/     TIMEzq=[((1000/F)*Z)-96]/84=[((1000/19.2)*12.000)-96]/84=6
;/-------------
;/例7:当通讯波特率F=9.6KHz,单片机晶振Z= 6.000MHz时:
;/     TIMEzq=[((1000/F)*Z)-96]/84=[((1000/9.6)*6.000)-96]/84=6
;/-------------
;/例8:当通讯波特率F=9.6KHz,单片机晶振Z=11.0592MHz时:
;/     TIMEzq=[((1000/F)*Z)-96]/84=[((1000/9.6)*11.0592)-96]/84=13
;/-------------
;/例9:当通讯波特率F=9.6KHz,单片机晶振Z=22.1184MHz时:
;/     TIMEzq=[((1000/F)*Z)-96]/84=[((1000/9.6)*22.1184)-96]/84=26
;/-------------
;/例10:当通讯波特率F=9.6KHz,单片机晶振Z=24.0000MHz时:
;/     TIMEzq=[((1000/F)*Z)-96]/84=[((1000/9.6)*24.000)-96]/84=29
;/------------

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -