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

📄 uart.lis

📁 该代码是ATMEGA16单片机下的串口通讯程序
💻 LIS
字号:
                        .module uart.c
                        .area vector(rom, abs)
                        .org 44
 002C 0C940500          jmp _uart_rx
                        .area data(ram, con, rel)
 0000           _data_tx::
 0000                   .blkb 1
                        .area idata
 0000 00                .byte 0
                        .area data(ram, con, rel)
 0001                   .dbfile D:\ELECTRICS\MCU\AVR\ICC_EXAM\UART\uart.c
 0001                   .dbsym e data_tx _data_tx c
 0001           _data_rx::
 0001                   .blkb 1
                        .area idata
 0001 00                .byte 0
                        .area data(ram, con, rel)
 0002                   .dbfile D:\ELECTRICS\MCU\AVR\ICC_EXAM\UART\uart.c
 0002                   .dbsym e data_rx _data_rx c
                        .area text(rom, con, rel)
 0000                   .dbfile D:\ELECTRICS\MCU\AVR\ICC_EXAM\UART\uart.c
 0000                   .dbfunc e main _main fV
                        .even
 0000           _main::
 0000                   .dbline -1
 0000                   .dbline 20
 0000           ; // **************************************************************
 0000           ; // ***                              AVR单片机应用程序                           ***
 0000           ; // ***                    RS232通信演示程序                             ***
 0000           ; // ***                       2005年10月                       ***
 0000           ; // ***      目标MCU:MEGA16,晶振:内部(INT)8MHZ,19200,8bit,N,1 ***
 0000           ; // ***                   实现将PC机串行给MEGA16的数送回给PCS机                  ***                     
 0000           ; // **************************************************************
 0000           ; #include<iom16v.h>
 0000           ; #include<macros.h>
 0000           ; #include "uart.h"
 0000           ; 
 0000           ; /*声明串口接收中断入口*/
 0000           ; #pragma interrupt_handler uart_rx:12 
 0000           ; unsigned char data_tx=0,data_rx=0; //定义发送缓存和接收缓存
 0000           ; 
 0000           ; 
 0000           ; 
 0000           ; /*RS232通信main函数*/ 
 0000           ; void main(void)
 0000           ; {
 0000                   .dbline 21
 0000           ;  CLI();                                                                           //关中断
 0000 F894              cli
 0002                   .dbline 22
 0002           ;  uart_init();                                                         //串口初始化              
 0002 0FD0              xcall _uart_init
 0004                   .dbline 23
 0004           ;  SEI();                                                                               //开中断                                          
 0004 7894              sei
 0006           L2:
 0006                   .dbline 25
 0006                   .dbline 25
 0006                   .dbline 25
 0006           L3:
 0006                   .dbline 24
 0006 FFCF              xjmp L2
 0008           X0:
 0008                   .dbline -2
 0008                   .dbline 26
 0008           ;  while(1)
 0008           ;  {uart_rx;}
 0008           ; }
 0008           L1:
 0008                   .dbline 0 ; func end
 0008 0895              ret
 000A                   .dbend
 000A                   .dbfunc e uart_rx _uart_rx fV
                        .even
 000A           _uart_rx::
 000A 0E940000          xcall push_lset
 000E                   .dbline -1
 000E                   .dbline 30
 000E           ; 
 000E           ; /*串口接收函数*/
 000E           ; void uart_rx(void) 
 000E           ; { 
 000E                   .dbline 31
 000E           ;    data_rx = UDR;
 000E 2CB0              in R2,0xc
 0010 20920100          sts _data_rx,R2
 0014                   .dbline 32
 0014           ;    data_tx=data_rx;
 0014 20920000          sts _data_tx,R2
 0018                   .dbline 33
 0018           ;    putchar(data_tx);  
 0018 022D              mov R16,R2
 001A 0ED0              xcall _putchar
 001C                   .dbline -2
 001C                   .dbline 34
 001C           ; } 
 001C           L5:
 001C 0E940000          xcall pop_lset
 0020                   .dbline 0 ; func end
 0020 1895              reti
 0022                   .dbend
 0022                   .dbfunc e uart_init _uart_init fV
                        .even
 0022           _uart_init::
 0022                   .dbline -1
 0022                   .dbline 39
 0022           ; 
 0022           ; 
 0022           ; /*串口初始化函数*/
 0022           ; void uart_init(void)
 0022           ; {
 0022                   .dbline 40
 0022           ;   UCSRB = 0x00;                                               //设置波特率时关闭发送和接收
 0022 2224              clr R2
 0024 2AB8              out 0xa,R2
 0026                   .dbline 41
 0026           ;   UBRRL = 0x19;
 0026 89E1              ldi R24,25
 0028 89B9              out 0x9,R24
 002A                   .dbline 42
 002A           ;   UBRRH = 0x00;                                                       //设定波特率,19200
 002A 20BC              out 0x20,R2
 002C                   .dbline 43
 002C           ;   UCSRA = 0x00;                                                       //初始化
 002C 2BB8              out 0xb,R2
 002E                   .dbline 44
 002E           ;   UCSRC = 0x86;                                       //设置帧格式,8位数据,无奇偶校验,1位停止位
 002E 86E8              ldi R24,134
 0030 80BD              out 0x20,R24
 0032                   .dbline 45
 0032           ;   UCSRB =(1<<RXCIE)|(1<<RXEN)|(1<<TXEN);    //允许发送和接收,接收中断使能
 0032 88E9              ldi R24,152
 0034 8AB9              out 0xa,R24
 0036                   .dbline -2
 0036                   .dbline 46
 0036           ; }
 0036           L6:
 0036                   .dbline 0 ; func end
 0036 0895              ret
 0038                   .dbend
 0038                   .dbfunc e putchar _putchar fV
 0038           ;           data -> R16
                        .even
 0038           _putchar::
 0038                   .dbline -1
 0038                   .dbline 51
 0038           ; 
 0038           ; 
 0038           ; /*字节输出函数*/
 0038           ; void putchar(unsigned char data)
 0038           ;       {        
 0038           L8:
 0038                   .dbline 52
 0038           L9:
 0038                   .dbline 52
 0038           ;      while (!(UCSRA&(1<<UDRE)));              //判断上次发送是否完成
 0038 5D9B              sbis 0xb,5
 003A FECF              rjmp L8
 003C                   .dbline 53
 003C           ;        UDR=data;                              //发送数据    
 003C 0CB9              out 0xc,R16
 003E                   .dbline -2
 003E                   .dbline 54
 003E           ;       }       
 003E           L7:
 003E                   .dbline 0 ; func end
 003E 0895              ret
 0040                   .dbsym r data 16 c
 0040                   .dbend

⌨️ 快捷键说明

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