AVR单片机 拥有暂停功能秒表
答案:2 悬赏:40 手机版
解决时间 2021-04-09 06:17
- 提问者网友:刺鸟
- 2021-04-08 06:19
用AVR单片机做一个可以摁一下暂时,再摁一下恢复的功能的秒表,求程序
最佳答案
- 五星知识达人网友:逃夭
- 2021-04-08 07:14
AVR的程序我也不会写,不过我能给你个思路,按键按下产生中断就可以了,在按一下恢复。
全部回答
- 1楼网友:躲不过心动
- 2021-04-08 07:49
avr单片机tc0快速pwm
pwm:脉冲宽度调制,图中t为脉冲周期,t为高电平时间,t与t的比值t/t称为占空比,脉宽调制指的是调整t的大小,即改变脉冲的占空比,占空比值越大,输出的电压越高。改变占空比就改变输出的电压,常用于实现d/a,调节电压或电流,改变电动机的转速等。
快速pwm模式:它的计数方式是tcnt0由0开始计数到255式,计数加1返回到0,然后继续加1计数,相对于相位pwm修正模式(由0计数到255,再从255计数到0),只有一个斜坡,因此pwm输出频率高。在快速pwm模式下,计数器的最大值决定了pwm的频率,而比较寄存器ocr0决定了占空比的大小。t/c0是8位计数器, 输出pwm的频率=系统时钟频率/(分频系数*255) 。
pwm产生过程:定时器启动后,当tnct0和ocr0的值相等时,输出引脚oc0(pb3)清0,当tnct0到255时oc0置位,在程序运行过程中改变ocr0中的数值,就改变了oc0输出的占空比。
//函数功能:控制pb3引脚上的发光二极管由亮到灭,再由灭到亮 (代码来自轻松玩转avr单片机c语言cd)
#include
#define uchar unsigned char
#define uint unsigned int
unsigned int count;
void delay_ms(uint xms)
{
int i,j;
for(i=0;i
{ for(j=0;j<1140;j++) ; }
}
void port_init()
{
ddrb|=(1<
portb&=(0<
}
void timer0_init()
{
tccr0=(1<
// t/c0工作于快速pwm模式,不分频
//比较匹配时,oc0置位,记数到0xff时,清零oc0
ocr0=0; //比较匹配寄存器初值,
sreg=0x80; //使能全局中断
}
void main(void)
{
port_init();
timer0_init();
while(1)
{
for(count=0;count<256;count++) //ocr=0时,led最亮,然后逐渐变暗
{
ocr0=count; //比较匹配寄存器赋值
delay_ms(20); //延时一段时间,以观察效果
}
delay_ms(3000); // led最暗时,延时一段时间
for(count=255;count>0;count--) //ocr=255时,led最暗,然后逐渐变亮
{
ocr0= count;
delay_ms(20);
}
delay_ms(3000); //led最亮时,延时一段时间
}
}
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