📄 ch375blk.asm
字号:
; CH375/CH372 Bulk Data Test
; U2(AT89C51) Program
; 本程序测试数据传输的正确性, 并通过收发大数据块来测试传输速度,
; 本程序适用于时钟频率不高于24MHz的标准MCS-51单片机, 如果高于24MHz则应该适当增加延时, 如果低于24MHz则可以适当减少延时
; 只要单片机允许, 尽量使用较高的时钟, 例如将原12MHz晶振换为24MHz,
; 因为MCS51单片机自身速度较慢,读写外部RAM需要2个周期以及附加的循环指令,即使24MHz时钟也无法超过500KB/S
; 为了减少单片机自身对速度测试的影响,本程序中速度测试部分在单片机中断服务程序中完成
;
; Website: http://winchiphead.com
; Email: tech@winchiphead.com
; Author: W.ch 2003.09
;
;
; 需要主程序定义的参数
CH375_CMD_PORT EQU 0BDF1H ;CH375命令口的地址,地址译码后自动片选
CH375_DAT_PORT EQU 0BCF0H ;CH375命令口的地址,地址译码后自动片选
;
THIS_CMD_CODE DATA 3EH ;保存当前命令码
RECV_LEN DATA 3FH ;刚接收到的数据的长度
RECV_BUFFER DATA 40H ;数据缓冲区,用于保存接收到的下传数据,长度为0到64字节
; 由于MCS-51单片机存取外部RAM的读写速度低于内部RAM, 并且需要用到DPTR, 所以读写速度较慢, 其程序可以参考本程序修改
;
; 定义位标志
FLAG_RECV_OK BIT 2FH.0 ;接收成功标志,1指示成功接收到数据块
FLAG_SEND_WAIT BIT 2FH.1 ;发送等待标志,1指示有数据块正在CH375中等待发送
;
; CH375的命令代码定义
$INCLUDE (..\..\MCU_IF1\MCS51ASM\CH375INC.ASM)
;
;****************************************************************************
;
; 应用层定义
;TEST_OTHER EQU 00H ;其它自定义的命令码
TEST_START EQU 20H ;测试过程开始
TEST_DATA EQU 21H ;测试数据正确性
TEST_UPLOAD EQU 22H ;测试上传数据块
TEST_DOWNLOAD EQU 23H ;测试下传数据块
;
STACK EQU 0FH ;堆栈区栈顶(向上延伸)
;
; 有关CH451的定义
CH451_DCLK BIT P1.7 ;串行数据时钟,上升沿激活
CH451_DIN BIT P1.6 ;串行数据输出,接CH451的数据输入
CH451_LOAD BIT P1.5 ;串行命令加载,上升沿激活
CH451_DOUT BIT P3.3 ;INT1,键盘中断和键值数据输入,接CH451的数据输出
;
;****************************************************************************
;主程序,用于配合演示CH375
ORG 0000H ;复位后单片机入口
LJMP START
ORG 0003H ;CH375中断
LJMP CH375_INTER
;
START:
; 以下初始化指令不是必要的,将单片机恢复为默认状态
CLR EA ;关中断
MOV SP,#STACK ;置堆栈初值
MOV A,#0FFH
MOV P0,A
MOV P1,A ;清端口状态
MOV P2,A
MOV P3,A
CLR A
MOV IE,A ;清中断允许控制寄存器
MOV IP,A ;清中断优先级控制寄存器
MOV PSW,A ;清程序状态字
MOV TCON,A ;清定时器/计数器控制寄存器
MOV TMOD,A ;清定时器/计数器工作方式寄存器
MOV PCON,A ;清电源控制寄存器
MOV THIS_CMD_CODE,#00H ;清除命令码
MOV R7,#0FFH
CALL DELAY_MS ;延时等待CH375初始化完成
; 初始化
CALL CH375_INIT ;初始化
CALL CH451_INIT ;初始化
; .....
;
; 启动CH451的显示驱动
MOV B,#04H ;设置系统参数命令
MOV A,#01H ;使能显示驱动
CALL CH451_WRITE ;发出命令
MOV B,#05H ;设置显示参数
MOV A,#88H ;BCD译码方式,8级亮度
CALL CH451_WRITE ;发出命令
MOV R6,#08H
MOV R5,#08H
MOV R4,#01H
SHOW_INIT: MOV B,R5
MOV A,R4
INC R5
INC R4
CALL CH451_WRITE ;显示字符
DJNZ R6,SHOW_INIT
;
SETB EA ;允许中断
SETB TR0 ;由定时器0自由计数值产生随机数
;
; 以下指令开始工作循环,等待PC机命令进行操作
WAIT_REQUEST: NOP
JNB FLAG_RECV_OK,WAIT_REQUEST ;等待下传数据
CLR FLAG_RECV_OK
MOV A,RECV_LEN ;分析下传数据并准备应答
JZ WAIT_REQUEST ;长度为0,在本程序中没有意义
; MOV R0,#RECV_BUFFER ;刚接收到的数据块
; MOV R7,RECV_LEN ;刚接收到的数据长度
; MOV A,@R0 ;我们在计算机和单片机的应用程序之间约定下传数据的首字节是命令码
; CJNE A,#TEST_OTHER,WAIT_REQUEST ;自定义的命令码,其它测试命令已经在中断服务程序中处理掉了
; NOP ;其它命令,分析后准备应答
; MOV R0,#SEND_BUFFER ;指向准备上传的数据的缓冲区
; MOV R7,SEND_LEN ;准备上传的数据的长度
; CALL CH375_UPLOAD ;上传数据块子程序(通过批量端点上传)
MOV B,#03H ;移位命令
MOV A,#00H ;左移一位
CALL CH451_WRITE ;发出命令使CH451显示左移一位
SJMP WAIT_REQUEST ;等待下一个请求
;
; 以毫秒为单位延时
; ENTRY: R7 延时毫秒数
; USE: ACC, R7
DELAY_MS: MOV A,#0FAH ;250*(1*6+2)*0.5=1000uS
DELAY_1MS: NOP
NOP
NOP
NOP
NOP
NOP
DJNZ ACC,DELAY_1MS ;每周期延时1毫秒
DJNZ R7,DELAY_MS
RET
;
; 初始化子程序
CH451_INIT: CLR CH451_DIN ;先低后高,输出上升沿通知CH451选择4线串行接口
SETB CH451_DCLK ;置为默认的高电平
SETB CH451_DIN
SETB CH451_LOAD
SETB CH451_DOUT ;置为输入
CLR EX1 ;禁止中断
RET
;
;
; 输出命令子程序
; ENTRY: B-ACC 待写的12位数据, 低8位在ACC中, 高4位在B的低4位中
; USE: ACC, B, R7
CH451_WRITE: CLR CH451_LOAD ;命令开始,此命令可以放在后面
MOV R7,#08H ;将ACC中8位送出
CH451_WRITE_8: RRC A ;低位在前,高位在后
CLR CH451_DCLK
MOV CH451_DIN,C ;送出一位数据
SETB CH451_DCLK ;产生时钟上升沿通知CH451输入位数据
DJNZ R7,CH451_WRITE_8 ;位数据未完继续
MOV A,B
MOV R7,#04H ;将B中4位送出
CH451_WRITE_4: RRC A ;低位在前,高位在后
CLR CH451_DCLK
MOV CH451_DIN,C ;送出一位数据
SETB CH451_DCLK ;产生时钟上升沿通知CH451输入位数据
DJNZ R7,CH451_WRITE_4 ;位数据未完继续
SETB CH451_LOAD ;产生加载上升沿通知CH451处理命令数据
RET
;
;
;****************************************************************************
;
; 初始化子程序
; USE: ACC, R7, DPTR
CH375_INIT: CLR FLAG_RECV_OK ;清接收成功标志,1指示成功接收到数据块
CLR FLAG_SEND_WAIT ;清发送等待标志,1指示有数据块正在CH375中等待发送
; 测试CH375是否正常工作,可选操作
; MOV DPTR,#CH375_CMD_PORT ;命令口地址
; MOV A,#CMD_CHECK_EXIST
; MOVX @DPTR,A ;测试CH375是否正常工作,可选操作
; NOP ;如果时钟频率低于16MHz则无需该指令延时,高于30MHz要多加2条指令
; MOV DPTR,#CH375_DAT_PORT ;数据口地址
; MOV A,#55H
; MOVX @DPTR,A ;写入测试数据
; CPL A
; MOV R7,A ;取反数据
; MOVX A,@DPTR ;返回数据应该是测试数据取反
; XRL A,R7
; JZ CH375_INIT_OK ;测试通过
; MOV DPTR,#CH375_CMD_PORT ;命令口地址
; MOV A,#CMD_RESET_ALL
; MOV R7,#50H ;多次重复发命令
;CH375_INIT_HR: MOVX @DPTR,A ;执行硬件复位
; DJNZ R7,CH375_INIT_HR
; MOV R7,#0A0H ;160*256uS=40mS
;CH375_INIT_D2: CLR A
;CH375_INIT_D1: DJNZ ACC,CH375_INIT_D1 ;延时1uS
; DJNZ R7,CH375_INIT_D2 ;延时256uS
; SJMP CH375_INIT ;再次测试
;CH375_INIT_OK:
; 设置外部自定义的USB设备VID和PID,可选操作,不执行该命令则使用默认的VID和PID
; MOV DPTR,#CH375_CMD_PORT ;命令口地址
; MOV A,#CMD_SET_USB_ID
; MOVX @DPTR,A ;设置外部自定义的USB设备VID和PID,可选操作
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -