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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

max7000系列CPLD紅外線遙控課程設計(含源代碼與文檔)

[復制鏈接]
跳轉到指定樓層
樓主
ID:259533 發表于 2018-3-12 23:19 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
數字系統設計


第一部分  設計題目及要求
本次設計的題目及要求如下:

一、設計題目

紅外線遙控接收器

二、設計步驟

1、EDA實驗板組裝調試

參照提供的EDA實驗板電路原理圖、PCB圖以及元器件清單進行電路板的組裝。電路板組裝完成后,編寫三個小程序進行電路板測試。

2、紅外遙控系統的設計

(1)發射編碼部分

使用指定的元器件在萬用板上完成紅外遙控器的制作。

(2)接收解碼部分

接收解碼用VHDL語言編寫程序,在EDA實驗板上實現解碼。

二、功能要求

1、將一體化紅外接收解調器的輸出信號解碼(12個單擊鍵、6個連續鍵,單擊鍵編號為7-18,連續鍵編碼為1-6),在EDA實驗板上用七段數碼管顯示出來。

2、當按下遙控器1—6號連續鍵時,在EDA實驗板上用發光二極管點亮作為連續鍵按下的指示,要求遙控器上連續鍵接下時指示燈點亮,直到松開按鍵時才熄滅,用于區別單擊鍵。

3、EDA實驗板上設置四個按鍵,其功能等同于遙控器上的1—4號按鍵,當按下此四個按鍵時七段數碼管分別對應顯示“1”、“2”、“3”、“4”。

4、每當接收到有效按鍵時,蜂鳴器會發出提示音。

第二部分   設計分析

本次設計包括兩大部分,一是電路設計及電路焊接,二是程序的設計及編寫。

電路部分,根據題目要求,要做到紅外發送,顯然整個電路系統要分為紅外發射和紅外接收兩個電路,分別做到紅外的編碼發射和譯碼接受,再在接收板上顯示接受到的紅外信號。另外還包括一個從電腦下載程序到芯片上的下載線電路。

  • 紅外發射電路

本次設計的紅外遙控器由紅外遙控專用芯片PT2248作為編碼及發送部分,PT2248最大可用作18路紅外遙控系統的編碼,其內部己集成了38kHz的紅外載波振蕩及相應的數字脈碼調制電路,只需外接3×6的矩陣式按鍵、紅外發光二極管及其驅動電路等少量元器件便可完成編碼發送的功能。

由PT2248和少量外圍元件組成的紅外遙控發射電路如下圖所示

芯片的發送指令由12位碼組成,其中C1~C3是用戶碼,可用來確定不同的模式。用戶碼設定是以列線內接入二極管為界線,當T1~T3與CODE之間分別接入二極管時,用戶碼(C1~C3)為“1”;當T1~T3引腳不接二極管時,用戶碼為“0”。如果該芯片與BL9150相結合,則C3引腳必須接入二極管;如果該芯片與BL9149相結合,則C2必須接二極管,H、S1和S2是代表連續發送或單次發送的碼,且分別與T1、T2和T3列的鍵對應。D4~D6是發送的數據碼(也是鍵輸入碼)

上圖中3V電源電壓一方面為芯片提供推薦工作電壓并加到引腳16,另一方面作為信號輸出指示復合管的工作電壓。為了使振蕩頻率為455kHz,特采用外接晶振,并外接兩個電容120pF旁路到地。圖7中三列T1、T2、T3和CODE分別接一個二極管,目的是為了使用戶碼(C1、C2、C3)為“1”。

  •       紅外接受部分
本次設計的紅外接受部分采用EDA實驗板,EDA實驗板的頂層PCB圖如下:
.
硬件部分的設計:

板的中心部件采用的是max7000系列CPLD,另外采用4M晶振以及紅外接收管(38K接收頭)直接在邏輯箱制作紅外接收解碼電路。紅外接收管有3個管腳,自左至右分別是信號輸出端,地端,電源端,分別接到邏輯箱的相應管腳上;同時,為了得到更加穩定的信號,在信號輸出端與地端加入一濾波電容。

三,下載線電路

本次設計采用的下載線把電腦的打印機口和實驗板的數據口連接起來,從而把程序從電腦下載到實驗板的芯片里,如下圖:

下載線電路采用芯片74LS244構成下載線電路,電路圖如下:
下載線電路板的頂層PCB圖如下:
第三部分  系統模塊的劃分以及各模塊的功能描述

