维库电子市场网
登录 免费注册 首页 | 行业黑名单 | 委托交易 | 帮助 | English
 
IC供应
IC求购
非IC供应
非IC求购
电子资讯
技术资料
商人论坛
 
技术文章 PDF资料 IC价格 引脚说明 电路图 IC替换 IC厂商 电子辞典
作者 主题 内容
采购元器件好去处--维库电子市场网推荐
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统
驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe

AVR多段多点定时及时钟控制应用

作者:lhfl9518 栏目:单片机
AVR多段多点定时及时钟控制应用
1 概 述
由于AVR的工作频率高而执行周期又极短对应用微电脑CPU来进行定时计数时大都会采用与其工作周期同步的计数因而使得其定时计数周期为工作周期也是最高极限以8051系列为例工作周期是12个振荡周期就12MHZ而言其定时计数周期最短为1S用AVR则在10MHZ工作频率时其计时计数最短为100ns即10MHZ测量频率显然有10倍之高若用PIC16C5X系列则定时计数器没有中断控制这样比较麻烦且不精确而PIC其它系列却把所有中断向量挤在同一个地址中断后还要分别按照其标志加以辨别然后再对应跳到中断地址这种方法极不明智本来中断就需要实时的对应执行如此一来便丧失了实时控制机会也拖延控制时间
AVR除了对应定时计数具有ICP实时硬件捕捉器(CAPTURE)外内部还具有OC1A/1B硬件设置比较实时输出控制同时也有高分辨率的PWM而定时计数器更有多级的分频器因此用timer1作16位的预设计数日时分秒计时及显示控制比较简捷方便若使TC1的分频器的TCCR1B=04即设置分频为256则在8MHZ的工作频率时进入TC1的计时单位为125ns*25632s而16位的计数默认值可直接进行加载65536(250*125)的默认值令TC1计数250*125个TCK132S即达32S*250*1251S的溢出计时作时钟计时而不必用中断次数作1秒计时的检查判别也就是说若工作频率8MHZ时ck=125nS则预分频256时为32S而tcnt1为65535(250*125)作计数溢出则溢出中断计时为250*125*32uS=1S若中断则为1S计时但对应1秒计时中断需4ck且执行程序需5ck才会将新值加载tcnt1内共9ck因此需再延时247ck总共延时2479256ck的一个tc1=32S同时输入周期时间来精确的校正
当计时达1秒时在中断执行向量程序中需对应将秒(scnt)分(mcnt)时(hcnt)等作进位检查计时秒分则分别输出到六位七段LED数码管上分别对应扫描显示因此主程序一直将SCNTMCNTHCNT等秒分时或设置定时值或对应此NN组的输出控制数据内容等对应输出扫描到六位七段LED数码管中显示当TIMER1定时器溢出产生中断时立即将TCNT1的预载值重新进行加载以便CT1继续计时下去之后再作60秒的检查若秒(SCNT)加1后达到60秒时必需清零并令分计时进位加1同样分(MSCNT)加一后也需作60分的检查若是则清零再令时(HCNT)计时加1并检查是否为24小时是则清零完整的程序如下列所示
2楼: >>参与讨论
lhfl9518
2 接口电路
AVR的工作时钟若使用8MHZ石英晶体振荡如图17-1所示内部经分频器设置预分频256后得32s输入AVR的TC1端作计时脉冲以AVR的PB0PB7输出直接驱动六位七段LED的阳极显示而以PD7PD2输出直接驱动扫描六位数的七段LED阴极控制
AVR 多段多点定时控制
PB0PB3通过电阻与PB4PB7通过电阻组成4 * 4个键盘扫描读入如果使用AVR的20接脚的小IC如AT90S2313则因其没有PD7接脚阴极扫描需改用PD6PD1作控制定时控制可由PD0端输出这样就足够了但若改用LCD 2021显示字幕时则它的控制接脚除了DB0DB7仍由PB0-PB7控制外其ER/SR/W只有3个控制接脚而且当E=0控制时LCD的数据及R/SR/W接脚会处于高输入阻抗的OFF态因此AVR的对应控制接脚就可用来作键盘扫描及其它控制应用如果使用AT90S8515时则有PC0PC7PA0PA7PD1PD0作驱动SSR或继电器的定时控制输出如图17-1电路接线所示 图17-1 AT90S8515多段多点定时及时钟控制电路
根据上列分析分别实验如下
3楼: >>参与讨论
lhfl9518
一功能说明
如果以一秒计时以六位七段LED数码管显示则可显示时分秒但对应多段多
AVR 多段多点定时控制
点的定时控制组数数据及定时时间等的设置和显示则将组数nn及输出控制数据设置为NN–DDD等方式显示而定时的时HH分MM的设置就用HH MM––作对应显示因此显示型态有三种而对应数码的输入则用对应各显示屏的小数点来表示起始为时钟的时(H)Hour和分(M)Minute秒(S)Second的设置输入显示方式若按09数字输入时则为时钟的时(H)Hour输入设置即用H.H.MM SS显示方式所以要调整时间时须按TM(0AH)键会显示H.H.MM SS的时分秒等时间若按(SHIFT)10H键则将作移位到分或秒输入设置此时对应由09设定左移入时的时间但若超过24就自动清零若对应键入分则输入09设定左移入分的时间若超过60就自动清零小数点会随着(SHIFT)键而移到第三位表示作秒输入设定而显示为HH MM S.S.注意在时间显示时分秒时均以第2位小数点以1秒闪烁显示若对应键入秒则左移入秒的时间超过60就自动清零显示为HH MM S.S.另外按下多段多点(ST)定时闹铃的时间设置键时会显示H.H. MM ––同样的以小数点的一秒闪烁加以辨识通知同类时钟的调整一样用(SHIFT)来作时分的闹铃时间设置对应各组点的指定为当按组数(SN)0DH键时将对应显示N.N.–DDD因此可由09数字输入0099组的定时控制设置时间及其对应数据若按SD(Set Data)0CH键时将显示NN–D.D.D.此时可由09移入十进制000255的控制数据若超过255将自动清零当时钟计时时间到达所设置的定时时间时会使控制数据HH(DDD) 输出到PORTC组数递增(INC)0EH键则使组数NN加一最大为99若按组数递减(DEC)0FH键则会使组数NN减一最小为00另外有11H的所有定时控制数据清除键停止时钟计时的(HOLD)12H保持键等以便作秒的校对整个键盘功能设置如下
SDI
8
4
SFT/ 0
STN
9
5
CLR/1
INC
TIM
6
HLD/2
DEC
STM
7
3
SHIFT
图17-2 AVR 多段多点定时及时钟控制的键盘功能设置
所有的时分秒最大值分别是246060都可以进行比较并判断辨别用作进位的依据秒分时作十六进制递增后将其存于SCNTMCNTHCNT但为了显示在七段LED字形上及输入设置调整需用十进制进行因此需将其转成十进制放在SCNTDMCNTDHCNTD内再转成七段LED显示码于SRAM寄存器内扫描显示所设置的定时时间和数据设置输入都以十进制方式作输入及输出显示但要存入对应各组的SRAM内时会将其转成十六进制存储并可逐一将各组的定时与时钟值MSCNTHCNT比较作多段多点的定时控制如果相等会将其所设定的控制数据输出到PORTC而PORTC可接到R-2R的D/A转换端作对应模拟电压输出或直接接到光隔离的SSR来驱动控制若用模拟电位输出控制时则将成为对应各定点时间作模拟电位输出的时序指令如温度或压力等控制
4楼: >>参与讨论
lhfl9518
AVR 多段多点定时控制
二流程图
根据上述功能按照两个程序规划整个控制程序其中为多段多点定时控制及时钟的输入设置和调整而另一个是定时器TC1计时一秒的控制及分时的进位计时同时作数字模式的转换及预定时比较作对应控制这两大程序的流程图如下所示
三程序及其对应说明
;avr7sck.asm
.include "8515def.inc"
广州市天河双龙电子有限公司 http://www.sl.com.cn
AVR 多段多点定时控制
.cseg
.org 0x00
rjmp RESET ;AVR复位寻址
.def TEMPdh =r2
.def TEMPdl =r3
.def CNT =r10
.def SCNN =r11
.def KEYN =r12
.def SCNK =r13
.def SCNDP =r14
.def KSNI =r15
.def TEMP =r16
.def TEMP1 =r17
.def TEMP2 =r18
.def TEMP3 =r19
.def TEMPn =r18
.def scnt =r22
.def mcnt =r21
.def hcnt =r20
.def scntd =r25
.def mcntd =r24
.def hcntd =r23
.cseg
.org 0x06 ;timer1 溢出中断向量
intt1: rjmp chk1s ;跳到检测是否1秒计时到
.cseg
.org 0x010 ;主程序起始地址
RESET:
ldi TEMP,low(RAMEND) ;RAMEND为8515def.inc内建定义值为025FH
out SPL,TEMP ;起始堆栈指针低位将R16=TEMP=02H放入SPL=3DH
;若硬件堆栈或者AVR装置内容SRAM小于256字符(byte)时下列二行程序就可省略,
ldi TEMP,high(RAMEND) ;以TEMP=R16<5FH为资料加载缓冲寄存器
out SPL+1,TEMP ;堆栈指针高位将R16=TEMP=5FH放入SPL+1=3EH
wdr ;在使用看门狗定时器前需复位看门狗定时器内容
;避免在接下来程序前就因WDT已快计时溢出而复位
5楼: >>参与讨论
lhfl9518
AVR 多段多点定时控制
ldi TEMP.html">TEMP,$0F;(1<<WDE) ;WDTCR地址$21不可位设定TEMP缓冲
;令WDE=D3=1
out WDTCR,TEMP.html">TEMP ;将已设定WDE=1=D3位值的TEMP输出到WDTCR内
clr scnt ;令秒寄存器SCNT=00
clr mcnt ;令分寄存器MCNT=00
clr hcnt ;令时寄存器HCNT=00
clr scntd ;令十进制秒寄存器SCNT=00
clr mcntd ;令十进制分寄存器CNT=00
clr hcntd ;令十进制时寄存器HCNT=00
ldi TEMP.html">TEMP,$00 ;令TEMP寄存器放入00
out tccr1a,TEMP.html">TEMP ;将TEMP=00内容输出到TCCR0内禁止比较器
;及pwm动作
out tccr1b,TEMP.html">TEMP ;将TEMP=00内容输出到TCCR0内
;停止TC0计时及捕获
ldi TEMP.html">TEMP,high(65536-250*125) ;TEMP为高8位(65536-250*125)
;放入TCNT1H
out tcnt1l,TEMP.html">TEMP ;TCNT1由(65536-250*125)
;计数到65536溢出共计时250*125
ldi TEMP.html">TEMP,low(65536-250*125) ;TEMP为低8位(65536-250*125)
;放入TCNT1L
out tcnt1h,TEMP.html">TEMP ;TCNT1由(65536-250*125)
;计数到65536溢出共计时250*125
LEDA:LDI TEMP1,$06 ;令TEMP1=06共6个显示数据
LDI XH,$00 ;令X间接寻址指针在0004的
;SRAM作显示数据寻址
LDI XL,$04 ;R9-R4显示字行寄存器
LDI TEMP,$3F ;令TEMP=3F值
REDSP:ST X+,TEMP ;将TEMP=00存放于SRAM的X地址内
;并令X加1
DEC TEMP1 ;将TEMP减1
BRNE REDSP ;若TEMP减1后不为0则跳回REDSP
;再令TEMP置于SRAM
sei ;中断总开关sreg=d7=i=1
ldi r16,0b10000000 ;令toie1=1触发中断
out timsk,r16 ;将R16的D7=1令TOIE1=1触发中断
LDI YH,$00 ;令间接指针YH=0
LDI XL,04 ;令XL为18寻址于R4间接指针
ldi r16,04 ;令R16=04
out tccr1b,r16 ;将R16=04设定TC1分频256
;开始计时其单位时间为32uS
6楼: >>参与讨论
lhfl9518
AVR 多段多点定时控制
LDI TEMP,$FF ;令TEMP=$FF以便令DDRADDRCDDRD设定为输出态
OUT DDRA,TEMP
OUT DDRC,TEMP
OUT DDRD,TEMP
CLR TEMP2
CLR TEMP1
CLR KSNI
DSPKB:RCALL SCAN ;SCAN将R04-R09内容显示于七断字幕并等待按键
MOV TEMP,KEYN ;将所按的键码置于TEMP寄存器内
cpi TEMP,$0a ;TEMP=键码寄存器与0AH值比较
BRCS nkey1 ;若小于0AH则借位标志CF=1为0-9之数字键
BREQ timstk ;若为0AH是时间设定键时分显示HH MM SS
cpi TEMP,$0b ;将键码TEMP内容与0BH比较是否为定时设定键
BREQ settk ;若为0BH是定时设定键时分而显示HH MM st
cpi TEMP,$0c ;将键码TEMP内容与0CH比较是否为定时数据设定键
BREQ setdk ;若为0CH则是定时数据设定键显示NN -D2 D1D0
cpi TEMP,$0d ;将键码TEMP内容与0DH比较
;判断是否为定时组数NN设定键
BREQ setnk ;若为0DH则是定时组数设定键显示NN -D2 D1D0
cpi TEMP,$0e ;将键码TEMP内容与0EH比较判断是否为定时组数递加键
BREQ inck ;若为0EH则是定时组数加1键显示NN -D2 D1D0
cpi TEMP,$0f ;将键码TEMP内容与0FH比较判断是否为定时组数递减键
BREQ deck ;若为0FH则是定时组数递减键显示NN -D2 D1D0
cpi TEMP,$10 ;将键码TEMP内容与10H比较判断是否为设定移位键
BREQ shftk ;若为10H则是设定移位SHFT键以小数点表示
cpi TEMP,$11 ;将键码TEMP内容与11H比较判断是否为清除数据键
BREQ clrk ;若为11H则是将所有定时及其设定数据予以清除
cpi TEMP,$12 ;将键码TEMP内容与12H比较判断是否为计时暂停键
BREQ holdk ;若为12H则是将停止计时并显示HH MM SS计时值
RJMP DSPKB ;跳回DSPKB再次显示及读取键盘并作传出移位显示
NKEY1:RJMP NKEY ;跳到较远的nkey程序
;时间的设定调整及定时设定的移位选择键
shftk: mov TEMP,ksni ;设定位移数ksni装入TEMP寄存器内
inc ksni ;将设定位移数KSCNI加1
cpi TEMP,$02 ;检测TEMP的位移设定数是否为02过大值
brcs nosft ;若TEMP小于03则c=1故正常值则跳到nosft
clr ksni ;若TEMP大于等于3则令ksni清零
nosft: RCALL SETP ;令设定要输入数码地址数七段LED的小数点对应显示
RJMP DSPKB ;跳回DSPKB再次显示及读取键盘并作输出移位显示
7楼: >>参与讨论
lhfl9518

AVR 多段多点定时控制
;将定时的时间及数据设定存放在SRAM内容$0070到3*100+$70进行清除
clrk: ldi zh,$00 ;令Z=$0070的SRAM存放起始地址
ldi zl,$70
ldi TEMP.html">TEMP,$00 ;令TEMP寄存器为00
nextc: st z+,TEMP.html">TEMP ;将TEMP=00放入Z所指的SRAM
;并令Z地址值加1
cpi zh,high(3*100+$70) ;检测ZH是否已达SRAM的最高地址
brne nextc ;若未达此最高地址则跳到NEXTC再继续清除
cpi zl,low(3*100+$70) ;若ZH达最高地址值则再检测ZL是否也达最高值
brne nextc ;若未达此最高地址则跳到NEXTC再继续清除
rjmp dspkb ;若清除到SRAM的最高地址
;则跳回DSPKB再次显示及读取键盘
;时钟计时的ON/OFF 设定控制
holdk: in TEMP.html">TEMP,tccr1b ;将控制TIMER1的TCCR1B读入TEMP
ldi TEMP.html">TEMP3,$04 ;令TEMP3=00001000
;以便令CS12-CS10转为000或100
eor TEMP.html">TEMP,TEMP.html">TEMP3 ;将TEMP=TCCR1B与TEMP3=04
;作EOR运算控制ON/OFF
out tccr1b,TEMP.html">TEMP ;将CS12-CS10=000(OFF)或100(ON)
;输出到TCCR1B控制
rjmp dspkb ;跳回DSPKB再次显示及读取
;调整设定时分秒设定键
timstk:LDI TEMP1,$00 ;令设定调整0-9数字输入模式TEMP1=00
CLR KSNI ;清除移位设定键KSNI令其为起始设定
RJMP DPTMM ;跳到DPTMM作计时的时分秒显示
;作定时器的时间设定
settk: LDI TEMP1,$01 ;令设定调整0-9数字输入模式TEMP1=01
clr ksni ;清除移位设定键KSNI令其为起始设定
RJMP DPSTM ;跳到DPSTM 作定时器的时分及控制数据显示
;作定时器的输出控制数据设定
setdk: LDI TEMP1,$03 ;令设定调整的0-9数字输入模式TEMP1=03
LDI TEMP,$02
MOV KSNI,TEMP
RCALL DPNDM ;调用DPNDM显示NN -D DD字幕
RJMP DSPKB ;跳到DSPKB作数据输入设定模式R69-R6E的显示
;定时的00-99组数设定输入
setnk: LDI TEMP1,$02 ;令设定调整的0-9数字输入模式TEMP1=02

