收藏 分享(赏)

AVR汇编百例 - 晋级篇 - 参考程序.doc

上传人:ysd1539 文档编号:6787476 上传时间:2019-04-22 格式:DOC 页数:30 大小:199.50KB
下载 相关 举报
AVR汇编百例 - 晋级篇 - 参考程序.doc_第1页
第1页 / 共30页
AVR汇编百例 - 晋级篇 - 参考程序.doc_第2页
第2页 / 共30页
AVR汇编百例 - 晋级篇 - 参考程序.doc_第3页
第3页 / 共30页
AVR汇编百例 - 晋级篇 - 参考程序.doc_第4页
第4页 / 共30页
AVR汇编百例 - 晋级篇 - 参考程序.doc_第5页
第5页 / 共30页
点击查看更多>>
资源描述

1、; 以下提供几个补充参考程序 ,都带有详细说明和指令注释.它们是主从多机通讯程序,采;用中断方式写入 EEPROM,直接对晶振分频产生 0.1 秒和秒号的精确定时程序 ,以及 RS-232/;RS-485 标准转换程序,AVR 频率计程序,串行时锺日历芯片 DS1302 读写,共享时基的 PWM输出、;输入捕获测周期程序和定时信号获取,以及 DS18B20 测温等程序 .多机通讯主要用 8 和 9位数;据模式区分被选分机(9 位)和其它分机 (8 位),达到主机只与被选分机交换数据之目的.以中;断方式写 EEPROM 的优点是可与系统运行同时进行(即在线写入),占用很少机时.;精确定时用定时/

2、计数器 1(或 0)直接对 MCU 主频(不设分频) 设定时间常数,分频精度可达到;1HZ.RS-232/RS-485 标准转换程序中 AVR 不作中转,使两种器件相关脚位直接连接 .以TCNT0;定时,以 T0 引脚接收 RS-232 数据.以收到 RS-232 字符起始位下跳沿或结束符($03)为依据,;控制切换 RS-485 的收发使能.(系统中的主 AVR 可兼做对通信标准之监控转换,即只是在完成;主要工作任务的同时附带进行 ).具体过程不再细述.串行时锺日历芯片 DS1302 具体积小,;可靠性高,与单片机连接方便等优点 .; 以下程序请参看有关章节或程序中的注释。;范例 91 ;多

3、机通讯主机程序/晶振 4MHZ.ORG 0 ;以 8/9 位数据模式区分被选/ 未被选分机通讯.EQU DTPINT=$180 ;UBRR=12 波特率 19200(REL.ERR.=0.16%).EQU DRPINT=$1C0 ;主机对 1#,2#,3#,4#分机发送数据块在$180-18F,$190-19F,$1A0-1AF)和$1B0-1BFSTRT38: RJMP RST38 ;主机从 1#,2#,3#,4#分机接收数据块在$1C0-1CF,$1D0-1DF,$1E0-1EF)和$1F0-1FF.ORG $00B ;RJMP STRT38 .ORG $00CRJMP STRT38 ;主

4、机不设串口中断,只以查询接收.ORG $011RST38: LDI R16,12OUT UBRR,R16 ;设波特率 :BAUD RATE=FCP/16(UBRR+1)CLR R15 ;初始化分机号LDI R27,HIGH(DTPINT)LDI R26,LOW(DTPINT);发送数据指针(首指$180)LDI R29,HIGH(DRPINT)LDI R28,LOW(DRPINT);接收数据指针(首指$1C0)NEXTNO: LDI R16,$18OUT UCR,R16 ;允许 UART 接收和发送,8 位数据模式INC R15 ;指向 1#分机OUTLP: OUT UDR,R15 ;呼分机号

5、,1:1#/2:2#/03:3#/04:4#.TSLOP: IN R16,USRSBRS R16,7RJMP TSLOP ;分机返回机号?IN R16,UDRCP R16,R15 ;分机号正确返回?BRNE OUTLPLDI R16,$1C ;改为 9 位数据模式 TXB8=0OUT UCR,R16 ;TXLOP: LD R16,X+OUT UDR,R16 ;向分机发送数据块TESTL: IN R17,USRSBRS R17,5 RJMP TESTL ;等待发送完成CPI R16,$0ABRNE TXLOP ;RXTST: IN R17,USRSBRS R17,7 ;RXC=1 收到数据RJM

