历史上的今天
返回首页

历史上的今天

今天是:2025年02月19日(星期三)

正在发生

2020年02月19日 | AVR单片机可运行的实时时钟源程序

2020-02-19 来源:eefocus

简介:AVR单片机可运行的实时时钟源程序


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


;AVR单片机实时时钟汇编程序实例


;功 能:24小时制实时时钟,带1/100秒


;介 绍:程序在实验板上能够正常运行,是一个带1/100秒的24小时制实时时钟。

;单片机:ATMEGA16


;晶 振:4MHz


;语 言:汇编程序


;来 源:晖创电子网www.schuitron.com收集整理

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

.include "m16def.inc" ;引用器件I/O配置文件


;定义程序中使用的变量名(在寄存器空间)

.def count = r18 ;循环计数单元

.def position = r19 ;LED显示位指针,取值为0-7

.def p_temp = r20 ;LED显示位选,其值取反由PC口输出

.def count_10ms = r21 ;10ms计数单元

.def flag_2ms = r22 ;2ms到标志

.def temp = r23 ;临时变量

.def temp1 = r24 ;临时变量

.def temp_int = r25 ;临时变量(中断中使用)


;中断向量区定义,flash空间$0000-$0045

.org $000

rjmp reset ;复位处理

nop

reti ;INT0 Handler

nop

reti ;INT1 Handler

nop

reti ;Timer2 Compare Handler

nop

reti ;Timer2 Overflow Handler

nop

reti ;Timer1 Capture Handler

nop

reti ;Timer1 CompareA Handler

nop

reti ;Timer1 CompareB Handler

nop

rjmp time1_ovf ;Timer1 Overflow Handler

nop

reti ;Timer0 Overflow Handler

nop

reti ;SPI Transfer Complete Handler

nop

reti ;USART RX Complete Handler

nop

reti ;USART UDR Empty Handler

nop

reti ;USART TX Complete Handler

nop

reti ;ADC Conversion Complete Handler

nop

reti ;E2PROM Ready Handler

nop

reti ;Analog Comparator Handler

nop

reti ;Two-wire Serial Interface Handler

nop

reti ;INT2 Handler

nop

reti ;Timer0 Comp Handler

nop

reti ;SPM Ready Handler

nop


;程序开始

.org $02A

reset:

ldi r16,high(RAMEND) ;设置堆栈指针高位

out sph,r16

ldi r16,low(RAMEND) ;设置堆栈指针低位

out spl,r16


ser temp

out ddra,temp ;设置PORTA为输出,段码输出

out ddrc,temp ;设置PORTC为输出,位码控制

out portc,temp ;PORTC输出$FF, 无显示


ldi position,0x00 ;段位初始化为1/100秒低位

ldi p_temp,0x01 ;LED第1位亮


;初始化时钟时间为11:59:55:00

ldi xl,low(time_buff) ;

ldi xh,high(time_buff) ;X寄存器取得时钟单元首指针

ldi temp,0x00

st x+,temp ;1/100秒 = 00

ldi temp,55

st x+,temp ;秒 = 55

ldi temp,59

st x+,temp ;分 = 59

ldi temp,11

st x,temp ;时 = 11


ldi temp,0xff ;T1初始化,每隔2ms中断一次

out tcnt1h,temp

ldi temp,0x83

out tcnt1l,temp

clr temp

out tCCr1a,temp

ldi temp,0x03 ;16M,64分频 2ms

out tccr1b,temp

ldi temp,0x04

out timsk,temp ;允许T1溢出中断

sei ;全局中断允许


;主程序

main:

cpi flag_2ms,0x01 ;判2ms到否

brne main ;No,转main循环

clr flag_2ms ;到,请2ms标志

rcall display ;调用LED显示时间(动态扫描显示一位)

d_10ms_ok:

cpi count_10ms,0x05 ;判10ms到否

brne main ;No,转main循环

clr count_10ms ;10ms到,清零10ms计数器

rcall time_add ;调用时间加10ms调整

rcall put_t2d ;将新时间值放入显示缓冲单元

rjmp main ;转main循环


;LED动态扫描显示子程序,2ms执行一次,一次点亮一位,8位循环

display:

clr r0

ser temp ;temp = 0x11111111

out portc,temp ;关显示,去消影和拖尾作用

ldi yl,low(display_buff)

ldi yh,high(display_buff) ;Y寄存器取得显示缓冲单元首指针

add yl,position ;加上要显示的位值

adc yh,r0 ;加上低位进位

ld temp,y ;temp中为要显示的数字

clr r0

ldi zl,low(led_7 * 2)

ldi zh,high(led_7 * 2) ;Z寄存器取得7段码组的首指针

add zl,temp ;加上要显示的数字

adc zh,r0 ;加上低位进位

