
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清零,清按键已处理标志
}
}
}
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)