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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機定時工作4000個小時自動損壞的程序

  [復制鏈接]
跳轉到指定樓層
樓主
ID:280979 發表于 2019-10-7 23:42 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
//實現功能:定時自毀應用程序
//使用芯片:STC15F104E
//晶振:12MHZ
//編譯環境:Keil
#include "reg52.h"
#include <intrins.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;        //擦除寄存器

/********************************************************************
                            命令定義
*********************************************************************/
#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_ADDRESS1 0X0000         //內部EEPROM地址
#define IAP_ADDRESS2 0X0200
/********************************************************************
                         最長時間定義
*********************************************************************/

#define T  4000         //定時時間(小時)
/********************************************************************
                            初始定義
*********************************************************************/
uint fen,days;
uchar Count;
uchar Count1;
uint cnt;
bit write;
sbit OUT1=P3^3;
sbit IN0=P3^5;

//============================================================
//延時程序
void delayms(unsigned int x)
{
    int i,j;                                                                                
    for(i=0;i<x;i++)                                                                    
       {
             for(j=0;j<260;j++);
       }                                                                                    
}

/********************************************************************
                            操作函數
*********************************************************************/
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();
}
/********************************************************************
                            定時中斷服務函數
*********************************************************************/
void t0(void) interrupt 1 using 1 //定時中斷服務函數
{   
    TH0=(65536-50000)/256; //對TH0 TL0 賦值
        TL0=(65536-50000)%256;

        cnt++;         //每過50ms tcnt 加一
        if(cnt==1200) //計滿1200次1分鐘
        {   cnt=0;          //重新再計
                fen++;   
                if(fen==60) //定時60分鐘,在從零開始計時
                {
                        fen=0;
                        days++;
                        write=1;
                }
        }
}
/********************************************************************
                            主函數
*********************************************************************/
void main()
{                                                                                          
         TMOD=0x01; //定時器工作在方式1
        TH0=(65536-50000)/256; //對TH0 TL0 賦值
        TL0=(65536-50000)%256;
        ET0=1;
        EA=1;
    TR0=1;                              //定時器函數初始化
        delayms(10);                                                          //開機延時
    Count=IapReadByte(IAP_ADDRESS1);                  //讀取EEPROM數據
        Count1=IapReadByte(IAP_ADDRESS1+1);                  //讀取EEPROM數據
        days=(Count*100)+Count1;                                  //從讀取數據中計算時間值
        
                while(1)
        {

         if(days>=T)                                                  //判斷如果延時時間大于等于設置時間,繼電器斷開,模塊停止工作。否則繼電器吸合
         {
           OUT1=0;
           TR0=0;
          }
        else
         {
           OUT1=1;
           TR0=1;
          }

    if(write==1) // 記滿一個小時,數據存儲一次
        {
        write=0;
         Count=days/100;
         Count1=days%100;;
          IapEraseSector(IAP_ADDRESS1);   //擦除0扇區        //34us
          IapEraseSector(IAP_ADDRESS1+1);   //擦除0扇區        //34us
      IapProgramByte(IAP_ADDRESS1,Count);            //寫入數據//38us
      IapProgramByte(IAP_ADDRESS1+1,Count1);            //寫入數據//38us
        
        }

         if(IN0==0)
         {
          delayms(10);
          if(IN0==0)
          {
           while(!IN0);
           days=0;
           Count=0;
           Count1=0;
          IapEraseSector(IAP_ADDRESS1);   //擦除0扇區        //34us
          IapEraseSector(IAP_ADDRESS1+1);   //擦除0扇區        //34us
      IapProgramByte(IAP_ADDRESS1,Count);            //寫入數據//38us
      IapProgramByte(IAP_ADDRESS1+1,Count1);            //寫入數據//38us
          }
        }
}
}


/********************************************************************
                            結束
*********************************************************************/

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

使用道具 舉報

沙發
ID:969272 發表于 2023-7-15 11:20 | 只看該作者
有沒有計算開機次數損壞的?
回復

使用道具 舉報

板凳
ID:1083996 發表于 2023-7-15 11:32 | 只看該作者
sh1900 發表于 2023-7-15 11:20
有沒有計算開機次數損壞的?

應該也能設置吧,開機多少次或復位多少次就損壞;
也可以設置成,逐漸的讓運行速度降低(intel是不是這樣操作的?)變卡,逼著用戶升級
回復

使用道具 舉報

地板
ID:1083996 發表于 2023-7-15 11:35 | 只看該作者
記得以前日本的S尼就弄過這種操作,DVD機質保1年,從第5次通電開始計算時間,到12個月時候加大激光頭輸出功率,然后15個月左右全部歇菜,后來維修換上后,激光頭只能用3個月,然后被人發現后弄出來一場風暴,從此S尼在國內逐漸勢微
回復

使用道具 舉報

5#
ID:992936 發表于 2023-7-17 22:41 | 只看該作者
某米,某想,是不是你設計的?老實交待
回復

使用道具 舉報

6#
ID:854496 發表于 2023-7-17 23:06 | 只看該作者
計劃性報廢,美其名曰:新技術,新環保,新理念
回復

使用道具 舉報

7#
ID:641483 發表于 2023-7-19 09:57 | 只看該作者
不應該自毀,應該限制功能,對于工程完成沒付 的可以用
回復

使用道具 舉報

8#
ID:213173 發表于 2023-7-19 16:57 | 只看該作者
sh1900 發表于 2023-7-15 11:20
有沒有計算開機次數損壞的?

不論用開機次數或開機累計時間自毀都很容易實現。
回復

使用道具 舉報

9#
ID:332444 發表于 2023-7-20 08:09 | 只看該作者
生產垃圾?!可恥的浪費和。
回復

使用道具 舉報

10#
ID:135715 發表于 2023-7-21 10:39 | 只看該作者
量子工業 發表于 2023-7-15 11:32
應該也能設置吧,開機多少次或復位多少次就損壞;
也可以設置成,逐漸的讓運行速度降低(intel是不是這 ...

這個可以 開機一次循環中delay增加一點點 直到最后卡的不要不要的
回復

使用道具 舉報

11#
ID:427868 發表于 2023-7-21 11:07 | 只看該作者
       看都樓主的方法我也在想采用類似的方法,就是開機計時,到一個小時寫入EEPROM,在程序中執行一個不到總時間的條件判斷,使程序正常運行,總時間到了不執行某個動作以達到保護的目的。但考慮會有一個問題,就是在程序正常運行中隨時寫入EEPROM,整個寫的過程會有幾十ms,這幾十ms過程中要關總中斷,這幾十秒很有可能會影響程序的正常運行。我考慮的解決方式是在寫EEPROM時再加一個判斷條件,這個條件成立時容許幾十毫秒的延時,不影響程序正常運行,比如在計數時,正常計數狀態下即使該寫入了也不寫入,只有當計數清零后再寫入。不知朋友是否有更好的方法。
回復

使用道具 舉報

12#
ID:709761 發表于 2023-7-21 16:07 | 只看該作者
如果硬改電路呢
回復

使用道具 舉報

13#
ID:584814 發表于 2023-7-21 17:22 | 只看該作者
當年電視臺用的肩扛的錄相機中就有個硬件,按時長自動報廢,有可視進度條。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久精品播放 | 中文精品久久 | 亚洲看片 | 国产精品二区三区 | 午夜二区 | 成人永久免费视频 | 国产一级毛片视频 | 色一级片| 九色.com| 国产资源视频 | 最新国产视频 | 久久涩涩| 免费在线视频一区二区 | 国产亚洲一区二区三区在线观看 | 天天躁日日躁狠狠躁2018小说 | 草久久| 久久机热 | 国产一级网站 | 久久国产精品一区二区三区 | 亚洲精品视频播放 | 天堂一区在线观看 | 亚洲一卡二卡 | 欧美精品一区二区免费 | 免费在线观看黄色av | 亚洲日韩视频 | 日韩有码一区 | 三级av免费| 国产资源一区二区三区 | 欧美一级在线免费观看 | 一区二区三区免费 | 国产亚洲精品久久久久动 | 嫩草影院黄 | 国产一区二区三区久久久久久久久 | 日本久久久久久 | 亚洲成av人片在线观看 | 欧美aaaaa | 国产精品久久久久久久岛一牛影视 | 粉嫩一区二区三区四区公司1 | 国产精品 亚洲一区 | 成人3d动漫一区二区三区91 | 中文天堂网 |