欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

基于魔術(shù)棒的多功能單片機(jī)系統(tǒng)仿真設(shè)計(jì) 含源碼與報(bào)告

[復(fù)制鏈接]
ID:376764 發(fā)表于 2018-7-21 17:36 | 顯示全部樓層 |閱讀模式
魔術(shù)棒仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png 0.png



單片機(jī)課程設(shè)計(jì)報(bào)告

學(xué)    院: 電子信息工程學(xué)院

專    業(yè):     通信工程   

學(xué)生姓名:     

學(xué)    號:     16271070   


  • 設(shè)計(jì)任務(wù)要求

我所設(shè)計(jì)的題目為“基于魔術(shù)棒的多功能單片機(jī)系統(tǒng)”,主要是在魔術(shù)棒的基礎(chǔ)上添加了單片機(jī)的其他功能,例如紅外遙控,蜂鳴器,溫度傳感器,LED燈等裝置。具體要求有以下幾點(diǎn):

  •     利用數(shù)碼管實(shí)現(xiàn)主要功能“魔術(shù)棒”。
  •     利用紅外裝置控制溫度傳感器,并顯示溫度。
  •     利用蜂鳴器使其能發(fā)出樂音。
  •     利用LED燈實(shí)現(xiàn)跑馬燈功能。
  •     利用按鍵控制以上幾種功能。

二、設(shè)計(jì)方案及論證

1、任務(wù)分析

我所做的主要部分為“魔術(shù)棒”,“魔術(shù)棒”的原理是利用人眼的視覺暫留原理,即物體在快速運(yùn)動時(shí), 當(dāng)人眼所看到的影像消失后,人眼仍能繼續(xù)保留其影像0.1-0.4秒左右的圖像,因此,我們可以利用數(shù)碼管或LCD顯示屏,逐個(gè)控制每一位的點(diǎn)亮,并送入數(shù)據(jù),再控制好相鄰位之間亮起的頻率,就可以實(shí)現(xiàn)一個(gè)動態(tài)顯示功能,但實(shí)際上在當(dāng)前時(shí)刻只有1位點(diǎn)亮并送入數(shù)據(jù),控制一定頻率使得人眼看起來每個(gè)位置都在同時(shí)點(diǎn)亮。

紅外傳感模塊和溫度傳感器單片機(jī)上已經(jīng)存在,需要編寫程序控制溫度傳感器工作,并實(shí)時(shí)顯示溫度,并且編寫控制紅外遙控裝置的程序,令紅外裝置能接收信號和發(fā)出紅外線,通過紅外遙控器控制溫度傳感器的開啟。

蜂鳴器是將音符表和節(jié)拍表送入寄存器中,通過改變蜂鳴器的音調(diào)和延遲時(shí)間實(shí)現(xiàn)演奏歌曲。

LED燈發(fā)光可以通過改變P1端口8位來選擇不同的LED發(fā)光。

按鍵開關(guān)是單片機(jī)的一個(gè)基礎(chǔ)元件,可以通過開關(guān)控制許多功能的開啟和關(guān)閉,我用不同的按鍵開關(guān)控制以上功能的實(shí)現(xiàn)。




  •          方案設(shè)計(jì)

經(jīng)過我們多次的設(shè)計(jì)方案討論,我們大致確定了2種設(shè)計(jì)方向。

①“魔術(shù)棒”用數(shù)碼管來實(shí)現(xiàn),這個(gè)方案的優(yōu)點(diǎn)是我們可以在一個(gè)時(shí)間點(diǎn)控制一個(gè)數(shù)碼管的點(diǎn)亮,控制好點(diǎn)亮頻率我們可清楚地觀察到“魔術(shù)棒”現(xiàn)象的生成。但缺點(diǎn)是數(shù)碼管只有4位,無法顯示多個(gè)字符,而且顯示內(nèi)容較少,只有數(shù)字和部分英文字母。