6、P RXTST ;等待接收分机返回数据块IN R16,UDR ST Y+,R16 ;存储接收数据CPI R16,$0A ;分机数据块发完?BRNE RXTSTMOV R16,R15CPI R16,4 ;与分机轮询通讯完毕?BRNE NEXTNO ;未完转对下一分机通信HH38: RJMP HH38 ;否则踏步(可改为处理分机返回的数据,之后再进行下一个轮询).DSEG.ORG $180DTPINT:.BYTE $40;$41 $45 $65 $73 $46 $42 $40 $6F $33 $44 $66 $5C $4D $4B $0D $0A;$42 $4F $66 $78 $47 $45 $

7、44 $63 $32 $48 $60 $7C $6D $45 $0D $0A;$43 $56 $55 $53 $4D $4F $40 $2E $31 $42 $67 $4C $47 $4A $0D $0A;$45 $54 $59 $63 $3D $4B $48 $2F $35 $48 $69 $3C $77 $43 $0D $0A.ORG $1C0DRPINT:.BYTE $40;范例 92.ORG 0 ;多机通讯 1#分机程序/晶振 4MHZ.EQU DTPIT1=$180 ;(UBRR)=12 波特率为 19200(REL.ERR.=0.16%).EQU DRPNT1=$1C0STRT39

8、: RJMP RST39.ORG $00BRJMP UARXC ;8535UART 接收完成中断.ORG $00CRJMP UATXC ;UART 发送完成中断.ORG $011RST39: CLR R18 ;清除分机被选中(R18,6)和主机数据块接收完毕标志(R18,7)LDI R16,12OUT UBRR,R16 ;设波特率 BAUD RATE=4000000/16*(12+1)=19200LDI R16,HIGH(DRPNT1)MOV R8,R16LDI R16,LOW(DRPNT1)MOV R9,R16 ;r8,r9:接收数据指针(FIRST POINT TO $1C0)LDI R1

9、6,$98 ;允许 UART 中断接收,8 位数据模式OUT UCR,R16SEIRXDTS: SBRS R18,6 ;主机呼号已收到(若收到,在 R17 中)?RJMP RXDTSOUT UDR,R17 ;返还该机号TXDON: IN R16,USRSBRS R16,5RJMP TXDON ;该机号发送完成?LDI R16,$9C ; 允许 UART 中断接收,9 位数据模式,TXB8=0OUT UCR,R16 RCVBLK: SBRS R18,7RJMP RCVBLK ;主机发来数据块已接收完毕?LDI R16,HIGH(DTPIT1)MOV R6,R16LDI R16,LOW(DTPIT

10、1)MOV R7,R16 ;设发送数据指针 r6r7,首指$180LDI R16,$3C ;允许 UART 中断发送,9 位数据模式,TXB8=0OUT UCR,R16TXDN: SBIC UCR,5RJMP TXDN ;发送完毕?RJMP RST39 ;:UART 中断接收程序UARXC: SBIC USR,4RETI ;祯错误(主机正与其它分机进行 9 位数据模式通信) ,不予接收IN R14,SREG ;保存当前状态 TST R18BREQ NUMB ;(R18 )=0 时收到数据,只可能是机号,转去核实PUSH R16 ;否则为主机向本分机发来数据块(9 位模式,机号已符合)PUSH

11、R26PUSH R27IN R17,UDR ;接收数据MOV XH,R8MOV XL,R9 ;取接收数据指针ST X+,R17 ;转入 RAMMOV R8,XHMOV R9,XL ;存数据指针 CPI R17,$0A ;是数据块结束符 LF?BRNE RSCOM1SBR R18,$80 ;收到完整数据块标志RSCOM1: POP R27POP R26POP R16DRETI: OUT SREG,R14RETINUMB: IN R17,UDR ;取出数据CPI R17,1 ;是 1#分机?2#分机与$02 比较/3#分机与$03 比较.BRNE DRETI ;机号不符合,转!SBR R18,$4

