c语言打铃器单片机程序,使用单片机设计打铃器的程序

硬件结构: PA0-5对应6个LED数显管的位 ,PC0-7对应各LED数显管的段 ,PB4-7为键盘。

软件描述: 上电后,时钟从00.00.00(时/分/秒)自动走时,在走时状态时 , 按PB4(设定;键)超过3秒可循环选择调整时间/工作参数 ,接着按PB5以确定选择的操作 ,进入调整操作后 ,;按PB5选择欲调整参数,按PB6(增加键)完成调整参数操作 。按PB7,进入时控运行,PB1亮,;再按PB7停止时控运行,回显走时。在定时到时,PB0点亮。

9ec2a635194462f849e8767a9f14db08.png

;*************************************************************************************

.device AT90S8515

.include “8515def.inc”

.equ DISBUF = $0060 ;显示缓冲区起始地址

.equ TIMEDIS = $0066 ;时钟时分秒存放单元

.equ XSDBZ = $0073 ;小数点位标志

.equ DISTBL = $0f00 ;显示字符编码表起始地址

.equ TIMECTR = $0010 ;32段时间控制表首址(EEPRON)

.equ TIMECBZ = $0080 ;控制时间到标志

.cseg

.org $0000

rjmp RESET

.org $0007

rjmp TIM0_OVF

;****单片机打铃器设计主程序***************************************************************************

.def cntms =r9

.def hour =r10

.def minute =r11

.def second =r12

.def EEdwr =r16

.def EEawr =r17

.def EEawrh =r18

.def EEdrd =r16

.def EEard =r17

.def EEardh =r18

.def temp =r20

.def temp1 =r21

.def temp2 =r22

.def temp3 =r23

.def temp4 =r24

.def TIM0INT =r19

.org $0020

RESET: ldi temp,low(ramend) ;设置堆栈指针

out spl,temp

ldi temp,high(ramend)

out sph,temp

ldi temp,0b11111111 ;设置各口线输入输出状态

out ddra,temp

ldi temp,0b00000011

out ddrb,temp

ldi temp,0b11111111

out ddrc,temp

ldi zl,TIMECBZ

clr zh

clr temp

st y,temp

clr r9 ;清各工作寄存器

clr r10

clr r11

clr r12

clr r13

clr r14

clr r15

clr r16

clr r17

clr r18

clr r19

clr r25

ldi temp,$5

out tccr0,temp ;T0设置ck/1024分频

ldi temp,256-195

out tcnt0,temp ;装T0时间常数

res1: ldi temp,$02 ;允许T0中断,并计时

out timsk,temp

sei ;开中断

res2: clr r6

clr r7

sbi PORTb,1

sbi PORTB,0

res3: ldi temp,$af

res4: rcall colodis ;时钟走时显示

dec temp

brne res4

sbis pinb,7 ;键扫描

rjmp PB7M

sbis pinb,4

rjmp BP4M ;去参数设置

rjmp res3

;****《系统功能程序》

.org $0080 ;定义系统功能程序存放区首址

;****32点打铃器工作程序*************************************************************************

PB7M: cbi PORTb,1 ;置运行指示灯亮

clr r25

clr r7

GNCX11:ldi r17,TIMECTR ;首个控制点EEPRON地址

clr r18

lsl r25

lsl r25

add r17,r25 ;取得EEPRON中控制点地址(Aj=A0+4*j),A=(r17),j=(r25)

lsr r25

lsr r25

rcall EERead

cpi r16,0

breq GNCX12 ;r16=(r17)=0为“ON”

inc r25

cpi r25,31

brmi GNCX11

rjmp GNCX16

GNCX12:inc r17

rcall EERead

cp r16,r10

brne GNCX13

inc r17

rcall EERead

cp r16,r11

brne GNCX14

inc r17

rcall EERead

mov r7,r16

inc r7

cbi PORTb,0

rjmp GNCX15

GNCX13:dec r17

inc r25

rjmp GNCX11

GNCX14:dec r17

dec r17

inc r25

rjmp GNCX11

GNCX15:cpi TIM0INT,1

brne GNCX17

clr TIM0INT

dec r7

brne GNCX17

clr r7

sbi PORTb,0

rjmp GNCX16

GNCX17:rcall colodis

sbic pinb,7

rjmp GNCX15

rjmp res2

GNCX16:ldi temp,$5f

