时间继电器 倒计时控制 定时通断开关模块程序包

发布者:phi31最新更新时间:2020-11-25 来源: 51hei关键字:时间继电器 手机看文章 扫描二维码
随时随地手机看文章


#include           //用52的头文件  里面加的引脚再定义  

#include "intrins.h"   //延时

sfr AUXR = 0x8e;

sfr P5 = 0xc8;                         //p5定义  是加的

sfr P5M0 = 0xc9;

sfr P5M1 = 0XCA;                 

sfr P3M0 = 0xb2;                //p3口设置强推完的定义

sfr P3M1 = 0Xb1;

sfr P1M0 = 0x92;                //p0口设置强推完的定义                   这样设置数码管就亮

sfr P1M1 = 0X91;

/***********************掉电存储开始********************/

typedef unsigned char BYTE;

typedef unsigned int WORD;          //类型定义

unsigned char x = 0;

sfr  IAP_DATA     =   0xC2;            //IAP数据寄存器

sfr  IAP_ADDRH    =   0xC3;            //IAP地址寄存器高字节

sfr  IAP_ADDRL    =   0xC4;            //IAP地址寄存器低字节

sfr  IAP_CMD      =   0xC5;            //IAP命令寄存器

sfr  IAP_TRIG     =   0xC6;            //IAP命令触发寄存器

sfr  IAP_CONTR    =   0xC7;            //IAP控制寄存器

#define        CMD_IDLE     0                //空闲模式

#define CMD_READ     1                //IAP字节读命令

#define        CMD_PROGRAM  2                 //IAP字节编程命令

#define        CMD_ERASE    3                 //IAP扇区擦除命令

#define ENABLE_IAP   0x82             //if SYSCLK<20MHz

#define IAP_ADDRESS  0x0400                          //测试地址

//void Delay(BYTE n);

void IapIdle();

BYTE IapReadByte(WORD addr);

void IapProgramByte(WORD addr, BYTE dat);

void IapEraseSector(WORD addr);

/***********************掉电存储结束****************/

/*****************************数码管开始***********************************/

unsigned int i = 0;//用于扫描数码管

unsigned char bainum1 = 0;//百

unsigned char shinum1 = 0;//十

unsigned char genum1 = 0;//个

sbit pa = P1^0;sbit pb = P3^2;sbit pc = P3^7;sbit pd = P1^3;//数码管段

sbit pe = P1^2;sbit pf = P1^4;sbit pg = P3^3;//数码管段

sbit p1 = P1^1;sbit p2 = P3^6;sbit p3 = P5^5;//数码管位

void s0();void s1();void s2();void s3();void s4();void s5();//数码管部分

void s6();void s7();void s8();void s9();void s10();//数码管部分

void xuaze(unsigned char j);//数码管段显示

void displaynum(unsigned int);//显示函数

//unsigned char code duan [] ={0,1,2,3,4,5,6,7,8,9};

unsigned int bainum11=0,shinum11=0,genum11=0;//用于传到数码管上显示

/*****************************数码管结束***********************************/

unsigned int inum1=0,inum2=0;//触发端子用的计数

unsigned char inum11=0,inum12=0,inum21=0,inum22=0,ss=0;//掉电存储要用到

static unsigned char presstime=0;//时间值按键用到的

unsigned int kf0=1;//按键用的标志位

unsigned int kt0=0;//按键用的标志位

unsigned int  if0=1,if0s=1,it0=0;

unsigned int  mm=0,ff=0,sss=0;//计数用

bit flag_eeprom1=1;//掉电存储的标志位

unsigned int keynum=0;//数码管的位

sbit key2=P3^0;//按键  

sbit key1=P3^1;//按键

sbit out= P5^4;//输出

void timer0_1init();//定时器声明

void keycan();//按键

void keyflag();//按键结束调用

void saveeepro();//掉电存储

extern void displaynums();//将数字传到数码管上显示

void main()

{

        timer0_1init();

         P3M0 = 0xcc;

         P3M1 = 0X00;          //p3口设置强推挽

         P1M0 = 0x1f;

         P1M1 = 0X00;

        inum11 = IapReadByte(1);//读取掉电存储里的值

        inum12 = IapReadByte(2);

        inum21 = IapReadByte(3);

        inum22 = IapReadByte(4);

        if0    = IapReadByte(5);

        if0s   = IapReadByte(6);

        ss           = IapReadByte(7);

           inum1=inum11*100+inum12;//组合掉电存储中的值

           inum2=inum21*100+inum22;

   bainum11=inum1/100;//传到数码管显示

   shinum11=inum1/10%10;

   genum11=inum1%10;           

        while(1){

                keycan();//按键

        }                  

}

void keycan(){//按键

        if(keynum==0){//当按键值等于0的时候调用显示

                displaynums();//数码管的显示

                if(if0s==0){//当if0s等于0时,继电器输出

                        out=0;

                }

                if((flag_eeprom1==1)){//加掉电存储

                        saveeepro();//掉电存储

                        flag_eeprom1=0;

                }               

        }

    if(key1==0){//当按键1按下

                if(kf0){//当标志位kf0=1的时候进行

                        if(presstime>50){//当时间值大于一百的时候

                                kf0=0;//标志位kf0=0

                                kt0=1;//标志位kt0=0

                                flag_eeprom1=1;if0s=1;out=1;if0=1;

                                presstime=0;//时间清零,重新进行

                                keynum++;//数码管的位

                        if(keynum==4){//当位到4则置位0

                                   keynum=0;

                                   if0=0;

                                 }

                                if(out==0){

                                if0=0;

                                }


                        }

                  }

        }else{//当按键松开

                keyflag();

                if((flag_eeprom1==1)){ //加掉电存储,必需加到这,不然有一些小问题

                        flag_eeprom1=0;

                        saveeepro();//掉电存储

                }

        }//按键1结束

    if(key2==0){if(kf0){if(presstime>50){kf0=0;kt0=1;presstime=0;flag_eeprom1=1;//掉电存储的标志位改为1,进行存值操作

//                                if(out==0){

//                                if0=0;if0s=1;out=1;

//                                }

                                switch(keynum){

                                        case 1:

                                                bainum11++;//数码管一加加

                                                if(bainum11>9){//当数码管一加加到9时置为1

                                                        bainum11=0;

                                                }

                                                break;

                                        case 2:shinum11++;if(shinum11>9){shinum11=0;}break;

                                        case 3:genum11++;if(genum11>9){genum11=0;}break;

[1] [2] [3]
关键字:时间继电器 引用地址:时间继电器 倒计时控制 定时通断开关模块程序包

上一篇:51单片机Keil C51的使用(C语言)
下一篇:51单片机gy906测温,语音播报,eepromc存储

小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved