0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

使用单片机设计打铃器的程序

Wildesbeast 来源:单片机教程网 作者:单片机教程网 2020-06-21 11:05 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

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

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

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

.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

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • led
    led
    +关注

    关注

    243

    文章

    24434

    浏览量

    687359
  • 单片机
    +关注

    关注

    6074

    文章

    45340

    浏览量

    663416
  • 寄存器
    +关注

    关注

    31

    文章

    5588

    浏览量

    129049
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    单片机程序的执行

    更快的SRAM中,以得到更快的执行速度。而对于,单片机而言工作频率也就几M,几十M,从Flash中与从RAM中读的差异可能并不明显,不会成为程序执行的瓶颈。 而对于PC而言,Flash的速度太慢
    发表于 12-04 06:20

    单片机烧录原理是怎样的?辉芒微单片机烧录程序详细步骤讲解

    烧录(Programming)就是把 .hex/.bin 文件里的机器码搬运进单片机片内 Flash 的过程。辉芒微(FMD)单片机内部有一块 自举 BootROM,上电时会先跑这段程序;如果检测
    的头像 发表于 09-17 16:14 1382次阅读
    <b class='flag-5'>单片机</b>烧录原理是怎样的?辉芒微<b class='flag-5'>单片机</b>烧录<b class='flag-5'>程序</b>详细步骤讲解

    单片机原理及应用详解

    单片机(Microcontroller Unit, MCC)  是一种集成计算机核心功能(CPU、存储、I/O接口等)的微型芯片,广泛应用于嵌入式系统中。以下是其原理及应用的详细介绍: 一、单片机
    的头像 发表于 08-11 13:57 1533次阅读

    单片机的储存优点是什么

    场景。深圳市安凯星科技有限公司在单片机应用开发中,充分利用这些储存优点,为拓邦、朗科、安徽龙多等客户打造了高效稳定的解决方案。 1.集成度高,节省硬件空间 单片机程序存储(ROM)
    的头像 发表于 07-31 10:09 484次阅读

    怎么测单片机系统频率

    单片机系统频率是指单片机工作时的时钟频率,它直接影响单片机的运行速度和处理能力,准确测量系统频率对单片机应用开发、程序调试和性能优化具有重要
    的头像 发表于 07-25 11:39 473次阅读

    单片机是怎么控制的

    单片机作为电子系统的控制核心,通过接收外部信号、执行预设程序、驱动外部设备的方式实现控制功能,其控制过程涉及信号输入、数据处理和指令输出三个关键环节,每个环节的协同配合决定了整体控制效果。 信号输入
    的头像 发表于 07-23 13:59 478次阅读

    单片机怎么烧程序

    骤,才能让单片机发挥作用。 烧程序前的准备工作 单片机程序前,需要做好硬件和软件两方面的准备。硬件方面,核心设备包括目标单片机、编程
    的头像 发表于 07-23 11:47 649次阅读

    STC单片机范例程序

    电子发烧友网站提供《STC单片机范例程序.zip》资料免费下载
    发表于 06-04 16:27 8次下载

    2.4寸TFT彩屏配套测试程序-51单片机

    如题,2.4寸TFT彩屏配套测试程序-51单片机
    发表于 06-04 16:26 0次下载

    单片机和伺服有什么区别

    : 1. 定义与功能 特性 单片机(Microcontroller) 伺服系统(Servo System) 定义 一种集成CPU、内存、I/O接口的微型计算机芯片,用于控制设备。 一种由伺服电机、编码
    的头像 发表于 05-26 09:18 576次阅读

    51+单片机TCP-IP+协议栈ZLIP源码

    概述 单片机上网技术,是当前的一个热门技术。单片机上网技术中的一个重要部分是在单片上实现 TCP/IP 协议栈。现在可获得的 TCP/IP 源代码一般并不为 51 单片机设计,而 51
    发表于 04-22 15:11

    STM32单片机无人机设

    小型无人机设
    发表于 03-10 17:50 25次下载

    一个基于Cortex的单片机专为USB耳机设备设计的USBCodec芯片

    USBCodec芯片 - CJC6811A是一款基于Cortex的单片机,专为USB耳机设备而设计。它集成了一个32位的RISC CPU和16KB的SRAM、USB、UART、IIC、音频编解码、GPIO、定时
    的头像 发表于 01-15 09:41 989次阅读
    一个基于Cortex的<b class='flag-5'>单片机</b>专为USB耳<b class='flag-5'>机设</b>备设计的USBCodec芯片

    用ADS1256结合飞思卡尔的单片机设计一个数据采集系统,为什么采用SPI通信时得到的总是一个固定的数?

    我准备用ADS1256结合飞思卡尔的单片机设计一个数据采集系统,但是不知道为什么采用SPI通信时,得到的总是一个固定的数。
    发表于 01-02 06:02

    单片机Debug与仿真区别

    是指在软件或硬件开发过程中,通过特定的工具和技术来查找、诊断和修复错误的过程。在单片机开发中,Debug通常涉及到以下几个方面: 硬件调试 :检查单片机的硬件连接是否正确,包括电源、时钟、I/O接口等。 软件调试 :使用调试
    的头像 发表于 12-19 09:47 1400次阅读