keil按键控制led闪烁速度(keil按键控制LED闪烁)

51单片机怎么用c语言写一个按钮控制一个led的闪烁,按一下开始闪烁,再按就灭掉

bit flash;//闪烁标志位

sbit led=P0^0;

sbit P01=P0^1;

sbit P02=P0^2;

void main()

{

P01=P02=0;

flash=0;

led=0;

while(1)

{

scankey();

ledflash();

}

}

void scankey()//键盘扫描

{

P01=1;//行线给1

if(P02)//如果P02也是1则说明接通

{

delay(10);//去抖动10MS

if(P02)//再次确定按键按下

{

while(P02){flash=flash}//按住按键的动作

flash=~flash;//按键按下后执行动作

}

}

}

void ledflash()

{

if(flash)

{

led=1;//点亮

delay(100);//延时100MS

led=0;//熄灭

}

else led=0;

}

void delay(unsigned int i)

{自己根据单片机频率写个1MS带形参的演示程序}

这个程序是现写的。。应该能执行,有些细节没有写,自己修改下,只是个大框而已(比如函数声明,定义端口什么的)

用keil编一个led灯闪烁程序

点亮 小灯的程序我们第二课完成了,就是让 LED = 0。熄灭小灯的程序也很简单,就是 LED = 1。点亮和熄灭都会了,那么如果我们在亮和灭中间加个延时,反复不停的点亮和熄灭小灯,就成了闪烁了。

我们首先复习一下 Keil 写程序的过程,建立工程--保存工程--建立文件--添加文件到工程--编写程序--编译--下载程序。

LED 对于有 C 基础的同学来说很简单,那我先写出来,大家可以先看下。没有C 语言基础的同学也可以跟着抄一遍,下节课我会补充部分 C 语言基础知识,这样你先抄一遍后,再跟着看 C 语言基础知识的时候也比较容易理解透彻。

纯文本复制

#reg52.h

sbit LED = P0^0;

sbit ADDR0 = P1^0;

sbit ADDR1 = P1^1;

sbit ADDR2 = P1^2;

sbit ADDR3 = P1^3;

sbit ENLED = P1^4;

main(){ //void 即函数类型

//以下为声明语句部分

unsigned int i = 0; //定义一个变量 i,并赋初值 0

//以下为执行语句部分

ENLED = 0; //U3、U4 两片 74HC138 总使能

ADDR3 = 1; //使能 U3 使之正常输出

ADDR2 = 1; //经 U3 的 Y6 输出开启Q16

ADDR1 = 1;

ADDR0 = 0;

(1){

LED = 0; //点亮小灯

for (i=0; i30000; i++); //延时一段时间

LED = 1; //熄灭小灯

for (i=0; i30000; i++); //延时一段时间

}

}

大家把这个程序编译一下,下载到里,就会发现 LED2 这个小灯会闪烁了。

单片机中,通过任意io口控制一个led灯以1hz的频率闪烁,要求能在keil4中

#includereg51.h

unsigned char cnt=0;

sbit led=P1^0;

void t0isr() interrupt 1

{

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

cnt++;

if(cnt=10)led=~led;

}

main()

{

TMOD=0x01;

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

TR0=1;

ET0=1;

EA=1;

while(1);

}

51单片机控制LED闪烁频率

暂时想到两种解决方案:

1.最简方案——利用延时函数:进入主函数后,初始化LED,设置一个延时初始值,然后进入while循环,里边只做四件事,打开LED,利用键盘返回值作延时函数参数,关闭LED,利用键盘返回值作延时函数参数。

2.精确解决方案——定时器:初始化定时器,打开中断等,然后进入while等待中断,在中断函数里先定义一个变量,然后将键盘返回值赋值给此变量,再将此变量去重装定时器初值,接下来就是为LED取反。

有不懂的随时回复我。

希望我的回答能帮助到你。

如何用单片机一个按钮开关控制3个灯3种效果。流水。闪烁。还有一直亮。用keil编程。

下面是用C51编写的简单程序:

#include reg51.h

#include intrins.h

sbit io_Key = P1 ^ 1;

sbit led1 = P1 ^ 2;

sbit led2 = P1 ^ 3;

sbit led3 = P1 ^ 4;

unsigned char ucCount = 0;

bit flag05s = 0;

//---------------------------------

void delay125us(void) //@12.000MHz

{

unsigned char i;

i = 60;

while (--i);

}

void Timer0Init(void) //10毫秒@12MHz

{

TMOD = 0xF0; //设置定时器模式

TMOD |= 0x01; //设置定时器模式

TL0 = 0xF0; //设置定时初值

TH0 = 0xD8; //设置定时初值

TR0 = 1; //开定时器0

ET0 = 1; //开定时器0中断

EA = 1; //开总中断

}

//T0中断用来计数器溢出

void zd0(void) interrupt 1

{

TL0 = 0xF0; //设置定时初值

TH0 = 0xD8; //设置定时初值

if(++ucCount = 50)

{

ucCount = 0;

flag05s = 1; //g_flag05s = isYes定时0.52秒到,用于测量周期延时

}

}

void main(void)

{

unsigned char CountTemp = 0, ucState = 0;

Timer0Init();

while(1)

{

//-------------------------------

//简单的按键检测程序:

io_Key = 1;

_nop_();

if( io_Key == 0 )

{

CountTemp = 0;

do

{

delay125us();

if( io_Key != 0 ) break;

} while(++CountTemp 160); // 延时20ms去抖动

if(CountTemp 160)//如果按键时间有效,改变状态

{

switch(ucState)

{

case(0):

{

ucState = 1;

led1 = 0;

led2 = 0;

led3 = 0;

}

break;

case(1):

{

ucState = 2;

led1 = 0;

led2 = 0;

led3 = 0;

}

break;

case(2):

{

ucState = 0;

led1 = 0;

led2 = 1;

led3 = 1;

}

break;

}

while(io_Key == 0); //等待按键释放

}

}

//------------------------------

//每0.5秒改变一下LED状态

if(flag05s == 1)

{

flag05s = 0;

switch(ucState)

{

case(0):

{

led1 = !led1;

led2 = !led2;

led3 = !led3;

}

break;

case(1):

{

bit ledTemp = led1;

led1 = led2;

led2 = led3;

led3 = ledTemp;

}

break;

//LED常亮可以忽略改变LED状态

/*

case(2):

{

led1 = 0;

led2 = 0;

led3 = 0;

}

break;

*/

}

}

}

}

//-----------------------------------------------

//上面程序中有很多地方可以优化,这里只是给出一个参考供学习。

361知讯网

本文链接:http://pdidw.com/keil/18152.html

发表评论

评论列表

还没有评论,快来说点什么吧~