②“魔術(shù)棒”用LCD顯示屏來實(shí)現(xiàn),這個(gè)方案的優(yōu)點(diǎn)是顯示的內(nèi)容比數(shù)碼管多,且能顯示所有的英文字母和數(shù)字,但缺點(diǎn)是無法很好的觀察到現(xiàn)象,且可能會出現(xiàn)未知的顯示錯誤。

最后,我們確定了主體方案為方案1,因?yàn)閿?shù)碼管可以更好地觀察到現(xiàn)象,可以將大于4的字符循環(huán)顯示,也可以觀察到魔術(shù)棒效果。

3、系統(tǒng)關(guān)鍵模塊設(shè)計(jì)

              

上圖為C51單片機(jī)數(shù)碼管原理圖,P2口為位選端口,P0口為段選端口,8個(gè)LED發(fā)光二極管為共陽極接法,不點(diǎn)亮?xí)r為高電平,點(diǎn)亮為低電平,即相應(yīng)管腳送0為低電平,送1為高電平,低電平有效,因此控制P2端口地址0的位置可使相應(yīng)數(shù)碼管點(diǎn)亮。

4、軟件算法流程(將完整代碼放在附錄1中)

下圖為控制數(shù)碼管依次顯示字符的算法流程圖,首先設(shè)次數(shù)為1,設(shè)置P2的值使第一個(gè)數(shù)碼管點(diǎn)亮,設(shè)置P0的值將數(shù)據(jù)送入第一個(gè)數(shù)碼管,再進(jìn)行延遲,判斷次數(shù)是否大于3,是則關(guān)閉所有數(shù)碼管, 否則次數(shù)加1,并回到設(shè)置P2值的步驟。



三、開發(fā)及調(diào)試過程

1、開發(fā)過程

根據(jù)我們確定的主體方案以及我自己的設(shè)計(jì)方案,我開始了程序的開發(fā)過程,我利用了Keil軟件進(jìn)行程序的開發(fā)和調(diào)試,我的程序運(yùn)用到的編程語言為C51語言和匯編語言,我將程序的開發(fā)分為以下3個(gè)模塊:溫度傳感器工作及顯示函數(shù),數(shù)碼管顯示函數(shù),紅外傳感器控制及工作函數(shù)。其中紅外傳感器模塊是用匯編語言編寫的,其他模塊是用C51語言編寫的。

對于匯編語言我還不是特別精通,所以我把紅外傳感器模塊安排到了最后進(jìn)行。首先進(jìn)行數(shù)碼管的開發(fā)過程,數(shù)碼管的段選是由P0端口擴(kuò)展的74HC573芯片控制的,74HC573芯片是擁有八路輸出的透明鎖存器,輸出為三態(tài)門的控制芯片,通過控制P0.0---P0.7管腳使a~g不同位置數(shù)碼管亮起,數(shù)碼管為共陽極接法,因此低電平有效,當(dāng)一個(gè)管腳置0時(shí),其代表的數(shù)碼管對應(yīng)位置就會亮起,實(shí)現(xiàn)送數(shù)功能。數(shù)碼管的位選是由P2口控制的四個(gè)三極管-電阻電路,通過控制P2.0~P2.3端口控制哪一位數(shù)碼管開啟,低電平有效。根據(jù)數(shù)碼管原理特性,首先定義兩個(gè)數(shù)組,一個(gè)向P0口送數(shù),一個(gè)向P2口送數(shù),再編寫延遲函數(shù),最后用循環(huán)執(zhí)行代碼,首先P2=0xFE,即打開數(shù)碼管1,之后P0=0xF9,送入數(shù)據(jù)1,調(diào)用延遲函數(shù)將這一狀態(tài)延時(shí)。延時(shí)過后判斷是否滿足循環(huán)條件,若不滿足則繼續(xù)執(zhí)行循環(huán),直到滿足循環(huán)條件為止,滿足則跳出循環(huán),進(jìn)行下一項(xiàng)內(nèi)容。調(diào)試時(shí)可以通過改變延遲時(shí)間觀察現(xiàn)象,直到利用視覺暫留原理達(dá)到人眼捕捉動畫的效果。基于上述原理,我又加了另外4個(gè)數(shù)字,使得數(shù)碼管能循環(huán)顯示8位數(shù)字,實(shí)現(xiàn)送入長度大于4的字符串功能。

C51單片機(jī)溫度傳感器型號為DS18B20,DS18B20內(nèi)部由4個(gè)部分構(gòu)成,分別是64位光刻ROM 、溫度傳感器、非揮發(fā)的溫度報(bào)警觸發(fā)器TH和TL、配置寄存器。它們可以實(shí)現(xiàn)溫度的測量,溫度值的存入和提取,溫度的轉(zhuǎn)換等功能。并可以將提取的溫度值通過數(shù)碼管顯示出來。溫度傳感器函數(shù)設(shè)計(jì)分為以下幾點(diǎn):定義延時(shí)函數(shù),初始化18B20,讀取18B20一個(gè)字節(jié),向18B20寫入一個(gè)字節(jié),讀溫度值,溫度處理,顯示溫度。將18B20初始化是給其一個(gè)工作條件。讀取18B20一個(gè)字節(jié)是要將數(shù)據(jù)從ROM中提取出來,向18B20寫入一個(gè)字節(jié)是要將測出來的數(shù)據(jù)寫入到ROM中,讀溫度值通過溫度傳感器特性得知環(huán)境實(shí)時(shí)溫度,溫度處理將溫度值變?yōu)?位有效數(shù)字的溫度值,溫度顯示是通過數(shù)碼管實(shí)現(xiàn)。遍譯好程序后經(jīng)過不同溫度的測試,發(fā)現(xiàn)在誤差范圍內(nèi)溫度測量精準(zhǔn),且溫度也在隨環(huán)境溫度實(shí)時(shí)變化。

以上兩個(gè)功能都可以通過按鍵控制的方式開啟,即設(shè)計(jì)一個(gè)按鍵去抖函數(shù),當(dāng)按鍵按下,按鍵就處于低電平有效狀態(tài),相應(yīng)的功能開始工作,當(dāng)別的按鍵按下后上一個(gè)功能停止工作執(zhí)行當(dāng)前按下按鍵的功能。通過按鍵可實(shí)現(xiàn)功能切換的功能。

紅外傳感器模塊用匯編語言編寫,紅外傳感器和遙控器搭配使用,當(dāng)在正常無遙控信號時(shí),一體化紅外接收頭輸出是高電平,不執(zhí)行相應(yīng)功能。當(dāng)接入信號后,首先要進(jìn)行解碼,傳輸?shù)募t外信號是以高低電平的形式送入的,于是設(shè)定外部中斷IR,觸發(fā)方式為下降沿觸發(fā),將高低電平信號存入寄存器中,獲得16位地址碼和8位數(shù)據(jù)碼,從而實(shí)現(xiàn)解碼。之后進(jìn)行遙控執(zhí)行部分,設(shè)定遙控器按鍵1為LED燈閃爍程序。LED燈位選通過P1口控制,為低電平有效,當(dāng)按下按鍵1后,執(zhí)行LED燈循環(huán)亮起程序。首先將第一個(gè)LED燈亮起地址送入累加器A中,經(jīng)過延遲后再將第二個(gè)LED燈亮起地址送入累加器A中,之后以此類推,實(shí)現(xiàn)LED跑馬燈功能。設(shè)定遙控器按鍵8為蜂鳴器播放樂音程序,蜂鳴器產(chǎn)生樂音原理是將預(yù)先設(shè)計(jì)好的節(jié)拍表和音符表送入蜂鳴器中,并進(jìn)行定時(shí),使蜂鳴器能完整播放一首樂音。當(dāng)播放完后清除遙控值使連按失效。紅外遙控程序結(jié)束。通過測試,遙控器在對準(zhǔn)紅外傳感器且距離在10cm以內(nèi)可順利遙控,LED跑馬燈以及蜂鳴器均可正常工作,且交換順序也并不影響,說明程序符合預(yù)期設(shè)計(jì)目標(biāo)。

  • 遇到的問題及解決方法

     ①若想將循環(huán)結(jié)束后的數(shù)碼管每一位清零,只將數(shù)碼管位選信號全部置1是不行的,需設(shè)置P0的值使發(fā)光二極管全部置1,令發(fā)光二極管熄滅,原因是Keil中執(zhí)行一條命令總在下一條命令開始執(zhí)行時(shí)執(zhí)行上一條命令,因此需加一條命令關(guān)閉發(fā)光二極管。

