http course sdu edu cnG 2 Sstcmcu cc

  • Slides: 115
Download presentation

任课教师: 刘忠国 山东大学课程中心网站: http: //course. sdu. edu. cn/G 2 S/stcmcu. cc 网站:http: //www. mcu

任课教师: 刘忠国 山东大学课程中心网站: http: //course. sdu. edu. cn/G 2 S/stcmcu. cc 网站:http: //www. mcu 001. com keil μvision软件下载及指导手册(Help→μvision Help) http: //www. keil. com/ 何宾STC单片机原理及应用 > http: //www. gpnewtech. com/study/stc/ 2

2、数据定义伪指令 例如: ORG 1000 H SEG: DB 23 H DW 1000 H DB ‘MCS-51’

2、数据定义伪指令 例如: ORG 1000 H SEG: DB 23 H DW 1000 H DB ‘MCS-51’ END 则: (1000 H)=23 H (1001 H)=00 H 10 H (1002 H)=10 H 00 H (1003 H)=4 DH (1004 H)=43 H (1005 H)=53 H (1006 H)=2 DH (1007 H)=35 H (1008 H)=31 H 14 ; 定义一个字节 ; 定义一个字符串 SEG的地址为 1000 H ‘M‘的ASCII码 ‘C’ 的ASCII码 ‘S’ 的ASCII码 ‘-’的ASCII码 数字 5的ASCII码 数字 1的ASCII码

【例4 -9】程序 SIGN EQU 50 H ; 求得的y 值存入SIGN单元 ORG 0000 H LJMP MAIN

【例4 -9】程序 SIGN EQU 50 H ; 求得的y 值存入SIGN单元 ORG 0000 H LJMP MAIN 设变量x值存放在R 0 ORG 0100 H MAIN: CJNE R 0, #37, NOTEQ ; R 0与37比较, 不相等则转NOTEQ MOV SIGN, #00 H ; 若比较相等, 则SIGN← 0 LJMP ENDM ; 转到程序结束 NOTEQ:JC NEG ; 两数不相等, 若R 0< 37则C=1, 转NEG处理 MOV SIGN, #01 H ; R 0> 37时, SIGN←+1 LJMP ENDM ; 转到程序结束 NEG:MOV SIGN, #0 FFH ; R 0< 37时, SIGN←-1 ENDM:NOP END 44

(2)多字节乘法运算子程序 DMUL: MOV A, R 3 MOV B, R 7 MUL AB ; R

(2)多字节乘法运算子程序 DMUL: MOV A, R 3 MOV B, R 7 MUL AB ; R 3×R 7 MOV 30 H, A ; (30 H) ← (R 3×R 7)L MOV 31 H, B ; (31 H) ← (R 3×R 7)H MOV A, R 2 MOV B, R 7 MUL AB ; R 2×R 7 ADD A, 31 H ; (R 3×R 7)H+(R 2×R 7)L MOV 31 H, A CLR A ADDC A, B ; 进位位C与(R 2 R 7)H加 MOV 32 H, A ; (32 H) ← (R 2 R 7)H 57

(2)多字节乘法运算子程序 MOV A, R 3 MOV B, R 6 MUL AB ; R 3×R

(2)多字节乘法运算子程序 MOV A, R 3 MOV B, R 6 MUL AB ; R 3×R 6 ADD A, 31 H MOV 31 H, A MOV A, B ADDC A, 32 H ; (R 2×R 7)H+(R 3×R 6)H MOV 32 H, A 程序状态标志寄存器PSW MOV F 0, C ; 暂存Cy ; 因下面乘法使C清0 ; 也可CLR A, ADDC A, #0, 58 MOV 33 H, A; 下面程序相应修改 位号 D 7 D 6 D 5 D 4 D 3 D 2 D 1 D 0 符号 CY AC F 0 RS 1 RS 0 OV F 1 P F 0: 用户标志位

(2)多字节乘法运算子程序 MOV F 0, C ; 暂存Cy MOV A, R 2 MOV B, R

(2)多字节乘法运算子程序 MOV F 0, C ; 暂存Cy MOV A, R 2 MOV B, R 6 MUL AB ; R 2×R 6 ADD A, 32 H MOV 32 H, A CLR A MOV ACC. 0, C ; 或 ADDC A, #0 MOV C, F 0 ; 前次加法进位送C, 为ADDC加(R 2 R 6)H准备 ADDC A, B 程序状态标志寄存器PSW 位号 D 7 D 6 D 5 D 4 D 3 D 2 D 1 D 0 MOV 33 H, A 符号 CY AC F 0 RS 1 RS 0 OV F 1 P RET F 0: 用户标志位 59

BRAN 3: MOV A, R 1 ANL A, #0 FH ; 取个位数 MOV R

BRAN 3: MOV A, R 1 ANL A, #0 FH ; 取个位数 MOV R 3, A ; 个位数(权值是自身)送R 3, R 4=00 H LCALL ADDT ; 加个位数二进制码 RET ADDT: PUSH PSW PUSH ACC CLR C MOV A, 20 H ; 20 H(低), 21 H单元存累加的转换结果 ADD A, R 3 ; 累加转换结果 MOV 20 H, A ; R 3, R 4存 1千(百, 十)的二进制 MOV A, 21 H 数权值 03 E 8 H(0064 H, 000 AH) ADDC A, R 4 MOV 21 H, A POP ACC POP PSW RET 70

