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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 5601|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

智能秒表(單片機(jī)內(nèi)部EEPROM)的設(shè)計(jì)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
這是我做的一個(gè)基于51單片機(jī)的秒表程序(數(shù)碼管顯示),具有以下功能:智能秒表(使用內(nèi)部EEPROM)
(1)啟動(dòng)/停止功能
(2)復(fù)位/間隔功能  
(3)兩種工作模式  
(4)查看數(shù)據(jù)功能      
(5)斷電記憶功能  



1、模式1:累積計(jì)時(shí)模式
1)按按鍵1可實(shí)現(xiàn)秒表開(kāi)始、停止、再開(kāi)始、再停止計(jì)時(shí)(時(shí)間累計(jì))
(2)計(jì)時(shí)完畢,按按鍵2計(jì)時(shí)歸零。

2、模式2:間隔計(jì)時(shí)模式
(1) 按按鍵1開(kāi)始計(jì)時(shí);
(2) 按按鍵2一次暫停秒表并顯示當(dāng)前時(shí)間。間隔時(shí)間顯示2秒后秒表將持續(xù)計(jì)時(shí)。(例如在3秒鐘時(shí)秒表被暫停,2秒鐘后秒表從5秒開(kāi)始繼續(xù)計(jì)時(shí)。顯示2秒是為了方便記錄當(dāng)前時(shí)間);
(3) 在下一點(diǎn)終止時(shí)再按按鍵2記錄此時(shí)相關(guān)信息,如此重復(fù);
(4) 當(dāng)計(jì)時(shí)停止時(shí)按按鍵1;
(5)可通過(guò)按鍵3查看前面操作所記錄的時(shí)間,最多可查看10個(gè)記錄;
(6) 計(jì)時(shí)完畢,按按鍵2鍵計(jì)時(shí)歸零。


仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載):




七、調(diào)試方法和步驟
1、通電前先用萬(wàn)用表歐姆檔(1KΩ檔)測(cè)量電源兩端正反向電阻,正向電阻約80KΩ,反向電阻約6.5KΩ。如果電阻很小,則說(shuō)明有短路性故障,不能通電,排除短路故障后才能通電,如果電阻為無(wú)窮大,則有開(kāi)路性故障。
2、通電后,測(cè)量單片機(jī)40腳與20腳之間的電壓應(yīng)該有5V左右,如果電壓不正常,則說(shuō)明單片機(jī)供電不正常,應(yīng)重點(diǎn)檢查單片機(jī)供電電路。
3、測(cè)量單片機(jī)晶振引腳18和19腳電壓,應(yīng)該在1.9~2.3V左右,兩個(gè)引腳電壓相差0.2V左右,如果這兩個(gè)引腳電壓不正常,說(shuō)明晶振電路沒(méi)有起振,重點(diǎn)檢查晶振和補(bǔ)償電容是否焊接好。
4、測(cè)量單片機(jī)復(fù)位引腳9腳,正常工作時(shí)電壓為0V,按復(fù)位鍵時(shí)為5V,松開(kāi)手后由5V逐漸降至0V。如果該腳電壓不正常,說(shuō)明復(fù)位電路有故障,需要檢查該腳的電阻、電容的連接和焊接是否正確。
5、以上步驟的測(cè)量如果正常,則多數(shù)是單片機(jī)的軟件問(wèn)題,可以通過(guò)編寫(xiě)幾個(gè)小程序單獨(dú)調(diào)試I/O口、按鍵、數(shù)碼管和存儲(chǔ)器的功能,測(cè)試到底是軟件問(wèn)題還是硬件問(wèn)題。


全部資料帶完整論文下載(word格式 可編輯):
項(xiàng)目1智能秒表2(內(nèi)部EEPROM).rar (1.35 MB, 下載次數(shù): 128)



評(píng)分

參與人數(shù) 2黑幣 +53 收起 理由
18677304384 + 3 很給力!
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

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

使用道具 舉報(bào)

