代码:
/*《AVR专题精选》随书例程2.编程技巧项目:不对变量进行初始化文件:main.c说明:演示不对变量进行默认初始化的方法。在proteus仿真例程中,按下按键,就可以看到两个变量输出结果的变化。作者:邵子扬时间:2012年12月12日*/// 串口波特率
#define BAUDRATE 9600UL// 系统时钟频率
#define F_CPU 8000000UL#include <avr/io.h>
#include <util/delay.h>
#include <stdio.h>// 变量cnt1声明noinit属性,不会进行初始化
char cnt1 __attribute__ ((section (".noinit")));
// 变量cnt2会进行初始化
char cnt2;// 串口输出缓冲区
char s[20];// 串口读写
#define UART_read() UDR
#define UART_write(dat) UDR = dat// 串口初始化
void UART_init()
{unsigned int UBRRREG;UBRRREG = F_CPU / ( 8 * BAUDRATE ) - 1;UBRRH = UBRRREG / 256;UBRRL = UBRRREG % 256;UCSRA = ( 1 << U2X );UCSRB = ( 1 << TXEN );UCSRC = (1 << URSEL ) | ( 1 << UCSZ1 ) | ( 1 << UCSZ0 );
}void UART_puts( char *s )
{while( *s ){UART_write( *s );s++;while( !( UCSRA & (1 << TXC )) );UCSRA |= ( 1 << TXC );}
}int main()
{UART_init();PORTD = (1 << PD2);while(1){_delay_ms(500); // 延时// 将两个变量的值转换为字符串sprintf(s, "%02X, %02X\n\r", cnt1, cnt2);// 输出到串口UART_puts(s);// 变量递增cnt1++;cnt2++;// 如果按键按下if (!(PIND & ( 1 << PD2))){// 等待释放按键,防止抖动和重复进入while(!(PIND & ( 1 << PD2)));// 跳转到0x0000, 相当于软复位// 对应的proteus仿真图中,还有RESET复位按键可以对比// 效果是一样的(*((void(*)(void))(0)))();}}return 0;
}
仿真效果图;