欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4572|回復: 2
打印 上一主題 下一主題
收起左側

時間繼電器 倒計時控制 定時通斷開關模塊程序包帶原理圖

  [復制鏈接]
跳轉到指定樓層
樓主
#include <reg52.h>          //用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;
                                        default:break;
                                }
                        }}}else{keyflag();displaynums();
                                        if((flag_eeprom1==1))//加掉電存儲,必需加到這,不然有一些小問題
                                        {   flag_eeprom1=0;
                                            saveeepro();//掉電存儲
                                        }
                        }//松開按鍵進行顯示       
}

void tm0_isr() interrupt 1 using 1
{//500等1s
        TL0 = 0x18;                //設置定時初值
        TH0 = 0xFC;                //設置定時初值
        presstime++;
   i++;
           if (if0==0){//當if0==0時開始倒計時
                mm++;
                if(mm==500){//一秒時間到
                        mm=0;
                        ff++;
                        if(ff>60){//一分鐘
                                ff=0;
                                sss++;
                                ss=sss;
                                flag_eeprom1=1;
                                if(sss>60){//一小時
                                        sss=0;
                                        inum2--;
                                        flag_eeprom1=1;
                                        if(inum2==0){
                                                if0s=0;//繼電器輸出
                                                if0=1;//返回設置的時長
                                                flag_eeprom1=1;
                                        }
                                }
                        }
                }       
        }
           switch (i){
                     case 1: s10(); xuaze(bainum1); if(keynum==1 || keynum==0){p1 = 0;}p2 = 1;p3 = 1;break;
                  case 2: s10(); xuaze(shinum1); if(keynum==2 || keynum==0){p2 = 0;}p1 = 1;p3 = 1;break;
                  case 3: s10(); xuaze(genum1);  if(keynum==3 || keynum==0){p3 = 0;}p1 = 1;p2 = 1;break;
                  default:i=0;s10(); break;
                }

}       

void timer0_1init(){//定時器聲明
        TMOD=0x11;//將定時器0,1都設置為模式1
        TL0 = 0x18;                //設置定時初值
        TH0 = 0xFC;                //設置定時初值
        TR0=1;//開啟定時器0
        TR1=1;//開啟定時器1
        EA=1;//開總中斷
        ET0=1;//開定時器0的中斷
}          
/**********************數碼管顯示部分開始**************************/
void displaynums(){//將數字傳到數碼管上顯示
        if (if0==0){//當if0==0時num1三個數碼管進行顯示               
                genum1=inum2%10;//個位
                shinum1=inum2/10%10;//十位
                bainum1=inum2/100;//百
        }else{
                bainum1=bainum11;
                shinum1=shinum11;
                genum1=genum11;
                inum1=bainum11*100+shinum11*10+genum11;        //將num1三個數碼管的值付給inum
                inum2=inum1;
        }                         
}
void s0(){pa = 1;pb = 1;pc = 1;pd = 1;pe = 1;pf = 1;pg = 0;}
void s1(){pb = 1;pc = 1;pa = 0;pg = 0;pd = 0;pe = 0;pf = 0;}
void s2(){pa = 1;pb = 1;pg = 1;pe = 1;pd = 1;pf = 0;pc = 0;}
void s3(){pa = 1;pb = 1;pg = 1;pc = 1;pd = 1;pf = 0;pe = 0;}
void s4(){pb = 1;pg = 1;pc = 1;pf = 1;pa = 0;pd = 0;pe = 0;}
void s5(){pa = 1;pg = 1;pc = 1;pd = 1;pf = 1;pe = 0;pb = 0;}
void s6(){pa = 1;pg = 1;pc = 1;pd = 1;pf = 1;pe = 1;pb = 0;}
void s7(){pa = 1;pb = 1;pc = 1;pf = 0;pe = 0;pd = 0;pg = 0;}
void s8(){pa = 1;pb = 1;pg = 1;pc = 1;pd = 1;pf = 1;pe = 1;}
void s9(){pa = 1;pb = 1;pg = 1;pc = 1;pd = 1;pf = 1;pe = 0;}
void s10(){pa =0;pb = 0;pc = 0;pf = 0;pe = 0;pd = 0;pg = 0;}
void xuaze(unsigned char j){
        if(j == 0){s0();}
        else if(j == 1){s1();}
        else if(j == 2){s2();}
        else if(j == 3){s3();}
        else if(j == 4){s4();}
        else if(j == 5){s5();}
        else if(j == 6){s6();}
        else if(j == 7){s7();}
        else if(j == 8){s8();}
        else if(j == 9){s9();}}