GNCX18:rcall colodis

dec temp

brne GNCX18

sbic pinb,7

rjmp GNCX11

rjmp res2

;****单片机打铃器参数设置

BP4M: ldi temp3,$ff

ldi temp4,$f

BP4M1: nop

rcall colodis

sbic pinb,4

rjmp res1

dec temp3 ;PB4有按下

brne BP4M1

inc temp3

dec temp4

brne BP4M1

ldi temp3,$ff ;超3秒进入

ldi temp4,$f

BP4M2: clr yh

ldi yl,low(DISBUF) ;设置显示cloc.

ldi temp,25

st y+,temp

st y+,temp

ldi temp,18

st y+,temp

ldi temp,19

st y+,temp

ldi temp,20

st y+,temp

ldi temp,18

st y,temp

ldi zl,low(XSDBZ)

clr zh

ldi temp,0b00100000 ;b0-5对应LED自左到右1-6位的小数点,置“1”在该位置小数点。

st z,temp

rcall display

sbis pinb,5

rjmp cloc ;进入时间设置

dec temp3

brne BP4M2

inc temp3

dec temp4

brne BP4M2

BP4M3: ldi temp3,$ff

ldi temp4,$f

BP4M4: clr yh

ldi yl,low(DISBUF) ;设置显示labor.

ldi temp,25

st y+,temp

ldi temp,19

st y+,temp

ldi temp,10

st y+,temp

ldi temp,11

st y+,temp

ldi temp,20

st y+,temp

ldi temp,22

st y,temp

ldi zl,low(XSDBZ)

clr zh

ldi temp,0b00100000 ;b0-5对应LED自左到右1-6位的小数点,置“1”在该位置小数点。

st z,temp

rcall display

sbis pinb,5

rjmp GNCS1 ;进入工作参数设置

dec temp3

brne BP4M4

inc temp3

dec temp4

brne BP4M4

sbic pinb,4

rjmp BP4M

rjmp res1

;****时钟调整******************************************************************

cloc: clr temp

out timsk,temp ;不许T0中断

cli ;关中断

rcall colodis

mov temp,r10

clr temp4

ldi temp1,20

ldi temp3,$80

cloc3: ldi yl,low(DISBUF)

add yl,temp4

sbic pinb,5 ;选择时分秒

rjmp cloc4

dec temp1

brne cloc4

ldi temp1,80

inc temp4

inc temp4

add yl,temp4

cpi yl,$68

brmi cloc4

clr temp4

ldi yl,low(DISBUF)

cloc4: nop

sbic pinb,6 ;调整时分秒值

rjmp cloc8

dec temp3

brne cloc8

ldi temp3,$20

cloc5: cpi yl,$60

brne cloc6

inc r10

mov temp,r10

cpi temp,24

brmi cloc8

clr temp

clr r10

cloc6: cpi yl,$62

brne cloc7

inc r11

mov temp,r11

cpi temp,60

brmi cloc8

clr temp

clr r11

cloc7: cpi yl,$64

brne cloc8

inc r12

mov temp,r12

cpi temp,60

brmi cloc8

clr temp

clr r12

cloc8: cpi yl,$60

brne cloc9

ldi zl,low(XSDBZ)

clr zh

ldi temp,0b00000010 ;b0-5对应LED自左到右1-6位的小数点,置“1”在该位置小数点。

st z,temp

mov r16,r10

rjmp cloc11

cloc9: cpi yl,$62

brne cloc10

ldi zl,low(XSDBZ)

clr zh

ldi temp,0b00001000 ;b0-5对应LED自左到右1-6位的小数点,置“1”在该位置小数点。

st z,temp

mov r16,r11

cloc10: cpi yl,$64

brne cloc11

ldi zl,low(XSDBZ)

clr zh

ldi temp,0b00100000 ;b0-5对应LED自左到右1-6位的小数点,置“1”在该位置小数点。

st z,temp

mov r16,r12

cloc11: rcall bto

st y+,r3

st y,r4

rcall display

sbis pinb,4 ;退出

rjmp cloc12

rjmp cloc3

cloc12: ldi temp,$02

out timsk,temp ;允许T0中断

sei ;开中断

rjmp res1

;****32点打铃器工作参数调整**********************************************************

GNCS1: clr r25 ;首个控制点