lpm ;读对应七段码到R0中

out porta,r0 ;LED段码输出




mov r0,p_temp

com r0,

out portc,r0 ;输出位控制字,完成LED一位的显示


inc position ;调整到下一次显示位

lsl p_temp

cpi position,0x08

brne display_ret

ldi position,0x00

ldi p_temp,0x01

display_ret:

ret


;时钟时间调整,加0.01秒

time_add:

ldi xl,low(time_buff) ;

ldi xh,high(time_buff) ;X寄存器为时钟单元首指针

rcall dhm3 ;ms单元加1调整

cpi temp,100 ;

brne time_add_ret ;未到100ms返回

rcall dhm ;秒单元加1调整

cpi temp,60

brne time_add_ret ;未到60秒返回

rcall dhm ;分单元加1调整

cpi temp,60

brne time_add_ret ;未到60分返回

rcall dhm ;时单元加1调整

cpi temp,24

brne time_add_ret ;未到24时返回

clr temp

st x,temp ;到24时,时单元清另

time_add_ret:

ret


;低段时间清零,高段时间加1

dhm: clr temp ;当前时段清零

dhm1: st x+,temp ;当前时段清零,X寄存器指针加一

dhm3: ld temp,x ;取出新时段数据

inc temp ;加一

dhm2: st x,temp ;并将调整结果送回

ret


;将时钟单元数据送LED显示缓冲单元中

put_t2d:

ldi xl,low(time_buff) ;

ldi xh,high(time_buff) ;X寄存器时钟单元首指针

ldi yl,low(display_buff)

ldi yh,high(display_buff) ;Y寄存器显示缓冲单元首指针

ldi count,4 ;循环次数 = 4

loop:

clr temp1

ld temp,x+ ;读一个时间单元

loop1:

cpi temp,10

brlo loop2 ;<10转

inc temp1

subi temp,10

rjmp loop1

loop2:

st y+,temp ;写入2个显示单元

st y+,temp1 ;低位BCD码在前,高位在后

dec count

brne loop ;4个时间单元->8个显示单元

ret


;T1时钟溢出中断服务

time1_ovf:

in temp_int,sreg

push temp_int ;保护状态寄存器


ldi temp_int,0xff ;T1初始值设定,2ms中断一次

out tcnt1h,temp_int

ldi temp_int,0x83

out tcnt1l,temp_int


inc count_10ms ;10ms计数器加一

ldi flag_2ms,0x01 ;置2ms标志到


pop temp_int

out sreg, temp_int ;恢复状态寄存器

reti ;中断返回


.CSEG ;LED七段码表,定义在Flash程序空间

led_7: ;7段码表

.db 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07

.db 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71


;字 PA7 PA6 PA5 PA4 PA3 PA2 PA1 PA0 共阴极 共阳极

; h g f E d c b a

;0 0 0 1 1 1 1 1 1 3FH C0H

;1 0 0 0 0 0 1 1 0 06H F9H

;2 0 1 0 1 1 0 1 1 5BH A4H

;3 0 1 0 0 1 1 1 1 4FH B0H

;4 0 1 1 0 0 1 1 0 66H 99H

;5 0 1 1 0 1 1 0 1 6DH 92H

;6 0 1 1 1 1 1 0 1 7DH 82H

;7 0 0 0 0 0 1 1 1 07H F8H

;8 0 1 1 1 1 1 1 1 7FH 80H

;9 0 1 1 0 1 1 1 1 6FH 90H

;A 0 1 1 1 0 1 1 1 77H 88H

;b 0 1 1 1 1 1 0 0 7CH 83H

;C 0 0 1 1 1 0 0 1 39H C6H

;d 0 1 0 1 1 1 1 0 5EH A1H

;E 0 1 1 1 1 0 0 1 79H 86H

;F 0 1 1 1 0 0 0 1 71H 8EH


.DSEG ;定义程序中使用的变量位置(在RAM空间)

.ORG $0100

display_buff: ;LED显示缓冲区,8个字节

.BYTE 0x00 ;LED 1 位显示内容

.BYTE 0x00 ;LED 2 位显示内容

.BYTE 0x00 ;LED 3 位显示内容

.BYTE 0x00 ;LED 4 位显示内容

.BYTE 0x00 ;LED 5 位显示内容

.BYTE 0x00 ;LED 6 位显示内容

.BYTE 0x00 ;LED 7 位显示内容

.BYTE 0x00 ;LED 8 位显示内容


.org $0108

time_buff: ;时钟数据缓冲区,4个字节

.BYTE 0x00 ;1/100s单元

.BYTE 0x00 ;秒单元

.BYTE 0x00 ;分单元

.BYTE 0x00 ;时单元


推荐阅读

史海拾趣

HCC Industries公司的发展小趣事

