永发信息网

怎么用avr单片机c语言控制led灯亮

答案:2  悬赏:10  手机版
解决时间 2021-03-11 03:43
单片机是ATmega49,用一个按键控制一个灯,长按十秒钟,LED灯就亮十秒钟,连续按键几次,LED灯就亮几秒钟。谢谢,感激不尽啊。
最佳答案
#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灯闪烁的频率
}
}
全部回答
给你写一个吧,反正很简单一个程序,用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(); } }
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
甲烷燃烧产生什么
前端c4 上3003好还是846好?在线等明早就买
一个男人天天给女人发微信红包 不过就几块钱
梵非时尚品牌折扣店地址有知道的么?有点事想
要求写出必要的计算过程某种型号的柴油每升4.
有没有木工和电工给我介绍一个
福源快餐这个地址在什么地方,我要处理点事
两个月前买的红豆生虫子了,已经把红豆扔了,
血型有哪些系统?其中Rh血型系统是怎样的概念
找一部关于触手怪的电影
flash里动作脚本关掉这个程序的??
什么是对冲成本
数学乘法 首同尾合十 是怎么算的
淄博市有多少人口
cosplay的假发怎么修剪啊?我的是100cm的长黑
推荐资讯
细胞分泌蛋白质 内质网产生囊泡 以后到高尔基
我想学摄影,到没有多少钱,买什么机器入门呢
板栗能和核桃花生牛奶一块食用吗
梦见捡到女人的一条绿色内裤
下列粒子结构示意图所表示的元素中化学性质最
顺风肥牛美食汇在哪里啊,我有事要去这个地方
请问润百分吃多久有效?有依赖性吗?反弹吗?
实习转正流程是什么样的?
具有细胞壁的是 A. 根尖细胞B. 红细胞C. 胃腺
老公的情人给我发了祝福短信我该怎么回
黑界扣字和打讨论是什么意思?
管理费记到营业外支出怎么做分录
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?