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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機硬件的使用時間限制的程序 這里起拋磚引玉的作用 相當于軟件狗 就是指定單片..

[復制鏈接]
跳轉到指定樓層
樓主
ID:13450 發表于 2017-10-30 22:33 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
前兩天有客戶委托做一個項目。這個項目做好后。我的客戶也需要把東西交付給另外的公司。但是這個公司只付了百分之三十的訂金。說好交付產品時再付百分之六十。結果交付產品時卻沒有兌現承諾。
所以客戶要求我在程序里面加一個限制使用時間的子程序。如果三十天,或者九十天。客戶還沒有打款。就不能用了。
想了幾天。寫了一段小程序。很好用。大家有需要的可以用一下。這里起一個拋磚引玉的作用。
  1. //2017.9.30  帶狗測試。運行一段時間后停止運行

  2. #include<reg52.h>
  3. #include<intrins.h>
  4. #include <stc15f102w.h>
  5. typedef unsigned char BYTE;
  6. typedef unsigned int WORD;

  7. //定義端口
  8. //sbit led = P3^4;        //LED指示燈
  9. sbit clk = P3^5;            //IIC時鐘
  10. sbit dio = P3^4;                //IIC數據
  11. sbit key_add  = P3^2;        //加按鍵
  12. sbit key_sub  = P3^3;
  13. sbit JSQ_Sig  = P3^1;                   //計數器脈沖信號
  14. sbit JSQ_Relay= P3^0;                   //計數器繼電器返回信號  計數器計數到0后返回信號給電路板

  15. unsigned char  number;
  16. unsigned char qian,bai,shi,ge,count,dog,dog_sec,dog_min,dog_hour,dog_day;
  17. unsigned char code xsbcdbuf[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77};                 //共陽數碼管

  18. //測試地址
  19. #define IAP_ADDRESS 0x0200

  20. void Delay(BYTE n);
  21. void IapIdle();
  22. BYTE IapReadByte(WORD addr);
  23. void IapProgramByte(WORD addr, BYTE dat);
  24. void IapEraseSector(WORD addr);


  25. ///=======================================

  26. void Delay_us(unsigned int i) //nus 延時
  27. {
  28.         for(;i>0;i--)
  29.         _nop_();
  30. }
  31. ///======================================

  32. void I2CStart(void) //1637 開始
  33. {
  34.         clk = 1;
  35.         dio = 1;
  36.         Delay_us(2);
  37.         dio = 0;
  38. }
  39. ///=============================================

  40. void I2Cask(void)         //1637 應答
  41. {
  42.         clk = 0;
  43.         Delay_us(5);         //在第八個時鐘下降沿之后延時 5us,開始判斷 ACK 信號
  44.         while(dio);
  45.         clk = 1;
  46.         Delay_us(2);
  47.         clk=0;
  48. }
  49. ///========================================

  50. void I2CStop(void)         // 1637 停止
  51. {
  52.         clk = 0;
  53.         Delay_us(2);
  54.         dio = 0;
  55.         Delay_us(2);
  56.         clk = 1;
  57.         Delay_us(2);
  58.         dio = 1;
  59. }
  60. ///=========================================

  61. void I2CWrByte(unsigned char oneByte) //寫一個字節
  62. {
  63.         unsigned char i;
  64.         for(i=0;i<8;i++)
  65.         {
  66.                 clk = 0;
  67.                 if(oneByte&0x01)        //低位在前
  68.                 {
  69.                         dio = 1;       
  70.                 }
  71.                 else
  72.                 {
  73.                         dio = 0;
  74.                 }
  75.                 Delay_us(3);
  76.                 oneByte=oneByte>>1;
  77.                 clk=1;
  78.                 Delay_us(3);
  79.         }
  80. }
  81. ///================================================

  82. unsigned char ScanKey(void)                 //按鍵檢測程序
  83. {
  84.         if(key_add == 0)                            //按鍵加
  85.                 {
  86.                         Delay_us(10);
  87.                         if(key_add==0)
  88.                         {
  89.                                 number = number+5;
  90.                                 IapEraseSector(IAP_ADDRESS);
  91.                                 IapProgramByte(IAP_ADDRESS,number);
  92.                                 while(!key_add);    //等待按鍵松手
  93.                         }
  94.                 }

  95.         if(key_sub == 0)                            //按鍵減
  96.                 {
  97.                         Delay_us(10);
  98.                         if(key_sub==0)
  99.                         {
  100.                                 number = number-5;
  101.                                 IapEraseSector(IAP_ADDRESS);
  102.                                 IapProgramByte(IAP_ADDRESS,number);
  103.                                 while(!key_sub);    //等待按鍵松手
  104.                         }
  105.                 }
  106. }

  107. ///================================================
  108. void jisuan()
  109. {
  110.         qian = number/1000;
  111.         bai  = number%1000/100;
  112.         shi         = number%1000%100/10;
  113.         ge         = number%10;
  114. }

  115. void SmgDisplay(void) //寫顯示寄存器
  116. {
  117.         unsigned char i;
  118.         I2CStart();
  119.         I2CWrByte(0x40); // 40H 地址自動加 1 模式,44H 固定地址模式,本程序采用自加 1 模式
  120.         I2Cask();
  121.         I2CStop();
  122.         I2CStart();
  123.         I2CWrByte(0xc1);//設置首地址,
  124.         I2Cask();
  125.         for(i=0;i<6;i++)//地址自加,不必每次都寫地址
  126.         {
  127.                 I2CWrByte(xsbcdbuf[bai]);        //送數據
  128.                 I2Cask();
  129.                 I2CWrByte(xsbcdbuf[shi]);        //送數據
  130.                 I2Cask();
  131.                 I2CWrByte(xsbcdbuf[ge]);        //送數據
  132.                 I2Cask();
  133.                 I2CWrByte(xsbcdbuf[1]);        //送數據
  134.                 I2Cask();
  135.                 I2CWrByte(xsbcdbuf[0]);        //送數據
  136.                 I2Cask();
  137.                 I2CWrByte(xsbcdbuf[qian]);        //送數據
  138.                 I2Cask();
  139.         }

  140.         I2CStop();
  141.         I2CStart();
  142.         I2CWrByte(0x8b); //開顯示 ,八級亮度調制 88 89 8a 8b 8c 8d 8e 8f
  143.         I2Cask();
  144.         I2CStop();
  145. }
  146. ///==============================================

  147. void init()                         //定時器中斷初始化
  148. {
  149.         TMOD = 0x01;                    //set timer0 as mode1 (16-bit)
  150.     TL0 = (65536-50000)%256;                     //initial timer0 low byte
  151.     TH0 = (65536-50000)/256;               //initial timer0 high byte
  152.     TR0 = 1;                        //timer0 start running
  153.     ET0 = 1;                        //enable timer0 interrupt
  154.     EA = 1;                         //open global interrupt switch
  155.         count = 0;
  156.         number = 200;
  157.         dog_sec = 0;
  158.         dog_min = 0;
  159.         dog_hour = 0;
  160. }
  161. ///==============================================

  162. void dog_test()
  163. {
  164.         dog_sec++;
  165.         if(dog_sec == 60)                          //60s鐘讓狗加1
  166.         {
  167.                 dog_sec = 0;
  168.                 dog_min++;
  169.                 if(dog_min ==60)
  170.                 {
  171.                         dog_min=0;
  172.                         dog_hour++;
  173.                         if(dog_hour ==24)                   //正常是24小時。測試時用1個小時算1天。
  174.                         {         
  175.                                 dog_hour=0;
  176.                                 dog_day++;
  177.                                 IapEraseSector(0x0000);
  178.                                 IapProgramByte(0x0000,dog_day);
  179.                         }
  180.                 }                       
  181.         }
  182. }

  183. void main(void)
  184. {
  185.         unsigned char keydate;
  186.         init();                         //初始化
  187.         dog_day = IapReadByte(0x0000);
  188.         number  = IapReadByte(IAP_ADDRESS);       
  189.         while(1)
  190.         {
  191.                 jisuan();
  192.                 SmgDisplay();
  193.                 ScanKey();
  194.                 if(count == 20)                         //脈沖信號來一次。計數器減1
  195.                 {
  196.                         count = 0;
  197.                         number--;
  198.                         IapEraseSector(IAP_ADDRESS);
  199.                         IapProgramByte(IAP_ADDRESS,number);
  200.                         dog_test();
  201.                         if(number ==0)
  202.                         {                       
  203.                                 number = 255;
  204.                         }
  205.                 }
  206.                 while(dog_day>=1);                  //2天后停止運行。實際上是2個小時。測試用小時代替天。
  207.         }
  208. }
  209. //===========end==================================

  210. /* Timer0 interrupt routine */
  211. void tm0_isr() interrupt 1 using 1
  212. {
  213.     TL0 = (65536-50000)%256;                   //reload timer0 low byte
  214.     TH0 = (65536-50000)/256;                //reload timer0 high byte
  215.     count++;dog++;
  216. }

  217. /*----------------------------
  218. 軟件延時
  219. ----------------------------*/
  220. void Delay(BYTE n)
  221. {
  222.     WORD x;

  223.     while (n--)
  224.     {
  225.         x = 0;
  226.         while (++x);
  227.     }
  228. }

  229. /*----------------------------
  230. 關閉IAP
  231. ----------------------------*/
  232. void IapIdle()
  233. {
  234.     IAP_CONTR = 0;                  //關閉IAP功能
  235.     IAP_CMD = 0;                    //清除命令寄存器
  236.     IAP_TRIG = 0;                   //清除觸發寄存器
  237.     IAP_ADDRH = 0x80;               //將地址設置到非IAP區域
  238.     IAP_ADDRL = 0;
  239. }

  240. /*----------------------------
  241. 從ISP/IAP/EEPROM區域讀取一字節
  242. ----------------------------*/
  243. BYTE IapReadByte(WORD addr)
  244. {
  245.     BYTE dat;                       //數據緩沖區

  246.     IAP_CONTR = ENABLE_IAP;         //使能IAP
  247.     IAP_CMD = CMD_READ;             //設置IAP命令
  248.     IAP_ADDRL = addr;               //設置IAP低地址
  249.     IAP_ADDRH = addr >> 8;          //設置IAP高地址
  250.     IAP_TRIG = 0x5a;                //寫觸發命令(0x5a)
  251.     IAP_TRIG = 0xa5;                //寫觸發命令(0xa5)
  252.     _nop_();                        //等待ISP/IAP/EEPROM操作完成
  253.     dat = IAP_DATA;                 //讀ISP/IAP/EEPROM數據
  254.     IapIdle();                      //關閉IAP功能

  255.     return dat;                     //返回
  256. }

  257. /*----------------------------
  258. 寫一字節數據到ISP/IAP/EEPROM區域
  259. ----------------------------*/
  260. void IapProgramByte(WORD addr, BYTE dat)
  261. {
  262.     IAP_CONTR = ENABLE_IAP;         //使能IAP
  263.     IAP_CMD = CMD_PROGRAM;          //設置IAP命令
  264.     IAP_ADDRL = addr;               //設置IAP低地址
  265.     IAP_ADDRH = addr >> 8;          //設置IAP高地址
  266.     IAP_DATA = dat;                 //寫ISP/IAP/EEPROM數據
  267.     IAP_TRIG = 0x5a;                //寫觸發命令(0x5a)
  268.     IAP_TRIG = 0xa5;                //寫觸發命令(0xa5)
  269.     _nop_();                        //等待ISP/IAP/EEPROM操作完成
  270.     IapIdle();
  271. }

  272. /*----------------------------
  273. 扇區擦除
  274. ----------------------------*/
  275. void IapEraseSector(WORD addr)
  276. {
  277.     IAP_CONTR = ENABLE_IAP;         //使能IAP
  278.     IAP_CMD = CMD_ERASE;            //設置IAP命令
  279.     IAP_ADDRL = addr;               //設置IAP低地址
  280.     IAP_ADDRH = addr >> 8;          //設置IAP高地址
  281.     IAP_TRIG = 0x5a;                //寫觸發命令(0x5a)
  282.     IAP_TRIG = 0xa5;                //寫觸發命令(0xa5)
  283.     _nop_();                        //等待ISP/IAP/EEPROM操作完成
  284.     IapIdle();
  285. }

