单片机时间控制器c语言程序,89C52单片机的可调时间定时控制模块程序

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

程序效果:上电后,倒计时默认为40分钟,继电器吸合,台灯点亮;倒计时至0分钟时,继电器断开,台灯熄灭,蜂鸣器报警。

1:倒计时过程中,按一下K0键,时间跳至0分钟,断开继电器,台灯熄灭;再按K1键增加定时时间,

每按1次增加5分钟,最大定时时间为95分钟。

2:设置好定时时间后,按一下K0键确认,继电器吸合,台灯点亮,倒计时开始。

说明:定时器按11.0592MHZ晶振设计。

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

#include //头文件

//#include  //包含移位寄存器的头文件

#define uchar unsigned char//宏定义

#define uint unsigned int

sbit key1=P3^2;   //时间设置键

sbit key2=P3^3;          //时间加

sbit fmq=P3^6;          //蜂鸣器                        本行与以下3行为开发板定义

sbit jdq=P3^7;          //继电器

sbit min10=P2^6;  //十分位数码管

sbit min1=P2^7;          //个分位数码管

//sbit fmq=P1^5;          //蜂鸣器                           本行与以下3行为红外台灯定时控制板定义

//sbit jdq=P1^6;          //继电器

//sbit min10=P1^0;  //十分位数码管

//sbit min1=P1^1;          //个分位数码管

/*uchar code table[]={0x3f,0x06,0x5b,//数码管显示的数值(共阴)

0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,

0xbf,0x86,0xdb,//带小数点的数值

0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; */

uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90

//数码管显示的数值(共阳0,1,2,3,4,5,6,7,8,9,)

/*0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10*/};

//带小数点的数值        (0./1./2./3./4./5./6./7./8./9.)

void jia();   //函数声明

uchar fen=40,miao=59; //显示初始值

uchar flag,cnt,count;//定义全局变量

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

延时子程序0.25MS

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

void delay250us(unsigned int i)

{

unsigned char j;

while(i--)

{

for(j=25;j>0;j--);

}

}

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

蜂鸣器发声函数,每1次大约响1秒

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

void beep(unsigned char a)        //

{

unsigned int b;

while(a--)

{

for(b=0;b<1000;b++)

{

fmq=0;

delay250us(1);

fmq=1;

delay250us(1);

}

}

}

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

初始化函数

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

void init()

{

TMOD=0X01; //工作方式1

TH0=0x49; //定时时间为:50ms

TL0=0x44;

ET0=1;     //打开定时器

EA=1;    //开总中断

TR0=1;    //启动定时器

}

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

显示子函数,用于显示时间数值

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

void display()

{

min10=1;

min1=1;

P0=table[fen/10];         //显示十分位

min10=0;

delay250us(5);

if(flag>10)

{

min10=1;

min1=1;

P0=table[fen%10];         //显示个分位

min1=0;

delay250us(5);

}

if(flag<=10)

{

min10=1;

min1=1;

P0=(table[fen%10]&0x7f);         //显示个分位

min1=0;

delay250us(5);

}

}

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

时间子函数

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

void shijian()

{

if(flag>=20)  //判断是否到一秒

{

flag=0;  //到了,则标志位清零

miao--;  //秒减1

if(miao<=0) //判断秒是否到0s

{

miao=59;//到了,则秒为59S

fen--; //分减1

if(fen<=0) //如果分计时至0分钟

{

fen=0;

miao=0;

beep(1);         //蜂鸣器报警

TR0=0;         //关闭定时器

//TH0=(65536-50000)/256; //定时时间为:50ms

//TL0=(65536-50000)%256;

}

}

}

}

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

键盘扫描子函数

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

void key_scan()

{

if(key1==0)        //判断设置键是否按下

{

while(!key1)  //防止掉显

{

if(cnt==0||cnt==1||cnt==2) //设置按键没按下或按1次或按2次

{

display();

}

}

cnt++; //记下按键key1按下的次数

if(cnt==1)         //如果设置键按下第1次

{

TR0=0; //停止计数

fen=0;miao=59; //将时间设置为0分钟

display();

}

if(cnt==2) //如果设置键按下第2次

{

cnt=0; //按下次数清零

if(fen>0) //如果设置分钟值大于0分钟

{

TR0=1;  //开始计数

}

}

}

if(key2==0)   //判断时间增加键是否按下

{

while(!key2)  //防止掉显

{

if(cnt==0||cnt==1||cnt==2||cnt==3)

{

display();

}

}

jia();//调用时间增加子函数

}

}

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

时间增加子函数

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

void jia()   //

{

if(cnt==1) //判断设置键按下的次数是否为第1次

{

fen=fen+5; //是,则分钟加5

if(fen>99) //判断分钟是否大于99,是,则分钟清零

fen=0;

}

}

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

主函数

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

void main()

{

delay250us(800);  //上电后延时2S启动定时器和继电器工作,防止烧灯。

init();//调用初始化子函数

while(1)

{

key_scan(); //调用键盘扫描子函数

shijian(); //时间子函数

if(cnt==0||cnt==1||cnt==2||cnt==3)

{

display();

}

if(fen!=0&&cnt!=1)

{

jdq=0;

}

else jdq=1;

}

}

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

定时器函数

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

void time0() interrupt 1 //定时器0

{

TH0=0x49; //初值50ms

TL0=0x44;

flag++;   //标志位

}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的STC89C52RC单片机按键控制PWM输出LED灯亮度的C语言程序: ```c #include <reg52.h> #define FOSC 12000000UL // 定义晶振频率为12MHz #define T1MS (FOSC / 12000) // 定义1ms的计数值 sbit LED = P2^0; // 将P2.0定义为LED输出口 sbit KEY = P3^2; // 将P3.2定义为按键输入口 unsigned int duty = 0; // 定义占空比变量 void Timer1_Init() // 定时器1初始化函数 { TMOD = 0x10; // 定时器1工作在模式1,16位自动重装载 TH1 = 0xFC; // 计数初值为0xFC67,定时1ms TL1 = 0x67; ET1 = 1; // 开启定时器1中断 TR1 = 1; // 启动定时器1 EA = 1; // 开启总中断 } void Delay(unsigned int t) // 延时函数 { unsigned int i, j; for(i = 0; i < t; i++) for(j = 0; j < T1MS; j++); } void main() { Timer1_Init(); // 初始化定时器1 while(1) { if(KEY == 0) // 检测按键是否按下 { Delay(10); // 延时去抖 if(KEY == 0) // 再次检测按键是否按下 { duty += 10; // 占空比加10% if(duty > 100) // 限制占空比最大值为100% duty = 100; Delay(100); // 延时防止多次按下 } } } } void Timer1_ISR() interrupt 3 // 定时器1中断服务函数 { static unsigned int cnt = 0; if(++cnt > 100) // 计数器满100次,PWM周期为100ms cnt = 0; if(cnt < duty) // 占空比控制LED亮度 LED = 1; else LED = 0; } ``` 程序的原理是通过定时器1产生1ms的中断,每100ms计数器增加一次,根据占空比控制LED的亮度。按键按下时,占空比增加10%,最大值为100%。需要注意的是,由于单片机IO口输出的PWM精度有限,因此LED的亮度调节可能存在一定的误差。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值