沙發(fā)
ID:1 發(fā)表于 2017-7-4 23:49 | 只看該作者
樓主的源程序如下:
  1. /********************************/
  2. /*   智能秒表(使用內(nèi)部EEPROM) */
  3. /*------------------------------*/
  4. /**(1)啟動(dòng)/停止功能          **/
  5. /**(2)復(fù)位/間隔功能          **/
  6. /**(3)兩種工作模式           **/
  7. /**(4)查看數(shù)據(jù)功能           **/
  8. /**(5)斷電記憶功能           **/
  9. /********************************/
  10. #include <reg52.h>
  11. #include <intrins.h>
  12. #define uint unsigned int
  13. #define uchar unsigned char

  14. #define RdCommand 0x01                  //定義內(nèi)部EEPROM存儲(chǔ)器部分
  15. #define PrgCommand 0x02
  16. #define EraseCommand 0x03
  17. #define Error 1
  18. #define Ok 0
  19. #define WaitTime 0x01
  20. sfr ISP_DATA=0xe2;  
  21. sfr ISP_ADDRH=0xe3;
  22. sfr ISP_ADDRL=0xe4;
  23. sfr ISP_CMD=0xe5;
  24. sfr ISP_TRIG=0xe6;
  25. sfr ISP_CONTR=0xe7;

  26. sbit key1=P2^0;              //定義"啟動(dòng)/暫停"按鈕
  27. sbit key2=P2^1;              //定義"復(fù)位"按鈕
  28. sbit key3=P2^2;                                 //定義"模式"按鈕
  29. sbit key4=P2^3;                                 //定義"查看"按鈕
  30. sbit key5=P1^5;                                 //定義"清除"按鈕

  31. sbit wei1=P2^4;                                 //定義位選
  32. sbit wei2=P2^5;
  33. sbit wei3=P2^6;               
  34. sbit wei4=P2^7;

  35. bit flag_start,flag_mode,flag_2sec,flag_CLR;
  36. uchar temp,temp1,aa,aa1,shi,ge,shifen,baifen,num,i=0;
  37. uchar time_data1[11],time_data2[11];
  38. uchar code table[]={                  //共陰極數(shù)碼管編碼
  39. 0x3f,0x06,0x5b,0x4f,
  40. 0x66,0x6d,0x7d,0x07,
  41. 0x7f,0x6f,0x77,0x7c,
  42. 0x39,0x5e,0x79,0x71,0x40};        

  43. void display(uchar shi,uchar ge,uchar shifen,uchar baifen);  //聲明顯示子函數(shù)
  44. void delay(uint z);           //聲明延時(shí)子函數(shù)
  45. void init();                  //聲明初始化函數(shù)
  46. void key();                                          //聲明鍵掃描函數(shù)
  47. void display_process();                  //聲明顯示處理函數(shù)
  48. void delayus();                                  //聲明延時(shí)微秒函數(shù)                          
  49. void data_read();                          //聲明內(nèi)部EEPROM數(shù)據(jù)讀出函數(shù)
  50. void clear();                                  //聲明清除EEPROM數(shù)據(jù)函數(shù)

  51. void ISP_IAP_enable(void);          //聲明EEPROM操作函數(shù)
  52. void ISP_IAP_disable(void);
  53. void ISPgoon(void);
  54. uchar byte_read(uint byte_addr);
  55. void SectorErase(uint sector_addr);
  56. void byte_write(uint byte_addr, uchar original_data);
  57. void memory_read();                          //聲明EEPROM讀函數(shù)
  58. void memory_write();                  //聲明EEPROM寫(xiě)函數(shù)

  59. void main()                                          //主函數(shù)
  60. {       
  61.         init();                          //調(diào)用初始化子程序
  62.         while(1)
  63.         {                      
  64.           key();                                                   //調(diào)用按鍵掃描函數(shù)
  65.           if(num==0&&i!=0)                                   //如果一開(kāi)機(jī)就按查看鍵
  66.             memory_read();                                   //調(diào)用EEPROM數(shù)據(jù)讀出函數(shù)
  67.           if(flag_CLR==1)                                   //如果按了清除鍵
  68.                 clear();                                           //調(diào)用清除EEPROM數(shù)據(jù)函數(shù)
  69.           display_process();                           //調(diào)用顯示處理函數(shù)
  70.           display(shi,ge,shifen,baifen);   //調(diào)用顯示函數(shù)   
  71.         }
  72. }

  73. void delay(uint z)                     //延時(shí)毫秒函數(shù)
  74. {
  75.         uint x,y;
  76.         for(x=z;x>0;x--)
  77.                 for(y=110;y>0;y--);
  78. }

  79. void display(uchar shi,uchar ge,uchar shifen,uchar baifen)   //顯示程序
  80. {       
  81.                 P0=table[shi];        //使用動(dòng)態(tài)掃描的方法實(shí)現(xiàn)數(shù)碼管顯示
  82.                 wei1=0;
  83.                 delay(1);
  84.                 wei1=1;

  85.                 if(flag_CLR==0)                  //正常顯示時(shí),第二位顯示小數(shù)點(diǎn)
  86.                   P0=table[ge]|0x80;
  87.                 else                                  //按清除鍵時(shí),不顯示小數(shù)點(diǎn)
  88.                   P0=table[ge];
  89.                 wei2=0;
  90.                 delay(1);            
  91.                 wei2=1;
  92.    
  93.         P0=table[shifen];      //使用動(dòng)態(tài)掃描的方法實(shí)現(xiàn)數(shù)碼管顯示
  94.                 wei3=0;
  95.                 delay(1);
  96.                 wei3=1;

  97.                 P0=table[baifen];
  98.                 wei4=0;
  99.                 delay(1);            
  100.                 wei4=1;       
  101. }

  102. void init()                     //初始化子程序
  103. {       
  104.         temp=0;
  105.         TMOD=0x01;                  //使用定時(shí)器T0的方式1
  106.         TH0=(65536-10000)/256;
  107.         TL0=(65536-10000)%256;      //定時(shí)10ms中斷一次
  108.         EA=1;                       //中斷總允許
  109.         ET0=1;                      //允許定時(shí)器T0中斷       
  110. }

  111. void key()                                                //按鍵掃描函數(shù)
  112. {
  113.         uchar j;
  114.         if(key1==0)                 //檢測(cè)"啟動(dòng)"按鈕是否按下
  115.          {
  116.                 delay(5);               //延時(shí)去抖動(dòng)
  117.                 if(key1==0)             //再次檢測(cè)"啟動(dòng)"按鈕是否按下
  118.                  {       
  119.            while(!key1)         //松手檢測(cè)(按下時(shí)數(shù)碼管不滅)
  120.                     {
  121.                           display_process();                          //調(diào)用顯示處理函數(shù)
  122.                   display(shi,ge,shifen,baifen);  //調(diào)用顯示函數(shù)
  123.                         }
  124.                    flag_start=~flag_start;
  125.                    if(flag_start==1)
  126.                          TR0=1;                    //啟動(dòng)定時(shí)器開(kāi)始工作
  127.                    else
  128.                          TR0=0;
  129.                  }
  130.          }
  131.                 if(key2==0)                    //檢測(cè)"間隔"按鈕是否按下   
  132.                 {
  133.                         delay(5);         
  134.                         if(key2==0)      
  135.                         {       
  136.                                 while(!key2)                                        //松手檢測(cè)
  137.                                 {
  138.                                  display_process();                            //調(diào)用顯示處理函數(shù)
  139.                      display(shi,ge,shifen,baifen); //調(diào)用顯示函數(shù)
  140.                                 }
  141.                                 if(flag_mode==0||i!=0)
  142.                                  {  
  143.                                   shi=0;              
  144.                                   ge=0;
  145.                                   shifen=0;
  146.                                   baifen=0;
  147.                                   aa=0;
  148.                                   temp=0;
  149.                                   TR0=0;
  150.                                   i=0;
  151.                                   num=0;
  152.                                   for(j=0;j<=10;j++)
  153.                                   {
  154.                                     time_data1[j]=0;
  155.                                     time_data2[j]=0;
  156.                                   }
  157.                                  }
  158.                             else
  159.                              {
  160.                                    num++;
  161.                                    if(num==11)
  162.                                      num=1;
  163.                                    memory_write();
  164.                                  }
  165.                         }
  166.                 }
  167.                 if(key3==0)
  168.                 {
  169.                   delay(5);
  170.                   if(key3==0)
  171.                    {
  172.                      while(!key3)                                            //松手檢測(cè)
  173.                            {
  174.                                 display_process();                            //調(diào)用顯示處理函數(shù)
  175.                     display(shi,ge,shifen,baifen);  //調(diào)用顯示函數(shù)
  176.                           }
  177.                          flag_mode=~flag_mode;
  178.                    }
  179.                 }
  180.            if(key4==0)
  181.                 {
  182.                   delay(5);
  183.                   if(key4==0)
  184.                    {
  185.                      while(!key4)                                            //松手檢測(cè)
  186.                           {
  187.                             display_process();                            //調(diào)用顯示處理函數(shù)
  188.                     display(shi,ge,shifen,baifen);  //調(diào)用顯示函數(shù)
  189.                           }
  190.                          TR0=0;
  191.                          i++;
  192.                          if(i==11)
  193.                           i=1;
  194.                          data_read();
  195.                    }
  196.                 }
  197.            if(key5==0)
  198.                 {
  199.                   delay(5);
  200.                   if(key5==0)
  201.                    {
  202.                      while(!key5)                                            //松手檢測(cè)
  203.                           {
  204.                             display_process();                            //調(diào)用顯示處理函數(shù)
  205.                     display(shi,ge,shifen,baifen);  //調(diào)用顯示函數(shù)
  206.                           }
  207.                          flag_CLR=~flag_CLR;
  208.                    }
  209.                 }
  210. }               

  211. void display_process()                            //顯示處理函數(shù)
  212. {
  213.   shifen=aa%100/10;                                                    //正常走秒的處理
  214.   baifen=aa%10;
  215.   shi=temp%100/10;
  216.   ge=temp%10;
  217.   if(flag_mode==1&&num!=0&&flag_2sec==0)        //間隔2秒停頓的處理
  218.    {
  219.          shi=time_data2[num]/10;
  220.      ge=time_data2[num]%10;
  221.          shifen=time_data1[num]/10;
  222.          baifen=time_data1[num]%10;
  223.          if(temp-time_data2[num]==2)
  224.            flag_2sec=~flag_2sec;
  225.    }
  226.   if(i!=0)                                                                    //查看存儲(chǔ)數(shù)據(jù)的處理
  227.         {
  228.           shi=time_data2[i]/10;
  229.           ge=time_data2[i]%10;
  230.           shifen=time_data1[i]/10;
  231.           baifen=time_data1[i]%10;
  232.     }
  233. }

  234. void timer0() interrupt 1         //定時(shí)器T0中斷服務(wù)函數(shù)
  235. {
  236.         TH0=(65536-10000)/256;   //重新賦初值
  237.         TL0=(65536-10000)%256;
  238.         aa++;                    //中斷一次10ms變量aa的值加1
  239.         if(aa==100)              //中斷100次后,定時(shí)時(shí)間100*10ms=1000ms=1s,變量temp的值加1
  240.         {
  241.           aa=0;
  242.           temp++;
  243.           if(temp==100)          //秒表到達(dá)100s后回零
  244.                 temp=0;
  245.         }       
  246. }

  247. /* EEPROM存儲(chǔ)器操作函數(shù) */
  248. /* ================================= */
  249. void ISP_IAP_enable(void)
  250. {
  251. EA = 0;      
  252. ISP_CONTR = ISP_CONTR & 0x18;      
  253. ISP_CONTR = ISP_CONTR | WaitTime;
  254. ISP_CONTR = ISP_CONTR | 0x80;      
  255. }
  256. /* ================================= */
  257. void ISP_IAP_disable(void)
  258. {
  259. ISP_CONTR=ISP_CONTR&0x7f;
  260. ISP_TRIG=0x00;
  261. EA=1;   
  262. }
  263. /* ==================================== */
  264. void ISPgoon(void)
  265. {
  266. ISP_IAP_enable();   
  267. ISP_TRIG = 0x46;  
  268. ISP_TRIG = 0xb9;  
  269. _nop_();
  270. }
  271. /* ============================================ */
  272. uchar byte_read(uint byte_addr)
  273. {
  274. ISP_ADDRH = (uchar)(byte_addr >> 8);
  275. ISP_ADDRL = (uchar)(byte_addr & 0x00ff);
  276. ISP_CMD   = ISP_CMD & 0xf8;   
  277. ISP_CMD   = ISP_CMD | RdCommand;
  278. ISPgoon();      
  279. ISP_IAP_disable();   
  280. return (ISP_DATA);   
  281. }
  282. /* ========================================== */
  283. void SectorErase(uint sector_addr)
  284. {
  285. uint iSectorAddr;
  286. iSectorAddr = (sector_addr & 0xfe00);
  287. ISP_ADDRH   = (uchar)(iSectorAddr >> 8);
  288. ISP_ADDRL   = 0x00;
  289. ISP_CMD     = ISP_CMD & 0xf8;   
  290. ISP_CMD     = ISP_CMD | EraseCommand;
  291. ISPgoon();      
  292. ISP_IAP_disable();   
  293. }
  294. /* ============================================ */
  295. void byte_write(uint byte_addr, uchar original_data)
  296. {
  297. ISP_ADDRH = (uchar)(byte_addr >> 8);  
  298. ISP_ADDRL = (uchar)(byte_addr & 0x00ff);
  299. ISP_CMD   = ISP_CMD & 0xf8;   
  300. ISP_CMD   = ISP_CMD | PrgCommand;
  301. ISP_DATA  = original_data;  
  302. ISPgoon();      
  303. ISP_IAP_disable();   
  304. }

  305. void data_read()                                         //讀數(shù)組數(shù)據(jù)函數(shù)
  306. {
  307.   aa=time_data1[i];
  308.   temp=time_data2[i];
  309. }

  310. void memory_write()                                          //寫(xiě)EEPROM數(shù)據(jù)函數(shù)
  311. {
  312.   aa1=aa;
  313.   temp1=temp;
  314.   time_data1[num]=aa1;
  315.   time_data2[num]=temp1;
  316.   if(num==1)
  317.     SectorErase(0x2000);              //擦除扇區(qū)
  318.   byte_write(0x2000+num,aa1);         //重新寫(xiě)入數(shù)據(jù)
  319.   byte_write(0x2000+num+10,temp1);    //重新寫(xiě)入數(shù)據(jù)   
  320.   flag_2sec=0;
  321. }

  322. void memory_read()                                                  //讀出EEPROM數(shù)據(jù)函數(shù)
  323. {
  324.   time_data1[i]=byte_read(0x2000+i);
  325.   time_data2[i]=byte_read(0x2000+i+10);
  326. }

  327. void clear()                                                  //清除EEPROM數(shù)據(jù)函數(shù)
  328. {
  329.   uchar j,k;
  330.   for(k=0;k<21;k++)
  331.     {
  332.           byte_write(0x2000+k,0x00);
  333.           display(16,16,16,16);
  334.     }
  335.   for(j=0;j<=10;j++)
  336.         {
  337.           time_data1[j]=0;
  338.           time_data2[j]=0;
  339.           display(16,16,16,16);
  340.         }
  341. }