復制代碼



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

使用道具 舉報

沙發
ID:495990 發表于 2020-2-7 10:15 | 只看該作者
這么好的貼咋沒人頂一個呢?
回復

使用道具 舉報

板凳
ID:620993 發表于 2020-2-7 11:52 | 只看該作者
很好的思路
回復

使用道具 舉報

地板
ID:73422 發表于 2020-2-9 20:29 | 只看該作者
這個不好用,別人要是付款了還得去給別人改,很麻煩。
時間到后產生一個隨機碼,機器鎖死,如果客戶付款了,讓他把隨機碼發過來,這邊用解碼算法算出密碼,讓客戶輸入設備就可以正常使用了。而且每臺設備產生的隨機碼不相同,密碼也就不一樣。以前用匯編寫過。
回復

使用道具 舉報

5#
ID:136189 發表于 2020-2-12 23:09 來自手機 | 只看該作者
很好哦,
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: av日韩高清 | 久久精品视频9 | 精品欧美一区二区精品久久久 | a级大毛片 | av天天干 | 国产黄色大片在线观看 | 久草视频在线播放 | 亚洲精选一区二区 | h片在线观看网站 | 国产精品久久久久久久久久三级 | 91欧美激情一区二区三区成人 | 爱爱综合网 | 久久国产成人 | 久久精品国内 | 久久免费精品 | 亚洲精品成人 | 精品视频一区二区三区在线观看 | 亚洲一区二区三区视频 | 欧美在线一区二区三区 | av国产精品| www.887色视频免费 | 视频二区 | 欧美一区不卡 | 国产精品美女久久久久久久久久久 | 亚洲一av| 久久国产精品亚洲 | 成人在线一区二区 | 久久精品亚洲精品国产欧美 | 国产高清一区二区 | a级免费黄色片 | 国产 日韩 欧美 在线 | 欧美一区2区三区4区公司 | 国产精品视频一区二区三区不卡 | 色吧综合网 | 欧美爱爱视频网站 | 黄视频免费 | 91精品国产综合久久精品 | 欧美一级在线观看 | 一级免费在线视频 | 色吊丝在线 | 日韩在线一区二区三区 |