TA的每日心情 | 郁闷 2013-9-12 12:12 |
---|
签到天数: 1 天 连续签到: 1 天 [LV.1]初来乍到
|
- 第四单元 片内存储器与数据传送指令
-
- 实验4-1:外部数据块搬移(≤256字节)
- 把处于程序存储器中从Data_TAB开始的256个字节数据传送到外部数据存储器从1000H开始的256个单元中去。
-
- $mod841 ; 包含841的头文件
- ORG 0000H ; 实验板开始执行的第一条指令所处的地址
- LJMP MAIN ; 跳转到主程序
- ORG 0100H ; 主程序开始的地址;避开中断入口地址
- MAIN: MOV DPTR, # Data_TAB ; 使DPTR指向程序存储器中的Data_TAB开始的256个字节数据
- MOV P2, #10H ; 使P2口指向XDATA中的目的地址高8位
- MOV R0, #00H ; 使R0口指向XDATA中的目的地址低8位起始地址
- MOVEDATA: MOV A, #00H ; 清除累加器,以便下一条指令能准确指向程序存储器中的数据
- MOVC A, @A+DPTR ; 从程序存储器中读取数据,请注意指令形式
- MOVX @R0, A ; 把数据写到XDATA中
- INC DPTR ; 修改源数据指针
- INC R0 ; 修改目的数据指针
- CJNE R0, #00H, MOVEDATA ; 没有送完256个数据,跳转到MOVEDATA继续送数
- HALT: LJMP HALT ; 送完256个数据,在此死循环,实际程序中应为后续操作
- ;++++++++以下为XCODE中的数据表++++++++ ; 用以分隔程序,使程序清晰易懂
- Data_TAB: ; 常数或数据表格前用标号表示其起始地址
- DB 0, 1, 2, 3, 4, 5, 6, 7 ; 立即数可以用十进制数表示,也可以用十六进制数表示, 后者有后缀“H”
- DB 8, 9, 0AH, 0BH, 0CH, 0DH, 0EH, 0FH ; 十六进制数中最高位数为A~F时,前面要补数字“0”
- DB 10H, 11H, 12H, 13H, 14H, 15H, 16H, 17H ; 十六进制数中最高位数为A~F时,前面要补数字“0”
- DB 18H, 19H, 1AH, 1BH, 1CH, 1DH, 1EH, 1FH ; 每行起始用伪指令“DB”定义数据,“DB”表示数据字节
- ……
- DB 0F8H, 0F9H, 0FAH, 0FBH, 0FCH, 0FDH, 0FEH, 0FFH ; 每个数据字节之间用英文逗号分隔
- ;+++++++ +++++表格结束++++++++++++++++ ; 用以分隔程序,使程序清晰易懂
- END ; 程序结束,编译程序不理会END以后的内容
-
- 实验4-2:外部数据块搬移(65280>数据字节数>256)
- 把处于外部数据存储器从Data_BLOCK开始的NUMB(65280>NUMB>256)个字节数据传送到串口数据缓冲器(SBUF)中去。
-
- $mod841 ; 包含841的头文件
- ORG 0000H ; 实验板开始执行的第一条指令所处的地址
- LJMP MAIN ; 跳转到主程序
- ORG 0100H ; 主程序开始的地址;避开中断入口地址
- MAIN: MOV DPTR, # Data_BLOCK ; 使DPTR指向XDATA中的Data_BLOCK开始数据块
- MOV R0, #NUMB_LOW ; #NUMB_LOW为#NUMB的低位字节放到作为低位字节计数器的R0中
- MOV R1, #NUMB_HIGH+1 ; #NUMB_HIGH为#NUMB的高位字节加1放到作为高位字节计数器的R1中
- MOVEDATA: MOVX A, @ DPTR ; 从XDATA中读取数据,请注意指令形式
- MOV SBUF, A ; 把数据写到SBUF中
- INC DPTR ; 修改源数据指针
- DJNZ R0, MOVEDATA ; 没有送完NUMB个数据,跳转到MOVEDATA继续送数
- DJNZ R1, MOVEDATA ;
- HALT: LJMP HALT ; 送完NUMB个数据,在此死循环,实际程序中应为后续操作
- ;================================== ; 用以分隔程序,使程序清晰易懂
- END ; 程序结束,编译程序不理会END以后的内容
-
-
- 实验4-3:外部数据块搬移(65536>数据字节数>1)
- 把处于外部数据存储器(XDATA)中从Data_TAB1开始的NUMB个字节数据传送到外部数据存储器从Data_TAB2开始的NUMB个单元中去。
-
- $mod841 ; 包含841的头文件
- ORG 0000H ; 实验板开始执行的第一条指令所处的地址
- LJMP MAIN ; 跳转到主程序
- ORG 0100H ; 主程序开始的地址;避开中断入口地址
- MAIN: MOV DPTR, # Data_TAB1 ; 使DPTR指向XDATA中的Data_TAB1开始的数据块
- MOV R0, # Data_TAB2_LOW ; # Data_TAB2的低位字节放到R0中
- MOV P2, # Data_TAB2_HIGH ; # Data_TAB2的高位字节放到P2中
- MOV R2, #0 ; R2作为送数个数计数器的低位字节计数器
- MOV R3, #0 ; R3作为送数个数计数器的高位字节计数器
- MOVEDATA: MOVX A, @ DPTR ; 从XDATA中的Data_TAB1开始的数据块读取数据
- MOVX @R0, A ; 把数据写到XDATA中的Data_TAB2开始的数据块中
- INC DPTR ; 修改源地址指针
- INC R0 ; 修改目的地址指针低位字节
- CJNE R0, #0, MOVEDATA1 ; 目的地址指针低位字节是否有进位
- INC P2 ; 目的地址指针低位字节有进位,高位字节加1
- MOVEDATA1: INC R2 ; 修改已传送数据个数计数指针低位字节
- CJNE R2, #0, MOVEDATA2 ; 已传送数据个数计数指针低位字节是否有进位
- INC R3 ; 已传送数据个数计数指针低位字节有进位,高位字节加1
- MOVEDATA2: CJNE R2, #NUMB_LOW, MOVEDATA; 比较已传送数据个数计数指针低位字节,不等则继续送数
- CJNE R3, #NUMB_HIGH, MOVEDATA; 低位字节相等,比较高位字节,不等则继续送数
- HALT: LJMP HALT ; 送完数据块搬移,在此死循环,实际程序中应为后续操作
- ;================================== ; 用以分隔程序,使程序清晰易懂
- END ; 程序结束,编译程序不理会END以后的内容
-
- 实验4-4:清除外部数据存储器(0000H~7FFFH)
- 清除外部数据存储器(XDATA)中从0000H到7FFFH的所有单元。
-
- $mod841 ; 包含841的头文件
- ORG 0000H ; 实验板开始执行的第一条指令所处的地址
- LJMP MAIN ; 跳转到主程序
- ORG 0100H ; 主程序开始的地址;避开中断入口地址
- MAIN: MOV DPTR, #0000H ; 使DPTR指向XDATA中的起始地址9000H
- MOV A, #0 ; 清除累加器
- CLR_RAM: MOVX @ DPTR, A ; 清除DPTR所指向的XDATA单元(即写入数据00H)
- INC DPTR ; 修改地址指针
- MOV R0, DPH ; 把地址指针的高位字节送到R0中进行判断
- CJNE R0, #80H, CLR_RAM ; 完成清除XDATA?
- HALT: LJMP HALT ; 完成清除XDATA,在此死循环,实际程序中应为后续操作
- ;================================== ; 用以分隔程序,使程序清晰易懂
- END ; 程序结束,编译程序不理会END以后的内容
-
- 实验4-5:清除片内数据存储器(DATA+IDATA)
- 清除片内数据存储器(DATA+IDATA),即片内从00H至FFH所有单元。
-
- $mod841 ; 包含841的头文件
- ORG 0000H ; 实验板开始执行的第一条指令所处的地址
- LJMP MAIN ; 跳转到主程序
- ORG 0100H ; 主程序开始的地址;避开中断入口地址
- MAIN: MOV R0, #0FFH ; 使R0指向IDATA中的最大的地址FFH
- MOV A, #0 ; 清除累加器
- CLR_RAM: MOV @ R0, A ; 清除DPTR所指向的IDATA单元(即写入数据00H)
- DJNZ R0, CLR_RAM ; 完成清除IDATA?
- HALT: LJMP HALT ; 完成清除IDATA,在此死循环,实际程序中应为后续操作
- ;================================== ; 用以分隔程序,使程序清晰易懂
- END ; 程序结束,编译程序不理会END以后的内容
-
- 实验4-6:读写RAM
- 把处于数据存储器(RAM)中从Data_TAB1开始的NUMB(<256)个字节数据传送到数据存储器从Data_TAB2开始的NUMB个单元中去。
-
- $mod841 ; 包含841的头文件
- ORG 0000H ; 实验板开始执行的第一条指令所处的地址
- LJMP MAIN ; 跳转到主程序
- ORG 0100H ; 主程序开始的地址;避开中断入口地址
- MAIN: MOV R0, #Data_TAB1 ; 使R0指向DATA中的Data_TAB1开始的数据块
- MOV R1, #Data_TAB2 ; 使R1指向DATA中的Data_TAB2开始的数据块
- MOV R2, #0 ; R2作为送数个数计数器的低位字节计数器
- MOVEDATA: MOV A, @R0 ; 从DATA中的Data_TAB1开始的数据块读取数据
- MOV @R1,A ; 把数据写到DATA中的Data_TAB2开始的数据块中
- INC R0 ; 修改源地址指针
- INC R1 ; 修改目的地址指针低位字节
- INC R2 ; 修改已传送数据个数计数字节
- CJNE R2, #NUMB, MOVEDATA ; 比较已传送数据个数计数指针字节,不等则继续送数
- HALT: LJMP HALT ; 送完数据块搬移,在此死循环,实际程序中应为后续操作
- ;================================== ; 用以分隔程序,使程序清晰易懂
- END ; 程序结束,编译程序不理会END以后的内容
-
- 实验4-7:读写XRAM
- 把ADC采样获得的1k个字节数据送入处于片内XRAM的从0000H开始的存储区内,再把这1k个字节数据传送到DAC中去。实际上该程序实现数字存储示波(滚动显示)。
-
- $mod841 ; 包含841的头文件
- ORG 0000H ; 实验板开始执行的第一条指令所处的地址
- LJMP MAIN ; 跳转到主程序
- ORG 0100H ; 主程序开始的地址;避开中断入口地址
- MAIN: MOV CFG841, #01 ; 使能片内XRAM,默认时为片外数据存储器
- MOV DPTR, #0 ; 使DPTR指向XDATA中的起始地址
- MOV ADCCON1,#0A4H ; 写ADC控制字
- MOV ADCCON2,#00H ; 选择0通道采样
- MOV DACCON, #0DH ; 写DAC控制字
- MOV R2, #0 ; 1k的低位字节放到作为低位字节计数器的R2中
- MOV R3, #3 ; 1k的高位字节放到作为高位字节计数器的R3中
- SETB SCONV ; 将SCONV置1,则ADC开始单步转换
- LCALL DELAY ; 调延时,等待ADC转换完毕
- SENDDATA: MOV A, ADCDATAH ; 将采样值的高字节放入累加器A中
- MOVX @DPTR, A ; 将采样值的高字节送入XRAM
- INC DPTR ; 修改源地址指针
- MOV A, ADCDATAL ; 将采样值的低字节放入累加器A中
- MOVX @DPTR, A ; 将采样值的低字节送入XRAM
- INC DPTR ; 修改源地址指针
- ANL DPH, #03H ; 保证DPTR指向0000H~03FFH的范围内
- SETB SCONV ; 将SCONV置1,则ADC开始单步转换
- SETB P3.3 ; 送同步脉冲,P3.3接示波器的外部触发信号
- CLR P3.3
- MOVEDATA: MOVX A, @DPTR ; 从XDATA中读取数据送DAC,DAC输出接示波器
- MOV DAC0H, A ; 将XRAM中的数据送DAC输出,先送高字节
- INC DPTR ; 修改地址指针
- MOVX A, @DPTR ; 从XDATA中读取数据
- MOV DAC0L, A ; 将XRAM中的数据送DAC输出,送低字节
- INC DPTR ; 修改地址指针
- ANL DPH, #03H ; 保证DPTR指向0000H~03FFH的范围内
- DJNZ R2, MOVEDATA ; 没有送完NUMB个数据,跳转到MOVEDATA继续采数
- DJNZ R3, MOVEDATA
- MOV R2, #0 ; 1k的低位字节放到作为低位字节计数器的R2中
- MOV R3, #3 ; 1k的高位字节放到作为高位字节计数器的R3中
- HALT: LJMP SENDDATA ; 送完1帧数据,跳转采样新数据和送下一帧数据
- ;================================== ; 用以分隔程序,使程序清晰易懂
- END ; 程序结束,编译程序不理会END以后的内容
-
- 实验4-8:读写FLASH/EE数据存储器
- 先对FLASH/EE数据存储器中的第N页的4个字节中分别写入#0AH、#0BH、#0CH和#0DH,然后再把第2个字节改为#0EH。
- $mod841 ; 包含841的头文件
- ORG 0000H ; 实验板开始执行的第一条指令所处的地址
- LJMP MAIN ; 跳转到主程序
- ORG 0100H ; 主程序开始的地址;避开中断入口地址
- MAIN: MOV ECON, #06H ; 读写FLASH/EE之前,先对其进行全部檫除命令
- MOV EADRL, #NL ; 设置编程页指针的低字节
- MOV EADRH, #NH ; 设置编程页指针的高字节
- MOV EDATA1, #0AH ; 向数据寄存器写第N页的第一个字节写入新字节#0AH
- MOV EDATA2, #0BH ; 向数据寄存器写第N页的第二个字节写入新字节#0BH
- MOV EDATA3, #0CH ; 向数据寄存器写第N页的第三个字节写入新字节#0CH
- MOV EDATA4, #0DH ; 向数据寄存器写第N页的第四个字节写入新字节#0DH
- MOV ECON, #02H ; 将数据寄存器组的数写入FLASH/EE中的第N页中
- MOV ECON, #01H ; 修改FLASH/EE之前,先读取该页数据,以免更改不需要修改的数据
- MOV EDATA2, #0EH ; 修改数据
- MOV ECON, #05H ; 写数据之前,应先檫除该页
- MOV ECON, #02H ; 将修改后的数写入FLASH/EE中的第N页中
- HALT: LJMP HALT ; 完成清除IDATA,在此死循环,实际程序中应为后续操作
- ;================================== ; 用以分隔程序,使程序清晰易懂
- END ; 程序结束,编译程序不理会END以后的内容
复制代码
|
|