久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

無線單路可編程遙控帶數碼管延時程序四位數碼管顯示倒計時遙控繼電器

[復制鏈接]
跳轉到指定樓層
樓主
ID:280979 發表于 2019-11-17 23:02 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
#include<STC15W408AS.h>                 //庫文件
#include <intrins.H>
#define uchar unsigned char//宏定義無符號字符型
#define uint unsigned int  //宏定義無符號整型
typedef unsigned char  INT8U;
typedef unsigned int   INT16U;
#define ENABLE_ISP 0x82 //系統工作時鐘<20MHz 時,對IAP_CONTR 寄存器設置此值
#define WD1        0x5a        //使用STC11xx系列單片機時,先寫入0x5a,然寫入0xa5
#define WD2        0xa5
char IAPAddr=0;
/********************************************************************
                            初始定義
*********************************************************************/
static uint ss=0; //ss為靜態
uint t=0,smg=0,ge=0,shi=0,bai=0,qian=0,y=0,s=0,j=0,z=0,k=0,a=0,kf=0,zz=0,sd=0,sv=0,so=0,sl=0;
sbit aj1=P3^0; //選位         
sbit aj2=P3^1; //加時間
sbit L1=P3^5; //數碼管1
sbit L2=P3^4; //數碼管2
sbit L3=P3^3; //數碼管3
sbit L4=P3^2; //數碼管
sbit out = P3^7;   //繼電器
sbit in_1 = P3^6;   //輸入觸發端
sbit in_2 = P5^4;   //遙控輸入觸發端
sbit in_3 = P5^5;   //遙控輸入觸發端
code uchar seg7code[10]={0x6F,0x21,0x8F,0xAB,0xE1,0xEA,0xEE,0x23,0xEF,0xEB}; //顯示段碼 數碼管字跟
uchar x;
uchar wei=0;
/********************************************************************
                            延時函數
*********************************************************************/
union union_temp16
{
    INT16U un_temp16;
    INT8U  un_temp8[2];
}my_unTemp16;

INT8U Byte_Read(INT16U add);              //讀一字節,調用前需打開IAP 功能
void Byte_Program(INT16U add, INT8U ch);  //字節編程,調用前需打開IAP 功能
void Sector_Erase(INT16U add);            //擦除扇區
void IAP_Disable();                       //關閉IAP 功能
void Delay();
/*******************************************************************
*                        選位按鍵
********************************************************************/
void key_1(){
    if(aj1==0)
         {
           if(ss>220){ ss=0;
                if(aj1==0){
                     z=1;
                      y+=1;//選位標志位
                           k=0;                //倒計時標志位
                            out=1;         //停止輸出
                           if(y==5){
                             y=0;           //選位標志重個位開始重新選
                                 z=0;          //全部顯示
                                 s=sd+sv+so+sl;        //把s值給kf
                                 kf=s;
                                 Sector_Erase(0);   //擦除EEPROM
                                 Byte_Program(1, (sd));  //寫入扇區
                                 Byte_Program(2, (sv/10));
                                 Byte_Program(3, (so/100));
                                 Byte_Program(4, (sl/1000));
                          }
                        }
                  }
           while(aj1==0);
         }
  }
/*******************************************************************
*                        加按鍵
********************************************************************/
void key_2(){
    if(aj2==0)
         {
           if(ss>220){ ss=0;
                if(aj2==0){
                     if(y==1){          //個位
                                   sd+=1;
                                     if(sd==10){
                                           sd=0;
                                          }
                                    }
                    if(y==2){           //十位
                                   sv+=10;
                                     if(sv==100){
                                          sv=0;
                                         }
                                   }
                        if(y==3){                //百位
                                    so+=100;
                                          if(so==1000){
                                            so=0;
                                          }
                                          }
                         if(y==4){                //百位
                                    sl+=1000;
                                          if(sl>9999){
                                            sl=0;
                                          }
                                   }
                        // if(s>=10000){s=9999;}
                        }
                  }
           while(aj2==0); //按一下加一下
         }
  }
/*******************************************************************
*                        暫停,繼續按鍵
********************************************************************/
void key_3(){
    if(in_3==1)
         {
           if(ss>220){ ss=0;
                if(in_3==1){
                           zz++;
                         if(zz==1){k=0;out=1;}  
                         if(zz==2){k=1;zz=0;}
                        }
                  }
           while(in_3==1);
         }
  }
