📄 usart.lst
字号:
__start:
__text_start:
0016 E5CF LDI R28,0x5F
0017 E0D2 LDI R29,2
0018 BFCD OUT 0x3D,R28
0019 BFDE OUT 0x3E,R29
001A 51C0 SUBI R28,0x10
001B 40D0 SBCI R29,0
001C EA0A LDI R16,0xAA
001D 8308 STD Y+0,R16
001E 2400 CLR R0
001F E6E1 LDI R30,0x61
0020 E0F0 LDI R31,0
0021 E010 LDI R17,0
0022 36E2 CPI R30,0x62
0023 07F1 CPC R31,R17
0024 F011 BEQ 0x0027
0025 9201 ST R0,Z+
0026 CFFB RJMP 0x0022
0027 8300 STD Z+0,R16
0028 E2EA LDI R30,0x2A
0029 E0F0 LDI R31,0
002A E6A0 LDI R26,0x60
002B E0B0 LDI R27,0
002C E010 LDI R17,0
002D 32EB CPI R30,0x2B
002E 07F1 CPC R31,R17
002F F021 BEQ 0x0034
0030 95C8 LPM
0031 9631 ADIW R30,1
0032 920D ST R0,X+
0033 CFF9 RJMP 0x002D
0034 D026 RCALL _main
_exit:
0035 CFFF RJMP _exit
_uart0_rx_isr:
0036 922A ST R2,-Y
0037 B62F IN R2,0x3F
0038 922A ST R2,-Y
FILE: E:\AVR开~1\例程\实验15_串口通讯回送数据\usart.c
(0001) //******************************************************************************
(0002) // *
(0003) // FileName : 实验板uart.c ICCAVR V6.31A编译 *
(0004) // Function : uart应用练习 ,回送PC发送的数据,从而双向通讯。 *
(0005) // Date : 2006-05-07 *
(0006) // Version : 1.0 *
(0007) // *
(0008) // Author : 开关电源 hongtusy@163.com *
(0009) // Company : 电子信息技术咨询网 http://www.itsn.cn *
(0010) // *
(0011) //***************************描述与记事*****************************************
(0012) //实验板的AVR程序,uart应用,和计算机通讯,回送PC发送的数据
(0013) //接线定义:PD0-RXD PD1-TXD 开关位置:SW6-7/8打开。
(0014) //使用串口调试器,使用十六进制方式,首先让PC发送一个字符给MCU,然后将接收到MCU返回的值。
(0015) //记事:本程序旨在对uart的理解与演示,程序适合初学者使用.
(0016) //使用片外8MHz晶体,9600bps波特率
(0017) //******************************************************************************
(0018)
(0019) #include <iom16v.h> //头文件,ATmega8535单片机的寄存器定义
(0020) #include <macros.h> //包含有SEI()、CLI()、NOP()、WDR()、等宏定义.
(0021)
(0022) typedef unsigned char uchar; //数据类型说明,无符号整型,两字节大小。
(0023) typedef unsigned int uint; //数据类型说明,无符号字符型,单字节大小。
(0024)
(0025) #define BAUDRATE 9600 //波特率
(0026) #define F_CPU 8000000 //系统晶体频率
(0027) uchar temprecv=0xf0,tempsend;
(0028) /*========*/
(0029)
(0030) #pragma interrupt_handler uart0_rx_isr: 12
(0031)
(0032) void uart0_rx_isr(void)
(0033) {
(0034)
(0035) temprecv=UDR;
0039 B02C IN R2,0x0C
003A 92200060 STS temprecv,R2
(0036) //while(!(UCSRA&(1<<UDRE)));
(0037) UDR = temprecv;
003C B82C OUT 0x0C,R2
003D 9029 LD R2,Y+
003E BE2F OUT 0x3F,R2
003F 9029 LD R2,Y+
0040 9518 RETI
_DelaymS:
j --> R20
i --> R16
0041 D031 RCALL push_gset1
(0038)
(0039) }
(0040) /************************************************
(0041) 函 数 名: DelaymS()
(0042) 功 能: 毫秒级延时函数
(0043) 输入参数: 延迟时间/系统晶体
(0044) 输出参数: 做相应的延迟处理
(0045) 描 述: /
(0046) ***********************************************/
(0047) void DelaymS (uint i) //延时函数,参数i为延时时间
(0048) {
(0049) uchar j; //双重延时
(0050) for (;i!=0;i--)
0042 C007 RJMP 0x004A
(0051) {
(0052) for (j=30;j!=0;j--);
0043 E14E LDI R20,0x1E
0044 C001 RJMP 0x0046
0045 954A DEC R20
0046 2344 TST R20
0047 F7E9 BNE 0x0045
0048 5001 SUBI R16,1
0049 4010 SBCI R17,0
004A 3000 CPI R16,0
004B 0701 CPC R16,R17
004C F7B1 BNE 0x0043
004D D028 RCALL pop_gset1
004E 9508 RET
(0053) }
(0054) }
(0055) /********************************************************
(0056) 子程序名: usart_Init()
(0057) 功 能: 串口初始化
(0058) 输入参数: /
(0059) 输出参数: /
(0060) 描 述: /
(0061) ********************************************************/
(0062) void usart_Init (void)
(0063) {
(0064) CLI(); //关闭中断
_usart_Init:
004F 94F8 BCLR 7
(0065) UBRRL= (F_CPU/BAUDRATE/16-1)%256;
0050 E383 LDI R24,0x33
0051 B989 OUT 0x09,R24
(0066) UBRRH= (F_CPU/BAUDRATE/16-1)/256;
0052 2422 CLR R2
0053 BC20 OUT 0x20,R2
(0067) //UBRRL=51; //波特率寄存器,UART:9600bps,8.000MHz
(0068) UCSRB = (1<<RXEN)|(1<<TXEN)|(1<<RXCIE); //接收结束中断使能,RXD&TXD使能
0054 E988 LDI R24,0x98
0055 B98A OUT 0x0A,R24
(0069) UCSRC = (1<<URSEL)|(1<<UPM1)|(1<<UCSZ0)|(1<<UCSZ1);
0056 EA86 LDI R24,0xA6
0057 BD80 OUT 0x20,R24
(0070) //访问UCSRC寄存器,偶校验,8个数据位,默认一个停止位,
(0071) SREG = 0b10000000;
0058 E880 LDI R24,0x80
0059 BF8F OUT 0x3F,R24
005A 9508 RET
(0072) //TIMSK =0X00;
(0073) //SEI(); //开全局中断使能
(0074) }
(0075) //*****************主程序**********************************
(0076) void main (void)
(0077) {
(0078) uchar temp=0xff;
_main:
temp --> R20
005B EF4F LDI R20,0xFF
(0079) usart_Init(); //串口初始化
005C DFF2 RCALL _usart_Init
005D C00B RJMP 0x0069
(0080) while(1) //无限循环执行
(0081) {
(0082) //if (UCSRA & (1<<RXC)) //等待接收完成,
(0083) //{
(0084) // temp = UDR; //将接收到的数据暂存
(0085) //while(!(UCSRA&(1<<UDRE)));
(0086) if(temp!=temprecv)
005E 90200060 LDS R2,temprecv
0060 1542 CP R20,R2
0061 F029 BEQ 0x0067
(0087) {
(0088) while(!(UCSRA&(1<<UDRE)));
0062 9B5D SBIS 0x0B,5
0063 CFFE RJMP 0x0062
(0089) UDR = temprecv; //将接收到的数据发送出去
0064 90200060 LDS R2,temprecv
0066 B82C OUT 0x0C,R2
(0090) }
(0091)
(0092) temp=temprecv;
FILE: <library>
0067 91400060 LDS R20,temprecv
0069 CFF4 RJMP 0x005E
006A 9508 RET
push_gset5:
006B 92FA ST R15,-Y
006C 92EA ST R14,-Y
push_gset4:
006D 92DA ST R13,-Y
006E 92CA ST R12,-Y
push_gset3:
006F 92BA ST R11,-Y
0070 92AA ST R10,-Y
push_gset2:
0071 937A ST R23,-Y
0072 936A ST R22,-Y
push_gset1:
0073 935A ST R21,-Y
0074 934A ST R20,-Y
0075 9508 RET
pop_gset1:
0076 E0E1 LDI R30,1
pop:
0077 9149 LD R20,Y+
0078 9159 LD R21,Y+
0079 FDE0 SBRC R30,0
007A 9508 RET
007B 9169 LD R22,Y+
007C 9179 LD R23,Y+
007D FDE1 SBRC R30,1
007E 9508 RET
007F 90A9 LD R10,Y+
0080 90B9 LD R11,Y+
0081 FDE2 SBRC R30,2
0082 9508 RET
0083 90C9 LD R12,Y+
0084 90D9 LD R13,Y+
0085 FDE3 SBRC R30,3
0086 9508 RET
0087 90E9 LD R14,Y+
0088 90F9 LD R15,Y+
0089 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -