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

QQ登錄

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

帖子
查看: 8065|回復(fù): 2
收起左側(cè)

Cortex-M3學(xué)習(xí)LPC1768 - DAC實(shí)驗(yàn)

[復(fù)制鏈接]
ID:81272 發(fā)表于 2015-5-27 19:29 | 顯示全部樓層 |閱讀模式
終于逮了個(gè)忙里偷閑的機(jī)會(huì),就再學(xué)一下LPC1768的外圍功能吧,循序漸進(jìn)是學(xué)習(xí)的基本規(guī)則,也許LPC1768DAC8位單片機(jī)16位單片機(jī)里面集成的DAC操作類似,但是既然這是懶貓的學(xué)習(xí)日志,就順便把DAC再好好復(fù)習(xí)一下了,或許能品出個(gè)什么味來(lái)^_^DACDigital to Analog Converter的縮寫,中文名就是數(shù)模轉(zhuǎn)換器,D/A轉(zhuǎn)換器一般由數(shù)碼寄存器、模擬電子開(kāi)關(guān)電路、解碼網(wǎng)絡(luò)、求和電路及基準(zhǔn)電壓等幾部分組成。如下圖所示:

圖1-1 DAC原理框圖
數(shù)字量以串行或并行方式輸入,存儲(chǔ)于數(shù)碼寄存器中,數(shù)碼寄存器輸出的名位數(shù)碼分別控制對(duì)應(yīng)的模擬開(kāi)關(guān),使數(shù)碼為1的位在位權(quán)網(wǎng)絡(luò)上產(chǎn)生與其值成正比的電流值或電壓值,再由求和電路將各權(quán)值相加,即得到數(shù)字量對(duì)應(yīng)的模擬量。按解碼網(wǎng)絡(luò)結(jié)構(gòu)不同可以將DAC轉(zhuǎn)換器分成T          型電阻網(wǎng)絡(luò)D/A轉(zhuǎn)換器、倒T型電阻網(wǎng)絡(luò)D/A轉(zhuǎn)換器、權(quán)電流D/A轉(zhuǎn)換器、權(quán)電阻網(wǎng)絡(luò)轉(zhuǎn)換器。
1、  T型電阻網(wǎng)絡(luò)D/A轉(zhuǎn)換器,其簡(jiǎn)單模型如下圖所示:


圖1-2 T型電阻網(wǎng)絡(luò)D/A轉(zhuǎn)換器模型
2、  倒T型電阻網(wǎng)絡(luò)D/A轉(zhuǎn)換器簡(jiǎn)易模型

圖1-3 倒T型電阻網(wǎng)絡(luò)D/A轉(zhuǎn)換器
3、  權(quán)電流D/A轉(zhuǎn)換器簡(jiǎn)易模型如下圖所示:

圖1-4  權(quán)電流D/A轉(zhuǎn)換器簡(jiǎn)易模型
4、  權(quán)電阻網(wǎng)絡(luò)轉(zhuǎn)換器簡(jiǎn)易模型如下圖所示:

圖 1-5 權(quán)電阻網(wǎng)絡(luò)轉(zhuǎn)換器簡(jiǎn)易模型
按模擬電子開(kāi)關(guān)的電路的不同,也可以將D/A轉(zhuǎn)換器分為CMOS開(kāi)關(guān)型D/A轉(zhuǎn)換器(速度要求不高),雙極型D/A轉(zhuǎn)換器。而雙極型D/A轉(zhuǎn)換器雙可以劃分為電流開(kāi)關(guān)型(速度要求較高)與ECL電流開(kāi)關(guān)型(轉(zhuǎn)換速度更高)兩種。如果對(duì)歐姆定律不陌生的話,我想上面各個(gè)模型是如何輸出電壓的應(yīng)該就可以理解了,在這里就不總結(jié)公式了,因?yàn)檫@只是模型,對(duì)應(yīng),實(shí)際電路與模型是有所出入的,在實(shí)際應(yīng)用中要著重關(guān)注一下以下幾個(gè)參數(shù):
1、  分辨率
D/A轉(zhuǎn)換器的分辨率用最小分辨電壓VLSB與滿量程輸出電壓VFSV的比值來(lái)表示:

從上式可以看出D/A轉(zhuǎn)換器的分辨率只與輸入二進(jìn)制數(shù)的位數(shù)n有關(guān),因此大部分情況下我們直接把n做為分辨率如8位,10位,12位等,由此我們也可以知道分辨率值越小,分辨能力越高。
2、  轉(zhuǎn)換精度
在D/A轉(zhuǎn)換器中,一般用轉(zhuǎn)換誤差來(lái)描述轉(zhuǎn)換精度。DAC轉(zhuǎn)換誤差是指實(shí)際輸出模擬電壓值與理想值的最大偏差。轉(zhuǎn)換誤差是一個(gè)綜合性的靜態(tài)指標(biāo),主要由三部分構(gòu)成:
1)非線性誤差:一般是由于模擬電子開(kāi)關(guān)的導(dǎo)通電阻和導(dǎo)通壓降及R、2R電阻值的偏差引起。
2)漂移誤差:一般是由于運(yùn)算放大器的零點(diǎn)漂移引起。
3)增益誤差:一般是由于參考電壓偏離標(biāo)準(zhǔn)值、運(yùn)放增益不穩(wěn)定引起。
3、  轉(zhuǎn)換速度
轉(zhuǎn)換速度一般由建立時(shí)間決定,從輸入由全0突變?nèi)?起,到輸出電壓穩(wěn)定(最大輸出電壓正負(fù)二分之一最小輸出電壓)止,稱為DAC轉(zhuǎn)換時(shí)間。它是DAC最大響應(yīng)時(shí)間。例如,DAC 5G7520響應(yīng)時(shí)間不大于500ns。
除了以上三個(gè)常見(jiàn)的指標(biāo)D/A轉(zhuǎn)換器的指標(biāo)還包括電源抑制比、功率消耗、溫度系數(shù)以及輸入高、低邏輯電平的數(shù)值等技術(shù)指標(biāo)。關(guān)于D/A的應(yīng)用,應(yīng)該說(shuō)在電子系統(tǒng)中應(yīng)用相當(dāng)廣泛,除了在微機(jī)系統(tǒng)中將數(shù)字量轉(zhuǎn)換為模擬量典型應(yīng)用之外,還常用于波形生成,名種數(shù)字式的或編程應(yīng)用等。
好了,關(guān)于D/A轉(zhuǎn)換器的知識(shí)暫時(shí)總結(jié)到這,更深入的知道還需要翻一下模電,信號(hào)與線性系統(tǒng)(好像里面有奈奎斯特定理,與采樣有關(guān)),微電子,放大器等方面的書籍。下面簡(jiǎn)單總結(jié)一下LPC1768內(nèi)部集成的D/A轉(zhuǎn)換器。LPC1768內(nèi)部集成的是10位模數(shù)轉(zhuǎn)換器,它是電阻串聯(lián)結(jié)構(gòu)的,并且?guī)в芯彌_輸出,最大輸出頻率為1MHz。電阻串聯(lián)結(jié)構(gòu)模型如下圖所示:

圖 1-6 電阻串聯(lián)結(jié)構(gòu)
涉及到D/A的引腳主要有DAC輸出腳P0.26,參考電壓引腳,用來(lái)給D/A轉(zhuǎn)換器提供參考電壓,模擬電源與數(shù)字電源VDD/VSS,這個(gè)兩個(gè)電源要分開(kāi)提供,再不使用DAC時(shí)也要將這兩個(gè)引腳連接到電源,不能懸空,不然系統(tǒng)會(huì)不穩(wěn)定。
DAC的配置也很簡(jiǎn)單,首先就是將P0.26設(shè)置為DAC模式,再一個(gè)就是配置DAC控制寄存器DACDR。DAC的控制寄存器DACDR的6-15位是DAC的輸出電壓數(shù)字值,這個(gè)數(shù)字決定了要輸出的電壓大小,DAC輸出電壓的計(jì)算方法是:

公式中VDAC即指AC的控制寄存器DACDR的6-15位的值,VREF指的是參考電壓,在這次實(shí)驗(yàn)電路中用的是3.3V。LPC1768的DAC功能還有DAM中斷和定時(shí)控制功能,它采用又緩沖方式輸出。在這里簡(jiǎn)單總結(jié)一下DAM模式,所謂的DAM模式也就是Direct Memory Access,漢語(yǔ)的意思就是直接內(nèi)存訪問(wèn),是一種不經(jīng)過(guò)CPU而直接從內(nèi)存存取數(shù)據(jù)的數(shù)據(jù)交換模式。在DMA模式下,CPU只須向DMA控制器下達(dá)指令,讓DMA控制器來(lái)處理數(shù)據(jù)的傳送,數(shù)據(jù)傳送完畢再把信息反饋給CPU,這樣就很大程度上減輕了CPU資源占有率,可以大大節(jié)省系統(tǒng)資源。DMA模式又可以分為Single-Word DMA(單字節(jié)DMA)和Multi-Word DMA(多字節(jié)DMA)兩種,其中所能達(dá)到的最大傳輸速率也只有16.6MB/s。DMA有兩個(gè)技術(shù)特征,首先是直接傳送,其次是塊傳送。
DMA工作過(guò)程
⑴     當(dāng)進(jìn)程要求設(shè)備輸入數(shù)據(jù)時(shí),CPU把準(zhǔn)備存放輸入數(shù)據(jù)的內(nèi)存起始地址以及要傳送的字節(jié)數(shù)分別送入DMA控制器中的內(nèi)存地址寄存器和傳送字節(jié)計(jì)數(shù)器。
⑵     發(fā)出數(shù)據(jù)傳輸要求的進(jìn)行進(jìn)入等待狀態(tài)。此時(shí)正在執(zhí)行的CPU指令被暫時(shí)掛起。進(jìn)程調(diào)度程序調(diào)度其他進(jìn)程占據(jù)CPU。
⑶     輸入設(shè)備不斷地竊取CPU工作周期,將數(shù)據(jù)緩沖寄存器中的數(shù)據(jù)源源不斷地寫入內(nèi)存,直到所要求的字節(jié)全部傳送完畢。
⑷     DMA控制器在傳送完所有字節(jié)時(shí),通過(guò)中斷請(qǐng)求線發(fā)出中斷信號(hào)。CPU在接收到中斷信號(hào)后,轉(zhuǎn)入中斷處理程序進(jìn)行后續(xù)處理。
⑸     中斷處理結(jié)束后,CPU返回到被中斷的進(jìn)程中,或切換到新的進(jìn)程上下文環(huán)境中,繼續(xù)執(zhí)行。
DMA與中斷的區(qū)別
⑴     中斷方式是在數(shù)據(jù)緩沖寄存器滿之后發(fā)出中斷,要求CPU進(jìn)行中斷處理,而DMA方式則是在所要求傳送的數(shù)據(jù)塊全部傳送結(jié)束時(shí)要求CPU 進(jìn)行中斷處理。這就大大減少了CPU進(jìn)行中斷處理的次數(shù)。
⑵     中斷方式的數(shù)據(jù)傳送是在中斷處理時(shí)由CPU控制完成的,而DMA方式則是在DMA控制器的控制下,不經(jīng)過(guò)CPU控制完成的。這就排除了CPU因并行設(shè)備過(guò)多而來(lái)不及處理以及因速度不匹配而造成數(shù)據(jù)丟失等現(xiàn)象。
在DMA方式中,由于I/O設(shè)備直接同內(nèi)存發(fā)生成塊的數(shù)據(jù)交換,因此I/O效率比較高。由于DMA技術(shù)可以提高I/O效率,因此在現(xiàn)代計(jì)算機(jī)系統(tǒng)中,得到了廣泛的應(yīng)用。許多輸入輸出設(shè)備的控制器,特別是塊設(shè)備的控制器,都支持DMA方式。
通過(guò)上述分析可以看出,DMA控制器功能的強(qiáng)弱,是決定DMA效率的關(guān)鍵因素。DMA控制器需要為每次數(shù)據(jù)的傳送做大量的工作,數(shù)據(jù)傳送單位的增大意味著傳送次數(shù)的減少。另外,DMA方式竊取了時(shí)鐘周期,CPU處理效率降低了,要想盡量少地竊取時(shí)鐘周期,就要設(shè)法提高DMA控制器的性能,這樣可以較少地影響CPU出理效率。
好了,關(guān)于DAM的知識(shí)先總結(jié)到這,要想使用LPC1768的DAM功能,需要配置D/A轉(zhuǎn)換控制寄存器DACCTRL與DAC轉(zhuǎn)換計(jì)數(shù)寄存器DACCNTVAL。這次實(shí)驗(yàn)只是簡(jiǎn)單的學(xué)習(xí)怎樣使用DAC,所以沒(méi)有用到DAM。下面說(shuō)一下實(shí)驗(yàn)電路,就是把DAC轉(zhuǎn)換的電壓通過(guò)放大器輸出到Speaker,電壓值不同,則Speaker的響度就不一樣,如下圖所示:
圖 1-7 DAC實(shí)驗(yàn)電路圖
關(guān)于LM386M已經(jīng)是爛大街的芯片,關(guān)于它的應(yīng)用網(wǎng)上有成大堆的資料可供參考,這里就不總結(jié)它的用法了,下面貼上這次實(shí)驗(yàn)的程序:
關(guān)于LM386M已經(jīng)是爛大街的芯片,關(guān)于它的應(yīng)用網(wǎng)上有成大堆的資料可供參考,這里就不總結(jié)它的用法了,下面貼上這次實(shí)驗(yàn)的程序:
一、dac.c程序源代碼

  1. #include"includes.h"

  2. /********************************************************************************

  3. * 函數(shù)名稱 :void DACInit( void )

  4. * 函數(shù)功能 : DAC初始化

  5. * 入口參數(shù) : 無(wú)

  6. * 出口參數(shù) : 無(wú)

  7. * 備    注 :無(wú)

  8. *******************************************************************************/

  9. void DACInit( void )

  10. {

  11.   PINCON -> PINSEL1 = 0x00200000;          /* 設(shè)置 p0.26 為DAC輸出腳 */

  12. }



  13. void DacOut(unsigned int val)

  14. {

  15.               DAC -> DACR = ((val << 16)/3300) | DAC_BIAS;

  16. }

  17. 二、main.c程序部分源代碼

  18. /********************************************************************************

  19. * 函數(shù)名稱 :void DacConver(unsigned int val)

  20. * 函數(shù)功能 : DAC轉(zhuǎn)換函數(shù)

  21. * 入口參數(shù) : unsigned int val -- 要轉(zhuǎn)換的電壓值,單位mv

  22. * 出口參數(shù) : 無(wú)

  23. * 備    注 :無(wú)

  24. *******************************************************************************/

  25. void DacConver(unsigned int val)

  26. {

  27.   

  28.    unsigned int hi = 0;

  29.    unsigned int low = 0;

  30.    hi  = val/1000;                        /* 求電壓的整數(shù)部分 */

  31.    low = val%1000/100;                                                               /* 求電壓的小數(shù)部分 */

  32.    DacVal[16]= (unsigned char)hi + 0x30; /* 將電壓值轉(zhuǎn)換成字符,方便從串口發(fā)送 */

  33.    DacVal[18]= (unsigned char)low + 0x30;/* 將電壓值轉(zhuǎn)換成字符,方便從串口發(fā)送 */

  34.    DacOut(val);                                  /* 賦給DAC控制寄存器DACDR的值*/

  35.    UARTSend(0,DacVal,25);                          /* 發(fā)送轉(zhuǎn)換信息 */

  36. }

  37. /********************************************************************************

  38. * 函數(shù)名稱 :int main(void)

  39. * 函數(shù)功能 : 主函數(shù)

  40. * 入口參數(shù) : 無(wú)

  41. * 出口參數(shù) : 無(wú)

  42. * 備    注 :無(wú)

  43. *******************************************************************************/

  44. int main(void)

  45. {

  46.     unsigned int i = 0;

  47.               SystemInit();       /* 系統(tǒng)初始化,函數(shù)在system_LPC17xx.c文件夾中定義 */

  48.               SysTick_Config(SystemFrequency/1000 - 1);/* 配置節(jié)拍定時(shí)器中斷,每1ms中斷一次 */

  49.                                                      

  50.     PortInit();                              /* 端口初始化 */

  51.               DACInit();



  52.               UARTInit(0,19200);                         /* 設(shè)置串口0波特率 */

  53.               for(i=0;i<7;i++)

  54.               {

  55.                             UARTSend(0,OpenString[i],50);           /* 發(fā)送歡迎信息 */

  56.               }

  57.              /* 下面的函數(shù)是測(cè)試DAC的,分別輸出2.0V、2.5V、3.0V與3.3V*/

  58.               DacConver(2000);    // 2.0v

  59.               DacConver(2500);    // 2.5v

  60.               DacConver(3000);    // 3.0v

  61.               DacConver(3300);    // 3.0v         



  62.     //LedOnMeg[4] = 4+0x30;                    /* 轉(zhuǎn)換成字符 */

  63.     //UART0_SendString (KeyMeg);

  64.               while(1)

  65.               {

  66.                 KeyScan();   // 按鍵掃描

  67.                 KeyHandle(); // 按鍵處理

  68.                 LedHandle(); // Led處理程序

  69.               }

  70. }
