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

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

QQ登錄

只需一步,快速開始

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

單片機(jī)智能秒表的制作與調(diào)試課程設(shè)計(jì)論文與資料下載

[復(fù)制鏈接]
ID:161768 發(fā)表于 2017-7-31 15:39 | 顯示全部樓層 |閱讀模式

單片機(jī)課程設(shè)計(jì)項(xiàng)目:智能秒表的設(shè)計(jì)與制作
一、項(xiàng)目任務(wù):智能秒表的設(shè)計(jì)與制作

用四位LED數(shù)碼管制作帶小數(shù)顯示的秒表,前兩位顯示整數(shù)部分(秒),后兩位顯示小數(shù)部分(百分之一秒)。

所設(shè)計(jì)的秒表最大計(jì)時(shí)時(shí)間為99秒99。

開始時(shí),數(shù)碼管顯示“00. 00”,表明從0開始計(jì)時(shí)。

1.001.jpg

本智能秒表有兩種時(shí)間計(jì)時(shí)模式。(注意:模式1與模式2用同一個(gè)程序?qū)崿F(xiàn),即當(dāng)程序下載至單片機(jī)芯片后,只需要按下相應(yīng)按鍵,該秒表可工作在任意一種模式下)

(一)基本部分:

1、模式1累積計(jì)時(shí)模式

(1)按按鍵1可實(shí)現(xiàn)秒表開始、停止、再開始、再停止計(jì)時(shí)(時(shí)間累計(jì));

(2)計(jì)時(shí)完畢,按按鍵2計(jì)時(shí)歸零。

2、模式2間隔計(jì)時(shí)模式

(1) 按按鍵1開始計(jì)時(shí);

(2) 按按鍵2一次暫停秒表并顯示當(dāng)前時(shí)間。間隔時(shí)間顯示2秒后秒表將持續(xù)計(jì)時(shí)。(例如在3秒鐘時(shí)秒表被暫停,2秒鐘后秒表從5秒開始繼續(xù)計(jì)時(shí)。顯示2秒是為了方便記錄當(dāng)前時(shí)間);

(3) 在下一點(diǎn)終止時(shí)再按按鍵2記錄此時(shí)相關(guān)信息,如此重復(fù);

(4) 當(dāng)計(jì)時(shí)停止時(shí)按按鍵1;

(5)可通過按鍵3查看前面操作所記錄的時(shí)間,最多可查看10個(gè)記錄;

(6) 計(jì)時(shí)完畢,按按鍵2鍵計(jì)時(shí)歸零。

(二)發(fā)揮部分

(1)用電腦時(shí)間校準(zhǔn)秒表的時(shí)間,保證秒表走時(shí)的準(zhǔn)確性(100秒的誤差小于0.1秒),思考如何修改程序?

(2)利用內(nèi)部E2PROM存儲(chǔ)器(STC89C52自帶),使智能秒表具有掉電數(shù)據(jù)不丟失的功能,思考如何修改程序?

(3)仿真無誤后,購(gòu)買元件制作該智能秒表,從商業(yè)價(jià)值考慮該智能秒表的美觀性和實(shí)用性。

二、硬件電路及仿真效果圖
1.002.jpg
三、STC90C52RC單片機(jī)引腳排列圖
1.003.jpg 1.004.jpg
四、四位共陰極數(shù)碼管引腳排列圖
1.005.jpg 1.006.jpg
1.007.jpg
五、元器件清單
序號(hào)
元件名稱
規(guī)格型號(hào)
數(shù)量
單價(jià)
合計(jì)
1
單片機(jī)
STC90C52RC
1
6
6
2
四位共陰數(shù)碼管
3641AS
1
2
2
3
輕觸按鍵
45*45mm
6
0.2
1.2
4
晶振
12MHz
1
0.5
0.5
5
瓷片電容
20pF
2
0.1
0.2
6
電解電容
10uF/10V
1
0.3
0.3
7
電阻
10KΩ
1
0.1
0.1
8
排電阻
1KΩ
1
0.5
0.5
9
單片機(jī)插座
40PIN
1
0.5
0.5
10
電路板
7cm×9cm
1
3
3
11
電池
+5V
1
3
3
12
外部存儲(chǔ)器
AT24C04
1
2
2
共計(jì)


18

19.30元
七、調(diào)試方法和步驟
1、通電前先用萬(wàn)用表歐姆檔(1KΩ檔)測(cè)量電源兩端正反向電阻,正向電阻約80KΩ,反向電阻約6.5KΩ。如果電阻很小,則說明有短路性故障,不能通電,排除短路故障后才能通電,如果電阻為無窮大,則有開路性故障。
2、通電后,測(cè)量單片機(jī)40腳與20腳之間的電壓應(yīng)該有5V左右,如果電壓不正常,則說明單片機(jī)供電不正常,應(yīng)重點(diǎn)檢查單片機(jī)供電電路。
3、測(cè)量單片機(jī)晶振引腳18和19腳電壓,應(yīng)該在1.9~2.3V左右,兩個(gè)引腳電壓相差0.2V左右,如果這兩個(gè)引腳電壓不正常,說明晶振電路沒有起振,重點(diǎn)檢查晶振和補(bǔ)償電容是否焊接好。
4、測(cè)量單片機(jī)復(fù)位引腳9腳,正常工作時(shí)電壓為0V,按復(fù)位鍵時(shí)為5V,松開手后由5V逐漸降至0V。如果該腳電壓不正常,說明復(fù)位電路有故障,需要檢查該腳的電阻、電容的連接和焊接是否正確。
5、以上步驟的測(cè)量如果正常,則多數(shù)是單片機(jī)的軟件問題,可以通過編寫幾個(gè)小程序單獨(dú)調(diào)試I/O口、按鍵、數(shù)碼管和存儲(chǔ)器的功能,測(cè)試到底是軟件問題還是硬件問題。
六、C語(yǔ)言程序
  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寫函數(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)                                             //如果一開機(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.         P0=table[shifen];      //使用動(dòng)態(tài)掃描的方法實(shí)現(xiàn)數(shù)碼管顯示
  93.                             wei3=0;
  94.                             delay(1);
  95.                             wei3=1;

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

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

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

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

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

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

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

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


  320. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

234028w2i2ffcaqixj2qpi.png

完整論文下載(word格式 可編輯)還帶仿真和源碼:



評(píng)分

參與人數(shù) 1黑幣 +10 收起 理由
話梅 + 10 很給力!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:569720 發(fā)表于 2019-6-22 21:25 | 顯示全部樓層
厲害,很有用,收獲很多
回復(fù)

使用道具 舉報(bào)

ID:757221 發(fā)表于 2020-6-17 15:26 | 顯示全部樓層
作者說的模式二,大家知道怎么運(yùn)行嗎?
回復(fù)

使用道具 舉報(bào)

ID:757221 發(fā)表于 2020-6-17 15:31 | 顯示全部樓層
作者說的模式二,大家有知道怎么運(yùn)行的嗎?
回復(fù)

使用道具 舉報(bào)

5#
無效樓層,該帖已經(jīng)被刪除

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 午夜精品久久久久久久久久久久久 | 国产精品久久久久久久免费观看 | 国产精品波多野结衣 | 亚洲福利一区二区 | 在线观看免费高清av | 欧洲一级毛片 | 欧美中文字幕在线观看 | 综合久久av | 国产精品久久久久久一级毛片 | 国产免费拔擦拔擦8x高清 | 九九精品在线 | 欧美影院 | 在线播放国产一区二区三区 | 夜夜骑av| 亚洲精品成人av | 国产免费人成xvideos视频 | 亚洲第一福利视频 | 久久视频精品 | 日韩中文一区二区三区 | 成年人视频免费在线观看 | 综合五月婷| 狠狠色狠狠色综合日日92 | 午夜国产羞羞视频免费网站 | 中文字幕99 | 欧美久久久久 | 欧美日韩精品一区 | 99欧美精品 | 日韩在线观看网站 | 夜夜精品浪潮av一区二区三区 | 欧美日韩第一页 | 久久久久一区 | 精品一区二区三区在线观看国产 | 国产成人免费在线 | 国产成人综合在线 | 久久久影院 | 欧美成人激情 | 国产精品一区二区久久久久 | 狠狠亚洲 | 在线日韩在线 | 亚洲97 | 一级片免费观看 |