找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3183|回復(fù): 1
收起左側(cè)

操作STC單片機自帶EEPROM掉電保存數(shù)據(jù)存儲器存儲數(shù)碼管顯示按秒遞增四位數(shù)字的項目...

[復(fù)制鏈接]
ID:171036 發(fā)表于 2020-4-25 10:02 | 顯示全部樓層 |閱讀模式
  1. #include <reg52.h>//52單片機頭文件
  2. #include <intrins.h>//intrins.h文件
  3. #define uchar unsigned char   // 自定義uchar為unsigned char(即無符號字符型數(shù)據(jù),數(shù)據(jù)范圍:0到255。)
  4. #define uint unsigned int     //自定義uint為unsigned int(即有符號整數(shù)型數(shù)據(jù),數(shù)據(jù)范圍:0到65535。)
  5. #define ISP_ReadCommand 0x01  //自定義ISP的讀字節(jié)操作
  6. #define ISP_WriteCommand 0x02 //自定義ISP的寫字節(jié)操作
  7. #define ISP_EraseCommand 0x03 //自定義ISP的擦除扇區(qū)操作
  8. #define ERROR   0
  9. #define OK         1
  10. sbit duanxuan=P2^6;
  11. sbit weixuan=P2^7;   
  12. uint count,value;//聲明定時器0中斷次數(shù)變量、數(shù)值變量
  13. uint ge,shi,bai,qian;//聲明數(shù)碼管個位變量、數(shù)碼管十位變量、數(shù)碼管百位變量、數(shù)碼管千位變量
  14. uint valuege,valueshi,valuebai,valueqian;//聲明數(shù)值變量個位變量、數(shù)值變量十位變量、數(shù)值變量百位變量、數(shù)值變量千位變量
  15. uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f} ; //共陰數(shù)碼管段碼數(shù)字0~9字碼表,高電平點亮數(shù)碼管段碼數(shù)字0~9。
  16. //#define WAIT_TIME   0x00     //mcu clock 小于 40mhz
  17. //#define WAIT_TIME   0x01     //mcu clock 小于 20mhz
  18. //#define WAIT_TIME   0x02     //mcu clock 小于 10mhz
  19. #define WAIT_TIME   0x03       //mcu clock 小于 5mhz
  20. sfr ISP_DATA=0xe2;  //Flash數(shù)據(jù)寄存器
  21. sfr ISP_ADDRH=0xe3; //Flash高字節(jié)地址寄存器
  22. sfr ISP_ADDRL=0xe4; //Flash低字節(jié)地址寄存器
  23. sfr ISP_CMD=0xe5;   //Flash命令模式寄存器
  24. sfr ISP_TRIG=0xe6;  //Flash命令觸發(fā)寄存器
  25. sfr ISP_CONTR=0xe7; //ISP/IAP 控制寄存器
  26. //  void Delay100us()    //晶振11.0592MHz,100微妙延時。
  27. //{
  28. //   unsigned char i, j;
  29. //   _nop_();
  30. //   _nop_();
  31. //   i = 2;
  32. //   j = 15;
  33. //   do
  34. // {
  35. //    while (--j);
  36. //   }
  37. //   while (--i);
  38. // }
  39.   void Delay(uint z)//延時程序
  40. {
  41.    uint x,y;
  42.    for(x=z;x>0;x--)
  43.     for(y=110;y>0;y--);
  44. }
  45.   void OPEN_ISP_IAP()//打開ISP/IAP功能函數(shù)
  46. {
  47.    EA=0;//關(guān)中斷
  48.    ISP_CONTR=ISP_CONTR&0x18;//0001,1000
  49.    ISP_CONTR=ISP_CONTR|WAIT_TIME;//寫入硬件延時
  50.    ISP_CONTR=ISP_CONTR|0x80;//ISPEN=1   
  51. }
  52.   void CLOSE_ISP_IAP()//關(guān)閉ISP/IAP功能函數(shù)
  53. {
  54.    ISP_CONTR=ISP_CONTR&0x7f;//ISPEN=0
  55.    ISP_TRIG=0x00;//關(guān)掉與ISP有關(guān)的特殊功能寄存器
  56.    EA=1;//開中斷
  57. }
  58.   void ActiveOperate(void)//觸發(fā)執(zhí)行函數(shù)
  59. {
  60.    OPEN_ISP_IAP(); //打開ISP/IAP功能
  61.    ISP_TRIG=0x46;  //觸發(fā)ISP_IAP命令字節(jié)1
  62.    ISP_TRIG=0xb9;  // 觸發(fā)ISP_IAP命令字節(jié)2
  63.    _nop_();//延時
  64. }
  65.   uchar ReadByte(uint byteaddress)//讀字節(jié)函數(shù)
  66. {
  67.    ISP_ADDRH=(uchar)(byteaddress>>8);//高8位字節(jié)地址
  68.    ISP_ADDRL=(uchar)(byteaddress&0x00ff);//低8位字節(jié)地址
  69.    ISP_CMD=ISP_CMD&0xf8;//清除低3位
  70.    ISP_CMD=ISP_CMD|ISP_ReadCommand;//寫入讀命令
  71.    ActiveOperate();//觸發(fā)執(zhí)行
  72.    CLOSE_ISP_IAP();//關(guān)閉ISP/IAP功能
  73.    return (ISP_DATA);//返回讀到的數(shù)據(jù)
  74. }
  75.   void SectorErase(uint sectoraddress)//刪除扇區(qū)函數(shù)
  76. {
  77.    uint isectoraddress;//聲明扇區(qū)地址變量
  78.    isectoraddress=(sectoraddress&0xfe00);//扇區(qū)地址賦值
  79.    ISP_ADDRH=(uchar)(isectoraddress>>8);//高8位字節(jié)地址
  80.    ISP_ADDRL=0x00;//低8位字節(jié)地址復(fù)位
  81.    ISP_CMD=ISP_CMD&0xf8;//清除低3位
  82.    ISP_CMD=ISP_CMD|ISP_EraseCommand;//擦除命令3
  83.    ActiveOperate();//觸發(fā)執(zhí)行
  84.    CLOSE_ISP_IAP();//關(guān)閉ISP/IAP功能
  85. }
  86.   void WriteByte(uint byteaddress,uchar originaldata)//寫字節(jié)函數(shù)
  87. {
  88.    ISP_ADDRH=(uchar)(byteaddress>>8);//高8位字節(jié)地址
  89.    ISP_ADDRL=(uchar)(byteaddress&0x00ff);//低8位字節(jié)地址
  90.    ISP_CMD=ISP_CMD&0xf8;//清除低3位
  91.    ISP_CMD=ISP_CMD|ISP_WriteCommand;//寫命令2
  92.    ISP_DATA=originaldata;//寫入數(shù)據(jù)準備
  93.    ActiveOperate();//觸發(fā)執(zhí)行
  94.    CLOSE_ISP_IAP();//關(guān)閉ISP/IAP功能
  95. }
  96.   void ShuMaGuanDisplayValue(uint value)//數(shù)碼管顯示數(shù)值函數(shù)
  97. {  
  98.    qian=value/1000;//數(shù)碼管千位變量
  99.    bai=value%1000/100;//數(shù)碼管百位變量
  100.    shi=value%100/10;//數(shù)碼管十位變量
  101.    ge=value%10;//數(shù)碼管個位變量
  102.   
  103. //
  104. //   P2=0xfe;//數(shù)碼管千位顯示位
  105. //   P0=table[qian];//數(shù)碼管千位數(shù)值顯示
  106. //   Delay(5);//延時

  107. //   P2=0xfd;//數(shù)碼管百位顯示位
  108. //   P0=table[bai];//數(shù)碼管百位數(shù)值顯示
  109. //   Delay(5);//延時

  110. //   P2=0xfb;//數(shù)碼管十位顯示位
  111. //   P0=table[shi];//數(shù)碼管十位數(shù)值顯示
  112. //   Delay(5);//延時

  113. //   P2=0xf7;//數(shù)碼管個位顯示位
  114. //   P0=table[ge];//數(shù)碼管個位數(shù)值顯示
  115. //   Delay(5);//延時

  116.    weixuan=1;
  117.    P0=0xfe;//數(shù)碼管千位顯示位
  118.    weixuan=0;
  119.    duanxuan=1;
  120.    P0=table[qian];//數(shù)碼管千位數(shù)值顯示
  121.    duanxuan=0;
  122.    P0=0xff;
  123.    Delay(5);//延時

  124.    weixuan=1;
  125.    P0=0xfd;//數(shù)碼管百位顯示位
  126.    weixuan=0;
  127.    duanxuan=1;
  128.    P0=table[bai];//數(shù)碼管百位數(shù)值顯示
  129.    duanxuan=0;
  130.    P0=0xff;
  131.    Delay(5);//延時
  132.   
  133.    weixuan=1;
  134.    P0=0xfb;//數(shù)碼管十位顯示位
  135.    weixuan=0;
  136.    duanxuan=1;
  137.    P0=table[shi];//數(shù)碼管十位數(shù)值顯示
  138.    duanxuan=0;
  139.    P0=0xff;
  140.    Delay(5);//延時

  141.    weixuan=1;
  142.    P0=0xf7;//數(shù)碼管個位顯示位
  143.    weixuan=0;
  144.    duanxuan=1;
  145.    P0=table[ge];//數(shù)碼管個位數(shù)值顯示
  146.    duanxuan=0;
  147.    P0=0xff;
  148.    Delay(5);//延時
  149. }
  150.   void Timer0Init()//定時器0初始化
  151. {
  152.    TMOD=0x01;//設(shè)定定時器類型為定時器0,定時器工作模式為模式0。
  153.    TH0=(65536-50000)/256;//TH0裝初值
  154.    TL0=(65536-50000)%256;//TL0裝初值
  155.    EA=1;//開啟定時器總中斷
  156.    ET0=1;//開啟定時器0中斷開關(guān)
  157.    TR0=1;//啟動定時器0
  158. }
  159.   void Timer0() interrupt 1//定時器0中斷函數(shù)
  160. {
  161.    TH0=(65536-50000)/256;//TH0重新裝值
  162.    TL0=(65536-50000)%256;//TL0重新裝值
  163.    count++;//定時器0中斷次數(shù)變量先賦值再加
  164.   }
  165.   void main()//主函數(shù)
  166. {
  167.    Timer0Init();//定時器0初始化函數(shù)
  168.    value=ReadByte(0x2004)*1000+ReadByte(0x2003)*100+ReadByte(0x2002)*10+ReadByte(0x2001);//斷電后,讀取EEPROM存儲器掉電保存的數(shù)據(jù)。  
  169.    if(value>=3600)//判斷數(shù)值變量是否大于等于3600
  170.    value=0;//數(shù)值變量置0
  171.    while(1)//固定循環(huán)
  172. {
  173.     if(count==18)//判斷定時器0中斷次數(shù)變量是否為18次
  174.   {
  175.      count=0;//定時器0中斷次數(shù)變量歸零
  176.      value++;//數(shù)值變量先賦值再加
  177.      valueqian=value/1000;//數(shù)值變量千位變量
  178.      valuebai=value%1000/100;//數(shù)值變量百位變量
  179.      valueshi=value%100/10;//數(shù)值變量十位變量
  180.      valuege=value%10;//數(shù)值變量個位變量
  181.      SectorErase(0x2000);//擦除EEPROM第一扇區(qū)
  182.      WriteByte(0x2004,valueqian);//對EEPROM第一扇區(qū)第4個扇區(qū)地址(從第0個扇區(qū)地址數(shù)起)重新寫入數(shù)據(jù)
  183.      WriteByte(0x2003,valuebai);//對EEPROM第一扇區(qū)第3個扇區(qū)地址(從第0個扇區(qū)地址數(shù)起)重新寫入數(shù)據(jù)
  184.      WriteByte(0x2002,valueshi);//對EEPROM第一扇區(qū)第2個扇區(qū)地址(從第0個扇區(qū)地址數(shù)起)重新寫入數(shù)據(jù)
  185.      WriteByte(0x2001,valuege);//對EEPROM第一扇區(qū)第1個扇區(qū)地址(從第0個扇區(qū)地址數(shù)起)重新寫入數(shù)據(jù)
  186.      if(value==3600)//判斷數(shù)值變量是否達到3600
  187.    {
  188.       value=0;//數(shù)值變量歸零  
  189.      }
  190.     }
  191.     ShuMaGuanDisplayValue(value);//數(shù)碼管顯示數(shù)值     
  192.    }
  193. }
復(fù)制代碼
1680900-20200213203210119-846213529.png

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復(fù)

使用道具 舉報

ID:976070 發(fā)表于 2021-12-19 16:30 | 顯示全部樓層
正在看相同問題,學(xué)習(xí)了
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表