完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
整个程序如下,用timer1计数溢出中断的方式,在C端口输出一个周期20ms的脉冲波,脉冲宽度是1.5ms。
#include "avr/io.h" #include "avr/interrupt.h" #include "util/delay.h" #define uchar unsigned char #define uint unsigned int //定义置位函数,a代表要操作的寄存器号,b代表要操作的位号 #define set_1(a,b) a|=(1< #define set_0(a,b) a&~(1< uint time_us=0; //定义定时器计数变量 /********TIMER1-16位寄存器配置函数********/ void TIMER1_Init(void) { TCCR1B=0X00; TCCR1A=0X00; TCNT1=0xF9C0; //赋初值,100us溢出 TCCR1B=0X01; //选择系统时钟不分频 TIMSK1=0X01; //允许T/C1溢出中断 sei(); } /*******************定时器中断服务程序*************************/ ISR(TIMER1_OVF_vect) //timer1定时器中断 { TIMSK1=0X00; //TCNT1=0XF9C0; TCNT1=0xF9C0; //重新赋值 time_us++; if (time_us==200) //限制20ms一个周期 time_us=0; switch(time_us) { case 0 : PORTC=0XFF; break; case 15: PORTC=0X00; break; default : break; } TIMSK1=0X01; } int main (void) { DDRA=0XFF; DDRC=0XFF; TIMER1_Init(); while(1) { } return 0; } 问题:这个语句 switch(time_us) { case 0 : PORTC=0XFF; break; case 15: PORTC=0X00; break; default : break; } 我放在ISR中端函数中可以得到波形,而放在结尾的main函数的while语句中,输出的一直是个高电平,这个是为什么? |
|
相关推荐
3 个讨论
|
|
只有小组成员才能发言,加入小组>>
AVR Atmega16 Bootloader程序与上位机LabView程序
4998 浏览 6 评论
#include <ioavr.h>这个头文件我应该下什么编译器
7656 浏览 0 评论
2945 浏览 2 评论
3038 浏览 1 评论
9923 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-8-26 02:13 , Processed in 0.578842 second(s), Total 68, Slave 51 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191