2011-12-21 12:46
单片机定时器多时段循环控制C程序
这是一段多时段定时(延时)程序,硬件组成为AT89C2051和前文提到的两位LED数码管,数码管的显示数据由一片74LS164经串口传输,(注:并非本人习惯使用164,盖因本人手中有几片这样的成品模块,弃之可惜。)另外由两个I/O口控制两位LED数码管的供电,端口分配相见程序,这是一段在用程序,正用于工作间的自动引排风系统,由于手边没有合用的空气检测传感器,只好采用定时启动的方法进行控制,并设置为:早晨有其他设备运行时,系统得电开始运行,经初次的90分钟倒计时延时后启动风机运转,风机运转10分钟后停止进入待机延时,待机40分钟后再次启动风机运转,此后,程序在40分与10分之间转换进行待机和运转的控制,直至所有设备停止(下班了!)后断电;程序主架构采用的是前文“单片机数码时钟带闹铃的C程序”,起初以为,定时控制程序应该很好弄的,但是现在才发现,“简单、容易”永远是深谙编程的人们的专利,对于我这般满脑子外行想法及编程语言都没学全的菜鸟就满不是那么回事了,仅主函数中的那几个选择结构就弄了好几天;另外,以前使用AT89C2051时,并未用全其P1端口,没出过问题,也就没有认真研究其端口结构,正是这个
原因导致程序写好后又被乱码纠缠了好久,直到发现其P1.0和P1.1口还有其他功能,需要加入上拉电阻时,才调试完成;但好在程序最终还是按照自己的意愿运行了,累与烦恼也就变成快乐了,谁让咱拿这东东当‘玩意’了呢,累之于斯,乐之于斯,于心坦然。
装置由两位LED数码管显示分钟,倒计时显示,最大设定值99分钟,个位数码管的dp段间隔一秒亮/灭闪动,一个选择按键和加减按键配合可随时修改设定时间,一个即时按键可随时控制风机启动运转。程序如下:
/*******2011/12/18 原创:wannenggong**************/
#include<at89x51.h>
#define uint unsigned int
#define uchar unsigned char
#define u_s 47575 //经校准后的50MS初值;
/***********I/O口位功能定义*****************************/
sbit beep=P1^7; //提示音输出端
sbit pw_out=P1^6; //继电器控制
#include<at89x51.h>
#define uint unsigned int
#define uchar unsigned char
#define u_s 47575 //经校准后的50MS初值;
/***********I/O口位功能定义*****************************/
sbit beep=P1^7; //提示音输出端
sbit pw_out=P1^6; //继电器控制
sbit H=P1^5; //十位显示供电控制
sbit M=P1^4; //个位显示供电控制
sbit N4=P1^3; //即使启动键
sbit N2=P1^2; //加1调整
sbit N3=P1^1; //减1调整
sbit N1=P1^0; //调整项选择
/************应用变量设置*******************************/
uchar T,r=0; //按键计数变量
uchar s,u,LD,TD,Time; //过渡变量
uchar minute,second,ON_time=10,OFF_time=40; //时间变量
uchar ms,count; //标志变量
/**********低电平有效不显示小数点的0-9显示段码**********/
uchar SEG7[10]=
{0x24,0x7d,0x16,0x15,0x4d,0x85,0x84,0x3d,0x04,0x05};
/**********低电平有效带小数点显示的0-9显示段码**********/
sbit M=P1^4; //个位显示供电控制
sbit N4=P1^3; //即使启动键
sbit N2=P1^2; //加1调整
sbit N3=P1^1; //减1调整
sbit N1=P1^0; //调整项选择
/************应用变量设置*******************************/
uchar T,r=0; //按键计数变量
uchar s,u,LD,TD,Time; //过渡变量
uchar minute,second,ON_time=10,OFF_time=40; //时间变量
uchar ms,count; //标志变量
/**********低电平有效不显示小数点的0-9显示段码**********/
uchar SEG7[10]=
{0x24,0x7d,0x16,0x15,0x4d,0x85,0x84,0x3d,0x04,0x05};
/**********低电平有效带小数点显示的0-9显示段码**********/
uchar SEG7_dp[10]=
{0x20,0x79,0x12,0x11,0x49,0x81,0x80,0x39,0x00,0x01};
/***************延时:12MHZ约pMS*************************/
void delay (uint p)
{
uchar i;
while( --p != 0)
{
for(i = 0; i < 125; i++);
}
}
/***********发声函数用微秒延时函数**********************/
void Delay_us(int num)
{
while(num--);
{0x20,0x79,0x12,0x11,0x49,0x81,0x80,0x39,0x00,0x01};
/***************延时:12MHZ约pMS*************************/
void delay (uint p)
{
uchar i;
while( --p != 0)
{
for(i = 0; i < 125; i++);
}
}
/***********发声函数用微秒延时函数**********************/
void Delay_us(int num)
{
while(num--);
}
/*********设置选择函数************************************/
void Choice_set()
{
if (N1==0)//选择键
{
delay(10);
if(N1==0)
{
r++;
if(r>2){r=0;}
while(!N1);
}
}
}
/
/*********设置选择函数************************************/
void Choice_set()
{
if (N1==0)//选择键
{
delay(10);
if(N1==0)
{
r++;
if(r>2){r=0;}
while(!N1);
}
}
}
/
*********加减1函数************************************/
uchar Adjustment(T)
{
if(N2 == 0)
{
delay(10);
if(N2 == 0)
{ //如果按动上调键
T++; //数字加
while(!N2);
}
}
if(N3 == 0)
{
delay(10);
uchar Adjustment(T)
{
if(N2 == 0)
{
delay(10);
if(N2 == 0)
{ //如果按动上调键
T++; //数字加
while(!N2);
}
}
if(N3 == 0)
{
delay(10);
if(N3 == 0)
{ //如果按动下调键
T--; //数字减
while(!N3);
}
}
return(T);
}
/********显示输出函数**********************************/
void Display(uchar x_time)
{
TR0=1;
LD=x_time/10;
TD=x_time%10;
if(s==0)
{ //如果按动下调键
T--; //数字减
while(!N3);
}
}
return(T);
}
/********显示输出函数**********************************/
void Display(uchar x_time)
{
TR0=1;
LD=x_time/10;
TD=x_time%10;
if(s==0)
{
SBUF=SEG7[TD];while(!TI);TI=0;
H=0;M=1;
delay(5);
SBUF=SEG7[LD];while(!TI);TI=0;
H=1;M=0;
delay(5);
}
else
{
SBUF=SEG7_dp[TD];while(!TI);TI=0;
H=0;M=1;
delay(5);
SBUF=SEG7[LD];while(!TI);TI=0;
H=1;M=0;
SBUF=SEG7[TD];while(!TI);TI=0;
H=0;M=1;
delay(5);
SBUF=SEG7[LD];while(!TI);TI=0;
H=1;M=0;
delay(5);
}
else
{
SBUF=SEG7_dp[TD];while(!TI);TI=0;
H=0;M=1;
delay(5);
SBUF=SEG7[LD];while(!TI);TI=0;
H=1;M=0;
delay(5);
}
志愿填报流程详细}
/********风机运转时间设定函数**********************************/
void N_time()
{
TR0=0;
刺激战场国际服有网络但无法连接app stores=0;
minute=0;
ON_time=Adjustment(ON_time);
Display(ON_time);
}
/********风机待机时间函数**********************************/
void F_time()
{
}
志愿填报流程详细}
/********风机运转时间设定函数**********************************/
void N_time()
{
TR0=0;
刺激战场国际服有网络但无法连接app stores=0;
minute=0;
ON_time=Adjustment(ON_time);
Display(ON_time);
}
/********风机待机时间函数**********************************/
void F_time()
{
TR0=0;
s=0;
minute=0;
OFF_time=Adjustment(OFF_time);
Display(OFF_time);
}
/**********嘀-嘀-嘀-发声函数*******************************/
void Beep(void)
{
uint a,b;
for(b=2;b>0;b--) //两短声
{
for(a=700;a>0;a--)//声音的长度
{
beep = ~beep; //产生音频脉冲
s=0;
minute=0;
OFF_time=Adjustment(OFF_time);
Display(OFF_time);
}
/**********嘀-嘀-嘀-发声函数*******************************/
void Beep(void)
{
uint a,b;
for(b=2;b>0;b--) //两短声
{
for(a=700;a>0;a--)//声音的长度
{
beep = ~beep; //产生音频脉冲
Delay_us(20); //发音频率设置
}
delay(500);
}
淘宝清空购物车delay(100);
for(a=1500;a>0;a--)//一长声
{闯红灯几天可以查到违章信息
beep = ~beep;
Delay_us(20);
}
beep = 1; //关闭蜂鸣器
}
/***************************************************
定时器0中断子函数
12T芯片,12MHz晶体,定时50MS
}
delay(500);
}
淘宝清空购物车delay(100);
for(a=1500;a>0;a--)//一长声
{闯红灯几天可以查到违章信息
beep = ~beep;
Delay_us(20);
}
beep = 1; //关闭蜂鸣器
}
/***************************************************
定时器0中断子函数
12T芯片,12MHz晶体,定时50MS
***************************************************/
void clock_T0(void) interrupt 1
{
TH0=(65536-u_s)/256;
TL0=(65536-u_s)%256;
if(count++==20) //经实测20次中断后定时约1S
{
count=0; //次数归0
s=~s;
second++; //秒标志加1
if(second==60)
{
second=0; //60S后秒标志归0
minute++; //分标志加1
}
void clock_T0(void) interrupt 1
{
TH0=(65536-u_s)/256;
TL0=(65536-u_s)%256;
if(count++==20) //经实测20次中断后定时约1S
{
count=0; //次数归0
s=~s;
second++; //秒标志加1
if(second==60)
{
second=0; //60S后秒标志归0
minute++; //分标志加1
}
}
}
}
/*********主函数***********************************/
main()
{
N1=1;N2=1;N3=1;N4=1; pw_out=1;beep=1;
IE=0x82; //开启总中断允许定时器0响应中断
TMOD=0x01; //设置定时器0工作于软件启动、Mode1模式
TH0=(65536-u_s)/256; //计数器高8位填值
TL0=(65536-u_s)%256; //计数器高8位填值
while(1)
{
//----即时启动风机控制-------------//
if(N4 == 0)
{
main()
{
N1=1;N2=1;N3=1;N4=1; pw_out=1;beep=1;
IE=0x82; //开启总中断允许定时器0响应中断
TMOD=0x01; //设置定时器0工作于软件启动、Mode1模式
TH0=(65536-u_s)/256; //计数器高8位填值
TL0=(65536-u_s)%256; //计数器高8位填值
while(1)
{
//----即时启动风机控制-------------//
if(N4 == 0)
{
delay(10);
if(N4 == 0)
{
TR0=0;
minute=0;
ms=2;
while(!N4);
}
}
//--------------------------------//
Choice_set();
if(r==1){TR0=0;F_time();}
if(r==2){TR0=0;N_time();}
if(r==0)
{
粮组词if(N4 == 0)
{
TR0=0;
minute=0;
ms=2;
while(!N4);
}
}
//--------------------------------//
Choice_set();
if(r==1){TR0=0;F_time();}
if(r==2){TR0=0;N_time();}
if(r==0)
{
if(ms==0) //上电后初延时
{
Time=90-minute;
Display(Time);
if(Time==0)
{TR0=0;Beep();minute=0;ms=2;}
}
if(ms==1) //风机待机时间
{
pw_out=1;
Time=OFF_time-minute;
Display(Time);
if(Time==0)
{TR0=0;Beep();minute=0;ms=2;}
}
{
Time=90-minute;
Display(Time);
if(Time==0)
{TR0=0;Beep();minute=0;ms=2;}
}
if(ms==1) //风机待机时间
{
pw_out=1;
Time=OFF_time-minute;
Display(Time);
if(Time==0)
{TR0=0;Beep();minute=0;ms=2;}
}
if(ms==2) //风机运转时间
{
pw_out=0;
Time=ON_time-minute;
Display(Time);
if(Time==0)
{TR0=0;minute=0;ms=1;}
}
}
}
}
{
pw_out=0;
Time=ON_time-minute;
Display(Time);
if(Time==0)
{TR0=0;minute=0;ms=1;}
}
}
}
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论