AVR汇编百例 - 串行通讯
第6章串行通信 AVR单片机应用技术项目化教程课件
6.1串行通信基础
6.1.3 同步通信与异步通信
1. 同步通信 SYNC(Synchronous Communication)同步通信
以数据块为传输单元,一个数据块中包含了若干个 数据字符(比如数据字节),仅在数据块首部设置 有1~2个同步字符,用以进行数据通信。一旦建立数 据同步,就可以进行数据字符的传输,中间无需再 同步,数据块中的数据字符长度可定义,如图6-4。
6.1串行通信基础
6.1.3 同步通信与异步通信
3、波特率(Baud Rate) 波特率是表示串行通信传输数据快慢的物理参数,
其定义为单位时间内传输的二进制bit数,用位/秒 (Bit per Second)表示,或写成bps。如串行通信中 的数据传输波特率为128bps,意为每秒钟传输128个 bit,合计16个字节,传输一个比特所需要的时间为: 1/128bps=0.0078秒=7.8毫秒。 传输一个字节的时间为: 7.8×8=62.4毫秒。
6.1串行通信基础
6.1.3 同步通信与异步通信
2、异步通信 异步通信以字符为传输单位,通信中两个字符
的时间间隔不固定(异步),而字符中的两个相邻 的比特位的时间是固定的(同步)。在异步通信中, 没有专门的、独立的同步时钟信号,典型的异步通 信的数据帧格式如图6-5所示,由起始位、数据位、 奇偶校验位、停止位所组成。起始位为一固定时间 长度的低电平,表示一帧数据的开始,接着就是传 输的数据,其长度有5位、6位、7位、8位、9位等。 数据位后面是奇偶校验位,指示数据通信的出错情 况。校验位后面是1位或2位停止位。停止位为高电 平,表示这一帧数据的结束。
6.1串行通信基础
6.1.4 同步通信与异步通信
AVR单片机的串行通信
return finished;} ... }}}}
启动 MyAgent 后,MyAgent 就自动地请求 SearchCompany 服务,获得服务结果。
4 结语
针对传统商务系统平台异构型、主动性差等缺陷,提出 了一种基于 Web Service 与多 Agent 的商务智能系统结构。经 研究表明基于 Web Service 与多 Agent 技术结合的商务智能系 统与传统的智能商务系统相比,有效地解决了企业间平台异
}
值得注意的有以下两点: (1) SPI 同步串行数据传送是
主机和从机互相来交换数据,而不是单纯的主机向从机发送
数据; (2) 当使用中断方式处理主机的数据传输,并且 SS
可能被拉低时,中断服务程序检查 MSTR 是否为“1 ”,若被
置“0”,必须将其置位,以保证 SPI 为主机模式。
4 结语
介绍 AVR 单片机的 SPI 串口通信,AVR 单片机作为一种
从机的同步。这样主机和从机的两个移位寄存器就可以被认
AVR 100个汇编范例
SBC R16,R9
RCALL SUDAA
MOV R13,R16
MOV R16,R12
SBC R16,R8
RCALL SUDAA
ADLOP: LD R16,-X ;X-1指向被加数;
LD R6,-Y ;Y-1指向加数
ADC R16,R6
RCALL ADDAA ;相加后调整
ST X,R16 ;返还调整后结果
RET ;否则返回
LDI R17,255
SUB R13,R17
SBC R12,R17 ;以减去-1($FFFF)替代加1
RET
RET
;范例2
SUDAA: BRCC SBD1 ;bcd码减法调整子程序,差在R16中
BRHC SBD3
SUBI R16,$66 ;进位半进位都置位,将差减去立即数$66
DEC R7
BRNE ADLOP
RET
;范例6
SUBCD4: MOV R16,R15 ;4字节压缩bcd码减法子程序
SUB R16,R11 ;R12,R13,R14,R15内为被减数,R8,R9,R10,R11内为减数
SUBLP: LD R16,-X ;X-1指向被减数
LD R6,-Y ;Y-1指向减数
SBC R16,R6
RCALL SUDAA ;相减后调整
ST X,R16 ;返还调整后结果
;范例10 ;32位被除数/16位除数-->16位商,精确到1
DIV16: LDI R16,16 ;(r12r13r14r15)/(r10r11)-->r14r15
DLOOP: LSL R15
串行通信简介
串行通信简介一、并行通信与串行通信数据传输的两种方式为并行和串行。
并行通信传输中,一组数据的各数据位在多条线上同时被传输,以字或字节为单位并行进行。
并行通信使用的通信线路多、成本高,另外由于线路长度增加时,干扰增加,数据也容易出错,所以并行方式不适宜远距离通信,工业上很少使用。
串行通信使用一条数据线,将数据一位接一位地按顺序依次传输,每一位数据占据一个固定的时间长度,只需要较少的通信线路就可以在系统间交换信息,特别适用于计算机与计算机、计算机与外设之间的远距离通信,工业上广泛使用。
二、同步通信与异步通信串行通信一般又分为同步通信和异步通信。
同步通信收发设备需要使用一根同步时钟信号线,在时钟信号的驱动下双方进行协调,同步数据。
例如,通信中双方通常会统一规定在时钟信号的上升沿(或下降沿)对数据线进行采样。
异步通信则不需要同步时钟信号,而是采用字符同步的方式,字符帧格式如图12-59所示。
图12-59 异步通信的字符帧格式发送的字符由1个低电平起始位、7或8个传送信息数据位、1个奇偶校验位(可以没有)、1或2个停止位组成。
通信双方需要对采用的字符帧格式和数据的传输速率做相同的约定。
异步通信传送的附加位(非有效传送信息)较多,传输效率低,但随着通信速率的提高,可以满足控制系统通信的要求。
S7-1200 PLC采用异步通信方式。
提示:串行通信中,波特率指的是数据传输速率,即每秒传送的二进制位数,其符号为bit/s或bps。
三、单工、半双工与全双工通信单工通信只支持数据在一个方向上传输,不能实现双向通信,例如电视、广播。
半双工通信允许数据在两个方向上传输,但同一时刻只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信。
在同一时间只可以有一方接收或发送信息,可以实现双向通信,如对讲机。
全双工通信允许数据同时在两个方向上传输,因此全双工通信是两个单工通信方式的结合。
在同一时间可以同时接收和发送信息,实现双向通信,如电话通信。
AVR单片机的SPI串行通信的应用
应用设计
晶振频率 fOSC)的四分之一。 当 SPI 接 口 被 使 能 时,
MOSI、MISO、SCK、SS 引 脚 的
最高速率的时候,传输准确率会 有一定程度的下降。一般采用非 倍速的 64 分频就基本可以满足要
SPI 串行通信的简单程序 实现
控制与数据方向如表 1 所示。
求。
通过设置 AVR 单片机提供的
在 进 行 SPI 的 任 何 操 作 时, SPE 位都必须置位;当 AVR 单片 机运行于主机模式时 MSTR 位应 该被置位。如果 MSTR 为“1”时, SS 端口被设置为输入,且被外部
DORD (bit5)
数据移出 顺序控制
MSTR (bit4)
主 / 从机 选择
CPOL (bit3)
SCK 极性 选择
如图 6 所示。
应用及结论
在 电 力 线 抄 表 系 统 中,AVR 单 片 机 作 为 其 控 制 的 核 心 芯 片, 我们使用其 SPI 串行外设接口访 问 Flash、EEPROM 以及时钟芯片。 如 图 7 所 示,CPU 定 时 通 过 SPI 总线访问时钟芯片,读取时间信 息,作为抄表的时间标准;由于 Flash、EEPROM 和时钟芯片共用 SPI 总线,这三者之间通过数字 开关来选择。
CPHA
SPR1
SPR0
(bit2) (bit1) (bit0)
SCK 相位 选择
SPI 时钟速率选择
比特位
SPIF (bit7)
含义及其作用 SPI 中断标志
表4 SPI状态寄存器SPSR
WCOL (bit6)
写冲突标志
—— (bit5)
保留
—— (bit4)
保留
AVR单片机学习七异步串行口UART
AVR单片机学习(七)异步串行口UART 串行通讯技术概述异步串行通讯原理UART与电脑的通讯M16的USART中断方式使用USART步骤一、串行通讯技术概述串行通讯的通俗定义:一位发送一位(相对与并行,)当然通过位同步帧同步串行通讯的分类同步串行通讯时钟线、数据线、通过时钟保持数据同步SPI,IIC属于同步串口通讯异步串口通信只有一根数据线,通过波特率保证数据同步(顾名思义没有时钟线只有数据线)UART无线通信一般均为异步串行通信(相对于无形之中只能有一根天线)波特率每秒发送码元时间宽度为(1/9600)S大概是在100个微妙左右发送方按照波特率发出数据接收方按照波特率确定码元时间宽度对数据进行采样帧格式8位数据格式idle 空闲时候保持高电平在发送数据的时候先发送一位起始位低电平0然后数据 0 1 。
8 位P这位是可选的一般在多级通讯的时候需要发送9位数据在第9位时候是地址位SP1(必选的一位停止位是1)也可以选2位加一个SP2但是一般都是1位起始位 1位停止位 8位数据位之后数据继续保持空闲高电平接线图发送端:TXD接收端:RXD交叉连接RS232电平标准逻辑1 :-15V逻辑0 :+15VDB9 接口定义TXD/RXD/GDN三根线即可瞒足绝大数应用场合下面是开发板电路图MAX3232标示的是3.3V的芯片我们用的是5V MAX232 芯片标示错了不论引脚封装还是顺序都是完全相同的。
MAX 232芯片能提供2路串口我们只用一个。
由于这个电路图上是按照DB9定义的走线了所以我们就得用交叉线来跟PC 通讯了。
M16的USART特点全双工操作(独立的串行接受合发送寄存器,不像51是公用同一个寄存器,只能半双工)异步或同步操作(当然同步一般用不到。
所以我们只当异步串行口使用)支持5,6,7,8或9个数据位和1个或2个停止位(一般用的最多是8位数据 1位停止)硬件支持的奇偶校验操作(一般用不到,有限的场合通信质量还是可靠的,没必要加上校验)三个独立的中断源(看技术文档《一》)噪声滤波,包括错误的起始位检测,以及数字低通滤波器USART寄存器universal(通用的大体的)synchronous(同步) asynchronous(异步)R/T(接受/发送)UDRUCSRAUCSRBUCSRCUBRRL与UBRRH《一》Three Separate Interrupts (3个分离独立的中断 ) TXcomplete 发送完成中断,TX Data Register Empty 发送数据寄存器空中断RX Complete 接受完成中断。
AVR 单片机 串口通信 串行通讯 详细例程介绍
Atmega128 有两个串口:USART0 与 USART1 以 USART0 为例
串口的初始化包括:
传输模式的选择:同步还是异步,默认为异步模式,可通过选择 USART 控制和状态 寄存器 UCSR0C 中的 UMSEL 位来选择,UMSEL 为 0,是异步模式. 波特率的设置:通信的双方都必须有相同的波特率,波特率可以通过设置波特率 发生寄存器 UBRR0 来确定,UBRR0 为两字节 16 位的寄存器,可分为 UBRR0H 和 UBRR0L.同时起作用的还有 UCSR0A 中的波特率加倍位 UX2,当 UX2 为 1 时设置的 波特率加倍.
3、设置 UCSR0C:
Bit6-UMSEL0:USART0 的模式选择,0 为异步模式,1 为同步模式 Bit5:4-UPM01:0:奇偶校验模式,00 禁止,01,保留,10 偶校验,11,奇校验 Bit3-USBS0:停止位的选择,0 停止位为 1bit,1 停止位为 2-bits Bit2:1-UCSZ01:0:字符长度,当 UCSZ02 为 0 时,00 表示 5 位,01 表示 6 位,10 表示 7 位,11 表示 8 位.当 UCSZ02 为 1 时,11 表示 9 位.(UCSZ02 为 UCSR0B 里的一位寄存器)
{ putchar0(*s); s++; }
putchar0(0x0a);//回车换行 putchar0(0x0d); }
/******************************************************************* ********* 函数功能:主程序 入口参数: 出口参数: ******************************************************************** ********/ void main(void) { unsigned char i;
AVR单片机串口通信程序
AVR单片机串口通信程序单片机的串口在很多时候都是一个有用的通信接口,比如要修改单片机内部的一些变量,就可以直接使用串口通信,将参数发送到单片机,就省去了重新编译下载的麻烦。
AVR单片机的串口通信功能可谓强大啊,下面就简单说下我在学习时的一些经验。
实验板是AVR-ATMEGA128A单片机,晶振8MHz。
1、初始化:设置波特率前,要关闭 USART0 的所有使用,包括使能和中断。
2、设置 UCSR0A: UCSR0A 能写的有Bit0,Bit1,Bit6,其他 5 位为状态位.我们一般使用的有Bit1-U2X0,当这一位为 1 时,波特率的分频因子从 16 降到 8,能够有效的将异步通信模式的传输速率加倍,但是这一位仅对异步操作有影响,使用同步操作时应将此位清零。
3、设置 UCSR0C: Bit6-UMSEL0:USART0 的模式选择0为异步模式,1为同步模式。
Bit5:4-UPM01:0:奇偶校验模式,00 禁止,01,保留,10 偶校验,11奇校验。
Bit3-USBS0:停止位的选择 0-停止位为1bit,1 停止位为 2bitsBit2:1-UCSZ01:0:字符长度当 UCSZ02 为0时:00 表示 5 位,01 表示 6 位,10 表示7 位,11表示 8 位。
当 UCSZ02 为 1 时,11 表示 9 位(UCSZ02 为UCSR0B 里的一位寄存器)。
4、设置 UBRR: UBRR 的设置和这些参数有关:U2X0,CPU 频率,波特率5、然后就是设置 UCSR0B:Bit7-RXCIE0 为接收结束中断使能,Bit6-TXCIE0 为发送结束中断使 ,Bit4-RXEN0 为接收使能,Bit3-TXEN0 为发送使能。
一般情况下,接收使用中断方式,所以使用接收结束中断使能。
下面是源代码:/** usart.c** Created: 2011/7/2 15:48:36* Author: YIN*/#include ;#include ;#include ;volatile unsigned char temp; void init(){UCSR0B=0x00;UBRR0H=0x00;UBRR0L=51;UCSR0A=0x00;UCSR0C=0x06;UCSR0B=0x98;sei();DDRF=0xff;PORTF=0xff;DDRD=0xf0;DDRA=0xff;}void delay(){unsigned int i;i=100;while(i--);}int main(void){init();while (1); //等待中断}SIGNAL(SIG_UART0_RECV) //将上位机发送的数据发送回上位机显示{temp=UDR0;PORTA=~temp;UDR0=temp;}部分内容摘自网络,希望对大家有帮助!。
AVR汇编百例 - 串行通讯
;范例40.ORG 0 ;8535UART串行通讯程序,晶振4MHZ.EQU DTPINT=$180 ;UBRR=12 波特率19200(REL.ERR.=0.16%).EQU DRPINT=$1D0STRT30: RJMP RST30.ORG $00BRJMP U_RXC ;UART接收完成中断.ORG $00CRJMP U_TXC ;UART发送寄存器空中断.ORG $011RST30: LDS R16,$A3 ;CBR R16,3STS $A3,R16 ;清完整ASCII数据块接收到标志($A3,1),错误标志(FE/OR)($A3,0) LDI R16,12OUT UBRR,R16 ;BAUD RA TE=FCP/16(UBRR+1)=19200LDI R27,HIGH(DIPINT)MOV R6,R27LDI R26,LOW(DTPINT)MOV R7,R26 ;发送数据指针在r6r7(dtpint)CLR R11INC R11LDI R16,$30 ;发送数据块长度为$30MOV R12,R16RCALL CRC0 ;得到CRC检测之余式(冲掉$0D&$0A)INC XLINC XLLDI R16,$0DST X+,R16LDI R16,$0AST X,R16 ;在数据块末尾加$0D&$0A,实际发送数据块长度为$32LDI R16,$B8 ;允许UART发送和接收,接收中断,发送寄存器空中断,8位数据OUT UCR,R16LDI R16,HIGH(DRPINT)MOV R8,R16LDI R16,LOW(DRPINT)MOV R9,R16 ;r8,r9:接收缓存区指针(FIRST POINT TO $1D0)CLR R10 ;接收数据块长预先清除SEI ;HH30: LDS R16,$A3SBRC R16,0 ;错误接收?RJMP RCVER ;错误处理SBRS R16,1 ;接收数据完成?RJMP HH30 ;否,转再查询RCVEF: CLR R11 ;块长予处理INC R11DEC R10DEC R10 ;$0D&$0A不算块长度之内(故将块长减2)MOV R12,R10 ;(R11,R12):块长LDI XH,HIGH(DRPINT)MOV R8,XHLDI XL,LOW(DRPINT)MOV R9,XLRCALL CRC0 ;恢复出CRC余式LDI R16,$0DCP R16,R14BRNE CRCERLDI R16,$0ACP R16,R15 ;恢复出$0D$0A为正确接收BREQ HH30CRCER: ;. ;循环冗余检测错误处理;.;.RJMP STRT30RCVER: CBI UCR,RXCIE;. ;接收错误(FE/OR)处理;. ;(过程略);.RJMP STRT30:UART接收数据块程序U_RXC: PUSH R16IN R16,SREGPUSH R16PUSH R26PUSH R27RSC1: IN R16,USR ;UART状态寄存器ANDI R16,$18 ;FE/OR ERROR?BRNE RVERR ;错误转INC R10 ;块长加1MOV XH,R8MOV XL,R9 ;r8r9:接收数据指针,首指$1D0IN R16,UDRST X+,r16 ;MOV R8,XHMOV R9,XLCPI R16,$0A ;收到最末字符(回车命令LF)?BRNE RSCOMLDS R16,$A3SBR R16,2 ;建立数据块接收完毕标志STS $A3,R16CBI UCR,RXCIE ;禁止接收中断RJMP RSCOMRVERR: LDS R16,$A3SBR R16,1STS $A3,R16 ;$A3,0:FE/OR错误接收标志RSCOM: POP R27POP R26POP R16OUT SREG,R16POP R16RETI; UART发送数据块程序U_TXC: PUSH R16IN R16,SREGPUSH R16PUSH R26PUSH R27SPSV1: MOV XH,R6MOV XL,R7 ;发送数据指针,首指$180LD R16,X+ ;取发送数据,调指针MOV R6,XHMOV R7,XLSPS11: OUT UDR,R16 ;送入数据寄存器,移入发送移位寄存器后即引起数据寄存器空中断CPI R16,$0ABRNE SPCOMCBI UCR,UDRIE ;发送最末字符后禁止发送寄存器空中断LDI R16,HIGH(DRPINT)MOV R8,R16LDI R16,LOW(DRPINT)MOV R9,R16 ;接收数据指针初始化,指向$1D0;CBI USR,6 ;SPCOM: POP R27POP R26POP R16OUT SREG,R16POP R16RETI.DSEG.ORG $180DTPINT:.BYTE $32;$41,$45,$65,$73,$46,$42,$40,$6F,$33,$44,$66,$8C,$4D,$4B,$2F,$67;$42,$4F,$66,$78,$47,$45,$44,$63,$32,$48,$60,$7C,$6D,$45,$2A,$63;$43,$56,$55,$53,$4D,$4F,$40,$2E,$31,$42,$67,$4C,$47,$4A,$38,$39;$0D,$0A.EQU DRPINT=$1D0.ORG $1D0DRPINT: .BYTE $34 ;(内容略);范例41 ;外部中断int0接收ASCII码数据块.ORG 0 ;8515/8535/晶振4MHZSTRT31: RJMP RST31RJMP EX_INT0.ORG $00D ;8535外部中断0RST31: LDI R17,HIGH(ramend)OUT SPH,R17LDI R17,LOW(ramend)OUT SPL R17LDI R17,2OUT TCCR1B,R17 ;4mhz/8分频,计数单位为2微秒,TCCR1B:$2e LDI R17,$40OUT GIMSK,R17 ;gimsk,6(允许int0中断)LDI R17,2OUT MCUCR,R17 ;设INT0为下降沿中断(mcucr'b1&b0=10)CBI DDRD,2 ;int0 为输入;.;. ;其他初始化略SEI ;CLRBUF: LDI R27,1CLR R26 ;接收数据缓存区首址$100LDI R17,$40OUT GIMSK,R17 ;gimsk,6CLR R17CLRLOP: ST X+,R17CPI R26,$48BRNE CLRLOP ;清接收缓存区($100--$147)LDS R16,$A3CBR R16,$60STS $A3,R16 ;接收错误($A3,6)和接收完成($A3,5)标志清除CLR5: ;.;. ;背景程序略RJMP CLR5 ;RCVST: CBI DDRD,2 ;int0 为输入SER R16 ;接收开始OUT PORTC,R16 ;关显LDI R27,1CLR R26 ;接收数据指针,首指$100LDI R17,18 ;接收18个字符,其末尾为$0D$0AMOV R14,R17RCALL RVBYT1 ;接收第一个字符RJMP RVBYTRVBLOP: RCALL RVBYT2 ;接收第二个字符及其后字符RVBYT: LDS R17,$A3SBRC R17,6RJMP CLRBUF ;接收出错,转去清除$100--$14FSBRC R17,5RJMP DTCOM ;接收完整数据块,转去处理ST X+,R16DEC R14BRNE RVBLOP ;未收完18个字符,继续CPI R26,$42 ;指针达到$142?BREQ DTCOM ;接收完整数据块,转去处理DEC R26DEC R26 ;$0D$0A(CR&LF)丢掉RCVLP: LDI R17,18MOV R14,R17RJMP RVBLOPDTCOM: LDI R27,1CLR R26 ;接收数据首地址:$100DLLOP: CLR R29LDI R28,$90 ;处理ASCII码程序acum要求将数据放在$90--$9f LD R16,XCPI R16,$50 ;第一个字符约定为‘P’才有效BRNE RVCOM1 ;也是判断处理结束符DLLOP1: LD R16,X+ST Y+,R16CPI R28,$A0BRNE DLLOP1 ;传16个字符PUSH R26PUSH R27RCALL ACUM ;ASCII变BCD再变为二进制数,累加POP R27POP R26BRTS RVCOM1 ;ASCII码无效,转出!RJMP DLLOPRVCOM1:CLTRJMP CLRBUF ;转去清缓存区,重新接收;晶振采用4MHZ,指令(DEC+BRNE)耗时0.75微秒)! EX_INT0:POP R16 ;int0中断服务子程序POP R16 ;废弃返回地址LDI R16,HIGH(RCVST)PUSH R16LDI R16,LOW(RCVST)PUSH R16 ;设置返回地址IN R16,GIMSK ;禁止int0中断CBR R16,$40OUT GIMSK,R16RETIRVBYT1: LDI R17,2 ;查到0接收时,再做一次接收MOV R15,R17LDI R17,50 ;第一个起始位半位延时(50*0.75=38微秒)MOV R12,R17RJMP RVBCMRVBYT2: LDI R17,2MOV R15,R17RVBY2: LDI R17,147 ;110微秒>1位宽/9600baud,110/0.75=147 MOV R12,R17TEST3: SBI PORTD,2SBIS PIND,2 ;停止位超宽测试RJMP RVSTDEC R12BRNE TEST3LDS R16,$A3 ;110微秒内查到低电平为起始位ORI R16,$20STS $A3,R16 ;否则为接收结束,令$A3,5=1RETRVST: LDI R17,60 ;60*0.75=45微秒(半位延时)MOV R12,R17RVBCM: DEC R12BRNE RVBCMLDI R17,9 ;1位起始+8位数据MOV R13,R17SBI PORTD,2SBIC PIND,2RJMP RVER1 ;无效起始位(半位测试)RVLOP: LDI R17,130 ;may be 128-132/位延时常数MOV R12,R17RVLP1: DEC R12 ;0.25微秒BRNE RVLP1 ;0.5微秒/if condition is trueSECSBI PORTD,2SBIS PIND,2CLCDEC R13BRNE OVRRC ;不是停止位,转数据位接收BRCC RVER1 ;无效停止位,出错TST R16 ;BRNE RBYRT ;不为0,收到一个有效字符DEC R15BRNE RVBY2 ;2次接收到$00,出错RVER1: LDS R16,$A3ORI R16,$40 ;接收出错标志CBR R16,$20STS $A3,R16RBYRT: RETOVRRC: ROR R16 ;组织数据RJMP RVLOP ;100.7微秒/程序实设位宽;范例42 ;8535'T0中断发送ASCII码程序,晶振4MHZ .EQU DATA2=$150.ORG $000STRT32: RJMP RST32.ORG 009RJMP T0_OVF.ORG $011RST32: SER R17OUT DDRB,R17 ;B口为输出OUT PORTB,R17 ;输出高电平LDI R16,2 ;0B00000010/8 DIVIDED(4fc/8:2微秒)OUT $33,R17 ;写入tccr0LDI R16,204 ;(256-204)*2=104微秒/9600baud 104微秒/位!OUT TCNT0,R17 ;LDI R17,HIGH(ramend)OUT SPH,R17LDI R17,LOW(ramend)OUT SPL,R17LDI R25,HIGH(DA TA2)LDI R24,LOW(DATA2);发送数据指针LDS R17,$A3CBR R17,$14 ;发送出错标志($A3,4)/发送完毕标志位($A3,2)清除!STS $A3,R17SEILDI R17,1OUT TIMSK,R17 ;允许T/C0溢出中断CLR R17 ;位计数器请除HH32: LDS R16,$A3SBRC R16,4RJMP HHER32 ;出错SBRS R16,2 ;RJMP HH32 ;查询等待数据块发送完成;. ;其他程序略;. ;可安排接收对方发来数据程序,见STRT33 RJMP RST32HHER32:;.;. ;错误处理略RJMP RST32T0_OVF: PUSH R16IN R16,SREGPUSH R16PUSH R26PUSH R27IN R16,TCNT0INC R16SUBI R16,52 ;重写入一位定时常数(带修正)OUT TCNT0,R16MOV R26,R24 ;数据指针MOV R27,R25CPI R17,10BREQ SND10TST R17BRNE SND9SND0: CBI PORTB,0 ;发起始位(0)RJMP SVCOMSND9: CPI R17,9BRNE SND18 ;1-8为数据位SBI PORTB,0 ;9为停止位(1)CLR R17 ;停止位发完后,位计数器清除ADIW R24,1 ;指针增1,指下一位数据LD R16,XCPI R16,$0A ;本次发送的是$0A?BRNE SVCOM1LDI R17,10 ;停止位标志RJMP SVCOM1SND10: LDS R16,$A3SBR R16,4 ;发送完成标志STS $A3,R16 ;SND11: CLR R16OUT TCCR0,R16 ;关闭T/C0CLR R17 ;清位计数器LDI R24,LOW(DATA2);发送指针初始化LDI R25,HIGH(DA TA2)RJMP SVCOM1SENDER: LDS R16,$A3SBR R16,$10STS $A3,R16 ;建出错标志RJMP SND11SND18: BRCC SENDER ;大于10为错误LD R16,XROR R16 ;发送位传到进位CBRCC S182SBI PORTB,0 ;C(=1)-->PB0($18,0)BRCS S183S182: CBI PORTB,0 ;C(=0)-->PB0($18,0)S183: LD R16,XROR R16 ;ST X,R16 ;保存剩余位MOV R24,R26 ;存数据指针MOV R25,R27SVCOM: INC R17 ;位计数器增1SVCOM1: POP R27POP R26POP R16OUT SREG,R16POP R16 ;恢复现场RETI;范例43 ;8515/8535/晶振4MHZ RECEIVING ASCII CHAR. BY TCNT0&PB0 .EQU DATA3=$100 ;UES R11 SA VE SREG, R12 R13:数据指针DATA3;R14: 块长(BLOCK LENGTH),R15:接收字符暂存寄存器.ORG 0 ;R16:(THE BIT SEQUENCE COUNTER)位序列计数器;R17:WORKING REG.R18:FLAG UNIT,BAUD RATE:9600 STRT33: RJMP RST33 ;X&Y:POINTER/接收数据缓存区首地址:$100 .ORG $009 ;$007(8515)RJMP T0_OVF1.ORG $011 ;$00D(8515)RST33: LDI R17,HIGH(ramend)OUT SPH,R17LDI R17,LOW(ramend)OUT SPL,R17LDI R17,HIGH(DA TA3)MOV R12,R17LDI R17,LOW(DATA3)MOV R13,R17 ;R12R13:接收数据指针CLRBF1: CLR R16CLRLP: ST X+,R16CPI R26,$48BRNE CLRLP ;接收数据缓存区请除CLR R18 ;标志寄存器请除/R18,2:完整数据块收到,R18,1;第一字符(块长)收到:R18,0:出错LDI R17,$02 ;8535:$01OUT TIMSK,R17 ;允许T/C0溢出中断LDI R17,6 ;外部脉冲下降沿计数OUT TCCR0,R17CBI DDRB,0 ;PB0为输入LDI R17,$FFOUT TCNT0,R17 ;计一个数即中断;SEI ;TEST1: RCALL DSPL Y3 ;调串行移位显示子程序SBRC R18,0 ;RJMP DLERR ;出错,转错误处理SBRS R18,2 ;数据块接收完成?RJMP TEST1LDI R16,128DECLP: DEC R16BRNE DECLPRJMP DTCOM0 ;先延时,再转处理数据块DLERR: ;. ;出错处理;.;.RCALL DL50 ;延时50毫秒后RJMP RST33 ;重新接收DTCOM0: LDI R27,1CLR R26 ;数据存储区首地址$100DLLOP0: CLR R29LDI R28,$90 ;ASCII码处理区为$90--$9fLD R16,XCPI R16,$50 ;字母P打头才有效BRNE RVCOM0 ;否则为无效字串或ASCII码处理结束DLLO1: LD R16,X+ST Y+,R16CPI R28,$A0BRNE DLLO1 ;传送16个字符PUSH R26PUSH R27RCALL ACUM ;处理一组ASCII码数据POP R27POP R26BRTC DLLOP0 ;T=1,ASCII码数据无效CLT;. ;错误处理RJMP STRT33RVCOM0:;. ;错误处理;.RJMP STRT33T0_OVF1:IN R11,SREG ;T/C0中断服务PUSH R17CPI R16,0 ;起始位下降沿中断?BRNE T0SV10LDI R17,2 ;YESOUT TCCR0,R17 ;改为内定时(4MHZ/8分频)LDI R17,232 ;半位时间常数24 定48微秒(<52)OUT TCNT0,R17RJMP T0SV6T0SV10: CPI R16,1 ;1,半位定时到BRNE T0SV2SBI PORTB,0SBIC PINB,0RJMP T0ERR ;高电平,错误RJMP T0SV60 ;低电平,有效起始位T0SV2: CPI R16,10 ;BRNE T0SV3SBI PORTB0 ;10,接收停止位SBIS PINB,0RJMP T0ERR ;低电平,错误LDI R17,6OUT TCCR0,R17 ;改为外部脉冲下降沿计数,为接受下一位字符准备LDI R17,$FF ;计一个数即中断OUT TCNT0,R17CLR R16 ;位计数器请除SBRC R18,1 ;是第一个字符(r18,1=0)?RJMP T0SV21 ;否,为块内数据MOV R14,R15 ;块长转入r14SBR R18,2 ;块长已收到RJMP T0SV61T0SV21: PUSH XLPUSH XHMOV XH,R12MOV XL,R13 ;取缓存区指针ST X+,R15 ;字符送入缓存区MOV R12,XHMOV R13,XLPOP XHPOP XLDEC R14BRNE T0SV61SBR R18,4 ;块长减为0,完整数据块收到CLR R16OUT TCCR0,R16 ;停止TCNT0RJMP T0SV61T0SV3: BRCC T0ERR ;出错(大于10)CLC ;2--9:数据位SBI PORTB,0 ;接收一位数据SBIC PINB,0SECROR R15 ;数据组织到R15T0SV60: IN R17,TCNT0 ;读TCNT0计数值INC R17 ;SUBI R17,52OUT TCNT0,R17 ;写入补偿后的时间常数T0SV6: INC R16 ;位序列计数器增1T0SV61: POP R17OUT SREG,R11RETIT0ERR: CLR R16T0ERL: SBR R18,1 ;错误接收标志OUT TCCR0,R16 ;停止TCNT0RJMP T0SV61;范例44.ORG 0 ;8535多机通讯主机程序/振4MHZ.EQU DTPINT=$180 ;UBRR=12,波特率19200(REL.ERR.=0.16%).EQU DRPINT=$1C0 ;主机发往#1,#2,#3,#分机数据在;$180-18F,$190-19F,$1A0-1AF和$1B0-1BFSTRT34: RJMP RST34 ;主机接收#1,#2,#3,#4分机之数据块分别在;$1C0-1CF,$1D0-1DF,$1E0-1EF和$1F0-1FF.ORG $00BRJMP U_RXC ;UART接收完成中断.ORG $00CRJMP U_TXC ;UART 发送完成中断.ORG $011RST34: LDI R16,12OUT UBRR,R16 ;BAUD RA TE=FCP/16(UBRR+1)=4000000/(16*13)=19200 CLR R15 ;分机号初始化LDI R27,HIGH(DTPINT)LDI R26,LOW(DTPINT);发送数据指针,首指$180LDI R29,HIGH(DRPINT)LDI R28,LOW(DRPINT);接收数据指针(POINT TO $1C0) NEXTNO: LDI R16,$18OUT UCR,R16 ;允许UART接收和发送,8位数据模式INC R15 ;指向分机OUTLP: OUT UDR,R15 ;呼分机号TSLOP: IN R16,USRSBRS R16,7RJMP TSLOP ;分机返回机号?IN R16,UDRCP R16,R15 ;与发送分机号符合?BRNE OUTLP ;不符再发TXLOP: LD R16,X+OUT UDR,R16 ;向分机发送数据块TESTL: IN R17,USRSBRS R17,5 ;发送寄存器空?RJMP TESTLCPI R16,$0ABRNE TXLOP ;发完整个数据块?RXTST: IN R17,USRSBRS R17,7 ;RXC=1 分机发来数据RJMP RXTSTIN R16,UDRST Y+,R16 ;接收数据转入内存CPI R16,$0ABRNE RXTST ;接收完整数据块后MOV R16,R15CPI R16,4 ;转与下一分机通讯(只有4台分机)BRNE NEXTNO ;直到轮询完毕HH34: RJMP HH34 ;可改为处理分机发来数据,再转入下一周轮询.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 $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;范例45.ORG 0 ;8535多机通讯1#分机程序,晶振4MHZ.EQU DTPIT1=$180 ;UBRR=12 波特率19200(REL.ERR.=0.16%).EQU DRPNT1=$1C0STRT35: RJMP RST35.ORG $00BRJMP UARXC ;UART接收完成中断.ORG $00CRJMP UATXC ;UART发送寄存器空中断.ORG $011RST35:CLR R18 ;请除主机发来完整数据块标志(R18,7)/主机呼号选中分机;标志(R18,6)LDI R16,12OUT UBRR,R16 ;[BAUD RATE=FCP/16(UBRR+1)]LDI R16,HIGH(DRPNT1)MOV R8,R16LDI R16,LOW(DRPNT1)mov R9,R16 ;r8,r9:接收数据指针(FIRST POINT TO $1C0)LDI R16,$98 ;允许UART发送,接收,接收完成中断OUT UCR,R16SEICLR R15INC R15 ;1#分机设为1/2#分机设为2/3#分机设为3/4#分机设为4 RXDTS: SBRS R18,6 ;收到主机发来呼号?RJMP RXDTSOUT UDR,R15 ;将分机号反还主机TXDON: IN R16,USRSBRS R16,5RJMP TXDON ;发送寄存器空?RCVBLK: SBRS R18,7RJMP RCVBLK ;等待接收主机发来数据块LDI R16,HIGH(DTPIT1)MOV R6,R16LDI R16,LOW(DTPIT1)MOV R7,R16 ;设置发送数据指针r6r7,首指$180SBI UCR,5 ;UDRIE=1 ,引起发送寄存器空中断TXDN: SBIC UCR,5RJMP TXDNRJMP RST35 ;等待UDRIE=0 ,向主机发送数据块完毕后,转下一轮通讯:UART中断接收程序UARXC: IN R14,SREGTST R18BREQ NUMB ;无主机呼号选中标志,查机号PUSH R26PUSH R27IN R17,UDR ;读入接收数据MOV XH,R8MOV XL,R9 ;r8r9:接收数据缓存区指针,首指$1C0ST X+,R17MOV R8,XHMOV R9,XLCPI R17,$0A ;收到换行符?BRNE RSCOM1SBR R18,$80 ;建立数据块接收完毕标志RSCOM1: POP R27POP R26DRETI: OUT SREG,R14RETINUMB: IN R17,UDRCP R17,R15 ;主机呼号与本分机号符合?BRNE DRETI ;不符,转SBR R18,$40 ;建选中标志RJMP DRETI; UART中断发送数据程序UA TXC: IN R16,SREG ;r6 r7:the sendDATA pointer(FIRST POINT TO $180) PUSH R16PUSH R26PUSH R27MOV XH,R6MOV XL,R7 ;发送数据指针LD R16,X+MOV R6,XHMOV R7,XLOUT UDR,R16 ;发送数据写入数据寄存器CPI R16,$0A ;发送LF?BRNE SDCOMCBI UCR,5 ;禁止数据寄存器空中断(清UDRIE)LDI R16,HIGH(DRPINT)MOV R8,R16LDI R16,LOW(DRPINT)MOV R9,R16 ;为接收作准备(FIRST POINT TO $1C0)SDCOM: POP R27POP R26POP R16OUT SREG,R16POP R16RETI.DSEG.ORG $180DTPIT1: .BYTE $10;$41 $45 $65 $73 $46 $42 $40 $6F $33 $44 $66 $5C $4D $4B $0D $0A.ORG $1C0DRPNT1: .BYTE $10;$41 $45 $65 $73 $46 $42 $40 $6F $33 $44 $66 $5C $4D $4B $0D $0A;范例46.ORG $000 ;RS232<->RS485通讯标准转换/晶振4MHZSTRT36: RJMP RST485 ;使用8515!.ORG $009RJMP U_RXC ;UART 接收中断.ORG $00DRST485: LDI R16,2OUT SPH,R16LDI R16,$5f ;OUT SPL,R16LDI R16,$98 ;允许UART接收和发送,允许接收中断OUT UCR,R16LDI R16,12OUT UBRR,R16 ;波特率19200SBI DDRB,7SBI DDRB,6 ;PB7,PB6为输出CBI PORTB,7CBI PORTB,6 ;PB7控制485发送(高有效)PB6控制485接收(低有效) SEIHERE0: CPI R16,3 ;收到停止符?BRNE HERE0 ;未收到循环等待HERE1: SBIS USR,6 ;RJMP HERE1 ;等待停止符发送完毕CBI PORTB,7 ;禁止485发送CBI PORTB,6 ;允许485接收SBI USR,6 ;写‘1’清除发送完成标志!CLR R16RJMP HERE0 ;转等待下一轮中转U_RXC: SBI PORTB,7 ;允许485发送SBI PORTB,6 ;禁止485接收,IN R16,UDR ;读出接收数据,同时清除接收中断标志TSAGN: SBIS USR,6 ;上一数据发送完毕?RJMP TSAGNSBI USR,6 ;清除发送完成标志OUT UDR,R16 ;转发本次接收数据RETI;范例47.EQU DATA4=$220.ORG $000 ;同步串口通讯主机程序,晶振4MHZSTRT37: RJMP RST37.ORG $00A ;8535 SPI中断矢量(8515为$008)RJMP SPINT.ORG $011 ;$00D(8515)RST37: LDI R16,2OUT SPH,R16LDI R16,$5fOUT SPL,R16 ;堆栈指针初始化LDI R16,$A0OUT DDRB,R16 ;SCK,MOSI为输出LDI R16,$DCOUT SPCR,R16 ;允许SPI中断,先发送高位,主控方式,时钟为主频4分;频,后沿有效LDI XH,HIGH(DATA4)LDI XL,LOW(DA TA4);数据指针LDI R16,$30MOV R15,R16 ;数据块长LDI R16,12 ;0.25微秒SPI0: DEC R16 ;0.25微秒BRNE SPI0 ;0.5微秒总延时9微秒LD R16,XOUT SPDR,R16 ;写发送数据寄存器,启动发送SEIHH37: RJMP HH37 ;背景程序略SPINT: IN R14,SREGIN R16,SPDR ;读出接收数据ST X+,R16DEC R15BRNE SPI1 ;数据收发完毕?OUT SPCR,R15 ;是,停止收发OUT SREG,R14RETISPI1: LDI R16,6 ;0.25微秒SPI1A: DEC R16 ;0.25微秒BRNE SPI1A ;0.5微秒总共4.5微秒LD R16,XOUT SPDR,R16 ;发下一个数据OUT SREG,R14RETI;范例48.ORG $000STRT37S:RJMP RST37S ;同步串口通讯从机程序(8515) 晶振4MHZ .ORG $008 ;$00A(8535)RJMP SPINTS ;同步串口中断矢量.ORG $00D ;$011(8535)RST37S: LDI R16,2OUT SPH,R16LDI R16,$5fOUT SPL,R16LDI R16,$40OUT DDRB,R16 ;MISO为输出LDI R16,$CCOUT SPCR,R16 ;允许SPI中断,先发送高位,从控方式,时钟为主频4分频,后沿有效LDI YH,HIGH(DATA4)LDI YL,LOW(DA TA4);数据指针LDI R16,$30 ;数据长度LD R15,YOUT SPDR,R15 ;写入数据寄存器SEIHH37S: RJMP HH37S ;背景程序从略SPINTS: IN R14,SREGIN R15,SPDR ;读接收数据ST Y+,R15DEC R16BRNE SPI2 ;数据块收发完毕OUT SPCR,R16 ;停止中断收发RJMP SPI3SPI2: LD R15,YOUT SPDR,R15 ;发下一数据SPI3: OUT SREG,R14RETI;范例49 以模拟串口与串行移位寄存器74165通讯,以74165驱动LED显示子程序DSPL Y3: SBI DDRC,1 ;PC1,串行数据输出SBI DDRC,0 ;PC0,移位时钟CBI PORTC,0 ;LDI R17,8 ;8字节显示缓存区$60(高)--$67(低))MOV R8,R17CLR XHLDI XL,$60 ;指针,首指最高位($60)SRDLOP: LDI R17,8 ;8位/字节MOV R9,R17LD R10,X+LDI ZH,HIGH(TABLE*2)LDI ZL,LOW(TABLE*2);使用DSPY子程序段选表ADD ZL,R10 ;加代码寻址BRCC DSPL1INC ZHDSPL1: LPM ;取段选码COM R0 ;取为反码SENDLP: ROR R0 ;段选码右移一位C<--R0最低位CBI PORTC,1BRCC SNDL1 ;进位C传给PC1SBI PORTC,1SNDL1: SBI PORTC,0 ;移位时钟,上升沿有效CBI PORTC,0 ;移位时钟变低DEC R9BRNE SENDLP ;8位段选码循环右移DEC R8BRNE SRDLOP ;8位LED显示数据都更新一遍?RET ;是,结束。
AVR单片机的串行通信
whl () i e 1 {
Trn mi ip taa ; a s t( ud t) n
送 ;读寄存器时将读取移位寄存 器接收缓 冲区的值 。
};
}
3 实例 分析
现 将 A 9 S 5 5与 A 9 S 4 4两 个 系 统 相 连来 进 行 数 据 T 0 83 T043
口也 同样 允 许 在 A m g 列 单 片 机 和 外 设 或 其 他 A R 系 列 T ea系 V
单片机之 间高速 同步数据传输 。A 9 T 0系列 S I P 特征如下 :
()采 用 全 双 T 模式 ,3线 同步 进 行 数据 传 输 。 1 () 可 以 当作 主 机或 从 机 上 作 。 2 () 可 配 置 为 MS 3 B方 式 或 L B方 式 。 S
Ke r s VR sn l — h p; P S r l o y wo d :A ig e c i S I; e a mmu ia in i c nc t o
l 前 言
A R单 片 机 是 由美 国 A M E V T L公 司 19 年 开 始 逐 步设 计 97
SI P 既可 以工作在 主模式下 ,也可 以 : 【 作在从模式下。当工作 在主模式下 时 ,每发送 或接收一位数 据 ,都需 要一次 时钟作 用 ;而 当工作 在从模式下 时 ,每次接 收到时钟信 号之后 才进 行一位数据 的发送或接 收。S I P 主机— —从机的互联如 图, 1所 示, 系统包括两个移位寄存器和一个主机时钟发 生器 。将 需要 的从机 的 s s引脚拉低 ,从而使主机启动一次通信过程 。主机 和 从机 将需 要 发送 的数 据放 入 相应 的移 位 寄存 器 。主 机在
S K 引 脚 上 产 生 时 钟 脉 冲 以 交 换 数 据 。 S K引 脚 是 主 机 模 式 C C 时 的时 钟 输 出 以及 从 机 模 式 的 时钟 输 入 。 主 机 数 据 从 主 机 的 MO I 出 , 由从 机 的 MO I 人 ; 从 机 数 据 由从 机 MIO 移 S移 S移 S 出 , 由主机 的 M S 移入 。 主 机通 过将 从 机 的 S IO s拉 高实 现 与
AVR简单的串口通信程序
AVR简单的串口通信程序
本例子是学习AVR 的串口通信时候编写的一个简单的串口通信的程序,运行的时候先向串口发送一个数据0x12,然后等待接收,当PC 机发送一个数据到单片机,单片机就对这个数据进行加1 处理,然后发回到PC 机显示。
以下是串口通信时候的界面和串口通信的源程序。
/***********************************************/
/************AVR USART 串口调试****************/
/************ClimberWin 2008.6.29**************/
/*CPU:ATMEGA32L 4MHZ 外部晶振(熔断位需要先配置好外部晶振)*/ /*说明:AVR 串口是通过UDR 发送出去的,类似于51 单片机的SBUF*/
/*程序功能:能够通过串行数据发送给PC 机0x12 数据,接收上位机数据并且+1 后发送回上位机*/
#include //AVR I/O 口定义头文件
#include // 延时头文件调用
#include interrupt.h> // 中断头文件调用
#define uchar unsigned char
//引脚定义
#define AVR_RXD 0 //PD0 RXD
#define AVR_TXD 1 //PD1 TXD
//常量定义
#define BAUDRATE 9600 //波特率定义
uchar UART_MID; //定义一个缓存区数据临时存储地址
/*******************串口接收中断服务程序*************************/。
AVR单片机与PC机串口通讯程序
A V R单片机与P C机串口通讯程序(总3页)本页仅作为文档封面,使用时可以删除This document is for reference only-rar21year.MarchProteus环境下完成本实验时,需要roteus中设COMPIM////-----------------------------------------------------------------#define F_CPU 4000000UL //4M晶振#include <avr/>#include <avr/>#include <util/>#define INT8U unsigned char#define INT16U unsigned int//数字串接收缓冲struct{INT8U Buf_Array[100]; //缓冲空间INT8U Buf_Len; //当前缓冲长度} Receive_Buffer ;//清空缓冲标志INT8U Clear_Buffer_Flag = 0;//0-9的数字编码,最后一位为黑屏const INT8U SEG_CODE[] ={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00}; char *s = "\n", *p;//------------------------------------------------------------------// USART初始化//------------------------------------------------------------------void Init_USART(){UCSRB = _BV(RXEN)|_BV(TXEN)|_BV(RXCIE);UCSRC = _BV(URSEL)|_BV(UCSZ1)|_BV(UCSZ0);UBRRL = (F_CPU/9600/16-1)%256;UBRRH = (F_CPU/9600/16-1)/256;}//------------------------------------------------------------------// 发送一个字符//------------------------------------------------------------------void PutChar(char c){if(c=='\n') PutChar('\r');UDR = c;while(!(UCSRA&_BV(UDRE)));}//------------------------------------------------------------------// 显示所接收的数字字符(数字字符由PC串口发送,AVR串口接收) //------------------------------------------------------------------void Show_Received_Digits(){INT8U i;for(i=0;i<;i++){PORTC= SEG_CODE[[i]];_delay_ms(400);}}//------------------------------------------------------------------// 主程序//------------------------------------------------------------------int main(){= 0;DDRB = 0x00; PORTB = 0xFF;DDRC = 0xFF; PORTC = 0x00;DDRD = 0x02; PORTD = 0xFF;MCUCR = 0x08;GICR =_BV(INT1);Init_USART();sei();while(1)Show_Received_Digits();}//-----------------------------------------------------------------// 串口接收中断函数//-----------------------------------------------------------------ISR (USART_RXC_vect){INT8U c= UDR;//如果接收到回车换行符则设置清空缓冲标志if(c=='\r'||c=='\n') Clear_Buffer_Flag=1;if(c>='0'&&c<='9'){//如果上次曾收到清空缓冲标志,则本次从缓冲开始位置存放 if(Clear_Buffer_Flag==1){= 0;Clear_Buffer_Flag = 0;}//缓存新接收的数字[]= c-'0';//刷新缓冲长度(不超过最大长度)if<100) ++;}}//-----------------------------------------------------------------// INT1中断函数(向PC发送字符串)//-----------------------------------------------------------------ISR (INT1_vect){INT8U i = 0;while(s[i]!='\0')PutChar(s[i++]);// 向PC发送字符串}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
;范例40.ORG 0 ;8535UART串行通讯程序,晶振4MHZ.EQU DTPINT=$180 ;UBRR=12 波特率19200(REL.ERR.=0.16%).EQU DRPINT=$1D0STRT30: RJMP RST30.ORG $00BRJMP U_RXC ;UART接收完成中断.ORG $00CRJMP U_TXC ;UART发送寄存器空中断.ORG $011RST30: LDS R16,$A3 ;CBR R16,3STS $A3,R16 ;清完整ASCII数据块接收到标志($A3,1),错误标志(FE/OR)($A3,0) LDI R16,12OUT UBRR,R16 ;BAUD RA TE=FCP/16(UBRR+1)=19200LDI R27,HIGH(DIPINT)MOV R6,R27LDI R26,LOW(DTPINT)MOV R7,R26 ;发送数据指针在r6r7(dtpint)CLR R11INC R11LDI R16,$30 ;发送数据块长度为$30MOV R12,R16RCALL CRC0 ;得到CRC检测之余式(冲掉$0D&$0A)INC XLINC XLLDI R16,$0DST X+,R16LDI R16,$0AST X,R16 ;在数据块末尾加$0D&$0A,实际发送数据块长度为$32LDI R16,$B8 ;允许UART发送和接收,接收中断,发送寄存器空中断,8位数据OUT UCR,R16LDI R16,HIGH(DRPINT)MOV R8,R16LDI R16,LOW(DRPINT)MOV R9,R16 ;r8,r9:接收缓存区指针(FIRST POINT TO $1D0)CLR R10 ;接收数据块长预先清除SEI ;HH30: LDS R16,$A3SBRC R16,0 ;错误接收?RJMP RCVER ;错误处理SBRS R16,1 ;接收数据完成?RJMP HH30 ;否,转再查询RCVEF: CLR R11 ;块长予处理INC R11DEC R10DEC R10 ;$0D&$0A不算块长度之内(故将块长减2)MOV R12,R10 ;(R11,R12):块长LDI XH,HIGH(DRPINT)MOV R8,XHLDI XL,LOW(DRPINT)MOV R9,XLRCALL CRC0 ;恢复出CRC余式LDI R16,$0DCP R16,R14BRNE CRCERLDI R16,$0ACP R16,R15 ;恢复出$0D$0A为正确接收BREQ HH30CRCER: ;. ;循环冗余检测错误处理;.;.RJMP STRT30RCVER: CBI UCR,RXCIE;. ;接收错误(FE/OR)处理;. ;(过程略);.RJMP STRT30:UART接收数据块程序U_RXC: PUSH R16IN R16,SREGPUSH R16PUSH R26PUSH R27RSC1: IN R16,USR ;UART状态寄存器ANDI R16,$18 ;FE/OR ERROR?BRNE RVERR ;错误转INC R10 ;块长加1MOV XH,R8MOV XL,R9 ;r8r9:接收数据指针,首指$1D0IN R16,UDRST X+,r16 ;MOV R8,XHMOV R9,XLCPI R16,$0A ;收到最末字符(回车命令LF)?BRNE RSCOMLDS R16,$A3SBR R16,2 ;建立数据块接收完毕标志STS $A3,R16CBI UCR,RXCIE ;禁止接收中断RJMP RSCOMRVERR: LDS R16,$A3SBR R16,1STS $A3,R16 ;$A3,0:FE/OR错误接收标志RSCOM: POP R27POP R26POP R16OUT SREG,R16POP R16RETI; UART发送数据块程序U_TXC: PUSH R16IN R16,SREGPUSH R16PUSH R26PUSH R27SPSV1: MOV XH,R6MOV XL,R7 ;发送数据指针,首指$180LD R16,X+ ;取发送数据,调指针MOV R6,XHMOV R7,XLSPS11: OUT UDR,R16 ;送入数据寄存器,移入发送移位寄存器后即引起数据寄存器空中断CPI R16,$0ABRNE SPCOMCBI UCR,UDRIE ;发送最末字符后禁止发送寄存器空中断LDI R16,HIGH(DRPINT)MOV R8,R16LDI R16,LOW(DRPINT)MOV R9,R16 ;接收数据指针初始化,指向$1D0;CBI USR,6 ;SPCOM: POP R27POP R26POP R16OUT SREG,R16POP R16RETI.DSEG.ORG $180DTPINT:.BYTE $32;$41,$45,$65,$73,$46,$42,$40,$6F,$33,$44,$66,$8C,$4D,$4B,$2F,$67;$42,$4F,$66,$78,$47,$45,$44,$63,$32,$48,$60,$7C,$6D,$45,$2A,$63;$43,$56,$55,$53,$4D,$4F,$40,$2E,$31,$42,$67,$4C,$47,$4A,$38,$39;$0D,$0A.EQU DRPINT=$1D0.ORG $1D0DRPINT: .BYTE $34 ;(内容略);范例41 ;外部中断int0接收ASCII码数据块.ORG 0 ;8515/8535/晶振4MHZSTRT31: RJMP RST31RJMP EX_INT0.ORG $00D ;8535外部中断0RST31: LDI R17,HIGH(ramend)OUT SPH,R17LDI R17,LOW(ramend)OUT SPL R17LDI R17,2OUT TCCR1B,R17 ;4mhz/8分频,计数单位为2微秒,TCCR1B:$2e LDI R17,$40OUT GIMSK,R17 ;gimsk,6(允许int0中断)LDI R17,2OUT MCUCR,R17 ;设INT0为下降沿中断(mcucr'b1&b0=10)CBI DDRD,2 ;int0 为输入;.;. ;其他初始化略SEI ;CLRBUF: LDI R27,1CLR R26 ;接收数据缓存区首址$100LDI R17,$40OUT GIMSK,R17 ;gimsk,6CLR R17CLRLOP: ST X+,R17CPI R26,$48BRNE CLRLOP ;清接收缓存区($100--$147)LDS R16,$A3CBR R16,$60STS $A3,R16 ;接收错误($A3,6)和接收完成($A3,5)标志清除CLR5: ;.;. ;背景程序略RJMP CLR5 ;RCVST: CBI DDRD,2 ;int0 为输入SER R16 ;接收开始OUT PORTC,R16 ;关显LDI R27,1CLR R26 ;接收数据指针,首指$100LDI R17,18 ;接收18个字符,其末尾为$0D$0AMOV R14,R17RCALL RVBYT1 ;接收第一个字符RJMP RVBYTRVBLOP: RCALL RVBYT2 ;接收第二个字符及其后字符RVBYT: LDS R17,$A3SBRC R17,6RJMP CLRBUF ;接收出错,转去清除$100--$14FSBRC R17,5RJMP DTCOM ;接收完整数据块,转去处理ST X+,R16DEC R14BRNE RVBLOP ;未收完18个字符,继续CPI R26,$42 ;指针达到$142?BREQ DTCOM ;接收完整数据块,转去处理DEC R26DEC R26 ;$0D$0A(CR&LF)丢掉RCVLP: LDI R17,18MOV R14,R17RJMP RVBLOPDTCOM: LDI R27,1CLR R26 ;接收数据首地址:$100DLLOP: CLR R29LDI R28,$90 ;处理ASCII码程序acum要求将数据放在$90--$9f LD R16,XCPI R16,$50 ;第一个字符约定为‘P’才有效BRNE RVCOM1 ;也是判断处理结束符DLLOP1: LD R16,X+ST Y+,R16CPI R28,$A0BRNE DLLOP1 ;传16个字符PUSH R26PUSH R27RCALL ACUM ;ASCII变BCD再变为二进制数,累加POP R27POP R26BRTS RVCOM1 ;ASCII码无效,转出!RJMP DLLOPRVCOM1:CLTRJMP CLRBUF ;转去清缓存区,重新接收;晶振采用4MHZ,指令(DEC+BRNE)耗时0.75微秒)! EX_INT0:POP R16 ;int0中断服务子程序POP R16 ;废弃返回地址LDI R16,HIGH(RCVST)PUSH R16LDI R16,LOW(RCVST)PUSH R16 ;设置返回地址IN R16,GIMSK ;禁止int0中断CBR R16,$40OUT GIMSK,R16RETIRVBYT1: LDI R17,2 ;查到0接收时,再做一次接收MOV R15,R17LDI R17,50 ;第一个起始位半位延时(50*0.75=38微秒)MOV R12,R17RJMP RVBCMRVBYT2: LDI R17,2MOV R15,R17RVBY2: LDI R17,147 ;110微秒>1位宽/9600baud,110/0.75=147 MOV R12,R17TEST3: SBI PORTD,2SBIS PIND,2 ;停止位超宽测试RJMP RVSTDEC R12BRNE TEST3LDS R16,$A3 ;110微秒内查到低电平为起始位ORI R16,$20STS $A3,R16 ;否则为接收结束,令$A3,5=1RETRVST: LDI R17,60 ;60*0.75=45微秒(半位延时)MOV R12,R17RVBCM: DEC R12BRNE RVBCMLDI R17,9 ;1位起始+8位数据MOV R13,R17SBI PORTD,2SBIC PIND,2RJMP RVER1 ;无效起始位(半位测试)RVLOP: LDI R17,130 ;may be 128-132/位延时常数MOV R12,R17RVLP1: DEC R12 ;0.25微秒BRNE RVLP1 ;0.5微秒/if condition is trueSECSBI PORTD,2SBIS PIND,2CLCDEC R13BRNE OVRRC ;不是停止位,转数据位接收BRCC RVER1 ;无效停止位,出错TST R16 ;BRNE RBYRT ;不为0,收到一个有效字符DEC R15BRNE RVBY2 ;2次接收到$00,出错RVER1: LDS R16,$A3ORI R16,$40 ;接收出错标志CBR R16,$20STS $A3,R16RBYRT: RETOVRRC: ROR R16 ;组织数据RJMP RVLOP ;100.7微秒/程序实设位宽;范例42 ;8535'T0中断发送ASCII码程序,晶振4MHZ .EQU DATA2=$150.ORG $000STRT32: RJMP RST32.ORG 009RJMP T0_OVF.ORG $011RST32: SER R17OUT DDRB,R17 ;B口为输出OUT PORTB,R17 ;输出高电平LDI R16,2 ;0B00000010/8 DIVIDED(4fc/8:2微秒)OUT $33,R17 ;写入tccr0LDI R16,204 ;(256-204)*2=104微秒/9600baud 104微秒/位!OUT TCNT0,R17 ;LDI R17,HIGH(ramend)OUT SPH,R17LDI R17,LOW(ramend)OUT SPL,R17LDI R25,HIGH(DA TA2)LDI R24,LOW(DATA2);发送数据指针LDS R17,$A3CBR R17,$14 ;发送出错标志($A3,4)/发送完毕标志位($A3,2)清除!STS $A3,R17SEILDI R17,1OUT TIMSK,R17 ;允许T/C0溢出中断CLR R17 ;位计数器请除HH32: LDS R16,$A3SBRC R16,4RJMP HHER32 ;出错SBRS R16,2 ;RJMP HH32 ;查询等待数据块发送完成;. ;其他程序略;. ;可安排接收对方发来数据程序,见STRT33 RJMP RST32HHER32:;.;. ;错误处理略RJMP RST32T0_OVF: PUSH R16IN R16,SREGPUSH R16PUSH R26PUSH R27IN R16,TCNT0INC R16SUBI R16,52 ;重写入一位定时常数(带修正)OUT TCNT0,R16MOV R26,R24 ;数据指针MOV R27,R25CPI R17,10BREQ SND10TST R17BRNE SND9SND0: CBI PORTB,0 ;发起始位(0)RJMP SVCOMSND9: CPI R17,9BRNE SND18 ;1-8为数据位SBI PORTB,0 ;9为停止位(1)CLR R17 ;停止位发完后,位计数器清除ADIW R24,1 ;指针增1,指下一位数据LD R16,XCPI R16,$0A ;本次发送的是$0A?BRNE SVCOM1LDI R17,10 ;停止位标志RJMP SVCOM1SND10: LDS R16,$A3SBR R16,4 ;发送完成标志STS $A3,R16 ;SND11: CLR R16OUT TCCR0,R16 ;关闭T/C0CLR R17 ;清位计数器LDI R24,LOW(DATA2);发送指针初始化LDI R25,HIGH(DA TA2)RJMP SVCOM1SENDER: LDS R16,$A3SBR R16,$10STS $A3,R16 ;建出错标志RJMP SND11SND18: BRCC SENDER ;大于10为错误LD R16,XROR R16 ;发送位传到进位CBRCC S182SBI PORTB,0 ;C(=1)-->PB0($18,0)BRCS S183S182: CBI PORTB,0 ;C(=0)-->PB0($18,0)S183: LD R16,XROR R16 ;ST X,R16 ;保存剩余位MOV R24,R26 ;存数据指针MOV R25,R27SVCOM: INC R17 ;位计数器增1SVCOM1: POP R27POP R26POP R16OUT SREG,R16POP R16 ;恢复现场RETI;范例43 ;8515/8535/晶振4MHZ RECEIVING ASCII CHAR. BY TCNT0&PB0 .EQU DATA3=$100 ;UES R11 SA VE SREG, R12 R13:数据指针DATA3;R14: 块长(BLOCK LENGTH),R15:接收字符暂存寄存器.ORG 0 ;R16:(THE BIT SEQUENCE COUNTER)位序列计数器;R17:WORKING REG.R18:FLAG UNIT,BAUD RATE:9600 STRT33: RJMP RST33 ;X&Y:POINTER/接收数据缓存区首地址:$100 .ORG $009 ;$007(8515)RJMP T0_OVF1.ORG $011 ;$00D(8515)RST33: LDI R17,HIGH(ramend)OUT SPH,R17LDI R17,LOW(ramend)OUT SPL,R17LDI R17,HIGH(DA TA3)MOV R12,R17LDI R17,LOW(DATA3)MOV R13,R17 ;R12R13:接收数据指针CLRBF1: CLR R16CLRLP: ST X+,R16CPI R26,$48BRNE CLRLP ;接收数据缓存区请除CLR R18 ;标志寄存器请除/R18,2:完整数据块收到,R18,1;第一字符(块长)收到:R18,0:出错LDI R17,$02 ;8535:$01OUT TIMSK,R17 ;允许T/C0溢出中断LDI R17,6 ;外部脉冲下降沿计数OUT TCCR0,R17CBI DDRB,0 ;PB0为输入LDI R17,$FFOUT TCNT0,R17 ;计一个数即中断;SEI ;TEST1: RCALL DSPL Y3 ;调串行移位显示子程序SBRC R18,0 ;RJMP DLERR ;出错,转错误处理SBRS R18,2 ;数据块接收完成?RJMP TEST1LDI R16,128DECLP: DEC R16BRNE DECLPRJMP DTCOM0 ;先延时,再转处理数据块DLERR: ;. ;出错处理;.;.RCALL DL50 ;延时50毫秒后RJMP RST33 ;重新接收DTCOM0: LDI R27,1CLR R26 ;数据存储区首地址$100DLLOP0: CLR R29LDI R28,$90 ;ASCII码处理区为$90--$9fLD R16,XCPI R16,$50 ;字母P打头才有效BRNE RVCOM0 ;否则为无效字串或ASCII码处理结束DLLO1: LD R16,X+ST Y+,R16CPI R28,$A0BRNE DLLO1 ;传送16个字符PUSH R26PUSH R27RCALL ACUM ;处理一组ASCII码数据POP R27POP R26BRTC DLLOP0 ;T=1,ASCII码数据无效CLT;. ;错误处理RJMP STRT33RVCOM0:;. ;错误处理;.RJMP STRT33T0_OVF1:IN R11,SREG ;T/C0中断服务PUSH R17CPI R16,0 ;起始位下降沿中断?BRNE T0SV10LDI R17,2 ;YESOUT TCCR0,R17 ;改为内定时(4MHZ/8分频)LDI R17,232 ;半位时间常数24 定48微秒(<52)OUT TCNT0,R17RJMP T0SV6T0SV10: CPI R16,1 ;1,半位定时到BRNE T0SV2SBI PORTB,0SBIC PINB,0RJMP T0ERR ;高电平,错误RJMP T0SV60 ;低电平,有效起始位T0SV2: CPI R16,10 ;BRNE T0SV3SBI PORTB0 ;10,接收停止位SBIS PINB,0RJMP T0ERR ;低电平,错误LDI R17,6OUT TCCR0,R17 ;改为外部脉冲下降沿计数,为接受下一位字符准备LDI R17,$FF ;计一个数即中断OUT TCNT0,R17CLR R16 ;位计数器请除SBRC R18,1 ;是第一个字符(r18,1=0)?RJMP T0SV21 ;否,为块内数据MOV R14,R15 ;块长转入r14SBR R18,2 ;块长已收到RJMP T0SV61T0SV21: PUSH XLPUSH XHMOV XH,R12MOV XL,R13 ;取缓存区指针ST X+,R15 ;字符送入缓存区MOV R12,XHMOV R13,XLPOP XHPOP XLDEC R14BRNE T0SV61SBR R18,4 ;块长减为0,完整数据块收到CLR R16OUT TCCR0,R16 ;停止TCNT0RJMP T0SV61T0SV3: BRCC T0ERR ;出错(大于10)CLC ;2--9:数据位SBI PORTB,0 ;接收一位数据SBIC PINB,0SECROR R15 ;数据组织到R15T0SV60: IN R17,TCNT0 ;读TCNT0计数值INC R17 ;SUBI R17,52OUT TCNT0,R17 ;写入补偿后的时间常数T0SV6: INC R16 ;位序列计数器增1T0SV61: POP R17OUT SREG,R11RETIT0ERR: CLR R16T0ERL: SBR R18,1 ;错误接收标志OUT TCCR0,R16 ;停止TCNT0RJMP T0SV61;范例44.ORG 0 ;8535多机通讯主机程序/振4MHZ.EQU DTPINT=$180 ;UBRR=12,波特率19200(REL.ERR.=0.16%).EQU DRPINT=$1C0 ;主机发往#1,#2,#3,#分机数据在;$180-18F,$190-19F,$1A0-1AF和$1B0-1BFSTRT34: RJMP RST34 ;主机接收#1,#2,#3,#4分机之数据块分别在;$1C0-1CF,$1D0-1DF,$1E0-1EF和$1F0-1FF.ORG $00BRJMP U_RXC ;UART接收完成中断.ORG $00CRJMP U_TXC ;UART 发送完成中断.ORG $011RST34: LDI R16,12OUT UBRR,R16 ;BAUD RA TE=FCP/16(UBRR+1)=4000000/(16*13)=19200 CLR R15 ;分机号初始化LDI R27,HIGH(DTPINT)LDI R26,LOW(DTPINT);发送数据指针,首指$180LDI R29,HIGH(DRPINT)LDI R28,LOW(DRPINT);接收数据指针(POINT TO $1C0) NEXTNO: LDI R16,$18OUT UCR,R16 ;允许UART接收和发送,8位数据模式INC R15 ;指向分机OUTLP: OUT UDR,R15 ;呼分机号TSLOP: IN R16,USRSBRS R16,7RJMP TSLOP ;分机返回机号?IN R16,UDRCP R16,R15 ;与发送分机号符合?BRNE OUTLP ;不符再发TXLOP: LD R16,X+OUT UDR,R16 ;向分机发送数据块TESTL: IN R17,USRSBRS R17,5 ;发送寄存器空?RJMP TESTLCPI R16,$0ABRNE TXLOP ;发完整个数据块?RXTST: IN R17,USRSBRS R17,7 ;RXC=1 分机发来数据RJMP RXTSTIN R16,UDRST Y+,R16 ;接收数据转入内存CPI R16,$0ABRNE RXTST ;接收完整数据块后MOV R16,R15CPI R16,4 ;转与下一分机通讯(只有4台分机)BRNE NEXTNO ;直到轮询完毕HH34: RJMP HH34 ;可改为处理分机发来数据,再转入下一周轮询.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 $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;范例45.ORG 0 ;8535多机通讯1#分机程序,晶振4MHZ.EQU DTPIT1=$180 ;UBRR=12 波特率19200(REL.ERR.=0.16%).EQU DRPNT1=$1C0STRT35: RJMP RST35.ORG $00BRJMP UARXC ;UART接收完成中断.ORG $00CRJMP UATXC ;UART发送寄存器空中断.ORG $011RST35:CLR R18 ;请除主机发来完整数据块标志(R18,7)/主机呼号选中分机;标志(R18,6)LDI R16,12OUT UBRR,R16 ;[BAUD RATE=FCP/16(UBRR+1)]LDI R16,HIGH(DRPNT1)MOV R8,R16LDI R16,LOW(DRPNT1)mov R9,R16 ;r8,r9:接收数据指针(FIRST POINT TO $1C0)LDI R16,$98 ;允许UART发送,接收,接收完成中断OUT UCR,R16SEICLR R15INC R15 ;1#分机设为1/2#分机设为2/3#分机设为3/4#分机设为4 RXDTS: SBRS R18,6 ;收到主机发来呼号?RJMP RXDTSOUT UDR,R15 ;将分机号反还主机TXDON: IN R16,USRSBRS R16,5RJMP TXDON ;发送寄存器空?RCVBLK: SBRS R18,7RJMP RCVBLK ;等待接收主机发来数据块LDI R16,HIGH(DTPIT1)MOV R6,R16LDI R16,LOW(DTPIT1)MOV R7,R16 ;设置发送数据指针r6r7,首指$180SBI UCR,5 ;UDRIE=1 ,引起发送寄存器空中断TXDN: SBIC UCR,5RJMP TXDNRJMP RST35 ;等待UDRIE=0 ,向主机发送数据块完毕后,转下一轮通讯:UART中断接收程序UARXC: IN R14,SREGTST R18BREQ NUMB ;无主机呼号选中标志,查机号PUSH R26PUSH R27IN R17,UDR ;读入接收数据MOV XH,R8MOV XL,R9 ;r8r9:接收数据缓存区指针,首指$1C0ST X+,R17MOV R8,XHMOV R9,XLCPI R17,$0A ;收到换行符?BRNE RSCOM1SBR R18,$80 ;建立数据块接收完毕标志RSCOM1: POP R27POP R26DRETI: OUT SREG,R14RETINUMB: IN R17,UDRCP R17,R15 ;主机呼号与本分机号符合?BRNE DRETI ;不符,转SBR R18,$40 ;建选中标志RJMP DRETI; UART中断发送数据程序UA TXC: IN R16,SREG ;r6 r7:the sendDATA pointer(FIRST POINT TO $180) PUSH R16PUSH R26PUSH R27MOV XH,R6MOV XL,R7 ;发送数据指针LD R16,X+MOV R6,XHMOV R7,XLOUT UDR,R16 ;发送数据写入数据寄存器CPI R16,$0A ;发送LF?BRNE SDCOMCBI UCR,5 ;禁止数据寄存器空中断(清UDRIE)LDI R16,HIGH(DRPINT)MOV R8,R16LDI R16,LOW(DRPINT)MOV R9,R16 ;为接收作准备(FIRST POINT TO $1C0)SDCOM: POP R27POP R26POP R16OUT SREG,R16POP R16RETI.DSEG.ORG $180DTPIT1: .BYTE $10;$41 $45 $65 $73 $46 $42 $40 $6F $33 $44 $66 $5C $4D $4B $0D $0A.ORG $1C0DRPNT1: .BYTE $10;$41 $45 $65 $73 $46 $42 $40 $6F $33 $44 $66 $5C $4D $4B $0D $0A;范例46.ORG $000 ;RS232<->RS485通讯标准转换/晶振4MHZSTRT36: RJMP RST485 ;使用8515!.ORG $009RJMP U_RXC ;UART 接收中断.ORG $00DRST485: LDI R16,2OUT SPH,R16LDI R16,$5f ;OUT SPL,R16LDI R16,$98 ;允许UART接收和发送,允许接收中断OUT UCR,R16LDI R16,12OUT UBRR,R16 ;波特率19200SBI DDRB,7SBI DDRB,6 ;PB7,PB6为输出CBI PORTB,7CBI PORTB,6 ;PB7控制485发送(高有效)PB6控制485接收(低有效) SEIHERE0: CPI R16,3 ;收到停止符?BRNE HERE0 ;未收到循环等待HERE1: SBIS USR,6 ;RJMP HERE1 ;等待停止符发送完毕CBI PORTB,7 ;禁止485发送CBI PORTB,6 ;允许485接收SBI USR,6 ;写‘1’清除发送完成标志!CLR R16RJMP HERE0 ;转等待下一轮中转U_RXC: SBI PORTB,7 ;允许485发送SBI PORTB,6 ;禁止485接收,IN R16,UDR ;读出接收数据,同时清除接收中断标志TSAGN: SBIS USR,6 ;上一数据发送完毕?RJMP TSAGNSBI USR,6 ;清除发送完成标志OUT UDR,R16 ;转发本次接收数据RETI;范例47.EQU DATA4=$220.ORG $000 ;同步串口通讯主机程序,晶振4MHZSTRT37: RJMP RST37.ORG $00A ;8535 SPI中断矢量(8515为$008)RJMP SPINT.ORG $011 ;$00D(8515)RST37: LDI R16,2OUT SPH,R16LDI R16,$5fOUT SPL,R16 ;堆栈指针初始化LDI R16,$A0OUT DDRB,R16 ;SCK,MOSI为输出LDI R16,$DCOUT SPCR,R16 ;允许SPI中断,先发送高位,主控方式,时钟为主频4分;频,后沿有效LDI XH,HIGH(DATA4)LDI XL,LOW(DA TA4);数据指针LDI R16,$30MOV R15,R16 ;数据块长LDI R16,12 ;0.25微秒SPI0: DEC R16 ;0.25微秒BRNE SPI0 ;0.5微秒总延时9微秒LD R16,XOUT SPDR,R16 ;写发送数据寄存器,启动发送SEIHH37: RJMP HH37 ;背景程序略SPINT: IN R14,SREGIN R16,SPDR ;读出接收数据ST X+,R16DEC R15BRNE SPI1 ;数据收发完毕?OUT SPCR,R15 ;是,停止收发OUT SREG,R14RETISPI1: LDI R16,6 ;0.25微秒SPI1A: DEC R16 ;0.25微秒BRNE SPI1A ;0.5微秒总共4.5微秒LD R16,XOUT SPDR,R16 ;发下一个数据OUT SREG,R14RETI;范例48.ORG $000STRT37S:RJMP RST37S ;同步串口通讯从机程序(8515) 晶振4MHZ .ORG $008 ;$00A(8535)RJMP SPINTS ;同步串口中断矢量.ORG $00D ;$011(8535)RST37S: LDI R16,2OUT SPH,R16LDI R16,$5fOUT SPL,R16LDI R16,$40OUT DDRB,R16 ;MISO为输出LDI R16,$CCOUT SPCR,R16 ;允许SPI中断,先发送高位,从控方式,时钟为主频4分频,后沿有效LDI YH,HIGH(DATA4)LDI YL,LOW(DA TA4);数据指针LDI R16,$30 ;数据长度LD R15,YOUT SPDR,R15 ;写入数据寄存器SEIHH37S: RJMP HH37S ;背景程序从略SPINTS: IN R14,SREGIN R15,SPDR ;读接收数据ST Y+,R15DEC R16BRNE SPI2 ;数据块收发完毕OUT SPCR,R16 ;停止中断收发RJMP SPI3SPI2: LD R15,YOUT SPDR,R15 ;发下一数据SPI3: OUT SREG,R14RETI;范例49 以模拟串口与串行移位寄存器74165通讯,以74165驱动LED显示子程序DSPL Y3: SBI DDRC,1 ;PC1,串行数据输出SBI DDRC,0 ;PC0,移位时钟CBI PORTC,0 ;LDI R17,8 ;8字节显示缓存区$60(高)--$67(低))MOV R8,R17CLR XHLDI XL,$60 ;指针,首指最高位($60)SRDLOP: LDI R17,8 ;8位/字节MOV R9,R17LD R10,X+LDI ZH,HIGH(TABLE*2)LDI ZL,LOW(TABLE*2);使用DSPY子程序段选表ADD ZL,R10 ;加代码寻址BRCC DSPL1INC ZHDSPL1: LPM ;取段选码COM R0 ;取为反码SENDLP: ROR R0 ;段选码右移一位C<--R0最低位CBI PORTC,1BRCC SNDL1 ;进位C传给PC1SBI PORTC,1SNDL1: SBI PORTC,0 ;移位时钟,上升沿有效CBI PORTC,0 ;移位时钟变低DEC R9BRNE SENDLP ;8位段选码循环右移DEC R8BRNE SRDLOP ;8位LED显示数据都更新一遍?RET ;是,结束。