②溫度傳感器在環(huán)境溫度突變時(shí)顯示數(shù)據(jù)會有錯誤,這是其器件特性所致,只能通過改進(jìn)溫度讀取函數(shù)來實(shí)現(xiàn)。

  • 總結(jié)

   本次課設(shè)中用到的關(guān)鍵知識點(diǎn)為C51語言及匯編語言的應(yīng)用,輸入輸出端口的應(yīng)用,各種芯片元器件的應(yīng)用,定時(shí)器,中斷以及許多數(shù)字電子技術(shù)和模擬電子技術(shù)上的知識。這些知識的綜合運(yùn)用使我順利完成了本次課程設(shè)計(jì)。

   為期4周的單片機(jī)課程設(shè)計(jì)結(jié)束了,我經(jīng)歷了查閱資料,小組討論,設(shè)計(jì)方案選取,編寫調(diào)試代碼,單片機(jī)調(diào)試,代碼修改,小組及個(gè)人答辯等一系列流程,我學(xué)到的不僅是這門課傳授我的只是,更學(xué)到了團(tuán)隊(duì)合作,多途徑查閱資料,分析問題能力和溝通能力,這些都是我成功做完這次課設(shè)的保證,我也要感謝我的隊(duì)友,是我們一起經(jīng)過討論確定了選題和主體方案設(shè)計(jì),當(dāng)程序有問題或需要改進(jìn)時(shí)我們也深入廣泛地交換了彼此的意見,每個(gè)人在這次課設(shè)中都收獲到了許多。我還要感謝多次熱心幫助我們的老師和助教,是他們多次幫助我們發(fā)現(xiàn)問題,提出建議,幫助我們在原有功能上增添了更多功能,并且還提供了許多參考資料給我們,令我們有豐富的知識儲備。但我們這次的課設(shè)還是有很多方面的不足,對于我仍然有很大的提升空間,礙于現(xiàn)在自身知識儲備和時(shí)間問題,我在一些方面上沒能做得更加細(xì)致,我會總結(jié)經(jīng)驗(yàn)教訓(xùn),努力完成以后的課程。


     單片機(jī)課程設(shè)計(jì)是一門對于電子專業(yè)學(xué)生很重要的一門課,它培養(yǎng)了我們的獨(dú)立工作能力和小組協(xié)作能力,但可能一個(gè)小組中并沒有很好的創(chuàng)意,我覺得可以在確定選題前先開一個(gè)選題交流會,大家踴躍發(fā)言,集思廣益,可以增加我們題目創(chuàng)新性,也可以與別的組成員進(jìn)行有效溝通,增加我們的完成機(jī)率。


