⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 简易24小时制时钟.txt

📁 用AVR编写的24小时时钟程序
💻 TXT
📖 第 1 页 / 共 2 页
字号:
该AVR的汇编程序选自《M128》,程序中体现了AVR汇编的基本特点,仅供大家参考。 



   该应用系统为一个带1/100秒的简易24小时制时钟,它在上电后能够自动从11时59分55秒00开始计时和显示时间。下图为简易时钟系统硬件电路图。 
 
                           图  简易24小时时钟硬件原理图 

   系统使用8个LED数码管显示时、分、秒、1/100秒4个时段的数字,每个时段占用2个LED。显示方式采用动态扫描方式,ATmega128的PA口输出显示数字的7段码(注意:图中省缺了PA口连接到LED各段的8个限流电阻,阻值800欧左右),PC口用于控制8个LED的位选。ATmega128使用外部16MHz晶振(图中未画出)。 
  系统还使用ATmega128片内的计数/定时器T1,设计T1工作在定时溢出中断方式,定时间隔为2ms,即T1每2ms产生一次中断。5次中断得到10ms的时间间隔,此时时钟的1/100秒加1,并相应进行时、分、秒的调整。 
  LED动态扫描方式的设计如下:在每2ms的时间中,点亮8个LED中的一个,显示其相应的数字(PC口的输出只有一位为低电平,选通一个LED,保持2ms)。因此PC口的输出值为0b11111110,每隔2ms循环右移,到0b01111111时8个LED各点亮一次,时间为16ms。在1秒钟内,循环8个LED的次数为62.5(1000/16),是人眼的滞留时间(25次/秒)的2.5倍,保证了LED显示亮度均匀,无闪烁。在程序设计中,在各个LED转换和7段码输出时,关闭位选信号(PC输出0b11111111),消除了显示的拖尾现象(消影功能)。 
  T1的设计:T1为16位定时器,系统时钟为16M,采用其64分频后的时钟作为T1的计数信号(寄存器TCCR1B = 0x03),一个计数周期为4us,2ms需要计500个(0x01F4)。由于T1溢出中断发生在0xFFFF后下一个T1计数脉冲的到来(参见第二章关于定时器原理部分),因此T1的计数初始值为0xFE0C = 0xFFFF – 0x01F3(65535-499),即寄存器TCNT1的初值为0xFE0C。 

3.8.2  AVR汇编源代码 
  该系统的汇编源代码如下,开发软件平台使用AVR Studio 4.08。 

;******************************************************** 
;AVR汇编程序实例 
;简易带1/100秒的24小时制时钟 
;******************************************************** 
.include "m128def.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 $0000 
        jmp reset                ;复位处理 
        reti                        ;IRQ0 Handler 
        nop 
        reti                        ;IRQ1 Handler 
        nop 
        reti                        ;IRQ2 Handler 
        nop 
        reti                        ;IRQ3 Handler 
        nop 
        reti                        ;IRQ4 Handler 
        nop 
        reti                        ;IRQ5 Handler 
        nop 
        reti                        ;IRQ6 Handler 
        nop 
        reti                        ;IRQ7 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 
        jmp time1_ovf ;Timer1 Overflow Handler 
        reti                        ;Timer0 Compare Handler 
        nop 
        reti                        ;Timer0 Overflow Handler 
        nop 
        reti                        ;SPI Transfer Complete Handler 
        nop 
        reti                        ;USART0 RX Complete Handler 
        nop 
        reti                        ;USART0 UDR Empty Handler 
        nop 
        reti                        ;USART0 TX Complete Handler 
        nop 
        reti                        ;ADC Conversion Complete Handler 
        nop 
        reti                        ;E2PROM Ready Handler 
        nop 
        reti                        ;Analog Comparator Handler 
        nop 
        reti                        ;Timer1 CompareC Handler 
        nop 
        reti                        ;Timer3 Capture Handler 
        nop 
        reti                        ;Timer3 CompareA Handler 
        nop 
        reti                        ;Timer3 CompareB Handler 
        nop 
        reti                        ;Timer3 CompareC Handler 
        nop 
        reti                        ;Timer Overflow Handler 
        nop 
        reti                        ;USART1 RX Complete Handler 
        nop 
        reti                          ;USART1 UDR Empty Handler 
        nop 
        reti                        ;USART1 TX Complete Handler 
        nop 
        reti                        ;Two-wire Serial Interface Handler 
        nop 
        reti                        ;SPM Ready Handler 
        nop                 

;程序开始 
.org $0046 
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,0x55 
        st  x+,temp                                ;秒 = 55 
        ldi temp,0x59 
        st  x+,temp                                ;分 = 59 
        ldi temp,0x11 
        st  x,temp                                ;时 = 11 

         ldi temp,0xfe                                ;T1初始化,每隔2ms中断一次 
        out tcnt1h,temp 
        ldi temp,0x0c 
        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循环 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -