單片機課程設計報告--- 函數(shù)發(fā)生器_第1頁
已閱讀1頁,還剩15頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、<p><b>  課程設計任務書</b></p><p>  課 程: 單片機實訓 </p><p>  題 目: 函數(shù)發(fā)生器 </p><p>  姓 名: </p><p>  學 號:

2、 </p><p>  系 別: 電氣工程系 </p><p>  專 業(yè): 電氣工程及其自動化 </p><p><b>  目 錄</b></p><p>  1、課程設計概述2</p><p>  2、課程設計題目

3、和實現(xiàn)目標2</p><p><b>  3、設計方案2</b></p><p>  4、Proteus仿真原理圖7</p><p><b>  5、程序流程圖7</b></p><p><b>  6、程序代碼8</b></p><p>&l

4、t;b>  7、調試總結16</b></p><p>  8、設計心得體會16</p><p><b>  9、參考文獻16</b></p><p><b>  1、課程設計概述</b></p><p>  函數(shù)發(fā)生器是一種多波形的信號源。它可以產(chǎn)生正弦波、方波、三角波、鋸齒

5、波,甚至任意波形。它的用途很廣泛??梢杂糜谏a(chǎn)測試、儀器維修和實驗室,還廣泛使用在其它科技領域,如醫(yī)學、教育、化學、通訊、地球物理學、工業(yè)控制、軍事和宇航等。</p><p>  本文是做基于單片機的信號發(fā)生器的設計,將采用編程的方法來實現(xiàn)三角波、鋸齒波、矩形波、正弦波的發(fā)生。根據(jù)設計的要求,對各種波形的頻率和幅度進行程序的編寫,并將所寫程序裝入單片機的程序存儲器中。在程序運行中,當接收到來自外界的命令,需要輸出

6、某種波形時再調用相應的中斷服務子程序和波形發(fā)生程序,經(jīng)電路的數(shù)/模轉換器和運算放大器處理后,從信號發(fā)生器的輸出端口輸出。</p><p>  本方案是基于AT89C51與PCF8591的單緩沖方式接口電路來設計。單緩沖式接口電路具有過程簡單,容易實現(xiàn)。由于本設計運用匯編的編程語言,導致用獨立式鍵盤來實現(xiàn)簡單控制。本方案所產(chǎn)生的信號頻率穩(wěn)定性高,精確度高。而且在硬件方面它所選的元器件比較常見。所以總的來說本方案的性

7、價比高。</p><p>  2、課程設計題目和實現(xiàn)目標 </p><p>  題目:《函數(shù)發(fā)生器》 </p><p><b>  要求:</b></p><p>  鍵盤輸入產(chǎn)生三角波,正弦波,鋸齒波,梯形波,任意波形(用示波器觀察)</p><p><b>  頻率可調</b

8、></p><p><b>  幅值可調</b></p><p><b>  設計方案</b></p><p><b>  (1)主控電路</b></p><p>  AT89C52是一個低電壓,高性能CMOS 8位單片機,片內(nèi)含8k bytes的可反復擦寫的Flash只

9、讀程序存儲器和256 bytes的隨機存取數(shù)據(jù)存儲器(RAM),器件采用ATMEL公司的高密度、非易失性存儲技術生產(chǎn),兼容標準MCS-51指令系統(tǒng),片內(nèi)置通用8位中央處理器和Flash存儲單元,功能強大的AT89C52單片機可為您提供許多較復雜系統(tǒng)控制應用場合。</p><p>  AT89C52有40個引腳,32個外部雙向輸入/輸出(I/O)端口,同時內(nèi)含2個外中斷口,3個16位可編程定時計數(shù)器,2個全雙工串行

10、通信口,2個讀寫口線,AT89C52可以按照常規(guī)方法進行編程,但不可以在線編程(S系列的才支持在線編程)。其將通用的微處理器和Flash存儲器結合在一起,特別是可反復擦寫的Flash存儲器可有效地降低開發(fā)成本。</p><p>  兼容MCS51指令系統(tǒng) · 8k可反復擦寫(>1000次)Flash ROM </p><p>  · 32個雙向I/O口 ·

11、; 256x8bit內(nèi)部RAM </p><p>  · 3個16位可編程定時/計數(shù)器中斷 · 時鐘頻率0-24MHz </p><p>  · 2個串行中斷 · 可編程UART串行通道 </p><p>  · 2個外部中斷源 · 共6個中斷源 </p><p>  ·

12、2個讀寫中斷口線 · 3級加密位 </p><p>  · 低功耗空閑和掉電模式 · 軟件設置睡眠和喚醒功能 </p><p>  中斷系統(tǒng)是使處理器具有對外界異步事件的處理能力而設置的。當中央處理器CPU正在處理某件事的時候外界發(fā)生了緊急事件,要求CPU暫停當前的工作,轉而去處理這個緊急事件。在波形發(fā)生器中,只用到片內(nèi)定時器/計數(shù)器溢出時產(chǎn)生的中斷請求,即是

13、在AT89C52輸出一個波形采樣點信號后,接著啟動定時器,在定時器未產(chǎn)生中斷之前,AT89C52等待,直到定時器計時結束,產(chǎn)生中斷請求,AT89C52響應中斷,接著輸出下一個采樣點信號,如此循環(huán)產(chǎn)生所需要的信號波形。如圖所示2.1,AT89C52所在電路中的工作情況。</p><p> ?。?)獨立式鍵盤電路</p><p>  獨立式鍵盤中,各按鍵相互獨立,每個按鍵各接一根輸入線,每根輸

14、入線上的按鍵工作狀態(tài)不會影響其它輸入線上的工作狀態(tài)。因此,通過檢測輸入線的電平狀態(tài)就可以很容易的判斷按鍵是否被按下了。獨立式鍵盤電路配置靈活,軟件結構簡單。但每個按鍵需占用一根輸入線,在按鍵數(shù)量較多時,輸入口浪費大,電路結構顯得很繁雜,故此種鍵盤適用于按鍵較少或操作速度較高的場合。如圖2.2所示,獨立式按鍵電路。</p><p> ?。?)數(shù)/模轉換電路</p><p>  PCF8591

15、是一個單片集成、單獨供電、低功耗、8-bit CMOS數(shù)據(jù)獲取器件。PCF8591具有4個模擬輸入、1個模擬輸出和1個串行I²C總線接口。PCF8591的3個地址引腳A0, A1和A2可用于硬件地址編程,允許在同個I²C總線上接入8個PCF8591器件,而無需額外的硬件。在PCF8591器件上輸入輸出的地址、控制和數(shù)據(jù)信號都是通過雙線雙向I²C總線以串行的方式進行傳輸。  PCF8591的功能包括多路模擬

16、輸入、內(nèi)置跟蹤保持、8-bit模數(shù)轉換和8-bit數(shù)模轉換。PCF8591的最大轉化速率由I²C總線的最大速率決定。</p><p>  PCF8591 特性</p><p><b>  單獨供電 </b></p><p>  PCF8591的操作電壓范圍2.5V-6V </p><p><b>  

17、低待機電流 </b></p><p>  通過I²C總線串行輸入/輸出 </p><p>  PCF8591通過3個硬件地址引腳尋址</p><p>  PCF8591的采樣率由I²C總線速率決定 </p><p>  4個模擬輸入可編程為單端型或差分輸入 </p><p><b&

18、gt;  自動增量頻道選擇 </b></p><p>  PCF8591的模擬電壓范圍從VSS到VDD </p><p>  PCF8591內(nèi)置跟蹤保持電路 </p><p>  8-bit逐次逼近A/D轉換器</p><p><b>  I2C總線特性</b></p><p>  I

19、2C總線是不同的IC或模塊之間的雙向兩線通信。這兩條線是串行數(shù)據(jù)線(SDA)和串行時鐘線(SCL)。這兩條線必須通過上拉電路連接至正電源。數(shù)據(jù)傳輸只能在總線不忙時啟動。</p><p>  1.一個數(shù)據(jù)位在每一個時鐘脈沖期間傳輸。SDA線上的數(shù)據(jù)必須在時鐘脈沖的高電壓期間保持穩(wěn)定,這個期間數(shù)據(jù)線上的改變將被當作控制信號。 圖12 位傳輸 </p><p>  2 數(shù)據(jù)和時鐘線在總不忙時

20、保持高電平。在時鐘為高電平時,數(shù)據(jù)線上的一個由高到低的變化被定義為開始條件。時鐘為高電平時,數(shù)據(jù)線上的一個由低到高的變化被定義為停止條件。 </p><p>  4、Proteus仿真原理圖 </p><p><b>  5、程序流程</b></p><p><b>  6、程序代碼</b></p>&

21、lt;p>  #include <reg51.h> //定義頭文件</p><p>  #include <intrins.h></p><p>  #define uchar unsigned char //宏定義</p><p>  #define uint unsigned int//無符號

22、整型</p><p>  #define _Nop() _nop_() </p><p>  #define AddW 0x90 //寫數(shù)據(jù)地址 </p><p>  #define AddR 0x91 //讀數(shù)據(jù)地址</p><p>  sbit SDA=P2^0; //PCF8591 IO口定義<

23、/p><p>  sbit SCL=P2^1;//PCF8591 IO口定義</p><p>  sbit key1=P3^2;//波形切換</p><p>  sbit key2=P3^3;//頻率加</p><p>  sbit key3=P3^4;//頻率減</p><p>  sbit key4=P

24、3^5;//幅值加</p><p>  sbit key5=P3^6; //幅值減</p><p>  bit back; //應答標志位</p><p>  uchar wave=0;//波形.初始化為三角波.wave=1鋸齒波.wave=2正弦波</p><p>  uchar f=15; //頻率

25、</p><p>  uchar A=25; //幅度 </p><p>  unsigned char code sanjiao[]</p><p><b>  ={ </b></p><p>  0,4,8,12,16,20,24,28,32,36,40,44,48,52,56,60,64,68,</

26、p><p>  72,76,80,84,88,92,96,100,104,108,112,116,120,124,128,</p><p>  124,120,116,112,108,104,100,96,92,88,84,80,76,72,68,</p><p>  64,60,56,52,48,44,40,36,32,28,24,20,16,12,8,4,0, &

27、lt;/p><p><b>  };</b></p><p>  unsigned char code sin[]</p><p>  ={ 135,145,158,167,176,188,199,209,218,226,234,</p><p>  240,245,249,252,254,254,253,251,247

28、,243,237,</p><p>  230,222,213,204,193,182,170,158, 146,133,</p><p>  121,108,96,84,72,61,50,41,32,24,17,11,7,3,</p><p>  1,0,0,2,5,9,14,20,28,36,45,55,66,78,90,102,114,128 </p&g

29、t;<p><b>  }; </b></p><p>  unsigned char code juci[]</p><p>  ={ 0,4,8,12,16,20,24,28,32,36,40,45,49,53,57,61,</p><p>  65,69,73,77,81,85,89,93,97,101,105,109,1

30、13,117,</p><p>  121,125,130,134,138,142, 146,150,154,158,162,166,</p><p>  170,174,178,182,186,190,194,198,202,206,210,215,</p><p>  219,223,227,231,235,239,243,247,251,255 }; <

31、/p><p>  unsigned char code tixing[]</p><p>  ={ 0,13,26,39,52,65,78,91,104,117,130,143,156,</p><p>  169,182,195,208,221,234,247,247,247,247,247,</p><p>  247,247,247,24

32、7,247,247,247,247,247,247,247,</p><p>  247,247,247, 247,247,247,247,247,247,247,242,</p><p>  229,216,203,190,177,164,151,138,125,112,99,86,73,60,47,34,21,8 };</p><p>  void delay1

33、(uint z)//延時函數(shù)</p><p><b>  {</b></p><p><b>  uint x,y;</b></p><p>  for(x=z;x>0;x--)</p><p>  for(y=60;y>0;y--);</p><p> 

34、 } /* 啟動總線*/</p><p>  void Start_I2c()</p><p><b>  {</b></p><p>  SDA=1; //發(fā)送起始條件的數(shù)據(jù)信號</p><p><b>  _Nop();</b></p&

35、gt;<p><b>  SCL=1;</b></p><p>  _Nop(); //接受.建立時間大于4.7us,延時</p><p><b>  _Nop();</b></p><p><b>  _Nop();</b></p><p><b&

36、gt;  _Nop();</b></p><p>  _Nop(); </p><p>  SDA=0; //發(fā)送起始信號</p><p>  _Nop(); //起始條件鎖定時間大于4μs</p><p><b>  _Nop();</b></p><p>&

37、lt;b>  _Nop();</b></p><p><b>  _Nop();</b></p><p>  _Nop(); </p><p>  SCL=0; //鉗住I2C總線,準備發(fā)送或接收數(shù)據(jù)</p><p><b>  _Nop();</b></

38、p><p><b>  _Nop();</b></p><p>  } /*結束總線-*/</p><p>  void Stop_I2c()</p><p><b>  {</b></p><p>  SDA=0; //發(fā)送結束條件的數(shù)據(jù)

39、信號</p><p>  _Nop(); //發(fā)送結束條件的時鐘信號</p><p>  SCL=1; //結束條件建立時間大于4μ</p><p><b>  _Nop();</b></p><p><b>  _Nop();</b></p><p><

40、b>  _Nop();</b></p><p><b>  _Nop();</b></p><p><b>  _Nop();</b></p><p>  SDA=1; //發(fā)送I2C總線結束信號</p><p><b>  _Nop();</b>&l

41、t;/p><p><b>  _Nop();</b></p><p><b>  _Nop();</b></p><p><b>  _Nop();</b></p><p>  } /*字節(jié)數(shù)據(jù)傳送函數(shù)*/</p><p>  /*

42、將數(shù)據(jù)c發(fā)送出去.可以是地址.也可以是數(shù)據(jù).發(fā)完后等待并對此狀</p><p>  態(tài)位進行操作.發(fā)送數(shù)據(jù)正常ack=1. 無應答或損壞ack=0.*/</p><p>  void SendByte(uchar c)</p><p><b>  {</b></p><p>  unsigned char Bit;&l

43、t;/p><p>  for(Bit=0;Bit<8;Bit++) //傳送長度為8位的數(shù)據(jù)</p><p><b>  {</b></p><p>  if((c<<Bit)&0x80)</p><p>  SDA=1; //判斷發(fā)送位</p><p><

44、;b>  else </b></p><p><b>  SDA=0; </b></p><p><b>  _Nop();</b></p><p>  SCL=1; //置時鐘線為高,通知被控器開始接收數(shù)據(jù)位</p><p>  _Nop(); //

45、保證時鐘高電平周期大于4μ</p><p>  _Nop(); </p><p><b>  _Nop();</b></p><p><b>  _Nop();</b></p><p>  _Nop(); </p><p><b&g

46、t;  SCL=0; </b></p><p><b>  }</b></p><p><b>  _Nop();</b></p><p><b>  _Nop();</b></p><p>  SDA=1; //8位發(fā)送完后釋放數(shù)據(jù)線

47、,準備接收應答位</p><p><b>  _Nop();</b></p><p>  _Nop(); </p><p><b>  SCL=1;</b></p><p><b>  _Nop();</b></p><p><b>  _

48、Nop();</b></p><p><b>  _Nop();</b></p><p>  if(SDA==1)</p><p>  back=0; </p><p><b>  else </b></p><p>  back=1;

49、//判斷是否接收到應答信號</p><p><b>  SCL=0;</b></p><p><b>  _Nop();</b></p><p><b>  _Nop();</b></p><p>  } /*寫入DA轉換數(shù)值函數(shù)*/</p&g

50、t;<p>  /*輸入?yún)?shù):dat表示需要轉換的DA數(shù)值,范圍是0-255*/</p><p>  bit WriteDAC(uchar dat,uchar num)</p><p><b>  { </b></p><p>  unsigned char i;</p><p>  Start_I2c()

51、; //啟動總線</p><p>  SendByte(AddW); //發(fā)送器件地址</p><p>  if(back==0)</p><p>  return(0);</p><p>  SendByte(0x40); //發(fā)送器件子地址</p>

52、<p>  if(back==0)</p><p>  return(0);</p><p>  for(i=0;i<num;i++)</p><p><b>  {</b></p><p>  SendByte(dat); //發(fā)送數(shù)據(jù)</p><p>  if

53、(back==0)</p><p>  return(0);</p><p><b>  }</b></p><p>  Stop_I2c(); //結束總線</p><p>  } /*按鍵函數(shù)*/</p><p>  void keys(

54、)</p><p><b>  {</b></p><p>  if(key1==0)//波形切換</p><p><b>  {</b></p><p>  delay1(10); //按下按鍵后延時.消抖</p><p>  if(key1==0)

55、 //再次確認是否按下</p><p><b>  {</b></p><p>  while(!key1); //等待按鍵彈起</p><p><b>  wave++;</b></p><p>  if(wave>5)</p><p><

56、b>  wave=0;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  if(key2==0)//頻率加</p><p><b>  {</b></p><p>  

57、delay1(10); </p><p>  if(key2==0)</p><p><b>  {</b></p><p>  while(!key2); </p><p><b>  f++;</b></p><p><b>  if(f

58、>30)</b></p><p><b>  f=30;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  if(key3==0) //頻率減</p><p>&l

59、t;b>  {</b></p><p>  delay1(10);</p><p>  if(key3==0)</p><p><b>  {</b></p><p>  while(!key3);</p><p><b>  if(f>1)</b>&

60、lt;/p><p><b>  f--;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  if(key4==0) //幅值加</p><p><b>  {</b>

61、;</p><p>  delay1(10);</p><p>  if(key4==0)</p><p><b>  {</b></p><p>  while(!key4);</p><p><b>  A+=5;</b></p><p><

62、b>  if(A>50)</b></p><p><b>  A=50;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  if(key5==0) //幅值減</p>

63、<p><b>  {</b></p><p>  delay1(10);</p><p>  if(key5==0)</p><p><b>  {</b></p><p>  while(!key5);</p><p><b>  if(A>=1

64、0)</b></p><p><b>  A-=5;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  

65、/*主函數(shù)*/</b></p><p>  void main() </p><p><b>  {</b></p><p>  unsigned char i; //定義變量</p><p>  while (1) </p><p><b>  

66、{</b></p><p>  if(wave==0)</p><p>  for(i=0;i<65;i++)</p><p>  WriteDAC(1.0*sanjiao[i]*A/20,21-f);//三角波</p><p>  //循環(huán)20-f次,可通過其改變輸出頻率;</p><p>  

67、else if(wave==1)</p><p>  for(i=0;i<64;i++)</p><p>  WriteDAC(1.0*sin[i]*A/40,21-f); //正弦波</p><p>  else if(wave==2)</p><p>  for(i=0;i<64;i++)</p>&

68、lt;p>  WriteDAC(1.0*juci[i]*A/40,21-f); //鋸齒波</p><p>  else if(wave==3)</p><p>  for(i=0;i<64;i++) </p><p>  WriteDAC(1.0*tixing[i]*A/40,21-f);// 梯形波<

69、/p><p>  else if(wave==4)//矩形波</p><p><b>  {</b></p><p>  for(i=0;i<64;i++)</p><p>  if(i%2==0)</p><p>  WriteDAC(1.0*0xff*A/40,21-f);

70、 </p><p><b>  else </b></p><p>  WriteDAC(0,21-f);</p><p><b>  }</b></p><p>  keys(); //按鍵掃描</p><p><b>  }

71、</b></p><p><b>  }</b></p><p><b>  7、調試總結</b></p><p>  1.把程序分模塊,一部分一部分調試,可以輕松找到癥結所在,所有模塊都通過之后,再組合在一起,一般就沒什么問題了,可以節(jié)省很多工作量</p><p>  2.Prote

72、us用多了,畫起來就很的心應手</p><p>  3.實驗室的單片機和液晶等都已經(jīng)內(nèi)部連接好了,端口也是固定的,與我們的程序有很大出入。通過查找內(nèi)部接線圖,更改部分程序之后,硬件也可以實現(xiàn)</p><p><b>  設計心得體會</b></p><p>  作函數(shù)信號發(fā)生器隨設計思想不同,具有多種方法,本文只是一種可能實現(xiàn)的方法。此法的頻

73、率控制和幅度控制分辨率高,且硬件集成度高,整機自動化程度高,性能優(yōu)良,具有很高的實用價值。該信號發(fā)生器在調試時,總是出現(xiàn)許多的錯誤,軟件上除了許多的問題,之后糾正和向老師、同學請教慢慢的改了過來。可是在仿真時依然存在很多的問題,開始的時候是仿真出不了波形,之后改了改電路的一根線,出現(xiàn)了。在頻率的調節(jié)問題更多,而使頻率無法調節(jié),同時信號的頻率無法在示波器顯示,鑒于此,我認為應該是輸出中斷出了問題,造成所定義的頻率的個位,十位,百位都沒有跟

74、隨鍵盤的輸入而賦值,使其值時鐘為初始設定值。</p><p>  同時該信號源設計尚存在的不足之處,主要有兩個方面,第一為缺乏頻率準確顯示的手段,可以配備相應的數(shù)字頻率計模塊,但如何將顯示的精度與信號源的頻段配合有待討論研究;第二轉換時可以加一個鎖存器,并且放大電路有待進一步改進使其具有更強的輸出能力。</p><p><b>  參考文獻</b></p>

75、<p>  [1] 中國儀器儀表學會電磁測量信息處理儀器分會.發(fā)展中的遠方集中抄表技術.電測與儀表.2001,38(430):5-9</p><p>  [2] 趙偉,呂鴻莉,郭蘊蛟.電子式電能表及其在現(xiàn)代用電管理中的應用.北京:中國電力出版社,1999.</p><p>  [3] 韓光輝.住宅電能表的發(fā)展淺析.洛陽工業(yè)高等專專學校報.2005,15(1):18-20<

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論