復(fù)制代碼


主程序:
  1. /*********************************************************************************
  2. 工程名稱:lesson5
  3. 功    能: 學(xué)習(xí)使用LPC1768的DAC功能                                                 
  4. 編譯環(huán)境: MDKV4.12                                                   
  5. 時(shí)    鐘: 外部12Mhz                                                                                           
  6. 日    期: 11/09/08                                                        
  7. 作    者: 懶貓愛(ài)飛
  8. 版本  號(hào):V1R0
  9. ---------------------------------------------------------------------------------
  10. 修改內(nèi)容:NULL
  11. 修改日期:
  12. 修改人員:
  13. ---------------------------------------------------------------------------------
  14.                                                                                                                                                                                                                          
  15. **********************************************************************************/


  16. /*********************************************************************************
  17. 文件名稱:mian.c
  18. 功    能: 主要調(diào)度函數(shù)及應(yīng)用函數(shù)                                                         
  19. 編譯環(huán)境: MDKV4.12                                                   
  20. 時(shí)    鐘: 外部12Mhz                                                                                           
  21. 日    期: 11/09/08                                                        
  22. 作    者: 懶貓愛(ài)飛
  23. 備    注:NULL
  24. ---------------------------------------------------------------------------------
  25. 修改內(nèi)容:NULL
  26. 修改日期:XXXX年xx月xx日      xx時(shí)xx分
  27. 修改人員:xxx xxx xxx
  28.                                                                                                          
  29. **********************************************************************************/
  30. #include"includes.h"
  31.                                                                             
  32. volatile unsigned long SysTickCnt;                   /* 用于系統(tǒng)時(shí)鐘計(jì)數(shù) */

  33. unsigned char LedOnMeg[] = "Led 1 On!\r\n";
  34. unsigned char LedOffMeg[] = "Led all Off!\r\n";
  35. unsigned char KeyMeg[] = "key push down \r\n";
  36. unsigned char DacVal[] = "the voltage is: 0.0 V \r\n";
  37. unsigned char OpenString[][50] = {
  38.                                 "**********************************************\r\n",
  39.                                 "****             --歡迎光臨--             ****\r\n",
  40.                                                                 "**** 小野獸的小草窩^_^                    ****\r\n",
  41.                                                                 "**** http://blog#ednchina#com/ytfdhb/     ****\r\n",
  42.                                                                 "**** 我是懶貓愛(ài)飛,我的口號(hào)是:           ****\r\n",
  43.                                                                 "**** 每天進(jìn)步一點(diǎn)點(diǎn),開(kāi)心多一點(diǎn)^_^        ****\r\n",
  44.                                                                 "**********************************************\r\n"
  45.                                                             };

  46. unsigned int key_sta = 0;              /* 按鍵狀態(tài) */
  47. unsigned int key_pre = 1;                   /* 按鍵當(dāng)前狀態(tài)值 */
  48. unsigned int key_old = 1;                           /* 按鍵前一個(gè)狀態(tài)值 */
  49. unsigned int led_flag = 0;

  50. unsigned int  StepCnt = 0;        /* 狀態(tài)計(jì)數(shù) */

  51. /********************************************************************************
  52. * 函數(shù)名稱 :void SysTick_Handler (void)
  53. * 函數(shù)功能 : 系統(tǒng)節(jié)拍定時(shí)器中斷函數(shù),每1ms計(jì)數(shù)一次
  54. * 入口參數(shù) : 無(wú)
  55. * 出口參數(shù) : 無(wú)
  56. * 備    注 :無(wú)
  57. *******************************************************************************/
  58. void SysTick_Handler (void)
  59. {         
  60.   SysTickCnt++;
  61. }

  62. /********************************************************************************
  63. * 函數(shù)名稱 :void Delay (unsigned long tick)  
  64. * 函數(shù)功能 : 毫秒級(jí)延時(shí)函數(shù)
  65. * 入口參數(shù) : unsigned long tick -- 延時(shí)時(shí)長(zhǎng)
  66. * 出口參數(shù) : 無(wú)
  67. * 備    注 :無(wú)
  68. *******************************************************************************/
  69. void DelayMs (unsigned long tick)
  70. {      
  71.   unsigned long systickcnt;

  72.   systickcnt = SysTickCnt;
  73.   while ((SysTickCnt - systickcnt) < tick);
  74. }
  75. /********************************************************************************
  76. * 函數(shù)名稱 :void PortInit(void)  
  77. * 函數(shù)功能 : 端口初始化
  78. * 入口參數(shù) : 無(wú)
  79. * 出口參數(shù) : 無(wú)
  80. * 備    注 :無(wú)
  81. *******************************************************************************/
  82. void PortInit(void)
  83. {
  84.    GPIO1->FIODIR = 0xB0000000;           /* LEDs on PORT1 defined as Output    */
  85.    GPIO2->FIODIR = 0x0000007C;           /* LEDs on PORT2 defined as Output    */
  86.    LedAllOff();                                                         /* 初始化時(shí)熄滅所有的燈 */
  87. }

  88. /********************************************************************************
  89. * 函數(shù)名稱 :void KeyScan(void)
  90. * 函數(shù)功能 : 按鍵掃描
  91. * 入口參數(shù) : 無(wú)
  92. * 出口參數(shù) : 無(wú)
  93. * 備    注 :現(xiàn)在只掃描一個(gè)按鍵
  94. *******************************************************************************/
  95. void KeyScan()
  96. {
  97.         key_pre = KEY_EN ;
  98.         if(!KEY_EN )                      /* 如果按鍵按下 */
  99.         {
  100.                 if(key_old)
  101.                 {
  102.                     if(key_pre == 0)         /* 下降沿有效 */
  103.                     {
  104.                          key_sta = 1;            /* 記錄按鍵狀態(tài) */
  105.                     }       
  106.             }
  107.         }
  108.         key_old = key_pre;
  109. }

  110. /********************************************************************************
  111. * 函數(shù)名稱 :void KeyHandle(void)
  112. * 函數(shù)功能 : 按鍵處理函數(shù)
  113. * 入口參數(shù) : 無(wú)
  114. * 出口參數(shù) : 無(wú)
  115. * 備    注 :無(wú)
  116. *******************************************************************************/
  117. void KeyHandle(void)
  118. {
  119.     if(key_sta == 1)
  120.     {
  121.             StepCnt++;                        /* 執(zhí)行下一步*/
  122.                 if(StepCnt == 9)
  123.                 {
  124.                         UART0_SendString (LedOffMeg); /* 顯示LED狀態(tài)信息 */               
  125.                 }
  126.                  if(StepCnt < 9)
  127.                 {
  128.                         LedOnMeg[4] = StepCnt+0x30;       /* 轉(zhuǎn)換成字符 */
  129.                 UART0_SendString (LedOnMeg);      /* 顯示LED狀態(tài)信息 */                       
  130.                 }
  131.                 key_sta = 0;                         /* 按鍵狀態(tài)清零,保證只執(zhí)行一次 */
  132.         }       
  133. }
  134. /********************************************************************************
  135. * 函數(shù)名稱 :void LedHandle()
  136. * 函數(shù)功能 : LED燈處理函數(shù)
  137. * 入口參數(shù) : 無(wú)
  138. * 出口參數(shù) : 無(wú)
  139. * 備    注 :無(wú)
  140. *******************************************************************************/
  141. void LedHandle()
  142. {
  143.         switch(StepCnt)
  144.         {
  145.                 case 1:Led1On();   /* LED1 點(diǎn)亮*/
  146.                        break;
  147.                 case 2:Led2On();   /* LED2 點(diǎn)亮*/
  148.                        break;
  149.             case 3:Led3On();   /* LED3 點(diǎn)亮*/
  150.                        break;
  151.             case 4:Led4On();   /* LED4 點(diǎn)亮*/
  152.                        break;
  153.                 case 5:Led5On();   /* LED5 點(diǎn)亮*/
  154.                        break;
  155.                 case 6:Led6On();   /* LED6 點(diǎn)亮*/
  156.                        break;
  157.                 case 7:Led7On();   /* LED7 點(diǎn)亮*/
  158.                        break;
  159.                 case 8:Led8On();   /* LED8 點(diǎn)亮*/
  160.                        break;
  161.             case 9:LedAllOff();        /* 熄滅所有的LED燈*/
  162.                        StepCnt = 0;        /* 重新開(kāi)始 */
  163.                        break;
  164.                 default:break;
  165.         }
  166. }
  167. /********************************************************************************
  168. * 函數(shù)名稱 :void DacConver(unsigned int val)
  169. * 函數(shù)功能 : DAC轉(zhuǎn)換函數(shù)
  170. * 入口參數(shù) : unsigned int val -- 要轉(zhuǎn)換的電壓值,單位mv
  171. * 出口參數(shù) : 無(wú)
  172. * 備    注 :無(wú)
  173. *******************************************************************************/
  174. void DacConver(unsigned int val)
  175. {
  176.    
  177.    unsigned int hi = 0;
  178.    unsigned int low = 0;
  179.    hi  = val/1000;                             /* 求電壓的整數(shù)部分 */
  180.    low = val%1000/100;                                         /* 求電壓的小數(shù)部分 */
  181.    DacVal[16]= (unsigned char)hi + 0x30; /* 將電壓值轉(zhuǎn)換成字符,方便從串口發(fā)送 */
  182.    DacVal[18]= (unsigned char)low + 0x30;/* 將電壓值轉(zhuǎn)換成字符,方便從串口發(fā)送 */
  183.    DacOut(val);                                 /* 賦給DAC控制寄存器DACDR的值*/
  184.    UARTSend(0,DacVal,25);                     /* 發(fā)送轉(zhuǎn)換信息 */
  185. }

  186. /********************************************************************************
  187. * 函數(shù)名稱 :int main(void)
  188. * 函數(shù)功能 : 主函數(shù)
  189. * 入口參數(shù) : 無(wú)
  190. * 出口參數(shù) : 無(wú)
  191. * 備    注 :無(wú)
  192. *******************************************************************************/
  193. int main(void)
  194. {
  195.     unsigned int i = 0;
  196.         SystemInit();       /* 系統(tǒng)初始化,函數(shù)在system_LPC17xx.c文件夾中定義 */
  197.         SysTick_Config(SystemFrequency/1000 - 1);/* 配置節(jié)拍定時(shí)器中斷,每1ms中斷一次 */
  198.                                                 
  199.     PortInit();                              /* 端口初始化 */
  200.         DACInit();

  201.         UARTInit(0,19200);                             /* 設(shè)置串口0波特率 */
  202.         for(i=0;i<7;i++)
  203.         {
  204.                 UARTSend(0,OpenString[i],50);            /* 發(fā)送歡迎信息 */
  205.         }
  206.         /* 下面的函數(shù)是測(cè)試DAC的,分別輸出2.0V、2.5V、3.0V與3.3V*/
  207.         DacConver(2000);    // 2.0v
  208.         DacConver(2500);    // 2.5v
  209.         DacConver(3000);    // 3.0v
  210.         DacConver(3300);    // 3.0v       

  211.     //LedOnMeg[4] = 4+0x30;                    /* 轉(zhuǎn)換成字符 */
  212.     //UART0_SendString (KeyMeg);
  213.         while(1)
  214.         {
  215.           KeyScan();   // 按鍵掃描
  216.           KeyHandle(); // 按鍵處理
  217.           LedHandle(); // Led處理程序
  218.         }
  219. }




復(fù)制代碼


程序很簡(jiǎn)單,就是簡(jiǎn)單的測(cè)試,能從Speaker聽(tīng)到響聲,同時(shí)我也把結(jié)果發(fā)送到了串口顯示,下面是實(shí)驗(yàn)的結(jié)果:

圖 1-8 實(shí)驗(yàn)執(zhí)行結(jié)果

每天進(jìn)步一點(diǎn)點(diǎn),開(kāi)心多一點(diǎn)^_^
完整程序源代碼工程文件下載地址: SW110908.rar (218.91 KB, 下載次數(shù): 27)


回復(fù)

使用道具 舉報(bào)

ID:88358 發(fā)表于 2015-8-15 04:27 | 顯示全部樓層
謝謝分享
回復(fù)

使用道具 舉報(bào)

ID:135964 發(fā)表于 2016-8-4 13:15 | 顯示全部樓層
很好的資料,講解很詳細(xì)
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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