12、0 ;建机号符合标志RJMP DRETI; UART 中断发送程序UATXC: PUSH R16 ;r6 r7:发送数据指针,首指$180IN R16,SREGPUSH R16PUSH R26PUSH R27MOV XH,R6MOV XL,R7 ;取出发送指针LD R16,X+ ;取数据,调指针MOV R6,XHMOV R7,XLOUT UDR,R16 ;送入发送寄存器CPI R16,$0ABRNE SDCOMCBI UCR,5 ;发送最后 1 个字符后,禁止发送寄存器空中断(CLR UDRIE)LDI R16,HIGH(DRPINT)MOV R8,R16LDI R16,LOW(DRPINT)

13、MOV R9,R16 ;接收数据指针初始化(POINT TO $1C0)SDCOM: POP R27POP R26POP R16OUT SREG,R16POP R16RETI.DSEG.ORG $180DTPIT1:.BYTE $40.ORG $1C0DRPNT1:.BYTE $10;$41 $45 $65 $73 $46 $42 $40 $6F $33 $44 $66 $5C $4D $4B $0D $0A;范例 93;以中断方式写入 EEPROM(仅对 8535,8515 无此功能) ,克服查询方式占用过多机时的缺点,;并可在线写入;运作过程特点如下:;(1)主程序初始化时设置 EEPRO

14、M 就绪(ready)中断使能位和中断总使能位;(2)在主程序中写入第一个字节,写入完成后引起就绪中断,其他写入在中断服务中完成;(3)本程序为一写入特例,写入地址为$100-$1FF,可作适当修改(如设块长计数器等);(4)为防止高优先级中断破坏写入过程,中断服务中不允许中断嵌套;(5)本例为简化程序只以查询写入地址循环作为背景程序,实用时可改为具体的背景序;(6)如能确信当前系统没有 EEPROM 正在写入,可删除对其进行查询部分.STWEEP: LDI R16,HIGH(ramend)OUT SPH,R16LDI R16,LOW(ramend)OUT SPL,R16SBI EECR,3

15、;设置 EEPROM 就绪(ready)中断使能位SEI ;中断总使能RJMP SRTW.ORG $00FRJMP EEPRDY ;8535 EEPROM 就绪(ready)中断向量SRTW: LDI YH,1LDI YL 0 ;EEPROM 写入首地址:$100LDI XL,$60 ;欲写入数据块首地址:$60CLR XHWEEP0: SBIC EECR,1 ;当前有 EEPROM 写入操作,有则等待写入完成RJMP WEEP0RCALL WREEP ;写入第一个字节,($60)-$100,写入完成后,EEWE=0 时引发 EEPROM 就绪中断INC YL ;调整写入地址指针HHWEEP:

16、 TST YLBRNE HHWEEP CPI YH,2 ;写入地址达到$200 后,写入完成BRNE HHWEEP CBI EECR,3 ;禁止 EEPROM 就绪(ready)中断WDON: RJMP WDON ;踏步EEPRDY: IN R6,SREGPUSH R16RCALL WREEP ;写入一个字节INC YLBRNE WRETI INC YH ;EEPROM 末地址为$1FFWRETI: POP R16OUT SREG,R6RETIWREEP: OUT EEARH,YH ;OUT EEARL,YL ;写入地址送入 EEARLD R16,X+ ;取数据,调指针OUT EEDR,R16

17、 ;数据写入 EEPROM 数据寄存器SBI EECR,2 ;设置 EEPROM 写入总使能位 EEMWESBI EECR,1 ;设置 EEPROM 写入使能位 EEWERET;范例 94 ;精确定时产生 0.1 秒信号;用定时/计数器 1 定时,不分頻定出 0.1 秒信号,由 PC5 脚输出正脉冲。;晶体 4.000119MHZ,计 400012 个数定出 0.1 秒信号;对定时/计数器 1 重装常数进行加法补偿(扣除自然计数和补偿占用时间) .;加法补偿若产生进位,将中断次数减 1.ORG $000 ;精确定时产生 0.1 秒信号STRT24: RJMP RST24 .ORG $006 ;

