您的位置:首页 > 其它

RB-101机器人主板蜂鸣器测试

2005-07-05 11:41 337 查看
这是从MCS51转到AVR后的第二个单片机程序,该程序是控制RB-101 机器人主板上的蜂鸣器连续发声。

1 //RB-101 机器人蜂鸣器测试程序
2 //2005年6月25日 彭斌
3
4 #include <mega8515.h> //头文件
5 #include <delay.h> //延时头程序调用,该文件已经存在于CodeVisionAVR里 ,安装后就有。
6 #include <stdio.h> //一些常用函数的头文件调用
7
8 //自定义蜂鸣器蜂鸣函数 (自定义函数必须放在入口函数前面,否则编译时会出错,这个可能是该软件识别造成的,不是一种程序设计规范)
9 void buzzer(void)
10 {
11 //定义一个变量
12 unsigned char i=0xff;
13 //循环
14 for(;i--;)
15 {
16 //蜂鸣器占用PORTB.3引脚
17 PORTB.3=!PORTB.3; //取反
18 delay_us(500); //延时500微秒,调节该延时值将改变蜂鸣器的音调高低
19 }
20 }
21
22 //主函数入口
23 void main(void)
24 {
25 //DDRxn 定义引脚方向,“1” 为输出,“0”为输入。
26
27 DDRB.3 = 1; //蜂鸣器引脚方向设置
28
29 //执行一个死循环,使数码管连续的全亮
30 while(1)
31 {
32 buzzer(); //调用自定义蜂鸣函数
33 delay_ms(1000); //延时1000毫秒,也就是1S ,调节该延时长短可以使蜂鸣节奏变化
34 buzzer(); //调用自定义蜂鸣函数
35 delay_ms(1000); //延时1000毫秒,也就是1S
36 }
37
38 }
39
40

编译软件使用:CodeVisionAVR C Compiler
编译后产生如下汇编代码:

;Chip type : ATmega8515L
;Program type : Application
;Clock frequency : 4.096000 MHz
;Memory model : Small
;Optimize for : Size
;(s)printf features : int
;(s)scanf features : int, width
;External SRAM size : 0
;Data Stack size : 128
;Promote char to int : No
;char is unsigned : Yes
;8 bit enums : No
;Enhanced core instructions : On
;Automatic register allocation : On

.LISTMAC
.EQU UDRE=0x5
.EQU RXC=0x7
.EQU USR=0xB
.EQU UDR=0xC
.EQU EERE=0x0
.EQU EEWE=0x1
.EQU EEMWE=0x2
.EQU SPSR=0xE
.EQU SPDR=0xF
.EQU EECR=0x1C
.EQU EEDR=0x1D
.EQU EEARL=0x1E
.EQU EEARH=0x1F
.EQU WDTCR=0x21
.EQU MCUCSR=0x34
.EQU MCUCR=0x35
.EQU EMCUCR=0x36
.EQU GICR=0x3B
.EQU SPL=0x3D
.EQU SPH=0x3E
.EQU SREG=0x3F

.DEF R0X0=R0
.DEF R0X1=R1
.DEF R0X2=R2
.DEF R0X3=R3
.DEF R0X4=R4
.DEF R0X5=R5
.DEF R0X6=R6
.DEF R0X7=R7
.DEF R0X8=R8
.DEF R0X9=R9
.DEF R0XA=R10
.DEF R0XB=R11
.DEF R0XC=R12
.DEF R0XD=R13
.DEF R0XE=R14
.DEF R0XF=R15
.DEF R0X10=R16
.DEF R0X11=R17
.DEF R0X12=R18
.DEF R0X13=R19
.DEF R0X14=R20
.DEF R0X15=R21
.DEF R0X16=R22
.DEF R0X17=R23
.DEF R0X18=R24
.DEF R0X19=R25
.DEF R0X1A=R26
.DEF R0X1B=R27
.DEF R0X1C=R28
.DEF R0X1D=R29
.DEF R0X1E=R30
.DEF R0X1F=R31

.EQU __se_bit=0x20