7、STC 15 F 2 K 60 S 2单片机双数据指针的使用 编程如下:或$INCLUDE (STC 15. INC); 包含STC 15寄存器定义头文件

7、STC 15 F 2 K 60 S 2单片机双数据指针的使用 编程如下:或$INCLUDE (STC 15. INC); 包含STC 15寄存器定义头文件 AUXR 1 DATA 0 A 2 H ; 定义辅助寄存器AUXR 1直接地址 ORG 0000 H LJMP MAIN ORG 0100 H MAIN: MOV SP, #30 H ; 设置堆栈指针 MOV R 2, #10 H ; 设置计数值(传送的字节数 16) ANL AUXR 1, #0 FEH ; 令DPS. 0=0, 选择DPTR 0 MOV DPTR, #0000 H ; 置源数据地址指针DPTR 0=0 H ORL AUXR 1, #01 H ; 令DPS. 0=1, 选择DPTR 1 ; 该句可用INC AUXR 1代替(思考: 为何?) MOV DPTR, #0040 H ; 置目的数据地址指针DPTR 1=40 H 73

7、STC 15 F 2 K 60 S 2单片机双数据指针的使用 LOOP: ANL AUXR 1, #0 FEH

7、STC 15 F 2 K 60 S 2单片机双数据指针的使用 LOOP: ANL AUXR 1, #0 FEH ; 该句可用INC DEC AUXR 1代替 选DPTR 0 MOVX A, @DPTR ; A← (DPTR 0) INC DPTR ; 修正源数据地址指针DPTR 0+1 ORL AUXR 1, #01 H ; 该句可用INC AUXR 1代替, 选DPTR 1 MOVX @DPTR, A INC DPTR ; 修正目的数据地址指针DPTR 1+1 DJNZ R 2, LOOP SJMP ; (DPTR 1) ← A ; 传送字节数 16没完, 继续循环传送 $ ; $表示本条语句地址, 本指令是死循环等待 ; SJMP $ 相当于HERE: SJMP HERE END 74

8、STC 15 F 2 K 60 S 2单片机数据Flash(EEPROM)的使用 STC 15 F 2 K 60

8、STC 15 F 2 K 60 S 2单片机数据Flash(EEPROM)的使用 STC 15 F 2 K 60 S 2单片机片内集成 1 KB的数据Flash存储器 , 可作为EEPROM使用, 用来保存程序的设置参数。 GO 【例4 -11】一个完整的数据Flash操作实例。 $INCLUDE (STC 15. INC) ; 包含STC 15 F 2 K 60 S 2寄存器定义文件 ; 定义ISP/IAP命令 ISP_IAP_BYTE_READ EQU 1 H ; 字节读 ISP_IAP_BYTE_PROGRAM EQU 2 H ; 字节编程 ISP_IAP_SECTOR_ERASE EQU 3 H ; 扇区擦除 ; 定义Flash操作等待时间及允许IAP/ISP操作的常数(设置IAP_CONTR) ENABLE_IAP EQU 82 H ; 系统 作时钟<20 MHz时 DEBUG_DATA EQU 5 AH ; EEPROM单元的测试值,如正确应等于该值 START_ADDRESS EQU 0000 H ; EEPROM测试起始地址 78

[例4 -11] 一个完整的数据Flash操作实例 (续) ; ------------ 延时子程序------------Delay: CLR A 延时时间: MOV R 0, A

[例4 -11] 一个完整的数据Flash操作实例 (续) ; ------------ 延时子程序------------Delay: CLR A 延时时间: MOV R 0, A 256*32(20 H) *时钟周期 MOV R 1, A MOV R 2, #20 H Delay_Loop: DJNZ R 0, Delay_Loop DJNZ R 1, Delay_Loop DJNZ R 2, Delay_Loop RET END 84

例4 -12程序代码 [例4 -12] 将片内RAM 40 H~ 4 FH单 ORG 0000 H 元清零, 循环从P

例4 -12程序代码 [例4 -12] 将片内RAM 40 H~ 4 FH单 ORG 0000 H 元清零, 循环从P 1. 0输出 10 ms方波。 LJMPMAIN ORG 0100 H MAIN: MOV SP, #70 H ; 设置堆栈指针 MOV R 0, #40 H ; 40 H~4 FH单元的起始地址40 H送R 0 MOV R 2, #10 H ; 循环(LOOP 1)次数计数器R 2 CLR A LOOP 1: MOV @R 0, A INC R 0 DJNZ R 2, LOOP 1 ; 将40 H~4 FH单元的内容清零 SETB P 1. 0 LOOP 2: CPL P 1. 0 ; P 1. 0输出方波高低电平变换 LCALL DELAY LJMP LOOP 2 ; 循环输出方波 DELAY: MOV R 2, #50 ; 10 ms延时子程序; 该指令 12 T DLY_LOOP: MOV A, #240 ; 该指令 12 T, 2/6 us LOOP: DEC A ; 该指令 1 T LOOP循环延时: JNZ LOOP ; 该指令 24 T 240*5* 1/6=200 us NOP ; 1 T DJNZ R 2, DLY_LOOP ; 24 T DLY_LOOP循环延时: RET 50*(240*5+7)* 1/6≈10 ms END 105