/************************************************************************************
*** 慧净电子10天学会AVR单片机与C语言视频教程配套程序源码 ***
*** 实验目的:HJ-1 M16 AVR实验板 《推荐用慧净电子的HJ-2G AVR多功能二合一开发板》 ***
*** MCU: ATmega16 部分C源码可以直接用于项目开发、欢迎复制共享、没有版权 ***
*** 作者:慧净免费助学会员 部分源码网上收集整理 感谢有共享精神的朋友 ***
*** 编译器:GCC ***
*** 百度交流空间:http://hi.baidu.com/HJMCU ***
*** 论坛交流:http://hjdz.5d6d.com ***
*** 配套的硬件学习板网址:http://shop37031453.taobao.com ***
*** 日期:2008.12.18 ***
*** 目标:用C语言写程序就这么简单:《1天入门、10天学会、1年精通单片机系列源码》 ***
*************************************************************************************/
//程序说明:
#include <avr/io.h> //io端口寄存器配置文件,必须包含
#include <util/delay.h>
#include <avr/wdt.h> //WINAVR自带的watch dog函数头文件
//端口声明
//变量声明
//函数声明
void Delayus(unsigned int lus); //us延时函数
void Delayms(unsigned int lms); //ms延时函数
int main(void) //GCC中main文件必须为返回整形值的函数,没有参数
{
DDRB = 0xFF; //端口PortB设为输出口,通过LED的变化指示看门狗的复位
PORTB = 0xff; //熄灭所有LED
Delayms(100); //延时
PORTB = 0x00; //点亮所有LED
Delayms(100); //延时
//由于看门狗使用的是内部独立的1MRC振荡器,因此定时器的时间与电源电压、环境温度有关,
//定时时间可能不准。
//在本实验中使用的是外部12M晶振,实验过程中发现,如果上面两个延时程序都改成延时200MS,
//则即使在下面设置了喂狗程序,程序还是会复位,而改成延时100MS,则程序不会复位。
//这可能是看门狗定时不准的例证。
wdt_enable(WDTO_500MS); //启动看门狗,定时时间500MS
while(1)
{
wdt_reset(); //喂狗,让程序正常运行,即LED一直点亮,注意一定要在while(1)中喂狗
//如果屏蔽这句话,则看门狗定时时间到后,会让程序复位,LED会不停的
//亮灭变化,
}
}
//us级别的延时函数
void Delayus(unsigned int lus)
{
while(lus--)
{
_delay_loop_2(3); //_delay_loop_2(1)是延时4个时钟周期,参数为3则延时12
//个时钟周期,本实验用12M晶体,则12个时钟周期为12/12=1us
}
}
//ms级别的延时函数
void Delayms(unsigned int lms)
{
while(lms--)
{
Delayus(1000); //延时1ms
}
}
# warning "Compiler optimizations disabled; functions from <util/delay.h> won't work as designed"
在avrstudio中使用winavr 自带的 延时函数时应该吧optimization 打开,不可设置为-00。