18、8515 t1 overflow vectorRJMP T1_OVFL ;400012=65536*7-58740=7*$10000-$E574/故 TCC=$E574.ORG $00D RST24: LDI R16,HIGH(ramend)OUT SPH,R16LDI R16,LOW(ramend)OUT SPL,R16SBI DDRC,5 ;PC5,0.1 秒号输出(高有效)CBI PORTC,5 LDI R16,1 ;不分頻OUT TCCR1B,R16 LDI R16,$E5OUT TCNT1H,R16 LDI R16,$74OUT TCNT1L,R16 ;写入时间常数 TCCLDI R

19、16,$80OUT TIMSK,R16 ;允许定时/计数器 1 溢出中断LDI R16,7 ;7 次中断输出 0.1 秒号MOV R6,R16SEI ;中断总使能HH1A: RJMP HH1A ;T1_OVFL:PUSH R16PUSH R17IN R7,SREGDEC R6 ;中断次数减一BRNE GOON10 ;0.1 秒时间到?LDI R16,7MOV R6,R16 ;重新装入中断次数SBI PORTC,5 ;0.1 秒号输出前沿IN R17,TCNT1L ;*IN R16,TCNT1H ;*读入 TCNT1 自然计数值LDI R18,$7C ;*TCC=$E574ADD R17,R18

20、 ;*TCC+8=$E57CLDI R18,$E5 ;*8 条单周期补偿指令占用 8 个时钟周期ADC R16,R18 ;*修正后 TCC=$E574+(TCNT1)+8OUT TCNT1H,R16 ;*OUT TCNT1L,R17 ;*重新装入补偿修正后的 TCCBRCC GOON09DEC R6 ;加法补偿若产生进位,将中断次数减 1GOON09: ;. ;数据处理略;.;.;.;.RCALL ACLK1 ;0.1 秒走时软时钟RJMP GOON11GOON10: CBI PORTC,5 ;输出信号后沿GOON11: POP R17POP R16OUT SREG,R7RETI;范例 95

21、;用定时/计数器 1 定时,不分頻定出 1 秒信号,由 PC5 脚输出正脉冲;晶体 4.000133MHZ,计 4000133 个数定出 1 秒信号;对定时/计数器 1 重装常数进行加法补偿(扣除自然计数和补偿占用时间) .;加法补偿若产生进位,将中断次数减 1.ORG $000 ;精确定时产生秒号 STRT25: RJMP RST25 .ORG $006RJMP T1_OVFB ;4000133=62*65536-63099=62*$10000-$F67B/故 TCC=$F67B.ORG $00D RST25: LDI R16,HIGH(ramend)OUT SPH,R16LDI R16,L

22、OW(ramend)OUT SPL,R16SBI DDRC,5 ;PC5 输出秒信号(正脉冲)CBI PORTC,5 LDI R16,1 ;不分頻OUT TCCR1B,R16 LDI R16,$F6 ;OUT TCNT1H,R16 ;写入 TCC 高 8 位LDI R16,$7B ;OUT TCNT1L,R16 ;写入 TCC 低 8 位LDI R16,$80 ;OUT TIMSK,R16 ;允许 T/C1 溢出中断LDI R16,62 ;62 次中断定出秒号MOV R6,R16SEI ;HH1B: RJMP HH1B ;等待中断T1_OVFB:PUSH R16PUSH R17IN R7,SR