.MACRO __CPD1N
CPI R30,LOW(@0)
LDI R26,HIGH(@0)
CPC R31,R26
LDI R26,BYTE3(@0)
CPC R22,R26
LDI R26,BYTE4(@0)
CPC R23,R26
.ENDM

.MACRO __CPD2N
CPI R26,LOW(@0)
LDI R30,HIGH(@0)
CPC R27,R30
LDI R30,BYTE3(@0)
CPC R24,R30
LDI R30,BYTE4(@0)
CPC R25,R30
.ENDM

.MACRO __CPWRR
CP R@0,R@2
CPC R@1,R@3
.ENDM

.MACRO __CPWRN
CPI R@0,LOW(@2)
LDI R30,HIGH(@2)
CPC R@1,R30
.ENDM

.MACRO __ADDD1N
SUBI R30,LOW(-@0)
SBCI R31,HIGH(-@0)
SBCI R22,BYTE3(-@0)
SBCI R23,BYTE4(-@0)
.ENDM

.MACRO __ADDD2N
SUBI R26,LOW(-@0)
SBCI R27,HIGH(-@0)
SBCI R24,BYTE3(-@0)
SBCI R25,BYTE4(-@0)
.ENDM

.MACRO __SUBD1N
SUBI R30,LOW(@0)
SBCI R31,HIGH(@0)
SBCI R22,BYTE3(@0)
SBCI R23,BYTE4(@0)
.ENDM

.MACRO __SUBD2N
SUBI R26,LOW(@0)
SBCI R27,HIGH(@0)
SBCI R24,BYTE3(@0)
SBCI R25,BYTE4(@0)
.ENDM

.MACRO __ANDD1N
ANDI R30,LOW(@0)
ANDI R31,HIGH(@0)
ANDI R22,BYTE3(@0)
ANDI R23,BYTE4(@0)
.ENDM

.MACRO __ORD1N
ORI R30,LOW(@0)
ORI R31,HIGH(@0)
ORI R22,BYTE3(@0)
ORI R23,BYTE4(@0)
.ENDM

.MACRO __DELAY_USB
LDI R24,LOW(@0)
__DELAY_USB_LOOP:
DEC R24
BRNE __DELAY_USB_LOOP
.ENDM

.MACRO __DELAY_USW
LDI R24,LOW(@0)
LDI R25,HIGH(@0)
__DELAY_USW_LOOP:
SBIW R24,1
BRNE __DELAY_USW_LOOP
.ENDM

.MACRO __CLRD1S
CLR R30
STD Y+@0,R30
STD Y+@0+1,R30
STD Y+@0+2,R30
STD Y+@0+3,R30
.ENDM

.MACRO __GETD1S
LDD R30,Y+@0
LDD R31,Y+@0+1
LDD R22,Y+@0+2
LDD R23,Y+@0+3
.ENDM

.MACRO __PUTD1S
STD Y+@0,R30
STD Y+@0+1,R31
STD Y+@0+2,R22
STD Y+@0+3,R23
.ENDM

.MACRO __POINTB1MN
LDI R30,LOW(@0+@1)
.ENDM

.MACRO __POINTW1MN
LDI R30,LOW(@0+@1)
LDI R31,HIGH(@0+@1)
.ENDM

.MACRO __POINTW1FN
LDI R30,LOW(2*@0+@1)
LDI R31,HIGH(2*@0+@1)
.ENDM

.MACRO __POINTB2MN
LDI R26,LOW(@0+@1)
.ENDM

.MACRO __POINTW2MN
LDI R26,LOW(@0+@1)
LDI R27,HIGH(@0+@1)
.ENDM

.MACRO __GETD1N
LDI R30,LOW(@0)
LDI R31,HIGH(@0)
LDI R22,BYTE3(@0)
LDI R23,BYTE4(@0)
.ENDM

.MACRO __GETD2N
LDI R26,LOW(@0)
LDI R27,HIGH(@0)
LDI R24,BYTE3(@0)
LDI R25,BYTE4(@0)
.ENDM

.MACRO __GETD2S
LDD R26,Y+@0
LDD R27,Y+@0+1
LDD R24,Y+@0+2
LDD R25,Y+@0+3
.ENDM