復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

板凳
ID:89286 發(fā)表于 2017-7-5 04:55 | 只看該作者
thanks for sharing
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 毛片99| 午夜精品久久久久久不卡欧美一级 | 超碰免费在 | 九九热这里| 欧美一区二区三区视频在线播放 | 欧美日韩精品专区 | 精品欧美一区二区三区久久久 | 亚洲精品免费在线 | 久久夜视频 | 国产精品久久久久久久午夜片 | 国产最新视频在线 | 午夜影院普通用户体验区 | 天天插天天操 | 久久久久久综合 | 国产高清精品一区 | 久久r久久| 欧美 日韩 国产 一区 | 男人的天堂亚洲 | 久久国产一区二区三区 | 日本人麻豆 | 国产欧美一区二区三区在线看 | 日韩中文字幕av | 欧美成人免费在线视频 | www.久久| av网站免费在线观看 | 伊人伊成久久人综合网站 | 国产免费一区二区三区 | 夜夜操操操 | 亚洲精品乱码久久久久久按摩观 | 国产午夜精品视频 | 在线色网| 一区二区三区视频在线 | 欧美一区二区视频 | 精品一区二区三区不卡 | 日韩av免费在线电影 | 亚洲国产精品久久久久 | 亚洲福利av | 中文字幕av一区 | 这里有精品 | 伊人超碰在线 | 久久久久久国产精品 |