CLR KSNI

8楼: >>参与讨论
lhfl9518
AVR 多段多点定时控制
RCALL DPNDM ;调用DPNDM显示NN -D DD字幕
RJMP DSPKB ;跳到DSPKB作数据输入设定模式R69-R6E的显示
;将定时控制的组数递加1
inck: INC TEMP2 ;将组数TEMP2内容加1
CPI TEMP2,99 ;与99最大组数值比较
BRCS DPND1 ;若小于99则CF=1故为正常值跳到DPND1
CLR TEMP2 ;若超过99则CF=0故令组数TEMP2清零
DPND1:RCALL DPNDM ;调用DPNDM显示NN -D DD字幕
RJMP DSPKB ;跳到DSPKB作数据输入设定模式R69-R6E的显示
;将定时控制的组数递减1
deck: CPI TEMP2,$00 ;将组数TEMP2内容与最小值00比较
BREQ DPND9 ;若等于00值则不再递减
DEC TEMP2 ;若不为00则正常递减1
RCALL DPNDM ;调用DPNDM显示NN -D DD字幕
DSPK1:RJMP DSPKB ;跳到DSPKB作数据输入设定模式R69-R6E的显示
dpnd9:ldi temp2,99
RCALL DPNDM ;调用DPNDM显示NN -D DD字幕
RJMP DSPKB ;跳到DSPKB作数据输入设定模式R69-R6E的显示
tmni1: rjmp tmni ;跳到较远的TMNI程序
;鉴别为何种数字输入而对应将键入值KEYN进行左移入
NKEY:CPI TEMP1,$00 ;将数字输入模式寄存器TEMP1与00比较
BREQ TMNI1 ;若模式为00则跳到TMNI作时间调整输入
CPI TEMP1,$01 ;将数字输入模式寄存器TEMP1与01比较
BREQ STMNI ;若模式为01则跳到STMNI作定时时间的设定输入
CPI TEMP1,$02 ;将数字输入模式寄存器TEMP1与02比较
BREQ SETNI ;若模式为02则跳到SETNI作定时的组数设定输入
CPI TEMP1,$03 ;将数字输入模式寄存器TEMP1与03比较
BRNE DSPK1 ;若不等于则跳到DSPKI
;作数据输入设定模式R69-R6E的显示
;对应各组定时控制的输出控制数据设定各定时点的设定存入数据依序为时分及数据
DATNI:RCALL CALTAD ;按照所设定的TEMP2
;定时组点来计算出要存于SRAM的 Y指针值
PUSH YL ;将YLYH压入堆栈所指SRAM内保存
PUSH YH
LDD TEMP,Y+2 ;将此组定时控制的第三字符即为控制数据加载TEMP
RCALL HTOD2 ;将此十六进制TEMP控制数据
;转成十进制存于TEMPDHTEMPDL内
LDI YL,$03 ;令将Y指着TEMPDL=R3的SRAM地址$0003
9楼: >>参与讨论
寻觅

不错,还 真挺详细的

10楼: >>参与讨论
lihai813
看得很辛苦!
11楼: >>参与讨论
wuly
其实AVR可以开专栏的
12楼: >>参与讨论
lhfl9518

本想传附件的,太大了

13楼: >>参与讨论
lhfl9518
版主说的也是
14楼: >>参与讨论
lhfl9518
原本还有一些没传完呢,太多了
15楼: >>参与讨论
AVR_AFA
哈哈,写的很辛苦看的也很辛苦。
16楼: >>参与讨论
寻觅
真多阿
参与讨论
昵称:
讨论内容:
 
 
相关帖子
步进电机小知识(摘)
HOLTEK指令集
找东西!!!!!!!!啊.....找东西
单片机问题
[求助]初学者用什么书好?
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入


Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号