/*******************************************************************
*                        定時器配置
********************************************************************/
void ConfigTimer0(){
        TMOD=0x01;//將定時器0,1都設置為模式1
    TH0=0XFC;//1ms
    TL0=0X66;
        TR0=1;//開啟定時器0
        ET0=1;//開定時器0的中斷
        EA=1;//開總中斷
}

/*******************************************************************
*                         顯示
********************************************************************/
void led(uint date)
{
qian=date/1000;
bai=date%1000/100;
shi=date%100/10;
ge=date%10;
}

/********************************************************************
                            主函數
*********************************************************************/
void main()
{
     P1M0 = 0xff;
     P1M1 = 0x00;
         //P3M0 = 0x34;
     //P3M1 = 0x00;
         ConfigTimer0();
          // out=0;
           ge= Byte_Read(1);    //讀EEPROM的值,存到read_eeprom  
          shi= Byte_Read(2);    //讀EEPROM的值,存到read_eeprom
          bai= Byte_Read(3);    //讀EEPROM的值,存到read_eeprom
         qian= Byte_Read(4);    //讀EEPROM的值,存到read_eeprom
          s=ge+shi*10+bai*100+qian*1000;
          kf=s;
           while(1)
    {          
           key_1();
            key_2();
                key_3();
                if(in_1==0){         //P3.6口輸入標志位
                k=1;
                }
                         if(in_2==1){ //        遙控從新開始計數
                 k=1;s=kf;zz=0;j=0;
                    }
          if(y==0){led(s);}
          if(y==1){led(sd);}
          if(y==2){led(sv);}
          if(y==3){led(so);}
          if(y==4){led(sl);}
          }
}
/********************************************************************
                            定時中斷服務函數
*********************************************************************/
void t0(void) interrupt 1 //定時中斷服務函數
{
    TH0=0xFC;
    TL0=0x66;
    ss++;
     if(z==0){
          smg++;
          }
           else{
             smg=y;//讓逐個顯示位
           }          
                if(k==1){
                 out=0;
                    j++;  // 讓毫秒變秒
                         if(j==1000){        //1s
                           s-=1; //減時間
                            j=0;
                         if(s==0){
                           out=1;        //輸出
                            s=kf;         //歸剛剛設定的值
                             k=0;        //倒計時位歸0
                           }
                         }
                  }
        switch(smg)
        {
          case 1:  P1=seg7code[ge]; L1=1;L2=1;L3=1;L4=0;break;
          case 2:  P1=seg7code[shi]; L1=1;L2=1;L3=0;L4=1;break;
          case 3:  P1=seg7code[bai]; L1=1;L2=0;L3=1;L4=1;break;
          case 4:  P1=seg7code[qian]; L1=0;L2=1;L3=1;L4=1;break;
          default:  smg=0;L1=1;L2=1;L3=1;L4=1; break;
        }
}
       