在這一部分,我將對系統功能進行模塊化劃分,對各模塊功能作詳細闡述。

  • 發射板部分

  發射板主要由紅外線編碼芯片PT2248 構成紅外編碼這個模塊。

  PT2248的管腳圖如下圖所示:



其各個管腳的功能如下表:




PT2248組成的十八路遙控發送器其編碼規則如下:

(1)設a為一個時間單位,時間長度是38kHz的16個時鐘周期,即

a=1÷38kHz×16=0.421ms

              編碼是以串行形式發送的,在接收端(38kHz一體化紅外接收解調器)接收到如下形式的1位的編碼時分別表示“0”和“1”:

1個a的低電平,3個a的高電平表示編碼“0”

3個a的低電平,1個a的高電平表示編碼“1”

編碼以串行形式發送,接收端的一體化紅外接收解調器輸出波形如下圖所示:

此外,由于發射器發送的時候,有兩個信號,一種是表示單擊的,一種則是表示連續的,這兩種不同的信號,其自身都有自己的特點:

(2)遙控器的每個按鍵編碼由12位按以上編碼規則所代表的“0”、“1”組成,時間長度為48a,當按下遙控器的7到18號單擊按鍵,則以12位為一組(48a)發送兩次編碼,如下圖所示:

60a為自按下按鍵到發送編碼的等待時間,80a是前后兩次發送12位48a編碼的高電平時間間隔。7到18號單擊按鍵無論發送端按鍵時間持續多長只發送一次這樣形式的兩組相同的12位編碼。

(3)當按下1到6號連續按鍵時,編碼按如下格式連續發送:

由上圖可以清楚的看到,兩種信號的巨大差別,可是在程序的編寫過程中,這種差別卻沒有什么很大的作用,因為兩種信號在譯碼上的區別也是相當明顯的,故為了簡化程序,直接由譯碼來區別連續單擊比利用上圖的效果更好,具體見程序。

(4)芯片的發送指令由12位碼組成,如下所列。其中C1~C3是用戶碼,可用來確定不同的模式。用戶碼設定是以列線內接入二極管為界線,當T1~T3與CODE之間分別接入二極管時,用戶碼(C1~C3)為“1”;當T1~T3引腳不接二極管時,用戶碼為“0”。

具體每個12位的串行編碼規則如下:

C1、C2、C3為用戶可通過在遙控器發射電路中是否接入IN4148二極管決定其為“0”或“1”,這里取“111”,H、S1、S2為單擊連續按鍵的標志位,相當于列坐標,D1至D6為按鍵輸入碼,相當于行坐標,低9位的按鍵編碼如下表所示:


按鍵
低9位編碼
H
S1
S2
D1
D2
D3
D4
D5
D6
1
1
0
0
1
0
0
0
0
0
2
1
0
0
0
1
0
0
0
0
3
1
0
0
0
0
1
0
0
0
4
1
0
0
0
0
0
1
0
0
5
1
0
0
0
0
0
0
1
0
6
1
0
0
0
0
0
0
0
1
7
0
1
0
1
0
0
0
0
0
8
0
1
0
0
1
0
0
0
0
9
0
1
0
0
0
1
0
0
0
10
0
1
0
0
0
0
1
0
0

續上表:
二,接收部分

接收部分電路主要可分為紅外接受模塊,譯碼電路模塊,小鍵盤模塊和數碼管顯示模塊幾個部分,紅外信號的編碼從發射板發射到接收板上的紅外信號接收頭后 ,譯碼電路把紅外編碼翻譯后送到數碼管顯示,小鍵盤輸入的代碼也經譯碼電路在數碼管上顯示對應的按鍵信息。


(一).紅外信號接受

本設計的紅外接受頭采用一體化紅外接收解調器,如下圖:

其引腳圖如下:

一體化紅外接收解調器的內部電路如下圖:

  上面詳述的紅外信號發射電路把發射板上的按鍵信息編成編碼以紅外信號的形式發射到接收板,該一體化紅外接收解調器接收到紅外信息后,把其包含的編碼信息傳到下一級譯碼電路,從而完成紅外信號的接收。

當紅外接收頭接收到遙控器發出的信號時,邏輯箱上的蜂鳴器需發出提示聲。因設計時只考慮譯碼器具有最簡單的譯碼功能,這樣就要求前面的編碼電路在每發出一串12位編碼的同時發出一個脈沖給計數器,使計數器輸出為高電平,同時開始計數,直至計數到規定值后又回到低電平,完成響鈴提示。
(二)紅外編碼譯碼電路