.MACRO __GETB1MN
LDS R30,@0+@1
.ENDM

.MACRO __GETW1MN
LDS R30,@0+@1
LDS R31,@0+@1+1
.ENDM

.MACRO __GETD1MN
LDS R30,@0+@1
LDS R31,@0+@1+1
LDS R22,@0+@1+2
LDS R23,@0+@1+3
.ENDM

.MACRO __GETBRMN
LDS R@2,@0+@1
.ENDM

.MACRO __GETWRMN
LDS R@2,@0+@1
LDS R@3,@0+@1+1
.ENDM

.MACRO __GETB2MN
LDS R26,@0+@1
.ENDM

.MACRO __GETW2MN
LDS R26,@0+@1
LDS R27,@0+@1+1
.ENDM

.MACRO __GETD2MN
LDS R26,@0+@1
LDS R27,@0+@1+1
LDS R24,@0+@1+2
LDS R25,@0+@1+3
.ENDM

.MACRO __PUTB1MN
STS @0+@1,R30
.ENDM

.MACRO __PUTW1MN
STS @0+@1,R30
STS @0+@1+1,R31
.ENDM

.MACRO __PUTD1MN
STS @0+@1,R30
STS @0+@1+1,R31
STS @0+@1+2,R22
STS @0+@1+3,R23
.ENDM

.MACRO __PUTBMRN
STS @0+@1,R@2
.ENDM

.MACRO __PUTWMRN
STS @0+@1,R@2
STS @0+@1+1,R@3
.ENDM

.MACRO __GETW1R
MOV R30,R@0
MOV R31,R@1
.ENDM

.MACRO __GETW2R
MOV R26,R@0
MOV R27,R@1
.ENDM

.MACRO __GETWRN
LDI R@0,LOW(@2)
LDI R@1,HIGH(@2)
.ENDM

.MACRO __PUTW1R
MOV R@0,R30
MOV R@1,R31
.ENDM

.MACRO __PUTW2R
MOV R@0,R26
MOV R@1,R27
.ENDM

.MACRO __ADDWRN
SUBI R@0,LOW(-@2)
SBCI R@1,HIGH(-@2)
.ENDM

.MACRO __ADDWRR
ADD R@0,R@2
ADC R@1,R@3
.ENDM

.MACRO __SUBWRN
SUBI R@0,LOW(@2)
SBCI R@1,HIGH(@2)
.ENDM

.MACRO __SUBWRR
SUB R@0,R@2
SBC R@1,R@3
.ENDM

.MACRO __ANDWRN
ANDI R@0,LOW(@2)
ANDI R@1,HIGH(@2)
.ENDM

.MACRO __ANDWRR
AND R@0,R@2
AND R@1,R@3
.ENDM

.MACRO __ORWRN
ORI R@0,LOW(@2)
ORI R@1,HIGH(@2)
.ENDM

.MACRO __ORWRR
OR R@0,R@2
OR R@1,R@3
.ENDM

.MACRO __EORWRR
EOR R@0,R@2
EOR R@1,R@3
.ENDM

.MACRO __GETWRS
LDD R@0,Y+@2
LDD R@1,Y+@2+1
.ENDM

.MACRO __PUTWSR
STD Y+@2,R@0
STD Y+@2+1,R@1
.ENDM

.MACRO __MOVEWRR
MOV R@0,R@2
MOV R@1,R@3
.ENDM

.MACRO __INWR
IN R@0,@2
IN R@1,@2+1
.ENDM

.MACRO __OUTWR
OUT @2+1,R@1
OUT @2,R@0
.ENDM

.MACRO __CALL1MN
LDS R30,@0+@1
LDS R31,@0+@1+1
ICALL
.ENDM

.MACRO __NBST
BST R@0,@1
IN R30,SREG
LDI R31,0x40
EOR R30,R31
OUT SREG,R30
.ENDM

.MACRO __PUTB1SN
LDD R26,Y+@0
LDD R27,Y+@0+1
SUBI R26,LOW(-@1)
SBCI R27,HIGH(-@1)
ST X,R30
.ENDM