2015年,HCC Industries迎来了其发展历程中的一个重要转折点。在这一年,公司成功收购了另一家具有强大研发实力和市场份额的微电子企业。此次并购不仅使HCC在技术上得到了进一步的补充和提升,还大大增强了其生产能力和市场覆盖范围。通过整合双方资源,HCC在短时间内实现了规模的快速扩张和效益的显著提升,进一步巩固了其在行业内的领先地位。

Cree(科瑞)公司的发展小趣事

2015年初,Cree曾计划将其射频产品线独立出来,并以近3.5亿美金卖给英飞凌。然而,由于某些限制原因,收购计划最终终止。面对这一变故,Cree不得不重新建立射频微波器件团队,并创立了新的品牌wolfspeed。这一举措不仅彰显了Cree的应变能力和创新精神,也为其在射频领域的发展注入了新的活力。

HALO Electronics公司的发展小趣事

如今的Cree已经成为宽带隙半导体的创新者,专注于碳化硅和氮化镓材料、功率和射频应用的设备以及特种照明级LED产品的研发和生产。其产品在运输、电源、逆变器和无线系统等领域有着广泛的应用。同时,Cree的LED产品也专门用于室内和室外照明、电子标牌和信号以及视频显示器等。作为市场上领先的照明革新者与半导体制造商,Cree通过显著提高固态照明、电力及通讯产品的能源效果来提升其价值,展现了其在电子行业中的卓越地位和创新实力。

Edsun Laboratories Inc公司的发展小趣事

在竞争激烈的电子行业中,品质是企业生存和发展的关键。ECM Electronics Limited.深知这一点,始终将产品质量放在首位。公司建立了严格的质量管理体系,从原材料采购到产品生产、检测、包装等各个环节都严格把关,确保每一件产品都符合高标准的质量要求。正是凭借过硬的产品品质,ECM赢得了客户的信赖和市场的认可。

Everspin公司的发展小趣事

Everspin公司成立于XXXX年,总部和晶圆厂均位于美国亚利桑那州的钱德勒市。自成立以来,Everspin一直致力于磁阻随机存取存储器(MRAM)技术的研发和商业化。2006年,Everspin成功推出了业界第一款商业化MRAM产品,这一突破性的技术为数据存储领域带来了革命性的变化。

BCD Semi(Diodes)公司的发展小趣事

BCD Semi(Diodes)公司自成立以来,一直致力于模拟半导体产品的设计和制造。在某一时期,公司研发团队成功突破了某项关键技术,开发出了具有更高性能、更低功耗的新型模拟器件。这一技术突破使得BCD Semi的产品在市场上更具竞争力,赢得了众多客户的青睐。随着产品升级的不断推进,公司逐渐在模拟半导体领域树立了良好的口碑。

问答坊 | AI 解惑

USB芯片HOST电路及PCB设计的注意事项

USB芯片HOST电路及PCB设计的注意事项…

查看全部问答>

51单片机的引脚

引脚功能: MCS-51是标准的40引脚双列直插式集成电路芯片,引脚分布请参照----单片机引脚图: l P0.0~P0.7 P0口8位双向口线(在引脚的39~32号端子)。 l P1.0~P1.7 P1口8位双向口线(在引脚的1~8号端子)。 l P2.0~P2.7 P2口8位双向口线( ...…

查看全部问答>

数字存储示波器的研究与设计

简单的介绍了下数字存储示波器的原理方便的基础知识…

查看全部问答>

PSpice_-_Model_Editor_系列介紹_(II).

PSpice_-_Model_Editor_系列介紹_(II).…

查看全部问答>

不知道自己是不是要变成老油条

最近不知道怎么了,刚入社时,平均50多见/班次,个每天一个班下来,心情还是比较愉快!上班两年多来,故障率飞流直下三千尺,降到最多20件/班次,可是总是觉得很累!…

查看全部问答>

Sql Mobil打开错误

我在pc上创建了一个sql mobile的数据库,data.sdf,我用activesync把它拷进pda里面,但是打开的时候却出现错误; Error: 0x80004005 E_FAIL Native Error:  (25033) Description: Unspecified error Interface defining error: IID_I ...…

查看全部问答>

9263WINCE5.0下SD卡驱动的问题

9263板跑WINCE5,使用SD卡时,时常从串口输出: WaitForSingleObject == WAIT_TIMEOUT (1000) StatusMask = 0x20 status 0xc0c5 这串数据重复输出,并且SD卡读写速度变得非常之慢。 查程序发现是PLATFOM\\COMMON\\SRC\\ARM\\ATMEL\\AT91SAM926 ...…

查看全部问答>

09嵌入式系统设计师考试上午试题第7题求解答

对计算机磁盘工作影响最大的因素是      (7)A.温度            B.湿度            C.噪声& ...…

查看全部问答>