/**********************數碼管顯示部分結束**************************/
/**********************掉電存儲部分開始**************************/
//掉電存儲
//void Delay(BYTE n){
//   WORD x;
//        while (n--){x = 0;while (++x);}
//}
//關閉IAP
void IapIdle(){
     IAP_CONTR  = 0;                     //關閉IAP功能
     IAP_CMD  = 0;                       //清除命令寄存器
     IAP_TRIG  = 0;                     //清除觸發寄存器
     IAP_ADDRH  = 0x80;                  //將地址設置到非IAP區域
     IAP_ADDRL  = 0;
}
//從ISP/IAP/EEPROM區域讀取一字節
BYTE IapReadByte(WORD addr){
     BYTE dat;                          //數據緩沖區
     IAP_CONTR = ENABLE_IAP;           //使能IAP
     IAP_CMD = CMD_READ;               //設置IAP命令
     IAP_ADDRL = addr;                 //設置IAP低地址
     IAP_ADDRH = addr >> 8;            //設置IAP高地址
     IAP_TRIG = 0x5a;                   //寫觸發命令(0x5a
     IAP_TRIG = 0xa5;                   //寫觸發命令(0xa5
     _nop_();                           //等待ISP/IAP/EEPROM操作完
     dat = IAP_DATA;                    //讀ISP/IAP/EEPROM數據
     IapIdle();                         //關閉IAP功能
     return dat;                        //返回
}
//寫一字節數據到ISP/IAP/EEPROM區域
void IapProgramByte(WORD addr, BYTE dat){
     IAP_CONTR = ENABLE_IAP;           //使能IAP
     IAP_CMD = CMD_PROGRAM;            //設置IAP命令
     IAP_ADDRL = addr;                 //設置IAP低地址
     IAP_ADDRH = addr >> 8;            //設置IAP高地址
     IAP_DATA = dat;                    //寫ISP/IAP/EEPROM數據
     IAP_TRIG = 0x5a;                   //寫觸發命令(0x5a
     IAP_TRIG = 0xa5;                   //寫觸發命令(0xa5
     _nop_();                           //等待ISP/IAP/EEPROM操作完
     IapIdle();
}
//扇區擦除
void IapEraseSector(WORD addr){
     IAP_CONTR = ENABLE_IAP;           //使能IAP
     IAP_CMD = CMD_ERASE;              //設置IAP命令
     IAP_ADDRL = addr;                 //設置IAP低地址
     IAP_ADDRH = addr >> 8;           //設置IAP高地址
     IAP_TRIG = 0x5a;                   //寫觸發命令(0x5a
     IAP_TRIG = 0xa5;                   //寫觸發命令(0xa5
     _nop_();                           //等待ISP/IAP/EEPROM操作完
     IapIdle();
}
void saveeepro(){//掉電存儲
                 inum11=inum1/100;//把int型的值拆分到char型
                 inum12=inum1%100;
                 inum21=inum2/100;
                 inum22=inum2%100;
           IapEraseSector(0);
           IapProgramByte(1, inum11);//數值1
           IapProgramByte(2, inum12);
           IapProgramByte(3, inum21);       
           IapProgramByte(4, inum22);       
           IapProgramByte(5, if0);//倒計時的狀態
           IapProgramByte(6, if0s);//繼電器的狀態
           IapProgramByte(7, ss);//存分
}
/**********************掉電存儲部分結束**************************/
void keyflag(){//按鍵結束調用,按鍵的建議使用,這樣可以減小code,但是觸發的不建議
           if(kt0){//當標志位kt0=1的時候進行
                   if(presstime>50){//當時間值大于一百的時候
                        kf0=1;//標志位kf0=1
                        kt0=0;//標志位kt0=0
                           presstime=0;//時間清零,重新進行
                        }
           }
}

應用舉例延時接通.JPG (130.81 KB, 下載次數: 90)

應用舉例延時接通.JPG

數顯可編程延時接通或延時斷開模塊最新整理配套例程.rar

3.7 MB, 下載次數: 108, 下載積分: 黑幣 -5

數顯可編程延時接通或延時斷開模塊原理圖及PCB圖.rar

192.45 KB, 下載次數: 108, 下載積分: 黑幣 -5

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏8 分享淘帖 頂2 踩
回復

使用道具 舉報

無效樓層,該帖已經被刪除
板凳
ID:846219 發表于 2020-11-24 14:10 | 只看該作者
這個項目真的很有用

評分

參與人數 1黑幣 +30 收起 理由
NMT1999 + 30 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

地板
ID:480051 發表于 2020-12-25 15:12 | 只看該作者
很實用的項目
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表