.MACRO __PUTW1SN
LDD R26,Y+@0
LDD R27,Y+@0+1
SUBI R26,LOW(-@1)
SBCI R27,HIGH(-@1)
ST X+,R30
ST X,R31
.ENDM

.MACRO __PUTD1SN
LDD R26,Y+@0
LDD R27,Y+@0+1
SUBI R26,LOW(-@1)
SBCI R27,HIGH(-@1)
RCALL __PUTDP1
.ENDM

.MACRO __PUTB1SNS
LDD R26,Y+@0
LDD R27,Y+@0+1
ADIW R26,@1
ST X,R30
.ENDM

.MACRO __PUTW1SNS
LDD R26,Y+@0
LDD R27,Y+@0+1
ADIW R26,@1
ST X+,R30
ST X,R31
.ENDM

.MACRO __PUTD1SNS
LDD R26,Y+@0
LDD R27,Y+@0+1
ADIW R26,@1
RCALL __PUTDP1
.ENDM

.MACRO __PUTB1PMN
LDS R26,@0
LDS R27,@0+1
SUBI R26,LOW(-@1)
SBCI R27,HIGH(-@1)
ST X,R30
.ENDM

.MACRO __PUTW1PMN
LDS R26,@0
LDS R27,@0+1
SUBI R26,LOW(-@1)
SBCI R27,HIGH(-@1)
ST X+,R30
ST X,R31
.ENDM

.MACRO __PUTD1PMN
LDS R26,@0
LDS R27,@0+1
SUBI R26,LOW(-@1)
SBCI R27,HIGH(-@1)
RCALL __PUTDP1
.ENDM

.MACRO __PUTB1PMNS
LDS R26,@0
LDS R27,@0+1
ADIW R26,@1
ST X,R30
.ENDM

.MACRO __PUTW1PMNS
LDS R26,@0
LDS R27,@0+1
ADIW R26,@1
ST X+,R30
ST X,R31
.ENDM

.MACRO __PUTD1PMNS
LDS R26,@0
LDS R27,@0+1
ADIW R26,@1
RCALL __PUTDP1
.ENDM

.MACRO __GETB1SX
MOVW R30,R28
SUBI R30,LOW(-@0)
SBCI R31,HIGH(-@0)
LD R30,Z
.ENDM

.MACRO __GETW1SX
MOVW R30,R28
SUBI R30,LOW(-@0)
SBCI R31,HIGH(-@0)
LD R0,Z+
LD R31,Z
MOV R30,R0
.ENDM

.MACRO __GETD1SX
MOVW R30,R28
SUBI R30,LOW(-@0)
SBCI R31,HIGH(-@0)
LD R0,Z+
LD R1,Z+
LD R22,Z+
LD R23,Z
MOVW R30,R0
.ENDM

.MACRO __GETB2SX
MOVW R26,R28
SUBI R26,LOW(-@0)
SBCI R27,HIGH(-@0)
LD R26,X
.ENDM

.MACRO __GETW2SX
MOVW R26,R28
SUBI R26,LOW(-@0)
SBCI R27,HIGH(-@0)
LD R0,X+
LD R27,X
MOV R26,R0
.ENDM

.MACRO __GETD2SX
MOVW R26,R28
SUBI R26,LOW(-@0)
SBCI R27,HIGH(-@0)
LD R0,X+
LD R1,X+
LD R24,X+
LD R25,X
MOVW R26,R0
.ENDM

.MACRO __GETBRSX
MOVW R30,R28
SUBI R30,LOW(-@1)
SBCI R31,HIGH(-@1)
LD R@0,Z
.ENDM

.MACRO __GETWRSX
MOVW R30,R28
SUBI R30,LOW(-@2)
SBCI R31,HIGH(-@2)
LD R@0,Z+
LD R@1,Z
.ENDM

.MACRO __LSLW8SX
MOVW R30,R28
SUBI R30,LOW(-@0)
SBCI R31,HIGH(-@0)
LD R31,Z
CLR R30
.ENDM

.MACRO __PUTB1SX
MOVW R26,R28
SUBI R26,LOW(-@0)
SBCI R27,HIGH(-@0)
ST X,R30
.ENDM