根據芯片介紹可知,紅外接收頭接收到的編碼,每一幀完整的串行數據有十二位,而每一位的BIT‘0’、BIT‘1’是占空比不同的矩形方波,要完成以后的功能,就需要一個編碼器將其編成邏輯器件能識別的普通邏輯電平‘0’、‘1’。

紅外接收頭接收負責接收38k載波的紅外光,解調得到脈沖,輸出至譯碼電路。接收頭接收到的脈沖如圖(與發射波形剛好互為反碼): (a為38kHz時鐘的16個周期)

每個按鍵的值由12bit組成:

按鍵編碼格式:

譯碼電路有把對應的譯碼程序下載后的CPLD構成,CPLD的外圍電路如下圖:

CPLD和芯片74HC4040以及其他元件構成譯碼電路,74HC4040的管腳圖如下圖所示:
其內部電路圖如下圖:
一體化紅外接收解調器接收到紅外信息后,將紅外編碼通過73HC4040傳到CPLD進行譯碼。
(三)紅外編碼顯示電路

這部分電路將譯碼后得到的十二位普通高低電平‘0、’‘1’編碼譯成相應的壓縮BCD碼1~18,應十位僅有0、1兩種可能,將譯得的BCD碼直接接芯片4511的輸入引腳,4511的譯碼輸出并接到4位LED數碼顯示管,再在程序中寫入十位和個位選擇的進程,即可得到相應1~18數字顯示輸出。

顯示部分電路由芯片CD4511BC構成,譯碼后的高低電平從CPLD的44,45,46,48,49管腳傳輸到CD4511BC,進行譯碼,這部份電路如下:

CPLD的33——41角分別接到三級管(8050)Q2——Q9,通過段路線,選擇兩個四位LED數碼顯示管里的共八位顯示中的哪一位或哪幾位顯示,沒有接段路線的那些位的顯示管將不亮。

CD4511BC的管腳圖如下圖所示:

其真值表及對應的LED數碼顯示管顯示如下:

(四)小鍵盤電路

   EDA實驗板上有個4*4 的按鍵矩陣,當按鍵被按下時,其輸出引腳為低電平,而其余時間內均為高電平。當按下每一行的四個鍵時,七段碼顯示管應顯示1—4,必須將四個按鍵并行輸入的按鍵編碼轉換成1—4的BCD碼才能輸出顯示。按鍵輸入與遙控輸入應共用兩個七段碼顯示管輸出,這樣就需要在程序中將輸入的遙控信號與按鍵信號先進行選擇再輸出。

  這部分電路如下圖所示:

第四部分  程序設計及注釋源程序

一、本次設計的程序設計的ASM圖如下:

        


二、程序設計時的主要部分以及遇到的問題及解決方案:


1頻率的同步問題:

這是本程序的一個關卡,由于信號的載波是16k,而晶振的頻率采用了4M,就是說無論怎么分頻,邏輯箱出來的頻率都不可能得到載波信號的頻率,所以有可能經過幾次解碼之后便出現誤碼。

本設計具體采用的處理措施如下:4M的2的7次方分頻(沒有安裝word的公式,請見諒哦),所得到一個信號(即4個a)為14倍clk,這里用到一個cnt1,每個時鐘上升沿計數一次,計數到第7個時鐘上升沿時,便進行讀數,根據0和1波形的特點,可知在此時輸入信號infared_in與其真正表示的值相反,故有:

if cnt1=7 then reg2<=reg2(7 downto 0) & not txout;
end if;
在第14個clk后,剩下的0.2個clk將產生誤碼,故采取以下措施:
when T1=>
if cnt1=50 then
cnt1<=0;
state<=T0;
else
cnt1<=cnt1+1;
end if;

計到第14個clk時(由于其中經過兩個狀態,所以計數只計到12),又回到T0,重新檢測infared_in=‘0’后回到T1狀態,從而取出那0.2個clk的影響。


2)如何判斷接收到一串完整的12位數據問題:

如果采用cnt1計數來控制的話,會導致cnt1的取值過大,而且會出現誤差時間的積累,故本程序用到的第二個計數器cnt2,其作用也不容小視,在每一次cnt1=7時,都會將cnt2自加,如下:

Ifcnt1=7 then
cnt2<=cnt2+1;
reg<=reg (7 downto 0) & not infared_in;
end if;                                 
if  cnt2=12 then
cnt2<=0;
speaker<='1';
end if;

這是用來記錄移入寄存器reg的次數,計到12時,說明已經接收了1個完整的信號了,此時把cnt2清零,以便下一次接收信號時使用。

3) 指示燈跟蜂鳴器的問題:

當接收一個完整的信號之后,當讓就是對這存在reg中的一串01代碼進行譯碼了,同時根據題目要求,蜂鳴器要相應的響一聲。故當cnt2=12時sound賦為高電平,并啟用第三個計數器cnt3,cnt3在下一個時鐘上升沿開始自加,加至16000,即延時16000/16k=1秒后停止,后將sound從新賦0。具體實現如下:

if cnt2=12 then
cnt2<=0;
speaker<='1';
end if;
if speaker='1' then
cnt3<=cnt3+1;
if cnt3=16000 then
cnt3<=0;
                              speaker<='0';
end if;
end if;
4、EDA板上的按鍵問題:EDA試驗板的按鍵的每一行的四個按鍵分別對應B1 ,B2,B3,B4,具體實現只是在時鐘上升沿下加入一下程序段即可。
if B1='0' then
reg<="100100000";
             end if;
             if B2='0' then
reg<="100010000";
             end if;
             if B3='0' then
reg<="100001000";
             end if;
             if B4='0' then
reg<="100000100";
             end if;
  • 源程序
