|
我用您的AVR-51实验板调试了很久了。就下面那么一小段程序,基本是CVAVR生成的,不知道为什么用串口精灵连续发送文件时,板子会复位。请您指点一下。感激不尽!
/*****************************************************
Chip type : ATmega16L
Program type : Application
Clock frequency : 11.059200 MHz
Memory model : Small
External SRAM size : 0
Data Stack size : 256
*****************************************************/
#include <mega16.h>
#include <delay.h>
//------------------------------蜂鸣器,复位时会鸣响一声---------------------
#define buzzer_port PORTD.7
void buzzer(unsigned char times)//
{
unsigned char i=0;
unsigned int buzzer_time=0;
while(i<times)
{
for(buzzer_time=0;buzzer_time<40;buzzer_time++)
{
buzzer_port=~buzzer_port;
delay_us(250);
}
i++;
}
buzzer_port=1;
}
// ----------------------------LED数码管,PA口接数据线,PB口接选择线---------------
flash unsigned char led_7[19]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40,0xff,0x00};
flash unsigned char position[8]={0b11111110,
0b11111101,
0b11111011,
0b11110111,
0b11101111,
0b11011111,
0b10111111,
0b01111111
};
unsigned char posit=0; //
unsigned char dis_buff[8]; //
//---------高位为0时,消隐不显示---------------
void hidden_zero(void)
{
if(dis_buff[0]==0)
{
dis_buff[0]=18;
if(dis_buff[1]==0)
{
dis_buff[1]=18;
if(dis_buff[2]==0)
{
dis_buff[2]=18;
if(dis_buff[3]==0)
{
dis_buff[3]=18;
if(dis_buff[4]==0)
{
dis_buff[4]=18;
if(dis_buff[5]==0)
{
dis_buff[5]=18;
if(dis_buff[6]==0)
{
dis_buff[6]=18;
if(dis_buff[7]==0)
{
dis_buff[7]=18;
}
}
}
}
}
}
}
}
}
//--------------------------2MS调用一次,显示------------------------------------
void display_led_7(void)
{
hidden_zero();
PORTB=0xff;
PORTA=led_7[dis_buff[posit]];
PORTB=position[posit];
if(++posit>=8) posit=0;
}
//---------------------初始化为88888888------------------------
void init_display_led_7(void)
{
unsigned char j;
for(j=0;j<8;j++)
dis_buff[j]=17;
delay_ms(500);
}
//移位显示收到的ASCII码
void display(unsigned char c)
{
unsigned char i;
for(i=3;i<8;i++)
{
dis_buff[i-3]=dis_buff[i-1];
dis_buff[i-2]=dis_buff;
}
dis_buff[6]=c/16;
dis_buff[7]=c%16;
}
//********************************
// USART
//********************************
//UCSRA
#define RXC 7 //½ÓÊÕ½áÊø±êÖ¾
#define TXC 6 //·¢ËͽáÊø±êÖ¾
#define UDRE 5 //USART DATA REGISTER EMPTY
#define FE 4 //FRAME ERROR
#define DOR 3 //DATA OVER RUN
#define PE 2 //PARITY ERROR
#define U2X 1 //
#define MPCM 0 //
//UCSRB
#define RXCIE 7
#define TXCIE 6
#define UDRIE 5
#define RXEN 4
#define TXEN 3
#define UCSZ2 2
#define RXB8 1
#define TXB8 0
//UCSRC
#define URSEL 7 // 1:Ñ¡ÔñUCSRC 0£ºÑ¡ÔñUBBRH
#define UMSEL 6 // 1£ºÒ첽ģʽ 0£ºÍ¬²½Ä£Ê½
#define UPM1 5 //parity mode
#define UMP0 4 //00 :ÎÞУÑé 01£ºreserved 10£ºÅ¼Ð£Ñé 11:ÆæУÑé
#define USBS 3 //0: 1λֹͣλ 1£º2λֹͣλ
#define UCSZ1 2 //11°Ëλ»ò¾ÅλÊý¾Ý
#define UCSZ0 1 //
#define UCPOL 0 //XCK(ÉÏÉýÑØ·¢ËÍ£¬Ï½µÑزÉÑù)
#define FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<PE)
#define DATA_OVERRUN (1<<DOR)
#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)
// USART Receiver buffer
#define RX_BUFFER_SIZE 128
char rx_buffer[RX_BUFFER_SIZE];
#if RX_BUFFER_SIZE<256
unsigned char rx_wr_index,rx_rd_index,rx_counter;
#else
unsigned int rx_wr_index,rx_rd_index,rx_counter;
#endif
// This flag is set on USART Receiver buffer overflow
bit rx_buffer_overflow;
//============================ USART Receiver interrupt service routine=============
interrupt [USART_RXC] void usart_rx_isr(void)
{
char status,data;
status=UCSRA;
data=UDR;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
{
rx_buffer[rx_wr_index]=data;
if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
if (++rx_counter >(RX_BUFFER_SIZE-32))
{
rx_counter=0;
rx_buffer_overflow=1;
};
};
}
#ifndef _DEBUG_TERMINAL_IO_
//================ Get a character from the USART Receiver buffer===============
#define _ALTERNATE_GETCHAR_
#pragma used+
char getchar(void)
{
char data;
while (rx_counter==0);
data=rx_buffer[rx_rd_index];
if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
#asm("cli")
--rx_counter;
#asm("sei")
return data;
}
#pragma used-
#endif
// USART Transmitter buffer
#define TX_BUFFER_SIZE 128
char tx_buffer[TX_BUFFER_SIZE];
#if TX_BUFFER_SIZE<256
unsigned char tx_wr_index,tx_rd_index,tx_counter;
#else
unsigned int tx_wr_index,tx_rd_index,tx_counter;
#endif
// =======================USART Transmitter interrupt service routine===============
interrupt [USART_TXC] void usart_tx_isr(void)
{
if (tx_counter)
{
--tx_counter;
UDR=tx_buffer[tx_rd_index];
if (++tx_rd_index == TX_BUFFER_SIZE) tx_rd_index=0;
};
}
#ifndef _DEBUG_TERMINAL_IO_
//======================= Write a character to the USART Transmitter buffer==============
#define _ALTERNATE_PUTCHAR_
#pragma used+
void putchar(char c)
{
while (tx_counter == TX_BUFFER_SIZE);
#asm("cli")
if (tx_counter || ((UCSRA & DATA_REGISTER_EMPTY)==0))
{
tx_buffer[tx_wr_index]=c;
if (++tx_wr_index == TX_BUFFER_SIZE) tx_wr_index=0;
++tx_counter;
}
else
UDR=c;
#asm("sei")
}
#pragma used-
#endif
// ====================Timer 0 output compare interrupt service routine============
char timer_2ms=0;
interrupt [TIM0_COMP] void timer0_comp_isr(void)
{
// Place your code here
if(++timer_2ms>=2)
{
timer_2ms=0;
display_led_7();
}
}
#include <stdio.h>
//====================================================主程序================
unsigned char ascii;
void main(void)
{
PORTA=0x00;
DDRA=0xFF;
PORTB=0x00;
DDRB=0xFF;
PORTC=0x00;
DDRC=0x00;
PORTD=0x80;
DDRD=0x80;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 172.800 kHz
// Mode: CTC top=OCR0
// OC0 output: Disconnected
TCCR0=0x0B;
TCNT0=0xAD;
OCR0=0xAD;
// Timer/Counter 1 initialization
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer/Counter 2 initialization
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x02;
// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud rate: 9600
UCSRA=0x00;
UCSRB=0xD8;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x47;
// Analog Comparator initialization
ACSR=0x80;
SFIOR=0x00;
// Global enable interrupts
#asm("sei")
init_display_led_7();
buzzer(4); //复位时鸣响
while (1)
{
// Place your code here
ascii=getchar();
if(ascii!=0)
{
putchar(ascii);
display(ascii);
}
};
} |
阿莫论坛20周年了!感谢大家的支持与爱护!!
一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
|