.MACRO __PUTW1SX
MOVW R26,R28
SUBI R26,LOW(-@0)
SBCI R27,HIGH(-@0)
ST X+,R30
ST X,R31
.ENDM

.MACRO __PUTD1SX
MOVW R26,R28
SUBI R26,LOW(-@0)
SBCI R27,HIGH(-@0)
ST X+,R30
ST X+,R31
ST X+,R22
ST X,R23
.ENDM

.MACRO __CLRW1SX
MOVW R30,R28
SUBI R30,LOW(-@0)
SBCI R31,HIGH(-@0)
CLR R0
ST Z+,R0
ST Z,R0
.ENDM

.MACRO __CLRD1SX
MOVW R30,R28
SUBI R30,LOW(-@0)
SBCI R31,HIGH(-@0)
CLR R0
ST Z+,R0
ST Z+,R0
ST Z+,R0
ST Z,R0
.ENDM

.MACRO __PUTB2SX
MOVW R30,R28
SUBI R30,LOW(-@0)
SBCI R31,HIGH(-@0)
ST Z,R26
.ENDM

.MACRO __PUTW2SX
MOVW R30,R28
SUBI R30,LOW(-@0)
SBCI R31,HIGH(-@0)
ST Z+,R26
ST Z,R27
.ENDM

.MACRO __PUTBSRX
MOVW R30,R28
SUBI R30,LOW(-@0)
SBCI R31,HIGH(-@0)
ST Z,R@1
.ENDM

.MACRO __PUTWSRX
MOVW R30,R28
SUBI R30,LOW(-@2)
SBCI R31,HIGH(-@2)
ST Z+,R@0
ST Z,R@1
.ENDM

.MACRO __PUTB1SNX
MOVW R26,R28
SUBI R26,LOW(-@0)
SBCI R27,HIGH(-@0)
LD R0,X+
LD R27,X
MOV R26,R0
SUBI R26,LOW(-@1)
SBCI R27,HIGH(-@1)
ST X,R30
.ENDM

.MACRO __PUTW1SNX
MOVW R26,R28
SUBI R26,LOW(-@0)
SBCI R27,HIGH(-@0)
LD R0,X+
LD R27,X
MOV R26,R0
SUBI R26,LOW(-@1)
SBCI R27,HIGH(-@1)
ST X+,R30
ST X,R31
.ENDM

.MACRO __PUTD1SNX
MOVW R26,R28
SUBI R26,LOW(-@0)
SBCI R27,HIGH(-@0)
LD R0,X+
LD R27,X
MOV R26,R0
SUBI R26,LOW(-@1)
SBCI R27,HIGH(-@1)
ST X+,R30
ST X+,R31
ST X+,R22
ST X,R23
.ENDM

.MACRO __MULBRR
MULS R@0,R@1
MOV R30,R0
.ENDM

.MACRO __MULBRRU
MUL R@0,R@1
MOV R30,R0
.ENDM

.CSEG
.ORG 0

.INCLUDE "main.vec"
.INCLUDE "main.inc"

__RESET:
CLI
CLR R30
OUT EECR,R30

;INTERRUPT VECTORS ARE PLACED
;AT THE START OF FLASH
LDI R31,1
OUT GICR,R31
OUT GICR,R30
OUT MCUCR,R30
OUT EMCUCR,R30

;DISABLE WATCHDOG
LDI R31,0x18
OUT WDTCR,R31
LDI R31,0x10
OUT WDTCR,R31

;CLEAR R2-R14
LDI R24,13
LDI R26,2
CLR R27
__CLEAR_REG:
ST X+,R30
DEC R24
BRNE __CLEAR_REG

;CLEAR SRAM
LDI R24,LOW(0x200)
LDI R25,HIGH(0x200)
LDI R26,0x60
__CLEAR_SRAM:
ST X+,R30
SBIW R24,1
BRNE __CLEAR_SRAM

