//端口初始化
void Port_Init()
{
PORTA=0xff;
DDRA=0x30; //PA4,PA5输出1
PORTB=0xbf;
DDRB=0xb7; //PB1输出1,PB2输出1,PB3输入0,PB4输出1,PB0输出1(用于新终端开关电源控制),PB5PB7为输出1
PORTC=0xff;
DDRC=0xd0; //PC4输出1,PC6,PC7输出1
PORTD=0xff;
DDRD=0x26; //PD0输入0,PD1输出1,PD5PD2输出1
}
void main(void)
{
// unsigned char dataa,i,j;
SREG=0x80; //开放全局中断
Port_Init();
USART0_Init();
USART1_Init();
// GPRS_On();
SPI_MasterInit();EEPROM_WRSR();
while(1)
{
USART0_Transmit(0x22);
USART0_Transmit(0x33);
EEPROM_ByteWrite(0x2030,0x48); //给25256地址0x2030写入数据0x48
USART0_Transmit(EEPROM_Read(0x2010));
USART0_Transmit(EEPROM_Read(0x2030));//读出地址0x2030中数据,从串口0发送出来
USART0_Transmit(0x44);
USART0_Transmit(0x55);
USART0_Transmit(EEPROM_RDSR());
EEPROM_PageWrite(0x1001,"456789",6); //输出结果0xff,0xff,0xff,0x37,0x38,0x39
USART0_Transmit(EEPROM_Read(0x1001));
USART0_Transmit(EEPROM_Read(0x1002));
USART0_Transmit(EEPROM_Read(0x1003));
USART0_Transmit(EEPROM_Read(0x1004));
USART0_Transmit(EEPROM_Read(0x1005));
USART0_Transmit(EEPROM_Read(0x1006));
USART0_Transmit(0x11);
}
}
/* //IAR中中断的写法
#pragma vector=USART0_RXD_vect
__interrupt void Usart0Rx(void)
{
unsigned char dataa;
dataa=UDR0;
usart0_transmit(dataa);
}
*/
//串行0通信接收完成中断\
//ICC中中断的写法
#pragma interrupt_handler USART0Rx:20
void USART0Rx()
{
unsigned char data0;
data0=UDR0;
USART0_Transmit(data0);
}
/*串行1通信接收完成中断
分析灯不亮原因,开了串口1中断,但是没有加入中断函数,导致其他地方不能工作。
串口中断0能执行,是由于其优先级比串口中断1高
以下是书上的说法:
接收结束标志位(RXC)用来说明接收缓冲器中是否有未读出的数据。当接收缓冲器中有未读出的
数据时,此位为1,当接收缓冲器空时为0(即不包含未读出的数据)。如果接收器被禁止(RXEN=0),
接收缓冲器会被刷新,从而使RXC清零。
置位UCSRB的接收结束中断使能位(RXCIE)后,只要RXC标志置位(且全局中断使能)就会产生USART
接收结束中断。使用中断方式进行数据接收时,数据接收结束中断服务程序必须从UDR读取数据
以清除RXC标志,否则只要中断处理程序结束,一个新的中断就会产生。
终上所述,RXC标志未清零,导致中断一直产生。
*/
#pragma interrupt_handler USART1Rx:21
void USART1Rx()
{
unsigned char data1;
data1=UDR1;
// USART1_Transmit(data1);
}
本文关键字:程序 AVR单片机,单片机-工控设备 - AVR单片机