51单片机定时器定时 2秒灯亮 3秒灯灭,如此循环

51单片机定时器定时 2秒灯亮 3秒灯灭,如此循环,第1张

如果想实现无限循环那就采用死循环方式,可以无限的循环如while(1){};然后设定定时器定时时间为1s(此值需要根据单片机确定是否可以设定这么大),其次,设定一个变量对时间进行计数,根据计数情况凳答做出相应的改变,程序可以这样设定:

unsigned

char

gucledstatus

=

0x00

//全局变量,表示灯当前的状态

0为灭基粗察,1为亮

volatile

unsigned

int

gustimecnt

//全局变量对时间计数

int

main()

{

//增加定时器初始化并开放中断

while(1)

{

if(gucledstatus

==

0x01)

//当前为亮状态

{

if(gustimecnt

>=

7200)

//两个小时时间到

{

gustimecnt

=

0x00

//清零

gucledstatus

=

0x00

//灯为灭状态

//此处加程序代码,控制灯为灭的状态

}

else

{

//此处加程序代码,控制灯为亮的状态,此处会重复执行,可以进行控制

}

}

else

if(gucledstatus

==

0x00)

//灯为灭的状态

{

if(gustimecnt

>=

3600)

//1个小时

{

gustimecnt

=

0x00

gucledstatus

=

0x01

//亮状态

//增加程序代码,控制灯亮

}

else

{

//增加程序代码,控制灯灭,此处会重复执行,可以进搏茄行控制

}

}

}

return

0

}

在中断函数中,对gustimecnt进行递增即可!

一、利用定时器实现:

/*****************************预处理命令*****************************/

#include<reg52.h>

#define OUT P0

//晶振:12MHZ

/********************重新定义数据类型*******************************/

typedef unsigned char unit8

typedef unsigned short unit_16

/*

函数名:main()

函数功能: 主函数

输入:无

输出:无

*/

void main()

{

TMOD = 0x01

TR0 = 1

ET0 = 1

EA = 1

while(1)

}

/*

函数名:Timer0_Rountine() interrupt 1

函数功能:内部中断T0 服务函数

输入: 无

输出:无

*/

void Timer0_Rountine() interrupt 1

{

static unit_16 Count=0

static unit8 Count_Sign=0

static bit Sign=0

TH0 = 0xfc

TL0 = 0x18

Count++

if(!Sign)

OUT = 0xaa //奇数 (1秒)

if(Count>=1000)

{

Sign=1

Count=0

if(Count_Sign<3) //2秒

OUT = 0xaa //奇数

else if(Count_Sign>=3&&Count_Sign<=10) //8秒

OUT = 0x55 //偶数

else if(Count_Sign>10&&Count_Sign<=22) //12秒

OUT = 0x00//全部

else if(Count_Sign>22)Count_Sign=Sign=0

Count_Sign++

}

}

二、利用软件延时实现:

#include<reg52.h>

#define OUT P0

typedef unsigned char unit8

typedef unsigned int unit16

/*

函数名帆码:delay_ms(unit16 x)

函数功能: 延时函数1MS

输入态敬哪:x

输出:无

*/

void delay_ms(unit16 x)

{

unit8 a,b

while(x--)

{

for(b=142b>0b--)

for(a=2a>0a--)

}

}

/*

函数名:main()

函数功能: 主函数

输入:无

输出:无

*/

void main()

{

while(1)

{

OUT = 0xaa //奇数

delay_ms(3000) //3秒稿稿

OUT = 0x55 //偶数

delay_ms(8000)//8秒

OUT = 0x00 //全部

delay_ms(12000)//12秒

}

}

一个简单的开关控制一盏灯的c程序如下:

#include<reg52.h>

sbit S1=P1^4                                     皮悄                           //将S1位定义为P1^4,检测独立按键

sbit led0=P1^0                                                        //将led0定义为P1.0口的LED

/***********************************************************************************************************************************************

延时函数

***********************************************************************************************************************************************/

void delay(void)

{

unsigned int i

for(i=5000i>0i--)

}

/***********************************************************************************************************************************************

主函数

***********************************************************************************************************************************************/

void main(void)

{

while(1)

{

if(S1==0)                                                                //判断是否有键按下

{

delay()                                                        //有键按下,延时去抖,真正应戚衫用时要少用这种延时,占用时间,用定时器延时或一个寄高握腔存器循环检测10多次按键

if(F0==0)                                                        //用F0标志位判断键按下是否已经处理,因刚学C语言没多久,

//不知道怎么定义RAM能位寻址的寄存器,先用F0,按键多的话,一个F0不够用

{

F0=1                                                        //F0置1,表示这次按键按下已处理

led0=~led0                                                //将LED亮灭状态取反

}

}

else                                                                         //S1=1说明按键释放

{

F0=0                                                                //F0清零,清按键已处理标志

}

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/8282571.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-15
下一篇2023-04-15

发表评论

登录后才能评论

评论列表(0条)

    保存