;GLOBAL VARIABLES INITIALIZATION
LDI R30,LOW(__GLOBAL_INI_TBL*2)
LDI R31,HIGH(__GLOBAL_INI_TBL*2)
__GLOBAL_INI_NEXT:
LPM R0,Z+
LPM R1,Z+
MOVW R22,R30
MOVW R30,R0
SBIW R30,0
BREQ __GLOBAL_INI_END
LPM R26,Z+
LPM R27,Z+
LPM R24,Z+
LPM R25,Z+
__GLOBAL_INI_LOOP:
LPM R0,Z+
ST X+,R0
SBIW R24,1
BRNE __GLOBAL_INI_LOOP
MOVW R30,R22
RJMP __GLOBAL_INI_NEXT
__GLOBAL_INI_END:

;STACK POINTER INITIALIZATION
LDI R30,LOW(0x25F)
OUT SPL,R30
LDI R30,HIGH(0x25F)
OUT SPH,R30

;DATA STACK POINTER INITIALIZATION
LDI R28,LOW(0xE0)
LDI R29,HIGH(0xE0)

RJMP _main

.ESEG
.ORG 0
.DB 0 ; FIRST EEPROM LOCATION NOT USED, SEE ATMEL ERRATA SHEETS

.DSEG
.ORG 0xE0
; 1
; 2 //RB-101 机器人蜂鸣器测试程序
; 3 //2005年6月25日 彭斌
; 4
; 5 #include <mega8515.h> //头文件
; 6 #include <delay.h> //延时头程序调用,该文件已经存在于CodeVisionAVR里 ,安装后就有。
; 7 #include <stdio.h> //一些常用函数的头文件调用
; 8
; 9 //自定义蜂鸣器蜂鸣函数 (自定义函数必须放在入口函数前面,否则编译时会出错,这个可能是该软件识别造成的,不是一种程序设计规范)
; 10 void buzzer(void)
; 11 {

.CSEG
_buzzer:
; 12 //定义一个变量
; 13 unsigned char i=0xff;
; 14 //循环
; 15 for(;i--;)
ST -Y,R16
; i -> R16
LDI R16,255
_0x10:
MOV R30,R16
SUBI R16,1
CPI R30,0
BREQ _0x11
; 16 {
; 17 //蜂鸣器占用PORTB.3引脚
; 18 PORTB.3=!PORTB.3; //取反
CLT
SBIS 0x18,3
SET
IN R30,0x18
BLD R30,3
OUT 0x18,R30
; 19 delay_us(500); //延时500微秒,改名该延时值将改变蜂鸣器的音调高低
__DELAY_USW 512
; 20 }
RJMP _0x10
_0x11:
; 21 }
LD R16,Y+
RET
; 22
; 23 //主函数入口
; 24 void main(void)
; 25 {
_main:
; 26 //DDRxn 定义引脚方向,“1” 为输出,“0”为输入。
; 27
; 28 DDRB.3 = 1; //蜂鸣器引脚方向设置
SBI 0x17,3
; 29
; 30 //执行一个死循环,使数码管连续的全亮
; 31 while(1)
_0x13:
; 32 {
; 33 buzzer(); //调用自定义蜂鸣函数
RCALL SUBOPT_0x0
; 34 delay_ms(1000); //延时1000毫秒,也就是1S ,调节该延时长短可以使蜂鸣节奏变化
; 35 buzzer(); //调用自定义蜂鸣函数
RCALL SUBOPT_0x0
; 36 delay_ms(1000); //延时1000毫秒,也就是1S
; 37 }
RJMP _0x13
; 38
; 39 }
_0x16:
NOP
RJMP _0x16
; 40
; 41
_getchar:
sbis usr,rxc
rjmp _getchar
in r30,udr
RET
_putchar:
sbis usr,udre
rjmp _putchar
ld r30,y
out udr,r30
ADIW R28,1
RET

;OPTIMIZER ADDED SUBROUTINE, CALLED 2 TIMES
SUBOPT_0x0:
RCALL _buzzer
LDI R30,LOW(1000)
LDI R31,HIGH(1000)
ST -Y,R31
ST -Y,R30
RJMP _delay_ms

_delay_ms:
ld r30,y+
ld r31,y+
adiw r30,0
breq __delay_ms1
__delay_ms0:
__DELAY_USW 0x400
wdr
sbiw r30,1
brne __delay_ms0
__delay_ms1:
ret
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: