|
- #include "reg52.h"
- #include "intrins.h"
- #include "TM1637.h"
- #define uchar unsigned char //宏定義字符型變量
- #define uint unsigned int//宏定義整型變量
- /********************************************************************
- ************************ 寄存器設置
- *********************************************************************/
- sfr IAP_DATA =0xc2;//數據寄存器
- sfr IAP_ADDRH =0xc3;//地址寄存器
- sfr IAP_ADDRL =0xc4;//地址寄存器
- sfr IAP_CMD =0xc5; //命令寄存器
- sfr IAP_TRIG =0xc6;//觸發寄存器
- sfr IAP_CONTR =0xc7;//擦除寄存器
- sbit P33=P3^3; //定義繼電器控制輸出腳
- sbit k1=P3^2; //按鍵
- uchar tmp[4]=0,yw=0,mode=0;
- uint i,num=0,num_diaodian=100; //定義整型變量i
- uchar g1=0,s1=0,b1=0,q1=0;
- uchar g=0,s=0,b=0,q=0;
- bit ReadTimeFlag=0,Flag=0;//定義讀時間標志
- unsigned char keydate=0xff;
- /********************************************************************
- ************************ 命令定義
- *********************************************************************/
- #define CMD_IDLE 0 //EEPROM無操作
- #define CMD_READ 1 //讀取字節
- #define CMD_PROGRAM 2//寫入字節
- #define CMD_ERASE 3 //擦除字節
- /********************************************************************
- ************************ 編程周期由晶振決定
- *********************************************************************/
- //#define ENABLE_IAP 0X80 //編程周期由晶振決定(如果<30MHZ選用此項)
- //#define ENABLE_IAP 0X81 //編程周期由晶振決定(如果<24MHZ選用此項)
- //#define ENABLE_IAP 0X82 //編程周期由晶振決定(如果<20MHZ選用此項)
- #define ENABLE_IAP 0X83 //編程周期由晶振決定(如果<12MHZ選用此項)
- //#define ENABLE_IAP 0X84 //編程周期由晶振決定(如果<6MHZ選用此項)
- //#define ENABLE_IAP 0X85 //編程周期由晶振決定(如果<3MHZ選用此項)
- //#define ENABLE_IAP 0X86 //編程周期由晶振決定(如果<2MHZ選用此項)
- //#define ENABLE_IAP 0X87 //編程周期由晶振決定(如果<1MHZ選用此項)
- #define IAP_ADDRESS 0X0000 //內部EEPROM地址
- /********************************************************************
- ************************ 函數初始化
- *********************************************************************/
- void Delay(uchar n); //延時函數
- void IapIdle();//操作函數
- uchar IapReadByte(uint addr); //讀取函數
- void IapProgramByte(uint addr,uchar dat); //寫入函數
- void IapEraseSector(uint addr);//擦除函數
- void Delay5ms() //@11.0592MHz
- {
- unsigned char i, j;
- i = 54;
- j = 199;
- do
- {
- while (--j);
- } while (--i);
- }
- void key(void) // //讀按鍵值 并做處理
- {
- keydate=0XFF;
- if(ReadTimeFlag==1) //100ms讀取
- {
- ReadTimeFlag=0;
- keydate=ScanKey(); //讀按鍵值
- }
- switch(keydate)
- {
- case 0xf7: //K1
- if(mode++>=1)
- {mode=0;}
- if(mode==0)
- {
- tmp[0]=num%256;
- tmp[1]=num/256;
- tmp[2]=num_diaodian%256;
- tmp[3]=num_diaodian/256;
- Delay(8);//延時
- IapEraseSector(IAP_ADDRESS); //擦除扇區
- for(i=0;i<4;i++)//對4個字節進行數據寫入
- {
- IapProgramByte(IAP_ADDRESS+i,(uchar)tmp[i]);//寫入數據
- }
- Delay(8);
- }
- break;
- case 0xf6: //K2
- if(yw++>=3)yw=0;
- break;
- case 0xf5: //K3
- switch(mode)
- {
- case 0:
- break;
- case 1:
- if(yw==0){ if(q1++>=9)q1=0;}
- else if(yw==1){ if(b1++>=9)b1=0;}
- else if(yw==2){ if(s1++>=9)s1=0;}
- else if(yw==3){ if(g1++>=9)g1=0;}
- num_diaodian=q1*1000+b1*100+s1*10+g1;
- break;
- }
-
- break;
- case 0xf4: //K4
- switch(mode)
- {
- case 0:
- break;
- case 1:
- if(yw==0){ if(q1--<=0)q1=9;}
- else if(yw==1){ if(b1--<=0)b1=9;}
- else if(yw==2){ if(s1--<=0)s1=9;}
- else if(yw==3){ if(s1--<=0)s1=9;}
- num_diaodian=q1*1000+b1*100+s1*10+g1;
- break;
- }
-
- break;
- }
- }
- /*------------------------------------------------
- 定時器初始化子程序
- ------------------------------------------------*/
- void Init_Timer0(void)
- {
- TMOD |= 0x01; //使用模式1,16位定時器,使用"|"符號可以在使用多個定時器時不受影響
- EA=1; //總中斷打開
- ET0=1; //定時器中斷打開
- TR0=1; //定時器開關打開
- }
- /*------------------------------------------------
- 定時器中斷子程序
- ------------------------------------------------*/
- void Timer0_isr(void) interrupt 1
- {
- static unsigned int num=0,cnt=0;
- TH0=(65536-50000)/256; //重新賦值 50ms
- TL0=(65536-50000)%256;
- num++;
- if(num==3) //大致100ms
- {
- num=0;
- ReadTimeFlag=1; //讀標志位置1
- }
- if(cnt++>=8)
- {
- cnt = 0;
- Flag= ~ Flag;
-
- }
- }
- /********************************************************************
- ************************ 主函數
- *********************************************************************/
- void main()
- {
- P5M0=0; P5M1=0;
- for(i=0;i<4;i++)//對4個字節數據讀出
- {
- tmp[i]=IapReadByte(IAP_ADDRESS+i);//讀eeprom數據
- }
- num=(uint)(tmp[0]+tmp[1]*256);
- num_diaodian =(uint)(tmp[2]+tmp[3]*256);
- if(num++>=num_diaodian)//到達預定掉電次數后
- {
- P33 = 0;//輸出低電平
- }
- q=num/1000%10;
- b=num/100%10;
- s=num/10%10;
- g=num%10;
- TM1637_display(q,b,s,g,0);
- tmp[0]=num%256;
- tmp[1]=num/256;
- tmp[2]=num_diaodian%256;
- tmp[3]=num_diaodian/256;
- Delay(8);//延時
- IapEraseSector(IAP_ADDRESS); //擦除扇區
- for(i=0;i<4;i++)//對4個字節進行數據寫入
- {
- IapProgramByte(IAP_ADDRESS+i,(uchar)tmp[i]);//寫入數據
- }
- Delay(8);//延時
- Init_Timer0();
- while(1)
- {
- key();
- if(k1==0)
- { Delay5ms();
- if(k1==0)
- {
- P33 = 1;//輸出G電平
- /**********上電次數清零*********/
- num=0;
- tmp[0]=0;
- tmp[1]=0;
- tmp[2]=num_diaodian%256;
- tmp[3]=num_diaodian/256;
- Delay(1);//延時
- IapEraseSector(IAP_ADDRESS); //擦除扇區
- for(i=0;i<4;i++)//對2個字節進行數據寫入
- {
- IapProgramByte(IAP_ADDRESS+i,(uchar)tmp[i]);//寫入數據
- }
- Delay(1);//延時
-
- }
- Delay5ms();
- while(!k1) ;
- }
- q=num/1000%10;
- b=num/100%10;
- s=num/10%10;
- g=num%10;
- q1=num_diaodian/1000%10;
- b1=num_diaodian/100%10;
- s1=num_diaodian/10%10;
- g1=num_diaodian%10;
- if(mode==0)
- {
- TM1637_display(q,b,s,g,0);
- }
- else if(mode==1)
- {
- if(Flag == 0)
- {
- TM1637_display(q1,b1,s1,g1,0);
- }
- else if(Flag == 1)
- {
- if(yw==0) TM1637_display(21,b1,s1,g1,0);
- else if(yw==1) TM1637_display(q1,21,s1,g1,0);
- else if(yw==2) TM1637_display(q1,b1,21,g1,0);
- else if(yw==3) TM1637_display(q1,b1,s1,21,0);
- }
- }
- }
- }
- /********************************************************************
- ************************ 延時函數
- *********************************************************************/
- void Delay(uchar n)
- {
- uint x;
- while(n--)
- {
- x=0;
- while(++x);
- }
- }
- /********************************************************************
- ************************ 操作函數
- *********************************************************************/
- void IapIdle()
- {
- IAP_CONTR=0;
- IAP_CMD=0;
- IAP_TRIG=0;
- IAP_ADDRH=0X80;
- IAP_ADDRL=0;
- }
- /********************************************************************
- ************************ 讀取一個字節函數
- *********************************************************************/
- uchar IapReadByte(uint addr)
- {
- uchar dat;
- IAP_CONTR=ENABLE_IAP;
- IAP_CMD=CMD_READ;
- IAP_ADDRL=addr;
- IAP_ADDRH=addr>>8;
- IAP_TRIG=0X5A;
- IAP_TRIG=0XA5;
- _nop_();
- _nop_();
- _nop_();
- dat=IAP_DATA;
- IapIdle();
- return dat;
- }
- /********************************************************************
- ************************ 寫入一個字節函數
- *********************************************************************/
- void IapProgramByte(uint addr,uchar dat)
- {
- IAP_CONTR=ENABLE_IAP;
- IAP_CMD=CMD_PROGRAM;
- IAP_ADDRL=addr;
- IAP_ADDRH=addr>>8;
- IAP_DATA=dat;
- IAP_TRIG=0X5A;
- IAP_TRIG=0XA5;
- _nop_();
- _nop_();
- _nop_();
- IapIdle();
- }
- /********************************************************************
- ************************ 擦除一個字節函數
- *********************************************************************/
- void IapEraseSector(uint addr)
- {
- IAP_CONTR=ENABLE_IAP;
- IAP_CMD=CMD_ERASE;
- IAP_ADDRL=addr;
- IAP_ADDRH=addr>>8;
- IAP_TRIG=0X5A;
- IAP_TRIG=0XA5;
- _nop_();
- _nop_();
- _nop_();
- IapIdle();
- }
復制代碼
|
-
-
STC15_EEPROM_掉電計數.rar
2020-4-4 16:53 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
449.08 KB, 下載次數: 75, 下載積分: 黑幣 -5
程序
-
-
原理圖.pdf
2020-4-4 17:21 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
130.86 KB, 下載次數: 32, 下載積分: 黑幣 -5
原理圖
評分
-
查看全部評分
|