怎么用avr单片机c语言控制led灯亮
答案:2 悬赏:10 手机版
解决时间 2021-03-11 03:43
- 提问者网友:愿为果
- 2021-03-10 11:36
单片机是ATmega49,用一个按键控制一个灯,长按十秒钟,LED灯就亮十秒钟,连续按键几次,LED灯就亮几秒钟。谢谢,感激不尽啊。
最佳答案
- 五星知识达人网友:孤独入客枕
- 2021-03-10 12:45
#include
sbit LED=P2^0;
//延时函数,含有输入参数unsigned int x,无返回值unsigned int是宏定义无符号整型变量,其值的范围是0~65535
void delay(unsigned int x)
{
while(x--);
}
//主函数
void main(void)
{
while(1)//无限循环
{
LED=0;//P2.0输出低电平,点亮LED灯
delay(2000);//调用延时函数,更改X值,相当于更改LED灯闪烁的频率
LED=1;//P2.0输出高电平,熄灭LED灯
delay(2000);//调用延时函数,更改X值,相当于更改LED灯闪烁的频率
}
}
sbit LED=P2^0;
//延时函数,含有输入参数unsigned int x,无返回值unsigned int是宏定义无符号整型变量,其值的范围是0~65535
void delay(unsigned int x)
{
while(x--);
}
//主函数
void main(void)
{
while(1)//无限循环
{
LED=0;//P2.0输出低电平,点亮LED灯
delay(2000);//调用延时函数,更改X值,相当于更改LED灯闪烁的频率
LED=1;//P2.0输出高电平,熄灭LED灯
delay(2000);//调用延时函数,更改X值,相当于更改LED灯闪烁的频率
}
}
全部回答
- 1楼网友:雪起风沙痕
- 2021-03-10 13:43
给你写一个吧,反正很简单一个程序,用mega8实现,单片机型号你可以改,只要改掉中断向量号就行: #include <iom8v.h> #include <macros.h> #define led1_on portb|= bit(1) #define led1_off portb&=~bit(1) //一下你可以再写七个灯或者更多 #define uchar unsigned char #define uint unsigned int uint adc_count = 0 ; //控制ad转换速度计数 uint a_time = 0 ; //用于ad数字滤波计数 uchar mode = 0 ; //用于ad处理结果赋值 void port_init(void) { ddrb = 0xff; portb = 0x00; ddrc = 0x00; portc = 0xff; ddrd = 0xf0; portd = 0x00; } // 定时器分频: 64 // 设定定时值: 1ms // 真实定时值: 1ms (0.0%) void timer0_init(void) { tccr0 = 0x00; //stop tcnt0 = 0x83; //set count timsk |= 0x01; tccr0 = 0x03; //start timer } #pragma interrupt_handler timer0_ovf_isr:10 void timer0_ovf_isr(void) { tcnt0 = 0x83; //reload counter value adc_count++; if(adc_count==50) //用于控制ad转换速度 { adc_count=0; adcsra = 0xcf; } else { adcsra = 0x00; } } void adc_init(void) { adcsra = 0x00; //禁止ad转换 admux = 0x07; sfior |= 0x00; acsr = 0x80; //禁止模拟比较器 adcsra = 0xcf; //adcsra = 0xed; } unsigned int adc_calc(void) { //计算实际电压 unsigned long value=0; unsigned int voltage=0; //电压单位为(mv) value=adcl; //首先读低位 value|=(int)adch << 8; //然后读高位 voltage=(value*5000)/1023; ad_flag=1; return voltage; } //采用ad取平均值的方式 #pragma interrupt_handler adc_isr:15 void adc_isr(void) { //转换完成后中断处理 unsigned int voltage1; a_time++; if(a_time<8) {voltage1=adc_calc();voltage2=voltage2+voltage1;}//数字滤波 while(a_time==8) { a_time=0;voltage=voltage2/8;voltage2=0; if((voltage)<1130){dianliang=0;} if((voltage>=1130)&&(voltage<1300)){mode=1;} if((voltage>=1300)&&(voltage<1560)){mode=2;} if((voltage>=1560)&&(voltage<1750)){mode=3;} if((voltage>=1750)&&(voltage<1950)){mode=4;} if((voltage>=1950)&&(voltage<2150)){mode=5;} if((voltage>=2150)&&(voltage<2341)){mode=6;} if((voltage>=2341)&&(voltage<2560)){mode=7;} if((voltage>=2560)&&(voltage<2710)){mode=8;} if((voltage>=2710)&&(voltage<2870)){mode=9;} } else{mode=0;} } void led_disp(void) //用于控制led显示 { switch(mode) { case 0: ;break; case 1: ;break; case 2: ;break; case 3: ;break; case 4: ;break; case 5: ;break; case 6: ;break; case 7: ;break; case 8: ;break; case 9: ;break; default: break; } }void init_devices(void) { cli(); //禁止所有中断 mcucr = 0x00; mcucsr = 0x80;//禁止jtag gicr = 0x00; timer0_init(); port_init(); adc_init(); //sei();//开全局中断 } void main(void) { init_devices(); while(1) { led_disp(); } }
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