clr r22 ;r22为0显示开关页面,为1显示h-xx页面,为2显示m-xx页面,为3显示c-xx页面

ldi zl,low(XSDBZ)

clr zh

ldi r19,0b00000010

st z,r19

gncs: ldi r17,TIMECTR ;首个控制点EEPRON地址

clr r18

ldi yl,low(DISBUF) ;设置显示缓冲区起始地址

clr yh

lsl r25

lsl r25

add r17,r25 ;取得EEPRON中控制点地址(Aj=A0+4*j),A=(r17),j=(r25)

lsr r25

lsr r25

mov r16,r25

rcall bto

st y+,r3

st y+,r4

cpi r22,0

breq kgymxs

cpi r22,1

breq hymxs

cpi r22,2

breq mymxs

cpi r22,3

breq cymxs

clr r22

rjmp gncs

kgymxs: rcall EERead

cpi r16,0

brne offxs

ldi r23,27 ;显示xx.--on

st y+,r23

st y+,r23

ldi r23,20

st y+,r23

ldi r23,26

st y,r23

rjmp gzcsxs

offxs: ldi r23,27 ;显示xx.-off

st y+,r23

ldi r23,20

st y+,r23

ldi r23,15

st y+,r23

st y,r23

rjmp gzcsxs

hymxs: ldi r23,28 ;显示xx.h-aa

st y+,r23

ldi r23,27

st y+,r23

inc r17

rcall EERead

rcall bto

st y+,r3

st y+,r4

dec r17

rjmp gzcsxs

mymxs: ldi r23,26 ;显示xx.n-aa

st y+,r23

ldi r23,27

st y+,r23

inc r17

inc r17

rcall EERead

rcall bto

st y+,r3

st y+,r4

dec r17

dec r17

rjmp gzcsxs

cymxs: ldi r23,18 ;显示xx.c-aa

st y+,r23

ldi r23,27

st y+,r23

inc r17

inc r17

inc r17

rcall EERead

rcall bto

st y+,r3

st y+,r4

dec r17

dec r17

dec r17

gzcsxs: ldi r23,40

ldi r24,40

gzcsxs1: rcall display

sbis pinb,5 ;翻页

rjmp fycz ;有,去翻页

sbis pinb,6 ;变值

rjmp bzcz ;有,去变值

sbis pinb,4 ;复位

rjmp res1 ;有,去复位

rjmp gncs

fycz: dec r23

brne gzcsxs1

rcall EERead

cpi r16,0

brne fycz1

inc r22

cpi r22,4

brmi fycz2

clr r22

fycz1: inc r25

cpi r25,32

brmi fycz2

clr r25

fycz2: rjmp gncs

bzcz: dec r24

brne gzcsxs1

cpi r22,0

brne bzcz2

bzcz1: rcall EERead

cpi r16,0

breq bzcz11

clr r16

rjmp bzcz12

bzcz11: ldi r16,1

bzcz12: rcall EEWrite

rjmp gncs

bzcz2: add r17,r22

rcall EERead

inc r16

cpi r22,1

breq bzcz21

cpi r16,60

brmi bzcz22

clr r16

rjmp bzcz22

bzcz21: cpi r16,24

brmi bzcz22

clr r16

bzcz22: rcall EEWrite

sub r17,r22

rjmp gncs

;****显示子程序***********************************************************************

;*

;* 功能:将SRAM显示缓冲区存放的数送数码管显示

;* 入口:DISBUF---显示缓冲区起始地址(SRAM)

;* Y--显示缓冲区的指针

;* DISTBL---显示字符编码表起始地址(FLASH)

;* LEDSXW---LED闪显寄存器位设置

;* XSDBZ----小数点设置

;* 出口:Y--显示缓冲区的指针,指向高地址

;*

;****程序段

display: nop

push temp

push temp1

push temp2

push temp3

push temp4

push r6

ldi temp1,6

ldi temp3,0b11011111

ldi yl,low(DISBUF)

ldi yh,high(DISBUF)

ldi xl,low(XSDBZ)

clr xh

ld r6,x

disp1: ld temp,y+

ldi zl,low(DISTBL)

ldi zh,high(DISTBL)

add zl,temp

lsl zl

rol zh

lpm

lsr r6

brcc disp2

ldi temp4,0b10000000

or r0,temp4

disp2: out PORTC,r0

in temp2,PORTA

ori temp2,0b00111111