/*********************************************************************************************
*********************************************************************************************/
//讀一字節,調用前需打開IAP 功能,入口:DPTR = 字節地址,返回:A = 讀出字節
INT8U Byte_Read(INT16U add)
{
    IAP_DATA = 0x00;
    IAP_CONTR = ENABLE_ISP;         //打開IAP 功能, 設置Flash 操作等待時間
    IAP_CMD = 0x01;                 //IAP/ISP/EEPROM 字節讀命令

    my_unTemp16.un_temp16 = add;
    IAP_ADDRH = my_unTemp16.un_temp8[0];    //設置目標單元地址的高8 位地址
    IAP_ADDRL = my_unTemp16.un_temp8[1];    //設置目標單元地址的低8 位地址

    //EA = 0;
    IAP_TRIG = WD1;   //先送 WD1,再送WD2 到ISP/IAP 觸發寄存器,每次都需如此
    IAP_TRIG = WD2;   //送完WD2 后,ISP/IAP 命令立即被觸發起動
    _nop_();
    //EA = 1;
    IAP_Disable();  //關閉IAP 功能, 清相關的特殊功能寄存器,使CPU 處于安全狀態,
                    //一次連續的IAP 操作完成之后建議關閉IAP 功能,不需要每次都關
    return (IAP_DATA);
}
/*********************************************************************************************/
//字節編程,調用前需打開IAP 功能,入口:DPTR = 字節地址, A= 須編程字節的數據
void Byte_Program(INT16U add, INT8U ch)
{
    IAP_CONTR = ENABLE_ISP;         //打開 IAP 功能, 設置Flash 操作等待時間
    IAP_CMD = 0x02;                 //IAP/ISP/EEPROM 字節編程命令

    my_unTemp16.un_temp16 = add;
    IAP_ADDRH = my_unTemp16.un_temp8[0];    //設置目標單元地址的高8 位地址
    IAP_ADDRL = my_unTemp16.un_temp8[1];    //設置目標單元地址的低8 位地址

    IAP_DATA = ch;                  //要編程的數據先送進IAP_DATA 寄存器
    //EA = 0;
    IAP_TRIG = WD1;   //先送 WD1,再送WD2 到ISP/IAP 觸發寄存器,每次都需如此
    IAP_TRIG = WD2;   //送完WD2 后,ISP/IAP 命令立即被觸發起動
    _nop_();
    //EA = 1;
    IAP_Disable();  //關閉IAP 功能, 清相關的特殊功能寄存器,使CPU 處于安全狀態,
                    //一次連續的IAP 操作完成之后建議關閉IAP 功能,不需要每次都關
}
/*********************************************************************************************
//擦除扇區, 入口:DPTR = 扇區地址 */
void Sector_Erase(INT16U add)
{
    IAP_CONTR = ENABLE_ISP;         //打開IAP 功能, 設置Flash 操作等待時間
    IAP_CMD = 0x03;                 //IAP/ISP/EEPROM 扇區擦除命令

    my_unTemp16.un_temp16 = add;
    IAP_ADDRH = my_unTemp16.un_temp8[0];    //設置目標單元地址的高8 位地址
    IAP_ADDRL = my_unTemp16.un_temp8[1];    //設置目標單元地址的低8 位地址

    //EA = 0;
    IAP_TRIG = WD1;   //先送 WD1,再送WD2 到ISP/IAP 觸發寄存器,每次都需如此
    IAP_TRIG = WD2;   //送完WD2 后,ISP/IAP 命令立即被觸發起動
    _nop_();
    //EA = 1;
    IAP_Disable();  //關閉IAP 功能, 清相關的特殊功能寄存器,使CPU 處于安全狀態,
                    //一次連續的IAP 操作完成之后建議關閉IAP 功能,不需要每次都關
}
/*********************************************************************************************/
void IAP_Disable()
{
    //關閉IAP 功能, 清相關的特殊功能寄存器,使CPU 處于安全狀態,
    //一次連續的IAP 操作完成之后建議關閉IAP 功能,不需要每次都關
    IAP_CONTR = 0;      //關閉IAP 功能
    IAP_CMD   = 0;      //清命令寄存器,使命令寄存器無命令,此句可不用
    IAP_TRIG  = 0;      //清命令觸發寄存器,使命令觸發寄存器無觸發,此句可不用
    IAP_ADDRH = 0;
    IAP_ADDRL = 0;
}
/*********************************************************************************************/

無線單路可編程遙控帶數碼管延時模塊原理圖及PCB圖.rar

251.61 KB, 下載次數: 31, 下載積分: 黑幣 -5

程序包.rar

516.53 KB, 下載次數: 32, 下載積分: 黑幣 -5

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美日韩国产一区二区 | 麻豆av网站 | 久久亚洲国产精品 | 一区二区三区不卡视频 | 视频一区二区在线观看 | 成人欧美在线 | 欧美色性 | 亚洲成人播放器 | 国产精品一区二区三区在线 | 午夜精品久久久久久久99黑人 | 免费观看的黄色网址 | 国产精品精品视频 | 在线观看日本高清二区 | 欧美精品一区二区在线观看 | 国产精品视频入口 | 伊人网站在线观看 | 精品二区| 亚洲精品久久久久久下一站 | 色片在线观看 | 国产精品久久久久久久久免费丝袜 | 欧美日在线| 亚洲三区在线观看 | 日韩精品一区二 | 日本午夜在线视频 | 国产欧美在线播放 | av网站观看| 91久久精品一区二区二区 | 日韩在线视频一区 | 国产伦精品一区二区三区照片91 | 欧美精品一二三 | 日韩三级在线 | 欧美又大粗又爽又黄大片视频 | 蜜桃五月天 | 久久久久久久久久久久久久国产 | 精品一二三区 | www.久久.com | 国产精品久久久久久久久免费高清 | 欧美性另类 | 91免费在线看 | 特级丰满少妇一级aaaa爱毛片 | 91精品欧美久久久久久久 |