|
这个程序我是按照马老师的<<一个USART(RS232)低层驱动+中间层软件示例>>( http://www.ouravr.com/bbs/bbs_content.jsp?bbs_sn=147242&bbs_page_no=1&search_mode=1&search_text=USART&bbs_id=9999 )改写的但是不知为什么,每次单片机都是不断的复位,详见以下程序,能否麻烦马老师抽空帮我看看!我想这是由于我的浮躁(记得马老师批过我这类学习态度)和急于求成造成的吧,但目前实在是找不到原因,还请马老师批评指正!以前通过看马老师的帖子和回复跟着马老师学了不少知识,在此感谢马老师!
//tool:ICCAVR
//crystal:8M (M16)
#include "iom16v.h"
#include "macros.h"
#define TEST_LED_ON (PORTB|=(1<<PB4)) //=======LED_ON
#define TEST_LED_OF (PORTB&=~(1<<PB4)) //=======LED_OF
#define DATA_REGISTER_EMPTY (1<<UDRE)
// USART Transmitter buffer========================================
#define TX_BUFFER_SIZE 20
unsigned char tx_buffer[TX_BUFFER_SIZE];//发送缓冲区
#if TX_BUFFER_SIZE<256 //定义发送缓冲区环形对列的控制指针
unsigned char tx_wr_index;// tx_wr_index为写指针,
unsigned char tx_rd_index;// tx_rd_index为读指针
unsigned char tx_cnter ;// tx_cnter为在队列中要发送的字符个数
#else
unsigned int tx_wr_index,tx_rd_index,tx_cnter;//
#endif
//==================================================================
void Delayms(unsigned int i)
{
unsigned int j;
for (;i!=0;i--)
{for (j=100;j!=0;j--); }
}
//=================================================================
#pragma interrupt_handler uart0_tx_isr:14
void uart0_tx_isr(void)
{
if (tx_cnter)
{
tx_cnter--;
UDR = tx_buffer[tx_rd_index];
if (++tx_rd_index == TX_BUFFER_SIZE) tx_rd_index = 0;
}
}
void TX_char(unsigned char c)
{
while(tx_cnter == TX_BUFFER_SIZE) ;
CLI();
if (tx_cnter || ((UCSRA & DATA_REGISTER_EMPTY)==0))
{
tx_buffer[tx_wr_index] = c;
if (++tx_wr_index == TX_BUFFER_SIZE) tx_wr_index=0;
++tx_cnter;
}
else UDR = c;
SEI();
}
//================================================================
void main(void) //==============main
{
CLI(); //disable all interrupts
PORTA = 0x00;
DDRA = 0x00;
PORTB = 0x00;//
DDRB = 0x10;
PORTC = 0x00; //
DDRC = 0x00;
PORTD = 0x00;
DDRD = 0x02;//
UCSRB = 0x00; //disable while setting baud rate
UCSRA = 0x00;
UCSRC = (1<<URSEL)|(0<<UMSEL)|(1<<UCSZ1)|(1<<UCSZ0)|(0<<UCPOL);//异步模式,8位数据+1位停止位
UBRRL = 51; //set baud rate lo 9600:51 4800:103 2400:207(8MHz)
UBRRH = 0x00; //set baud rate hi
UCSRB=(0<<RXEN)|(1<<TXEN)|(0<<RXCIE)|(0<<TXCIE);//允许发送
SEI();
tx_cnter=0;//
TEST_LED_ON ;//LED亮
Delayms(1000);
UCSRB |= 1<<TXCIE;//开中断
while(1)
{
Delayms(1000);//
TEST_LED_OF ;//LED在此熄灭,只要单片机不复位,就不会亮了,但是它一直在亮!!!!
//用示波器看了一下,上电后LED有4次反复短暂熄灭后又亮了的过程,之后就一直亮!
//上电时用串口调试助手测试TX脚收到数据:82828282,之后就没有数据了!
//此外单片机的电源很稳定.
TX_char('8');
TX_char('2');
TX_char('3');
TX_char('4');
TX_char('5');
}
} |
阿莫论坛20周年了!感谢大家的支持与爱护!!
你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。
|