23、EGDEC R6 ;到 62 次中断?BRNE GOON12 LDI R17,62MOV R6,R17 ;重装中断次数SBI PORTC,5 ;输出秒信号IN R17,TCNT1L ;*IN R16,TCNT1H ;*读入 T/C1 自然计数值LDI R18,$83 ;*TCC=$F67BADD R17,R18 ;*TCC+8=$F683LDI R18,$F6 ;*8 条单周期补偿指令占用 8 个时钟周期ADC R16,R18 ;*OUT TCNT1H,R16 ;*OUT TCNT1L,R17 ;*重新装入补偿修正后的 TCCBRCC GOON19DEC R6 ;加法补偿若产生进位,将中断次数

24、减 1GOON19: ;. ;数据处理略;.;.;.;.RJMP GOON13GOON12: CBI PORTC,5 ;秒号后沿GOON13: POP R17POP R16OUT SREG,R7RETI;范例 96;运作特点如下:;此程序为一完整频率测量显示程序,所测频率较高(2MHZ),使用 4 兆晶振;程序兼有启动看门狗及对其管理功能;以 TCNT0 精确定时输出秒号作为捕获信号,用 TCNT1 对被测信号频率计数;用 TCNT0 直接对(8515)4 兆晶振计数产生秒号,定时精度达 1Hz 主常数选为 256(即 0);由 PA0 输出精确定时产生的秒信号(与 ICP 脚相连) 捕获 T

25、CNT1 计数值,相减计算频率;将频率转换为十进制数,装入显示缓存区 ,调 DSPA 子程序显示之(参考范例 27 和图 4-5);重装 TCC 时对 TCC 进行修正,若修正(减法) 计算不产生借位,将中断次数 n 减 1;被测频率可近 2 兆,故须设 1 字节扩展计数器,以 tcnt1 溢出中断对其计数(共 3 字节计数器);在 TCNT1 捕获中断服务中,以 3 字节减法计算频率,并置位 T 标志;若 TCNT1 溢出标志置位;必须提前增 1 扩展计数器,并将 TCNT1 溢出标志清除( 不再增 1 扩展计数器),再计算频率.;TCNT1 溢出中断优先级高于 TCNT0,故 TCNT1

26、中断服务可能影响秒号精度,导致测量误差;可以排队法剔除坏值,即将几个连续采样按大小顺序排队,掐头去尾只留中间再作平均.;也可以监视 LED 显示,连续 3 秒稳定显示( 高频测量允许有 2Hz 误差)即为所测频率正确值.;若晶振采用 12 兆,被测信号频率 (暂空比 1:1 或接近 1:1)可接近 6 兆.ORG $000 STRT26: RJMP RST26 ;实测 8515 晶振频率 4.000167MHZ 计 4000167 个数为 1 秒.ORG $003RJMP T1_CAPT ;T/C1 捕获中断.ORG $006RJMP T1_OVRF ;T/C1 溢出中断.ORG $007RJ

27、MP T0_OVFB ;T/C0 溢出中断.ORG $00D ;4000167=256*15626-89=256*$3D0A-89/故 TCC=89 n=15626RST26: LDI R16,HIGH(ramend)OUT SPH,R16LDI R16,LOW(ramend)OUT SPL,R16SBI DDRA,0 ;PA0 输出秒定时信号,捕获频率计数值CBI PORTA,0 ;初始为低CLR R22CLR R21 CLR R20 ;R20,R21,R22 为频率量瞬时计数采样CLR R2WDRLDI R16,$0D ;启动看门狗,溢出时间为 0.49“OUT WDTCR,R16 ;写入

28、看门狗控制寄存器CLR XHLDI XL,$6C ;set the display buffer pointerT26LP: ST X+,R2CPI R26,$74BRNE T26LP ;清除$6C-$73LDI R16,$01 ;T/C0 为定时器,不分频OUT TCCR0,R16LDI R16,89 ;OUT TCNT0,R16 ;写 TCC 到 TCNT0LDI R16,$C6 ;上升沿捕获,允许噪音滤除,外部脉冲计数OUT TCCR1B,R16LDI R16,$8A ;允许 T/C1 捕获,溢出以及 T/C0 溢出中断OUT TIMSK,R16 ;LDI R16,$3E ;设 1562

29、6(=$3D0A)次中断(高位字节已增 1)MOV R1,R16 ;MOV R19,$0A ;SEI ;HH1C: BRTS HH2C ;已采集到频率?RCALL DSPA ;仍显示原数据RJMP HH1C HH2C: CLT ;频率量已在 R3,R4,R5MOV R9,R3MOV R10,R4MOV R11,R5 RCALL CONV1 ;翻为十进制数(R12R13R14R15252 253 254 255 | 0 1 2 3 4 5.加法计数方向GOON13: POP R16 ; | | | | | | | | | | |OUT SREG,R8 ;|RETIT1_OVRF:IN R18,S

30、REG ;TCNT1 溢出中断服务INC R3 ;R3 为 TCNT1 扩展字节OUT SREG,R18RETIT1_CAPT:IN R6,SREG ;T/C1 捕获中断PUSH R16IN R5,ICR1LIN R4,ICR1HMOV R16,R22MOV R22,R5SUB R5,R16MOV R16,R21MOV R21,R4 ;与上一次采集的频率量相减,得到频率值SBC R4,R16 IN R16,TIFRSBRS R16,7RJMP T1CP1INC R3 ;8515TCNT1 溢出中断,预先对扩展字节计数LDI R16,$80 ;并将溢出标志清除,( 中断返回后不再计数)OUT T

31、IFR,R16 ;清除 TIFR,7T1CP1: MOV R16,R20MOV R20,R3SBC R3,R16 ;采集频率量在 R3,R4,R5SET ;建采集频率量标志POP R16OUT SREG,R6RETI;范例 97 ; 本时基资源共享式综合测量系统,具有精确定时 PWM 输出、输入捕获测外部信号;周期、获取 TCNT1 溢出中断信号等多种功能。特点是 TCNT1 启动之后即不停运行。; 时基资源共享式 PWM 的特点在于装入比较匹配寄存器之数据方式,它不是在比较;匹配达到时清除定时/计数器,再装入高(或低)电平时间常数:而是当比较匹配;达到时以定时/计数器当前值加上时间常数后将和

32、装入比较匹配寄存器,二者效果;是相同的。可称前者为静态设置,后者为动态设置。后者因不停运行定时/计数器;,其资源可同时用于输出比较匹配 A 及 B、输入捕获、定时信号输出等等。; 本程序使用晶体标称值 4MHZ 实测为 4,000,236HZ。使用定时/计数器 1 直接;对主频精确定时设定 PWM 高低电平的维持时间。以 ICP 脚输入被测周期脉冲信号。; 本程序 PWM 之暂空比与范例 51 相同,为 5 毫秒(高):10 毫秒。故维持;高电平的时间常数为 4,000,236200=20,001,维持低电平的时间常数为;4,000,236100=40,002。此即输出比较匹配 A 达到时交替

33、写入比较匹配寄;存器 OCR1A 之对 TCNT1 当前内容的超前值。; 因以 TCNT1 直接对主频计数,频率高周期短,输入捕获的外部信号周期不能;大于 655364,000,236=0.01638(秒)即 16.38 毫秒(但也不能太小,对频率;较高的脉冲信号应改为测频率) 。以相邻两次捕获值相减之差除以主频得到被测信;号之周期(单位为秒) 。; 为避免小数除法运算,可将相邻两次捕获值相减之差先乘以 1,000,再将乘积;除以主频,将得到以毫秒为单位的周期值;考虑到除法子程序 DIV16 只实现整数;除法,且除数不能大于 65535,可将主频缩小 100 倍,即以 40,002 作除数,故

34、;除得之商扩大了 100 倍。这样将整数商二翻十后,其末两位皆为小数。本程序采用;这种计算方法。并在主循环程序中调 DSPA 子程序显示所测周期值。 。; 若将以上算法中乘以 1,000 改为乘以 10,000,并增加对商的万位转换,;其余保留不变,则所得商数末 3 位皆为小数位。本算法精度高于上一种方法,如有;提高测量精度之必要,应采用后种算法。; 若扩大测量信号周期,应对 TCNT1 溢出信号计数,做 3 字节减法(见范例 96);后再计算被测信号周期(除以 4,000,236) 。所测信号周期可达 4.194 秒。; 本示例定时精度可与范例 51 做如下比较:本例中高低电平分别对主频计数

35、;20,001 个和 40,002 个。范例 51 中高低电平分别对主频计数 19,968 个和;40,000 个。本示例定时精度明显高于范例 51。; 本示例 TCNT1 产生溢出中断之周期为 16.38 毫秒,其频率约为 61HZ。在 TCNT1;溢出中断服务子程序中由 PA3 以正脉冲形式输出该信号。.ORG $000 ;USE 8535STRT43: RJMP RST43 ;5.0000MS(高):9.9999MS(低) 晶振 4,OOO,236HZ.ORG $005RJMP T1_CP43 ;T/C1 输入捕获中断.ORG $006RJMP T1_CA43 ;T/C1 输出比较匹配

36、A 中断.ORG $008RJMP T1_OV43 ;TCNT1 溢出中断.ORG $011RST43: LDI R16,HIGH(RAMEND)OUT SPH,R16LDI R16,LOW(RAMEND)OUT SPL,R16LDI R16,$80 ;T/C1 比较匹配 A 达到时,清除输出脚 OC1AOUT TCCR1A,R16LDI R16,$41 ;不分频,比较匹配达到不清 TCNT1;上升沿捕获/禁止噪音滤除OUT TCCR1B,R16SBI DDRD,5SBI PORTD,5 ;PD5(OC1A)初始化输出为高SBI DDRA,3 ;PA3 为 TCNT1 溢出中断信号输出CBI

37、PORTA,3 ;PA3 输出为低LDI R16,$4EOUT OCR1AH,R16LDI R16,$21 ;写比较匹配寄存器($4E21=20001 脉宽 5 毫秒)OUT OCR1AL,R16LDI R16,$34 ;允许输入捕获/输出比较匹配 A/TCNT1 溢出中断OUT TIMSK,R16 CLR R21CLR R20 ;捕获值暂存单元CLR XH LDI XL,$6CCLR43: ST X+,R20CPI XL,$74BRNE CLR43 ;清除显示区$6C-$73SEIHH43: RCALL DSPA ;背景程序:显示捕获频率信号之周期,单位:毫秒BRTC HH43 RCALL

38、FIL2 ;T=1,已捕获到数据在 R4,R5/先关显示 CLTMOV R14,R4MOV R15,R5LDI R16,3MOV R12,R16LDI R16,$E8 ;取立即数 1000(=$3E8)MOV R13,R16RCALL MUL16 ;乘以 1000LDI R16,$9C ;使周期单位为毫秒MOV R10,R16LDI R16,$42 ;$9C42=40002MOV R11,R16RCALL DIV16 ;除以立即数 40002,得到被测脉冲周期之单位为毫秒,且含因子 100MOV R16,R14MOV R17,R15LDI R18,3LDI R19,$E8RCALL CONVT

39、 ;二翻十,得千位STS $70,R11 ;送入显示区CLR R18LDI R19,$64RCALL CONVT ;二翻十,得百位LDI R19,-$29 ;在百位处加小数点(百位实为个位)SUB R11,R19STS $71,R11 ;送入显示区LDI R19,10RCALL CONVT ;二翻十,得十位STS $72,R11STS $73,R17 ;小数送入显示区RJMP HH43 ;转去显示新采样数据CONVT: CLR R11COVLOP:SUB R17,R19SBC R16,R18 ;减去十进制数某位之权BRCS CONVCMINC R11 ;够减,增权RJMP COVLOPCONV

40、CM:ADD R17,R19 ;否则恢复余数ADC R16,R18RETT1_CA43:SEIIN R1,SREGIN R24,TCCR1ASBRS R24,6 RJMP OUTLW ;当前输出低电平,转IN R24,OCR1ALIN R25,OCR1AHSUBI R24,$DF ;LOW(-20001)SBCI R25,$B1 ;HIGH(-20001)/$B1DF 为 20,001 之补码OUT OCR1AH,R25 OUT OCR1AL,R24 ;写入高电平维持时间超前值LDI R24,$80 ;比较匹配 A 达到时,OC1A 输出为低OUT TCCR1A,R24OUT SREG,R1R

41、ETIOUTLW: IN R24,OCR1ALIN R25,OCR1AHSUBI R24,$BE ;LOW(-40002) SBCI R25,$63 ;HIGH(-40002)/$63BE 为 40,002 之补码OUT OCR1AH,R25 ;OUT OCR1AL,R24 ;写入低电平维持时间超前值 LDI R24,$C0 ;比较匹配 A 达到时,OC1A 输出为高OUT TCCR1A,R24OUT SREG,R1RETIT1_CP43:IN R3,SREG ;T/C1 捕获中断IN R5,ICR1LIN R4,ICR1HMOV R17,R21MOV R21,R5SUB R5,R17MOV

42、R17,R20MOV R20,R4 ;与上一次采集的频率量相减,得到频率值SBC R4,R17 ;在 R4,R5 中SET ;建采集频率量标OUT SREG,R3RETIT1_OV43:SEISBI PORTA,3 ;OUTPUT THE 61HZ PULSSBI PORTA,3SBI PORTA,3SBI PORTA,3CBI PORTA,3 ;脉冲宽度 2 微秒RETI;范例 98;MAX232R1OUT 接 MAX483DI/MAX483RO 接 MAX232T1IN;由 TCNT0 配合 PB0 以软件接收 RS-232 数据 对 485 进行监控:PB1 接 DE 和/RE;AVR

43、对 485 发来数据不接收,该数据经 MAX483RO-MAX232T1INRS-232 远端;数据起始位下降沿引起中断接收,中断服务一开始,将对 RS-485 的控制改为允发禁收使 RS-;232 发来数据直接通过 RS-485 向远端发送;当收到 RS-232 数据结束符$03 后,经半位延时,对 RS-485 的控制改为允收禁发 使能接收RS-;485 远端发来数据(故要求经 RS-232 发来数据要以$03 为结束符,对来自 RS-485 数据无此要求);可采用 avr 专门管理两种标准转换方案(可采用少脚 ATtiny 系列), 也可采取主 avr 兼管方案.;主 avr 兼管时,

44、它既接收处理完整串行数据块(及执行其它程序 ),又控制通讯标准转换.EQU DATA4=$100 .ORG 0 ;R16:THE BIT SEQUENCE COUNTER R17:WORKING ;REG.R18:FLAG UNITSTRT3S: RJMP RST3S ;BAUD RATE:9600 USE 8515/may REPLACE BY ATtiny serials.ORG $007 ;$007(8515)RJMP T0_OF.ORG $00DRST3S: LDI R17,HIGH(ramend)OUT SPH,R17LDI R17,LOW(ramend)OUT SPL,R17LDI

45、 R17,$02 ;8535:$01OUT TIMSK,R17 ;timsk,1(允许 tcnt0 中断)LDI R17,6 ;设外部脉冲计数OUT TCCR0,R17CBI DDRB,0 ;T0 为输入LDI R17,$FFOUT TCNT0,R17 ;计 1 个数即中断SBI DDRB,1 ;PB1 输出,控制 DE 和/RECBI PORTB,1 ;禁止 485 发送SEI CLR R18CLR R16HERE0: SBRC R18,0BRNE RST3S ;无错误标志循环SBRS R18,1BRNE HERE0 ;未收到数据块结束符($03)循环LDI R16,64 HERE1: DEC R16BRNE HERE1 ;延时(48+3.5=)52 微秒(超过半位,以等待半个停止位发过去)RJMP RST3S ;以使远端 485 正确收到停止位 T0_OF: SBI PORTB,1 ;允许 485 发送 IN R11,SREG PUSH R17CPI R16,0 ;接收起始位 ?BRNE T0SV11LDI R17,2 ;YESOUT TCCR0,R17 ;改为内定时,8

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报