|
学习单片机有一段时间了,除了做几个时钟当个摆设好像也没什么作品了。家里有些电器充电时间不能太长,如现在的手机有闪充功能的一般100分钟就能充满电。这样在晚上睡觉时让手机满血复活好像就有了困难(以前用的手机晚上总要充一晚上)。随想做个定时插座吧,就在做单片机数码管时钟的基础上改进。由于初始功能还不太完善,特意外接了串口下载接口! 本以为有现成装单片机的电路板能省点焊接功夫,没想到要改线路造成很多飞线,所以看起来很乱。还不如用洞洞板好!
运行过程:上电显示12:00---通过调时,调分按键设定时间---启动---开始倒计时,继电器吸合通电(运行中按键失效)---时间到继电器断开,数码管闪烁
单片机源程序:
- /********************************************************
- *********************************************************
- *********** 可编程定时插座 *****************
- *********** 初次完成程序日期:2017、3、28 ******
- 程序:上电-K1,K2按键进行时分调整-K3启动(启动后按键将无效)
- -继电器闭合通电-开始倒计时- 倒计时结束继电器断开-完成周期
- ********************************************************/
- #include<reg51.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit s1=P3^2;
- sbit s2=P3^3;
- sbit s3=P3^4; // 定义位使用端口 1,2,3,4段
- sbit s4=P3^5;
- sbit jd=P2^0; // 继电器端口
- sbit k1=P1^1; // 调时
- sbit k2=P1^2; // 调分
- sbit k3=P1^3; // 启动
- sbit GGD=P1^0; // 按键公共端
- uchar code mum[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; // 段码0~9
- uchar code display1[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf} ;
- uchar code display2[]={0xfe,0xbf,0xf7,0xbf,0xfe,0xbf,0xf7,0xbf} ;
- uchar code display3[]={0xcf,0xf9,0xcf,0xf9,0xcf,0xf9} ;
- uchar code display4[]={0xfe,0xdf,0xef,0xf7,0xfb,0xfd} ;
- char sec=59,min=0,hour=12; // 定义全局变量 有符号字符型
- uint cnt;
- /***************************************************************************
- *************** 函数名:delay ****************************
- *************** 函数功能:延时函数 ****************************
- *************** 输入: ****************************
- 输出:
- ***************************************************************************/
- void delay(uchar x) // 延时函数
- {
- uchar i,j;
- for(;x>0;x--)
- for(i=20;i>0;i--)
- for(j=2;j>0;j--);
- }
- void delay1(uint x)
- {
- uchar i,j;
- for(;x>0;x--)
- for(i=20;i>0;i--)
- for(j=200;j>0;j--);
- }
- void shuma()
- {
- uchar a,b,n,m,j,k;
- s1=1;
- s2=1;
- s3=1;
- s4=0;
- while(1)
- {
-
- for(a=0;a<6;a++)
- {
- for(n=0;n<6;n++)
- {
- P0=display1[n];
- delay1(15);
- }
- }
- for(m=0;m<8;m++)
- {
- P0=display2[m];
- delay1(100);
- }
- for(j=0;j<6;j++)
- {
- P0=display3[j];
- delay1(30);
- }
- for(b=0;b<6;b++)
- {
- for(k=0;k<6;k++)
- {
- P0=display4[k];
- delay1(15);
- }
- }
-
-
- }
- }
- /***************************************************************************
- *************** 函数名:timeyx ****************************
- *************** 函数功能:时钟运行 ****************************
- *************** 输入: ****************************
- 输出:
- ***************************************************************************/
- void timeyx() // 时钟运行
- {
- GGD=1; // 按键公共端置高电平,运行中按键无效
- sec--;
- if(sec<0)
- {
- sec=59;
- min--;
- if(min<0)
- {
- min=59;
- hour--;
-
- }
- }
- }
- /***************************************************************************
- *************** 函数名:stop ****************************
- *************** 函数功能:继电器断开 ****************************
- *************** 输入: ****************************
- 输出:
- ***************************************************************************/
- void stop() // 时间到继电器断开
- {
- if(hour==0&&min==0) // 判断时分为0时
- {
- TR0=0; // 定时器停止
-
- jd=1;
- shuma(); // 继电器断开
- }
- }
-
- /***************************************************************************
- *************** 函数名:display ****************************
- *************** 函数功能:数码管显示 ****************************
- *************** 输入: ****************************
- 输出:
- ***************************************************************************/
- void display(uchar zm,uchar zh) // 显示函数
- {
-
-
-
- P0=mum[zm%10];
- s1=0;
- delay(10);
- s1=1 ;
-
- P0=mum[zm/10];
- s2=0;
- delay(10);
- s2=1;
-
- P0=mum[zh%10];
- if(cnt>2000) // 小数点闪烁
- P0&=0x7f; // 增加小数点显示
- s3=0;
- delay(10);
- s3=1;
-
- P0=mum[zh/10];
- s4=0;
- delay(10);
- s4=1 ;
- }
- /***************************************************************************
- *************** 函数名:timeset ****************************
- *************** 函数功能:时间设置 ****************************
- *************** 输入: ****************************
- 输出:
- ***************************************************************************/
- void timeset() // 时间设置
- {
- if(k1==0)
- {
- delay(50);
- if(k1==0)
- {
- hour--;
- if(hour<0)
- {
- hour=12;
-
- }
- while(k1==0)
- display(min,hour);
- }
- }
- if(k2==0)
- {
- delay(10);
- if(k2==0)
- {
- min--;
-
- if(min<0)
- {
- min=59;
- hour--;
-
- }
-
- while(k2==0)
- display(min,hour);
-
- }
- }
-
- display(min,hour);
-
-
- }
- /***************************************************************************
- *************** 函数名:main ****************************
- *************** 函数功能:主函数 ****************************
- *************** 输入: ****************************
- 输出:
- ***************************************************************************/
- void main()
- {
-
- uchar end=1; // 时间预设单次循环
- TMOD=0x02; // 模式2 8位自动重装定时器
- TH0=0x06;
- TL0=0x06;
- EA=1;
- ET0=1;
- GGD=0; // 按键公共端
- jd=1; // 继电器关闭
- TR0=0;
- P3=0xff;
- while(1)
- {
-
- timeset();
- stop();
-
- while(end) //上电未按K3启动前一直在循环 达到预设目的
- {
-
- timeset();
- if(k3==0)
- {
- delay(20);
- if(k3==0)
- {
- TR0=1;
- jd=0;
- end=0;
- }
- while(k3==0);
- }
-
-
- }
- }
- }
- …………限于本文篇幅 余下代码请从51黑电子论坛下载附件…………
复制代码
下载:
源代码.rar
(1.9 KB, 下载次数: 98)
|
评分
-
查看全部评分
|