and temp2,temp3

out PORTA,temp2

sec

ror temp3

rcall delay

in temp2,PORTA

ori temp2,0b00111111

out PORTA,temp2 ;关显示

dec temp1

brne disp1

pop r6

pop temp4

pop temp3

pop temp2

pop temp1

pop temp

ret

;****时钟显示子程序*********************************************************************

colodis: push temp

ldi yl,low(DISBUF) ;设置显示缓冲区起始地址

clr yh

ldi xl,low(TIMEDIS) ;设置时钟时分秒存放单元

clr xh

ldi zl,low(XSDBZ)

clr zh

ldi temp,0b00001010 ;b0-5对应LED自左到右1-6位的小数点,置“1”在该位置小数点。

st z,temp

rcall ram6ram

rcall display

pop temp

ret

;****延时子程序**********************************************************************

delay: nop ;延时子程序

push temp2

push temp1

ldi temp2,$ff

lp1: ldi temp1,$f

lp2: dec temp1

brne lp2

dec temp2

brne lp1

pop temp1

pop temp2

ret ;子程序返回

;****写EEPRON子程序*********************************************************************

;*

;*功能:将EEDWR(r16)内容写入以EEAWR(r18:r17)内容为地址的EEPRON单元内。

;*

;****程序段

EEWrite:sbic EECR,EEWE

rjmp EEWrite

out EEARH,EEawrh

out EEARL,EEawr

out EEDR,EEdwr

sbi EECR,EEMWE

sbi EECR,EEWE

ret

;****读EEPRON子程序*********************************************************************

;*

;*功能:从以EEARD(r18:r17)内容为地址的EEPRON单元读区内容送EEDRD(r16)寄存器。

;*

;****程序段

EERead: sbic EECR,EEWE

rjmp EERead

out EEARH,EEardh

out EEARL,EEard

sbi EECR,EERE

sbi EECR,EERE

in EEdrd,EEDR

ret

;****6字节SRAM内容传送子程序************************************************************

;*

;* 功能:将SRAM内连续6字节由BLOCK1传送到BLOCK2

;* x---欲传送6字节起始地址(SRAM)指针

;* y---欲放置6字节起始地址(SRAM)指针

;*

;****程序段

ram6ram:push temp1

push temp2

ldi temp1,$06

ramd1: ld temp2,x+

st y+,temp2

dec temp1

brne ramd1

pop temp2

pop temp1

ret

;****8位二进制数转3位BCD数子程序********************************************************

;*

;*功能:把一个8位无符号二进制数转换为3位BCD码数。

;*入口:r16---内装8位无符号二进制数。

;*出口:BCD码放在r2:r3:r4,r2存放百位。

;*

;****程序段

bt push r16

clr r2

clr r3

clr r4

rjmp bto2

bto1: inc r2

bto2: subi r16,100

brpl bto1

ldi temp,100

add r16,temp

rjmp bto4

bto3: inc r3

bto4: subi r16,10

brpl bto3

ldi temp,10

add r16,temp

mov r4,r16

pop r16

ret

;****时钟0中断服务程序******************************************************

.org $0bf0

TIM0_OVF: push temp

ldi temp,256-195

out tcnt0,temp ;重装T0时间常数

inc cntms

mov temp,cntms

cpi temp,40

brne timecunt

clr cntms

inc second

mov temp,second

cpi temp,60

brne timecunt

clr second

ldi TIM0INT,1

inc minute

mov temp,minute

cpi temp,60

brne timecunt

clr minute

inc hour

mov temp,hour

cpi temp,24

brne timecunt

clr hour

timecunt: ldi xl, low(TIMEDIS)

clr xh

mov r16,hour

rcall bto

st x+,r3

st x+,r4

mov r16,minute

rcall bto

st x+,r3

st x+,r4

mov r16,second

rcall bto

st x+,r3

st x+,r4

pop temp

reti

;****字形表*****************************************************************

.cseg

.org DISTBL

.dw 0x003f,0x0006,0x005b,0x004f,0x0066,0x006d,0x007d,0x0007,0x007f,0x006f

.dw 0x0077,0x007c,0x0039,0x005e,0x0079,0x0071,0x0073,0x0076,0x0058,0x0038

.dw 0x005c,0x0067,0x0050,0x006e,0x0078,0x0000,0x0054,0x0040,0x0074,0x0000

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值