單片機(jī)源程序如下:

  1. <font face="宋體"><font style="font-size: 10.5pt">#include<reg52.h>

  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. extern void infrared(void);

  5. uchar display[ ]={0xF9,0x82,0xA4,0xF8};
  6. uchar display4[ ]={0xF9,0xC0,0xF8,0xC0};

  7. uchar code display2[ ]={0xff,0xC7,0x83,0xE1};
  8. //uchar code con[ ]={ 0xff,0xfe,0xfd,0xfb,0xf7};
  9. uchar code con[ ]={0xfe,0xfd,0xfb,0xf7};
  10. uchar code table[]={0xc0,0xf9,0xA4,0xB0,0x99,0x92,0x82,0xf8,0x80,0x90};
  11.                                            //四位8段數(shù)碼管共陽0——9
  12. uchar code table1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
  13.                                            //四位8段數(shù)碼管帶小數(shù)點(diǎn)共陽0——9
  14. sbit s2=P3^3;
  15. sbit s3=P3^4;
  16. sbit s4=P3^5;

  17. void delay(uint i)
  18. {
  19.     while(i--)
  20.         ;
  21. }

  22.                                        
  23. //**************按鍵處理*******************************
  24. char check_s2(void)
  25. {
  26.         if(s2==0)
  27.         {
  28.                 delay(2000);
  29.                 {
  30.                         if(s2==0)
  31.                         {
  32.                                 return 1;        
  33.                         }
  34.                 }
  35.         }
  36.         return 0;        
  37. }
  38. char check_s3(void)      
  39. {
  40.         if(s3==0)
  41.         {
  42.                 delay(2000);                        // 按鍵去抖
  43.                 {
  44.                         if(s3==0)
  45.                         {
  46.                                 return 1;        
  47.                         }
  48.                 }
  49.         }
  50.         return 0;        
  51. }

  52. char check_s4(void)      
  53. {
  54.         if(s4==0)
  55.         {
  56.                 delay(2000);                        // 按鍵去抖
  57.                 {
  58.                         if(s4==0)
  59.                         {
  60.                                 return 1;        
  61.                         }
  62.                 }
  63.         }
  64.         return 0;        
  65. }



  66. //***********************溫度傳感器************************
  67. uint x;
  68. sbit DQ =P3^7;          //DS18B20接P3^7口
  69. uint tvalue;
  70. uchar disdata[]={0,0,0,0};



  71. void delaytimer(void)                    
  72. {
  73.         EA=1;//打開中斷
  74.         TMOD=0x10;//
  75.         TL1=(65536-500)%256;//設(shè)置定時(shí)器1低8位
  76.         TH1=(65536-500)/256; //設(shè)置定時(shí)器1高8位        
  77.         TR1=0;//停止計(jì)數(shù)
  78.         ET1=1;//打開定時(shí)器

  79. }


  80. void delay_18B20( uint i)    //延時(shí)
  81. {   
  82.    while(--i);
  83. }
  84. void delay2(uchar n)                         //延時(shí)
  85. {   
  86.    uchar i,j;   
  87.    for(i=n;i>0;i--)   
  88.      for(j=20;j>0;j--);
  89.          }

  90. void ds1820rst()                        //初始化DS18B20
  91. {      
  92.    unsigned char x=0;   
  93.    DQ = 1;           //DQ復(fù)位
  94.    delay_18B20(4);   //   
  95.    DQ = 0;           //單片機(jī)將DQ拉低     
  96.    delay_18B20(60); //   
  97.    DQ = 1;           //拉高總線  
  98.    delay_18B20(14);//   
  99.    x=DQ;            //稍做延時(shí)后 如果x=0則初始化成功 x=1則初始化失敗   
  100.    delay_18B20(20);
  101. }
  102. uchar ds1820rd()                //從DS18B20讀取一字節(jié)
  103. {
  104.    unsigned char i=0;
  105.    unsigned char dat = 0;
  106.    for (i=8;i>0;i--)           //一位一位地讀,共8位
  107.    {   
  108.      DQ = 0;                        //給一脈沖信號
  109.          dat>>=1;                      //dat往右移一位
  110.          DQ = 1;                        //給一脈沖信號
  111.          if(DQ)   
  112.            dat|=0x80;   
  113.            delay_18B20(4);//
  114.    }   return(dat);
  115. }

  116. void ds1820wr(uchar wdata)                 //寫入一字節(jié)
  117. {
  118.    unsigned char i=0;   
  119.    for (i=8;i>0;i--)   
  120.    {
  121.      DQ = 0;     
  122.          DQ = wdata&0x01;     
  123.          delay_18B20(5);      
  124.          DQ = 1;     
  125.          wdata>>=1;   
  126.    }
  127. }

  128. uint read_temp()                          //讀取溫度
  129. {      
  130.    float aaa;      
  131.    uchar a,b;      
  132.    ds1820rst();         
  133.    ds1820wr(0xcc);               //向DS18B20發(fā)跳過讀ROM命令
  134.    ds1820wr(0x44);                    //啟動DS18B20進(jìn)行溫度轉(zhuǎn)換命令,轉(zhuǎn)換結(jié)果存入內(nèi)部RAM
  135.    delay_18B20(80);                //延時(shí)
  136.    ds1820rst();         
  137.    ds1820wr(0xcc);               //向DS18B20發(fā)跳過讀ROM命令
  138.    ds1820wr(0xbe);                    //讀取溫度寄存器等(共可讀9個(gè)寄存器) 前兩個(gè)就是溫度
  139.    delay_18B20(80);                //延時(shí)
  140.    a=ds1820rd();                       //讀內(nèi)部RAM  低位
  141.    b=ds1820rd();                       //讀內(nèi)部RAM  高位
  142.    aaa=(b*256+a)*6.25;      
  143.    tvalue=(uint)aaa;   
  144.    return(tvalue);
  145. }

  146. void display1(uchar a1,uchar a2,uchar a3,uchar a4)          //顯示溫度
  147. {
  148.    P2=0xfe;
  149.    P0=table[a1];
  150.    delay2(20);   
  151.    P2=0xfd;
  152.    P0=table1[a2];
  153.    delay2(20);
  154.    P2=0xfb;
  155.    P0=table[a3];   
  156.    delay2(20);
  157.    P2=0xf7;
  158.    P0=table[a4];   
  159.    delay2(20);   
  160. }



  161. void ds1820disp( unsigned int tvalue1)           //溫度處理
  162. {   
  163.    disdata[0]=tvalue1/1000;                       //十位
  164.    disdata[1]=tvalue1%1000/100;               //個(gè)位
  165.    disdata[2]=tvalue1%100/10;                       //小數(shù)點(diǎn)后一位
  166.    disdata[3]=tvalue1%10;;                       //小數(shù)點(diǎn)后兩位
  167.    display1(disdata[0],disdata[1],disdata[2],disdata[3]);
  168. }

  169. //void stop(){



  170.       
  171. void t18B20()     //溫度傳感器顯示函數(shù)
  172. {
  173.    uint temp;
  174.    delaytimer();
  175.    while(1)
  176.    {     
  177.      temp=read_temp();     
  178.          ds1820disp(temp);

  179.         

  180.    }
  181. }

  182. /*void smg()
  183. {
  184. uchar shift,j,k,m;
  185. while(1)
  186.    {    for(m=1;m<101;m++)
  187. {for(j=0;j<4;j++)
  188.         {
  189.             
  190.                        P2=con[j];
  191.                             P0=display[j];
  192.                                  delay(10000);

  193.          }
  194.                         P2=0xFF;
  195.                         
  196.          for(k=0;k<4;k++)
  197.       {   
  198.             P2=con[k];
  199.                         P0=display4[k];
  200.                         delay(10000);
  201.           }
  202.           P2=0xFF;
  203.           }
  204.       P0=0xFF;
  205.       P2=0xFF;
  206. }}*/
  207. //*************主函數(shù)***********************

  208. void main()
  209. {         uchar shift,j,k,m;
  210.        for(m=1;m<5;m++)
  211. { for(j=0;j<4;j++)
  212.         {
  213.             
  214.                        P2=con[j];
  215.                             P0=display[j];
  216.                                  delay(10000);

  217.          }
  218.                         
  219.                         P2=0xFF;
  220.             
  221.                      /* for(j=0;j<3;j++)
  222.         {
  223.             
  224.                        P2=con[j];
  225.                             P0=display2[j];
  226.                                    delay(1000);
  227.                                  }*/
  228.          for(k=0;k<4;k++)
  229. ……………………

  230. …………限于本文篇幅 余下代碼請從51黑下載附件…………
  231. </font></font>
復(fù)制代碼

所有資料51hei提供下載(仿真+源碼+完整論文):

魔術(shù)棒.zip (270.6 KB, 下載次數(shù): 22)




評分

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

查看全部評分

回復(fù)

使用道具 舉報(bào)

ID:760362 發(fā)表于 2020-5-25 08:49 | 顯示全部樓層
請問這是用到了數(shù)碼管動態(tài)掃描技術(shù)嗎
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

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