綜合上面所討論的幾點,可的得到本次設計的源程序(帶注釋)
  1. library ieee;
  2. use ieee.std_logic_1164.all;
  3. use ieee.std_logic_unsigned.all;
  4. entity infared is
  5. port (clk,infared_in,B1,B2,B3,B4,reset:in std_logic;
  6. --B1.B2.B3.B4為實驗版上4*4鍵盤每一行對應的4個按鍵
  7. --infared_in為紅外接收頭接收并解碼輸出的信號
  8. BCD_out : out std_logic_vector(3 downto 0);   
  9. --芯片輸出到4511的經紅外編碼后的12位按鍵碼對應的4位代碼
  10. selet: out std_logic_vector(1 downto 0);        
  11. --數碼顯示管十位和個位的選擇信號
  12. led,speaker : buffer std_logic);               
  13. --連續鍵的指示燈信號,按鍵按下即蜂鳴器信號
  14. end infared;
  15.   architecture behav of infared is
  16.       type state_type is (s0,s1,s2);
  17.       signal state : state_type;
  18.       signal reg : std_logic_vector(8 downto 0);
  19.       signal cnt1 : integer range 0 to 14;
  20. --0, 1解碼計數器。對0的個數的計數,遇到0則開始計數,遇到1就停止,以區別0和1的編碼
  21.       signal cnt2 : integer range 0 to 12;
  22. --輸入的編碼位數計數器,計數到到12就把編碼輸出到infared_in
  23.       signal cnt3 : integer range 0 to 16000;
  24. --蜂鳴器延時計數器
  25.       signal cnt4 : integer range 0 to 1;
  26. --個位十位選擇計數器,為0時數碼管顯示個位,為1顯示十位
  27.   begin
  28. judge:process (clk,infared_in,cnt1)  
  29. --進程1,判斷是否接受到低電平,紅外接受低電平有效,infared_in=0時表示有編碼輸入
  30.       begin        
  31.         if clk'event and clk='1' then
  32.           case state is
  33.             when s0=> if infared_in='0' then
  34.                          state<=s1;
  35.                       else
  36.                          state<=s0;               
  37. --檢測輸入信號,如果是高電平則繼續檢測;如果為低電平則進入狀態s1
  38.                       end if;
  39.             when s1=> if cnt1=12 then
  40.                          cnt1<=0;
  41.                          state<=s2;
  42.                       else cnt1<=cnt1+1;              
  43. --計數到12時,跳到s2狀態,繼續檢測低電平
  44.                       end if;
  45.             when s2=>
  46. if infared_in='1' then         
  47. --若出現高電平則跳回s0狀態
  48.                          state<=s0;
  49.                                                                         else
  50.                          state<=s2;
  51.                     end if;
  52.            end case;
  53.         end if;                                       
  54. --當計數到7時,自動跳到進程com2,每接收完一個完整的0或1信號后,自動接收下一個信號,自身不停地在兩個狀態中輪換。
  55.      end process judge;
  56. coding:process(clk,cnt1,cnt2,cnt3,B1,B2,B3,B4)      
  57. --編碼譯碼進程
  58. begin
  59.      if clk'event and clk='1' then
  60.          if B1='0' then
  61.            reg<="100100000";         
  62. --B1按下,寄存器儲存表示00000001的代碼。
  63.          end if;
  64.          if B2='0' then
  65.            reg<="100010000";         
  66. --B2按下,寄存器儲存表示00000010的代碼。
  67.          end if;
  68.          if B3='0' then
  69.            reg<="100001000";         
  70. --B3按下,寄存器儲存表示00000011的代碼。
  71.          end if;
  72.          if B4='0' then
  73.            reg<="100000100";         
  74. --B4按下,寄存器儲存表示00000100的代碼。
  75.          end if;
  76.          if cnt1=7 then                             
  77.             cnt2<=cnt2+1;                           
  78. --cnt2加1,表示移入一位數據
  79.            reg<=reg (7 downto 0) & not infared_in;
  80.           end if;                                 
  81. --當計數到7時,將接收到的infared_in的相反值移入寄存器。
  82.            if cnt2=12 then                        
  83. --當cnt2計數到12時,表示接收到了完整的一串數據,自身清零并開啟蜂鳴器
  84.                cnt2<=0;
  85.                speaker<='1';
  86.             end if;
  87.             if speaker='1' then
  88.                  cnt3<=cnt3+1;
  89.               if cnt3=16000 then
  90.                  cnt3<=0;
  91.                  speaker<='0';                        
  92. --計數cnt3計到16000時賦0,蜂鳴器停止,即蜂鳴器鳴響時間持續16000/16k=1秒后停止
  93.               end if;
  94.             end if;
  95.         end if;

  96.      end process coding;
  97. display:process(clk,reg,reset)                          
  98. --顯示進程。低9位編碼轉換成對應的BCD輸出,1-6連續按鍵燈亮,7-18單擊鍵燈滅,
  99.    begin
  100.      if(reset='1') then                                  --高電平復位
  101.        BCD_out<="0000";
  102.        selet<="11";
  103.        led<='1';                                       
  104. --若按下復位鍵,十位個位同時顯示0,指示燈亮
  105.      elsif (clk'event and clk='1') then
  106.        led<='1';                              
  107.          case reg is
  108.           when "100100000" => BCD_out<="0001";            --顯示1
  109.                             selet<="01";
  110.                             led<='0';
  111.           when "100010000" =>BCD_out<="0010";              --顯示2
  112.                              selet<="01";
  113.                              led<='0';
  114.           when "100001000" => BCD_out<="0011";              --顯示3
  115.                             selet<="01";
  116.                             led<='0';
  117.           when "100000100" => BCD_out<="0100";              --顯示4
  118.                             selet<="01";
  119.                             led<='0';
  120.           when "100000010" => BCD_out<="0101";              --顯示5
  121.                             selet<="01";
  122.                             led<='0';
  123.           when "100000001" => BCD_out<="0110";              --顯示6
  124.                             selet<="01";   
  125.                             led<='0';
  126.           when "010100000" => BCD_out<="0111";              --顯示7
  127.                             selet<="01";
  128.                             led<='1';
  129.           when "010010000" => BCD_out<="1000";              --顯示8
  130.                             selet<="01";
  131.                             led<='1';
  132.           when "010001000" => BCD_out<="1001";             --顯示9
  133.                             selet<="01";
  134.                             led<='1';                     
  135. --連續鍵時led賦為高電平,燈亮;sel賦值''01''表示采用個位顯示
  136.           when "010000100" =>if (cnt4=0) then
  137.                              cnt4<=cnt4+1;
  138.                             BCD_out<="0000";            --個位顯示0
  139.                              selet<="01";
  140.                             else cnt4<=0;
  141.                             BCD_out<="0001";             --十位顯示1
  142.                              selet<="10";
  143.                             end if;                     
  144. --兩位數利用計數器cnt4實現個、十位輪流顯示。
  145.           when "010000010" =>if (cnt4=0) then
  146.                               cnt4<=cnt4+1;
  147.                              BCD_out<="0001";           --個位顯示1
  148.                               selet<="01";   
  149.                              else cnt4<=0;
  150.                              BCD_out<="0001";            --十位顯示1
  151.                               selet<="10";   
  152.                              end if;     
  153.           when "010000001" => if (cnt4=0) then
  154.                                cnt4<=cnt4+1;
  155.                               BCD_out<="0010";           --個位顯示2
  156.                                selet<="01";
  157.                              else cnt4<=0;
  158.                                BCD_out<="0001";           --十位顯示1
  159.                                selet<="10";
  160.                              end if;
  161.           when "001100000" => if (cnt4=0) then
  162.                                cnt4<=cnt4+1;
  163.                                BCD_out<="0011";           --個位顯示3
  164.                                selet<="01";
  165.                              else cnt4<=0;
  166.                                BCD_out<="0001";           --十位顯示1
  167.                                selet<="10";
  168.                             end if;

  169.           when "001010000" => if (cnt4=0) then
  170.                               cnt4<=cnt4+1;
  171.                               BCD_out<="0100";            --個位顯示4
  172.                              selet<="01";
  173.                             else cnt4<=0;
  174.                              BCD_out<="0001";             --十位顯示1
  175.                              selet<="10";
  176.                             end if;
  177.           when "001001000" =>if (cnt4=0) then
  178.                              cnt4<=cnt4+1;
  179.                              BCD_out<="0101";             --個位顯示5
  180.                              selet<="01";
  181.                           else cnt4<=0;
  182.                              BCD_out<="0001";             --十位顯示1
  183.                             selet<="10";
  184.                          end if;
  185.           when "001000100" => if (cnt4=0) then
  186.                              cnt4<=cnt4+1;
  187.                              BCD_out<="0110";             --個位顯示6
  188.                              selet<="01";
  189.                            else cnt4<=0;
  190.                              BCD_out<="0001";             --十位顯示1
  191.                             selet<="10";
  192.                            end if;
  193.                              led<='1';
  194.           when "001000010" => if (cnt4=0) then
  195.                              cnt4<=cnt4+1;
  196.                              BCD_out<="0111";             --個位顯示7
  197.                              selet<="01";
  198.                            else cnt4<=0;
  199.                              BCD_out<="0001";             --十位顯示1
  200.                              selet<="10";
  201.                          end if;
  202.           when "001000001" =>if (cnt4=0) then
  203.                              cnt4<=cnt4+1;
  204.                              BCD_out<="1000";             --個位顯示8
  205.                              selet<="01";
  206.                            else cnt4<=0;
  207.                              BCD_out<="0001";             --十位顯示1
  208.                              selet<="10";
  209.                           end if;
  210.          when others => led<='1';
  211.                       selet<="00";                           
  212. --其他數碼無顯示,指示燈亮
  213.        end case;
  214.     end if;
  215.   end process display;
  216. end behav;
復制代碼


第五部分  程序仿真

本次設計程序的一個仿真波形圖見下頁:

該波形圖可分為兩部分,第一部分是EDA板對紅外發射所發射的信號進行譯碼 ,并輸出BCD碼,即其他輸出的部分,第二部分是對EDA試驗板的鍵盤矩陣輸入信號的譯碼BCD碼輸出。

一、紅外譯碼部分

   在B2的低電平脈沖輸入前的部分屬于剛才講的第一部分,即紅外譯碼部分,此時EDA試驗板上的按鍵均沒有按下,所也B1,B2,B3,B4都把保持高電平。

   這部分波形圖示仿真紅外發射器的按鍵1按下是的情況。根據紅外編碼芯片PT2248的編碼規則,按鍵1按下是的編碼應該是“100100000”,上面也提到,每個代碼‘0’或‘1’的波形包括4個時鐘周期:‘0’是1個時鐘周期的低電平加3個時鐘周期的高電平;‘1’是3個時鐘周期的低電平加1個時鐘周期的高電平。所以“100100000”的波形應該如下圖所示:

    當9位編碼“100100000”全部接收完后,CPLD的BCD碼輸出為“0001”,即數碼管顯示1,如下圖:

Selet輸出,即選擇個位數碼管顯示。

二 、EDA板上的按鍵編碼及BCD碼輸出

   EDA板上的按鍵按下時,紅外發射板的信號不能被EDA板接收,故CPLD是對EDA板上的按鍵信號進行譯碼的。

這部分波形從B2低電平脈沖,即B2按下開始,B1,B2,B3,B4分別是4*4鍵盤的右數第一,二,三,四列的任何一個按鍵,隨后是B3,B1,B4的低電平脈沖,如下圖:

   先后輸出的BCD碼為“0010”,“0011”,“0001”,“0100”,如下圖:

   即B2按下時數碼管顯示2,B3按下時數碼管顯示3,B1按下時數碼管顯示1,B4按下時數碼管顯示4,仿真無誤。

第六部分  設計體會及心得

一、設計過程中遇到的問題及解決方法

上面已經提過,本次設計的設計分為兩個方面:電路板和程序。

程序設計遇到的問題的解決方案及解決方法幾經在第四部分闡述,這部分主要討論電路板設計,焊接及調試遇到的問題和解決方法。

  • EDA試驗板和數據線電路板

這兩塊板發下來時電路已經設計好,主要出現的問題在焊接上。

在焊接前先觀察這兩塊板,看清哪面是元件面,哪面是焊接面,畫有元件圖案的那面是元件面,焊接是要把元放在這一面上。

在焊接過程中最容易犯的錯誤就是把IC,晶振,三級管,穩壓器,紅外接收器,排阻,二極管等元件的管腳焊錯。

IC中管角最多的就是CPLD的IC座了,要是焊錯了,這個83個腳的元件拆下來的困難程度將是很難想象的。其實把它含對不難,在IC座內部的IC槽有一個是缺腳的,而實驗板元件面上畫圖案也是有一個缺角的,只要把位置對好,先把IC座的兩個對角的管腳焊好,再焊其他腳就可以順利焊好它了。其他IC都有一個缺口,只要把缺口和板上畫的缺口對齊,同樣把對角的兩個管腳焊好再焊其他腳,就行了,IC上有一個管腳的旁邊有一個圓形的凹陷,板上和這個角對應的焊盤是方行的,根據這個規則也可以可方便的把IC焊好。

焊晶振,三級管,穩壓器,紅外接收器時,只要把元件和板上畫的圖案對齊,就可以焊好。比如:晶振的四個角只有一個角是直角,其他三個角都是圓角,板上畫的圖案也是這樣,只要把直角對齊,就可以焊好了。

普通二極管有一頭印有一個黑色的環,試驗板上普通二級管的圖案也是有一頭是有黑色(或白色)的,對其再焊就可以把二極管的正負極焊對。發光二級管的兩個管腳是一長一短的,長的那根是正極,試驗板已經把發光二極管的正負極標上去,真樣也很容易就把放光二極管焊好。

在焊接過程中遇到的另一個問題就是焊電阻等比較矮的元件時,焊好后發現元件沒有緊貼在板上,這是就要把焊錫熔調,調整元件的位置,有時候在熔焊錫時,會把焊盤弄調,這時可以在元件面上焊,應為試驗板元件面和焊接面都有焊盤的。另外,焊接元件時一定要記住先焊矮的元件,再焊高的,這樣就方便把元件緊貼在板上。

焊接結束后,把測數碼管的程序下載到CPLD里,發現有一個數碼管的亮得不正常,程序寫的是8為數碼管從右向左依次顯示0——9,發現左數第四位的二級管是在其他管亮過一編后再閃一下,懷疑是于這為數碼管連接的三極管壞了,根據電路圖,找到和這為數碼管相連的三級管是Q6,把這個三極管換掉后,數碼管就正常顯示了。

2.發射板部分

發射板是采用面包板,根據PT2248和少量外圍元件組成的紅外遙控發射電路設計成的,焊接部分遇到的問題和EDA板焊接遇到的問題類似,只不過,發射板的電路顯得比較擁擠,焊盤挨得比較緊,很容易造成短路,焊接時要十分小心,發現兩個焊盤有可能短路時馬上用萬用表的歐姆檔檢測。

發射板焊接電路最復雜的就是3*6鍵盤矩陣的焊接電路。考慮到按鍵的四個管角中,在同一測的兩個角是不導通的,而不再同一側的相對的兩隊管腳是內部導通的,當按鍵按下時,四個管角全部連通,開關就相當于一個節點,把18個按鍵豎著排列在板上,同一側的管角處于上下位置,把每個同側管角的右邊那個和它正上方(或下方)的按鍵的管腳焊在一起,這樣6根豎線就形成了。在三行按鍵之間和最下面那行按鍵的下方固定一條導線,把三行按鍵下方同測管腳的左邊那個通過導線連起來,這樣三條橫線也形成了。到此,3*6的鍵盤矩陣電路就焊接完畢,再把這3根橫線和6根豎線根據電路圖接到芯片上,再焊其他元件,發射板電路就完成了。

在設計發射板電路時,我在紅外發射二極管的旁邊串連了一個發光二級管,這樣有按鍵按下時,發光二級光就會亮。這樣就能檢測發射板是否有信號發出,也可以檢測發射板是工作正常。


二、心得體會

歷經快學期的兩周的數字系統設計在我把我親手做的EDA試驗板和紅外發射板,還有CPLD里面的程序交到老師手中并通過驗收的那一克結束了。看到自己的作品,雖然不管從外表還是實現的功能都和其他同學的相差無幾,但心里有一股很強的成就感,也有如釋重負的輕快。

短短兩周的時間很可能是我走向社會,走向工作的一個縮影,遇到難題,積極求證,分析問題,解決問題…一系列的過程不僅讓我體會到了面對問題無從下手的尷尬,也讓我體味到問題迎刃而解的喜悅。這次設計使我學到了許多東西,不僅理論知識,實踐能力得到了很大的提高,也鍛煉了自己的意志。

無可非議,數字系統設計時四門設計中設計面最廣,科技含量最大,難度最大,立時最久的一門設計。程序方面,設計的程序比微機設計的復雜;焊板方面,工作量比高頻設計的大;實現的功能方面,比模電設計的更前衛,這些因素時使這次設計給我留下了及其極其深刻的印象,也使我學到許多課堂上,課本里根本就學不到的東西。

數字系統是現在社會上的熱門話題,這方面的人才的社會需求量也是相當大的。這方面的知識也是很有趣的,特別是程序下載,通過編程可以使實驗板有自己想要的功能,這是一件很有趣的事情。

   這次設計加深了我對FPGA/CPLD的認識,也是我鞏固可VHDL語言的知識,還鍛煉了動手能力,可以說是受益匪淺。我在這方面的知識還是比較薄弱的,但我對這方面的知識很感興趣,這次設計給了我一個很好的機會學習數字系統的實踐知識的機會。

這次設計也是我學會了不輕言放棄,不怕困難,不怕麻煩,在做實驗的過程中,會重復不斷的遇到一些相同的問題,特別是程序和電路的調試時,往往要經過很多次反復的檢查、測量才能找到問題的所在,要使不能靜下心來,仔細研究,完成設計時不可能的。

這次的設計給了我又一次認識自我的機會,讓我學會了從更多角度分析解決問題,設計的過程中也積攢了一些相關的項目經驗,我想對我以后的實際操作肯定會有很大幫助的。設計給與了我們一個平臺去發揮自己的學到的理論知識,鍛煉了我們的動手能力,鞏固了我們所學的知識,為我們以后步入社會做了準備,使大學生學習相當重要的、不可或缺的一部份。


完整的Word格式文檔51黑下載地址:

紅外線遙控設計-課程設計(含源代碼).rar (714.07 KB, 下載次數: 24)



評分

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

查看全部評分

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 中文在线一区二区 | 亚洲夜夜爽 | 国产一区二区三区免费观看在线 | 丁香婷婷成人 | 午夜视频在线免费观看 | 亚洲精品乱码久久久久久按摩 | 91亚洲国产成人久久精品网站 | 中文字幕福利 | 日韩欧美国产电影 | 久久久美女 | 国产精品一区二区精品 | 国产免费又黄又爽又刺激蜜月al | 国产免国产免费 | 99视频在线免费观看 | 精品亚洲一区二区三区 | 免费a网站 | 色999日韩| 国产精品久久久久久久久免费 | 中文字幕韩在线第一页 | 日韩伦理一区二区三区 | 久久综合九九 | 成人特区 | 欧美一级特黄aaa大片在线观看 | 亚洲福利片 | www.天天干.com | 欧美激情一区二区 | 91极品视频 | 欧美成人专区 | 波多野结衣中文字幕一区二区三区 | 日韩av成人在线观看 | 嫩草懂你的影院入口 | 99精品久久久久 | 欧美综合一区 | 黄色片网此| 久久国产精品色av免费观看 | 噜噜噜噜狠狠狠7777视频 | 视频一区二区在线观看 | 欧美日韩综合一区 | 国产婷婷在线视频 | 欧美一区二区三区高清视频 | 日日操夜夜操天天操 |