紅外遙控接收;=================================================;; zsMCU51實驗板配套學習例程;; 中山單片機學習網 智佳科技;; 作者:逸風 QQ:105558851;; http://www.zsmcu.com; E-mail:info@zsmcu.com;=================================================ORG 0000HLJMP START;轉入主程序ORG 0010HSTART:MAIN:JNB P2.2,IRLJMP MAIN;以下為進入P3.2腳外部中斷子程序,也就是解碼程序IR:MOV R6,#9SB:ACALL DELAY882 ;調用882微秒延時子程序JB P2.2,EXIT ;延時882微秒后判斷P3.2腳是否出現高電平如果有就退出解碼程序DJNZ R6, SB ;重復10次,目的是檢測在8820微秒內如果出現高電平就退出解碼程序;以上完成對遙控信號的9000微秒的初始低電平信號的識別。JNB P2.2, $ ;等待高電平避開9毫秒低電平引導脈沖ACALL DELAY2400JNB P2.2,IR_Rp ;ACALL DELAY2400 ;延時4.74毫秒避開4.5毫秒的結果碼MOV R1,#1AH ;設定1AH為起始RAM區MOV R2,#4PP:MOV R3,#8JJJJ:JNB P2.2,$ ;等待地址碼第一位的高電平信號LCALL DELAY882 ;高電平開始后用882微秒的時間尺去判斷信號此時的高低電平狀態MOV C,P2.2 ;將P3.2引腳此時的電平狀態0或1存入C中 JNC UUU ;如果為0就跳轉到UUULCALL DELAY1000UUU:MOV A,@R1 ;將R1中地址的給ARRC A ;將C中的值0或1移入A中的最低位MOV @R1,A ;將A中的數暫時存放在R1中DJNZ R3,JJJJ ;接收地址碼的高8位INC R1 ;對R1中的值加1,換下一個RAMDJNZ R2,PP ;接收完16位地址碼和8位數據碼和8位數據,存放在1AH/1BH/1CH/1DH的RAM中MOV P1,1DH ;將按鍵的鍵值通過P1口的8個LED顯示出來!CLR P2.3 ;蜂鳴器鳴響-嘀嘀嘀-的聲音,表示解碼成功LCALL DELAY2400LCALL DELAY2400LCALL DELAY2400SETB P2.3;蜂鳴器停止LJMP MAINIR_Rp:LJMP MAINEXIT:LJMP MAIN ;退出解碼子程序;=============================882DELAY882: ;1.085x ((202x4)+5)=882MOV R7,#202DELAY882_A:NOPNOPDJNZ R7,DELAY882_ARET;=============================1000DELAY1000: ;1.085x ((229x4)+5)=999.285MOV R7,#229DELAY1000_A:NOPNOPDJNZ R7,DELAY1000_ARET;=============================2400
上傳時間: 2013-11-01
上傳用戶:2525775
I2C總線高頻頭控制程序(Keil C51程序 基于芯片TSA5522系列) /*I2C總線高頻頭控制Keil C51程序(PLL芯片為TSA5522系列) *///--------------------------------------------------------------------------//// 源程序大公開 //// (c) Copyright 2001-2003 xuwenjun //// All Rights Reserved //// V1.00 ////--------------------------------------------------------------------------////標 題: I2C總線高頻頭控制程序(PLL芯片為TSA5522系列) ////文件名: xwj_fi1256.c ////版 本: V1.00 ////修改人: 徐文軍 E-mail:xuwenjun@21cn.com ////日 期: 06-02-26 首次公開 ////描 述: I2C總線高頻頭控制程序(PLL芯片為TSA5522系列) ////聲 明: //// 以下代碼僅免費提供給學習用途,但引用或修改后必須在文件中聲明出處. //// 如用于商業用途請與作者聯系. E-mail:xuwenjun@21cn.com //// 有問題請mailto xuwenjun@21cn.com 歡迎與我交流! ////--------------------------------------------------------------------------////老版本: 無 老版本文件名: ////創建人: 徐文軍 E-mail:xuwenjun@21cn.com ////日 期: 06-02-26 ////描 述: ////--------------------------------------------------------------------------// /* 頻率單位為KHz */#define FUENCY 38900 /* 中頻頻率 */#define PLLdataH(f) ((f+FUENCY)*16/1000/256) /* 頻率數據高 第1字節*/#define PLLdataL(f) ((f+FUENCY)*16/1000%256) /* 頻率數據低 第2字節*/#define PLLCON1 0x8e /* 控制字1 第3字節*/ /* 控制字2 第4字節*/#define PLLCON2(f) (((f)<(168000))?(0xa0):(((f)<(450000))?(0x90):(0x30)))#define PLLdata3(fchan) PLLdataH (fchan),PLLdataL (fchan),PLLCON2 (fchan)
上傳時間: 2013-11-10
上傳用戶:nanfeicui
微處理器及微型計算機的發展概況 第一代微處理器是以Intel公司1971年推出的4004,4040為代表的四位微處理機。 第二代微處理機(1973年~1977年),典型代表有:Intel 公司的8080、8085;Motorola公司的M6800以及Zlog公司的Z80。 第三代微處理機 第三代微機是以16位機為代表,基本上是在第二代微機的基礎上發展起來的。其中Intel公司的8088。8086是在8085的基礎發展起來的;M68000是Motorola公司在M6800 的基礎發展起來的; 第四代微處理機 以Intel公司1984年10月推出的80386CPU和1989年4月推出的80486CPU為代表, 第五代微處理機的發展更加迅猛,1993年3月被命名為PENTIUM的微處理機面世,98年PENTIUM 2又被推向市場。 INTEL CPU 發展歷史Intel第一塊CPU 4004,4位主理器,主頻108kHz,運算速度0.06MIPs(Million Instructions Per Second, 每秒百萬條指令),集成晶體管2,300個,10微米制造工藝,最大尋址內存640 bytes,生產曰期1971年11月. 8085,8位主理器,主頻5M,運算速度0.37MIPs,集成晶體管6,500個,3微米制造工藝,最大尋址內存64KB,生產曰期1976年 8086,16位主理器,主頻4.77/8/10MHZ,運算速度0.75MIPs,集成晶體管29,000個,3微米制造工藝,最大尋址內存1MB,生產曰期1978年6月. 80486DX,DX2,DX4,32位主理器,主頻25/33/50/66/75/100MHZ,總線頻率33/50/66MHZ,運算速度20~60MIPs,集成晶體管1.2M個,1微米制造工藝,168針PGA,最大尋址內存4GB,緩存8/16/32/64KB,生產曰期1989年4月 Celeron一代, 主頻266/300MHZ(266/300MHz w/o L2 cache, Covington芯心 (Klamath based),300A/333/366/400/433/466/500/533MHz w/128kB L2 cache, Mendocino核心 (Deschutes-based), 總線頻率66MHz,0.25微米制造工藝,生產曰期1998年4月) Pentium 4 (478針),至今分為三種核心:Willamette核心(主頻1.5G起,FSB400MHZ,0.18微米制造工藝),Northwood核心(主頻1.6G~3.0G,FSB533MHZ,0.13微米制造工藝, 二級緩存512K),Prescott核心(主頻2.8G起,FSB800MHZ,0.09微米制造工藝,1M二級緩存,13條全新指令集SSE3),生產曰期2001年7月. 更大的緩存、更高的頻率、 超級流水線、分支預測、亂序執行超線程技術 微型計算機組成結構單片機簡介單片機即單片機微型計算機,是將計算機主機(CPU、 內存和I/O接口)集成在一小塊硅片上的微型機。 三、計算機編程語言的發展概況 機器語言 機器語言就是0,1碼語言,是計算機唯一能理解并直接執行的語言。匯編語言 用一些助記符號代替用0,1碼描述的某種機器的指令系統,匯編語言就是在此基礎上完善起來的。高級語言 BASIC,PASCAL,C語言等等。用高級語言編寫的程序稱源程序,它們必須通過編譯或解釋,連接等步驟才能被計算機處理。 面向對象語言 C++,Java等編程語言是面向對象的語言。 1.3 微型計算機中信息的表示及運算基礎(一) 十進制ND有十個數碼:0~9,逢十進一。 例 1234.5=1×103 +2×102 +3×101 +4×100 +5×10-1加權展開式以10稱為基數,各位系數為0~9,10i為權。 一般表達式:ND= dn-1×10n-1+dn-2×10n-2 +…+d0×100 +d-1×10-1+… (二) 二進制NB兩個數碼:0、1, 逢二進一。 例 1101.101=1×23+1×22+0×21+1×20+1×2-1+1×2-3 加權展開式以2為基數,各位系數為0、1, 2i為權。 一般表達式: NB = bn-1×2n-1 + bn-2×2n-2 +…+b0×20 +b-1×2-1+… (三)十六進制NH十六個數碼0~9、A~F,逢十六進一。 例:DFC.8=13×162 +15×161 +12×160 +8×16-1 展開式以十六為基數,各位系數為0~9,A~F,16i為權。 一般表達式: NH= hn-1×16n-1+ hn-2×16n-2+…+ h0×160+ h-1×16-1+… 二、不同進位計數制之間的轉換 (二)二進制與十六進制數之間的轉換 24=16 ,四位二進制數對應一位十六進制數。舉例:(三)十進制數轉換成二、十六進制數整數、小數分別轉換 1.整數轉換法“除基取余”:十進制整數不斷除以轉換進制基數,直至商為0。每除一次取一個余數,從低位排向高位。舉例: 2. 小數轉換法“乘基取整”:用轉換進制的基數乘以小數部分,直至小數為0或達到轉換精度要求的位數。每乘一次取一次整數,從最高位排到最低位。舉例: 三、帶符號數的表示方法 機器數:機器中數的表示形式。真值: 機器數所代表的實際數值。舉例:一個8位機器數與它的真值對應關系如下: 真值: X1=+84=+1010100B X2=-84= -1010100B 機器數:[X1]機= 01010100 [X2]機= 11010100(二)原碼、反碼、補碼最高位為符號位,0表示 “+”,1表示“-”。 數值位與真值數值位相同。 例 8位原碼機器數: 真值: x1 = +1010100B x2 =- 1010100B 機器數: [x1]原 = 01010100 [x2]原 = 11010100原碼表示簡單直觀,但0的表示不唯一,加減運算復雜。 正數的反碼與原碼表示相同。 負數反碼符號位為 1,數值位為原碼數值各位取反。 例 8位反碼機器數: x= +4: [x]原= 00000100 [x]反= 00000100 x= -4: [x]原= 10000100 [x]反= 111110113、補碼(Two’s Complement)正數的補碼表示與原碼相同。 負數補碼等于2n-abs(x)8位機器數表示的真值四、 二進制編碼例:求十進制數876的BCD碼 876= 1000 0111 0110 BCD 876= 36CH = 1101101100B 2、字符編碼 美國標準信息交換碼ASCII碼,用于計算 機與計算機、計算機與外設之間傳遞信息。 3、漢字編碼 “國家標準信息交換用漢字編碼”(GB2312-80標準),簡稱國標碼。 用兩個七位二進制數編碼表示一個漢字 例如“巧”字的代碼是39H、41H漢字內碼例如“巧”字的代碼是0B9H、0C1H1·4 運算基礎 一、二進制數的運算加法規則:“逢2進1” 減法規則:“借1當2” 乘法規則:“逢0出0,全1出1”二、二—十進制數的加、減運算 BCD數的運算規則 循十進制數的運算規則“逢10進1”。但計算機在進行這種運算時會出現潛在的錯誤。為了解決BCD數的運算問題,采取調整運算結果的措施:即“加六修正”和“減六修正”例:10001000(BCD)+01101001(BCD) =000101010111(BCD) 1 0 0 0 1 0 0 0 + 0 1 1 0 1 0 0 1 1 1 1 1 0 0 0 1 + 0 1 1 0 0 1 1 0 ……調整 1 0 1 0 1 0 1 1 1 進位 例: 10001000(BCD)- 01101001(BCD)= 00011001(BCD) 1 0 0 0 1 0 0 0 - 0 1 1 0 1 0 0 1 0 0 0 1 1 1 1 1 - 0 1 1 0 ……調整 0 0 0 1 1 0 0 1 三、 帶符號二進制數的運算 1.5 幾個重要的數字邏輯電路編碼器譯碼器計數器微機自動工作的條件程序指令順序存放自動跟蹤指令執行1.6 微機基本結構微機結構各部分組成連接方式1、以CPU為中心的雙總線結構;2、以內存為中心的雙總線結構;3、單總線結構CPU結構管腳特點 1、多功能;2、分時復用內部結構 1、控制; 2、運算; 3、寄存器; 4、地址程序計數器堆棧定義 1、定義;2、管理;3、堆棧形式
上傳時間: 2013-10-17
上傳用戶:erkuizhang
自制89C51單片機實驗電路板 學習單片機離不開實驗,以往單片機的實驗往往依賴于仿真機和單片機學習系統,價格昂貴,初學者很難配備。近年來,隨著FLASH型單片機的廣泛應用,采用軟件模擬加寫片驗證成為一種經濟實用的實驗方法,以AT89C51單片機為例,其價格不足¥10RMB,而擦、寫次數可以有1000次,一塊芯片即可做上千次的實驗。目前,流行的單片機開發軟件Keil可以免費獲得用于學習的EVAL版;編程器價格并不昂貴,專門用于寫89C51類芯片的編程器價格更低廉(不足百元),而且編程器也是以后開發單片機所必備的工具;相比之下,用于實驗的電路板制作比較麻煩,用萬用板搭接,只能做些很簡單的電路,稍復雜的電路一般要用到雙面板,而業余條件下是很難自制雙面板的,而且實驗電路板主要是用于學習,學完了,也就沒有什么使用價值了,所以很多人希望能夠廉價地獲得。作者在多年單片機教學(包括從事網絡教學)的基礎上,開發了一塊有較多功能但使用單面板的單片機實驗板,適于業余愛好者自制。這塊實驗板采用89C51為主芯片,板上安裝了5位數碼管,8個發光二極管,四個按鈕開關,一個簡單的音響電路,一個用于計數實驗的振蕩器,At24CXXX類芯片插座,X5045芯片插座,RS232串行接口等。使用這塊實驗板可以進行流水燈、人機界面程序設計、音響、中斷、計數器等基本編程練習,還可以學習I2C接口芯片使用、SPI接口芯片使用、與PC機進行串行通訊等目前較為流行的技術。圖1是該實驗板的電路原理圖,從圖中可以看出,該實驗板由若干塊集成電路和一些阻容元件等組成,下面我們就分別介紹。1、發光二極管接口主芯片(U1)的P1端口接了8個發光二極管,這些發光二極管的負極接到P1端口各引腳,而正極則通過一個排電阻(標號為JP4,阻值為470毆)接到正電源端,這樣,這些發光二極管亮的條件就U1的P1口相引的引腳為低電平,即如果P1口某引腳輸出為0,相應的燈亮,如果輸出為1,相應的燈滅。例:MOV P1,#0FH該行程序將使發光二極管L1-L4熄滅,而L5-L8點亮。2、數碼管接口U1的P0口和P2口的部份引腳構成了5位LED數碼管驅動電路,這里LED數碼管采用了共陽型,共陽型數碼管的筆段(即對應abcdefgh)引腳是二極管的負極,所有二極管的正極連在一起,構成公共端,即片選端,對于這種數碼管的驅動,要求在片選端提供電流,為此,使用了PNP型三極管作為片選端的驅動,共使用5只三極管,所有三極管的發射極連在一起,接到正電源端,它們的基極則分別連到P2.0⋯P2.4,這樣,當P2.0⋯P2.4中某引腳輸出是高電平時,三極管不導通,不能給相應位的數碼管供電,該位數碼管的所有筆段都不亮,反之,如果某引腳是低電平時,三極管導通,可以給相應的數碼管供電,該位數碼管是否點亮,點亮哪些筆段,取決于這些筆段引腳是高或低電平。從圖圖1 共陽型數LED顯示器.....
上傳時間: 2013-11-14
上傳用戶:dingdingcandy
The Tri-Mode Ethernet MAC (TEMAC) UltraController-II module is a minimal footprint,embedded network processing engine based on the PowerPC™ 405 (PPC405) processor coreand the TEMAC core embedded within a Virtex™-4 FX Platform FPGA. The TEMACUltraController-II module connects to an external PHY through Gigabit Media IndependentInterface (GMII) and Management Data Input/Output (MDIO) interfaces and supports tri-mode(10/100/1000 Mb/s) Ethernet. Software running from the processor cache reads and writesthrough an On-Chip Memory (OCM) interface to two FIFOs that act as buffers between thedifferent clock domains of the PPC405 OCM and the TEMAC.
上傳時間: 2013-10-26
上傳用戶:yuzsu
產品概述HP ProCurve Switch 2810系列包括兩款機型:帶有 20個10/100/1000端口的24端口HP ProCurve Switch 2810-24G和帶有44個10/100/1000端口的48端口HP ProCurve Switch 2810-48G。每款交換機還配有4個雙功能定制端口,可用于RJ-45 10/100/1000或mini-GBIC光纖千兆連接。2810系列交換機可提供出色的訪問安全性、高級優先化和流量監控能力,因而是高性能、安全10/100/1000連接的理想選擇。此外,它還價格經濟、簡單易用,帶有1U可堆疊外形,即使應用于更小的布線室內,也便于靈活操作。
上傳時間: 2013-11-24
上傳用戶:tiantwo
藍牙4.0低功耗 ●鑒于蘋果產品對藍牙4.0的開發政策,藍牙模塊可以不用解密芯片與蘋果產品取得通信, 結合APP軟件,使用藍牙指令和數據實現對藍牙健康醫療設備,藍牙玩具,藍牙家居設備,藍牙工業設備的控制和數據顯示 ● 藍牙模塊:RB105(CSR 1000 藍牙4.0 BLE) ●同時兼容IOS、android、windows 8
上傳時間: 2013-12-11
上傳用戶:xhwst
MOTION BUILDER Ver.2 是用于監控 KV-H20/H20S/H40S/H20G 的參數設定以及當前動作狀態的軟件。 在 PC 上可以設定復雜的參數,并可以在顯示畫面上監控正在運行的 KV-H20/H20S/H40S/H20G。 關于 MOTION BUILDER Ver.2 概要、功能與使用方法的詳細說明。在安裝之前,請仔細閱讀本手冊,并充分 理解。 注意 1、使用 MOTION BUILDER Ver.2 時,必須在可以使用 KV-H20/H20S/H40S/H20G 上 連接的緊急停止開關的地方使用。 通訊異常時,不接受 MOTION BUILDER Ver.2 的“強制停止”,可能會導致事故指示發生。發生通信異常時,MOTION BUILDER Ver.2 的“強制停止”按鈕將不起作用。 2、JOG 過程中,不能采用斷開 PLC 的連接電纜等手段停止通訊。 KV-H20/H20S/H40S/H20G 單元的 JOG 繼電器會一直保持 ON,機器繼續運轉,并可能導致事故發生。 3、執行監控或者寫入參數(設定)時,不能斷開和 PLC 的連接電纜。 否則會發生通訊錯誤,PC 可能會被重啟。KV-H20/H20S/H40S/H20G 內的數據可 能會損壞。 4、在 RUN 過程中,KV-1000/700 進行 JOG 示教時,必須在 PROG 模式下實施。 如果掃描時間較長,則反映的時間變長,且可能發生無法預料的動作。 5、發送到 KV-1000/700 的單元設定信息必須與當前打開的梯形圖程序的單元設定信 息一致。如果設定信息不同,則顯示錯誤,且不運行。 6、錯誤操作或者靜電等會引起數據變化或者去失,為了保護數據,請定期進行備份。 指示 關于數據的變化或者消失引起的損失,本公司不負任何責任,請諒解。 7、保存數據時,如果需要保留原來保存的數據,則選擇“重命名保存”。 如果“覆蓋保存”則會失去原來保存的數據。 運行環境及系統配置 運行 MOTION BUILDER Ver.2 ,必須具備如下環境。 請確認您使用的系統是否符合如下條件、是否備齊了必需的設備。 對應的 PC 機型 • IBM PC 以及 PC/AT 兼容機(DOS/V) 系統配置 • CPU Pentium 133 MHz 以上 支持 Windows 的打印 (推薦 Pentium 200 MHz 以上) • 內存容量擴展內存 64MB 以上 • 硬盤可用空間 20MB 以上 • CD-ROM 驅動器 • 接口 RS-232C 或者 USB
上傳時間: 2013-10-08
上傳用戶:fujiura
溫濕度傳感器 sht11 仿真程序 sbit out =P3^0; //加熱口 //sbit input =P1^1;//檢測口 //sbit speek =P2^0;//報警 sbit clo =P3^7;//時鐘 sbit ST =P3^5;//開始 sbit EOC =P3^6;//成功信號 sbit gwei =P3^4;//個位 sbit swei =P3^3;//十位 sbit bwei =P3^2;//百位 sbit qwei =P3^1;//千位 sbit speak =P0^0;//報警音 sbit bjled =P0^1;//報警燈 sbit zcled =P0^2;//正常LED int count; uchar xianzhi;//取轉換結果 uchar seth;//高時間 uchar setl;//低時間 uchar seth_mi;//高時間 uchar setl_mi;//低時間 bit hlbz;//高低標志 bit clbz; bit spbz; ///定時中斷程序/// void t0 (void) interrupt 1 using 0 { TH0=(65536-200)/256;//5ms*200=1000ms=1s TL0=(65536-200)%256; clo=!clo;//產生時鐘 if(count>5000) { if(hlbz) { if(seth_mi==0){seth_mi=seth;hlbz=0;out=0;} else seth_mi--; } if(!hlbz) { if(setl_mi==0){setl_mi=setl;hlbz=1;out=1;} else setl_mi--; } count=0; } else count++; } ///////////// ///////延時/////// delay(int i) { while(--i); } ///////顯示處理/////// xianshi() { int abcd=0; int i; for (i=0;i<5;i++) { abcd=xianzhi; gwei=1; swei=1; bwei=1; qwei=1; P1=dispcode[abcd/1000]; qwei=0; delay(70); qwei=1; abcd=abcd%1000; P1=dispcode[abcd/100]; bwei=0; delay(70); bwei=1; abcd=abcd%100; P1=dispcode[abcd/10]; swei=0; delay(70); swei=1; abcd=abcd%10; P1=dispcode[abcd]; gwei=0; delay(70); gwei=1; } } doing() { if(xianzhi>100) {bjled=0;speak=1;zcled=1;} else {bjled=1;speak=0;zcled=0;} } void main(void) { seth=60;//h60秒 setl=90;//l90秒 seth_mi=60;//h60秒 setl_mi=90;//l90秒 TMOD=0X01;//定時0 16位工作模式 TH0=(65536-200)/256; TL0=(65536-200)%256; TR0=1; //開始計時 ET0=1; //開定時0中斷 EA=1; //開全中斷 while(1) { ST=0; _nop_(); ST=1; _nop_(); ST=0; // EOC=0; xianshi(); while(!EOC) { xianshi(); } xianzhi=P2; xianshi(); doing(); } }
上傳時間: 2013-11-07
上傳用戶:我們的船長
注:1.這篇文章斷斷續續寫了很久,畫圖技術也不精,難免錯漏,大家湊合看.有問題可以留言. 2.論壇排版把我的代碼縮進全弄沒了,大家將代碼粘貼到arduino編譯器,然后按ctrl+T重新格式化代碼格式即可看的舒服. 一、什么是PWM PWM 即Pulse Wavelength Modulation 脈寬調制波,通過調整輸出信號占空比,從而達到改 變輸出平均電壓的目的。相信Arduino 的PWM 大家都不陌生,在Arduino Duemilanove 2009 中,有6 個8 位精度PWM 引腳,分別是3, 5, 6, 9, 10, 11 腳。我們可以使用analogWrite()控 制PWM 腳輸出頻率大概在500Hz 的左右的PWM 調制波。分辨率8 位即2 的8 次方等于 256 級精度。但是有時候我們會覺得6 個PWM 引腳不夠用。比如我們做一個10 路燈調光, 就需要有10 個PWM 腳。Arduino Duemilanove 2009 有13 個數字輸出腳,如果它們都可以 PWM 的話,就能滿足條件了。于是本文介紹用軟件模擬PWM。 二、Arduino 軟件模擬PWM Arduino PWM 調壓原理:PWM 有好幾種方法。而Arduino 因為電源和實現難度限制,一般 使用周期恒定,占空比變化的單極性PWM。 通過調整一個周期里面輸出腳高/低電平的時間比(即是占空比)去獲得給一個用電器不同 的平均功率。 如圖所示,假設PWM 波形周期1ms(即1kHz),分辨率1000 級。那么需要一個信號時間 精度1ms/1000=1us 的信號源,即1MHz。所以說,PWM 的實現難點在于需要使用很高頻的 信號源,才能獲得快速與高精度。下面先由一個簡單的PWM 程序開始: const int PWMPin = 13; int bright = 0; void setup() { pinMode(PWMPin, OUTPUT); } void loop() { if((bright++) == 255) bright = 0; for(int i = 0; i < 255; i++) { if(i < bright) { digitalWrite(PWMPin, HIGH); delayMicroseconds(30); } else { digitalWrite(PWMPin, LOW); delayMicroseconds(30); } } } 這是一個軟件PWM 控制Arduino D13 引腳的例子。只需要一塊Arduino 即可測試此代碼。 程序解析:由for 循環可以看出,完成一個PWM 周期,共循環255 次。 假設bright=100 時候,在第0~100 次循環中,i 等于1 到99 均小于bright,于是輸出PWMPin 高電平; 然后第100 到255 次循環里面,i 等于100~255 大于bright,于是輸出PWMPin 低電平。無 論輸出高低電平都保持30us。 那么說,如果bright=100 的話,就有100 次循環是高電平,155 次循環是低電平。 如果忽略指令執行時間的話,這次的PWM 波形占空比為100/255,如果調整bright 的值, 就能改變接在D13 的LED 的亮度。 這里設置了每次for 循環之后,將bright 加一,并且當bright 加到255 時歸0。所以,我們 看到的最終效果就是LED 慢慢變亮,到頂之后然后突然暗回去重新變亮。 這是最基本的PWM 方法,也應該是大家想的比較多的想法。 然后介紹一個簡單一點的。思維風格完全不同。不過對于驅動一個LED 來說,效果與上面 的程序一樣。 const int PWMPin = 13; int bright = 0; void setup() { pinMode(PWMPin, OUTPUT); } void loop() { digitalWrite(PWMPin, HIGH); delayMicroseconds(bright*30); digitalWrite(PWMPin, LOW); delayMicroseconds((255 - bright)*30); if((bright++) == 255) bright = 0; } 可以看出,這段代碼少了一個For 循環。它先輸出一個高電平,然后維持(bright*30)us。然 后輸出一個低電平,維持時間((255-bright)*30)us。這樣兩次高低就能完成一個PWM 周期。 分辨率也是255。 三、多引腳PWM Arduino 本身已有PWM 引腳并且運行起來不占CPU 時間,所以軟件模擬一個引腳的PWM 完全沒有實用意義。我們軟件模擬的價值在于:他能將任意的數字IO 口變成PWM 引腳。 當一片Arduino 要同時控制多個PWM,并且沒有其他重任務的時候,就要用軟件PWM 了。 多引腳PWM 有一種下面的方式: int brights[14] = {0}; //定義14個引腳的初始亮度,可以隨意設置 int StartPWMPin = 0, EndPWMPin = 13; //設置D0~D13為PWM 引腳 int PWMResolution = 255; //設置PWM 占空比分辨率 void setup() { //定義所有IO 端輸出 for(int i = StartPWMPin; i <= EndPWMPin; i++) { pinMode(i, OUTPUT); //隨便定義個初始亮度,便于觀察 brights[ i ] = random(0, 255); } } void loop() { //這for 循環是為14盞燈做漸亮的。每次Arduino loop()循環, //brights 自增一次。直到brights=255時候,將brights 置零重新計數。 for(int i = StartPWMPin; i <= EndPWMPin; i++) { if((brights[i]++) == PWMResolution) brights[i] = 0; } for(int i = 0; i <= PWMResolution; i++) //i 是計數一個PWM 周期 { for(int j = StartPWMPin; j <= EndPWMPin; j++) //每個PWM 周期均遍歷所有引腳 { if(i < brights[j])\ 所以我們要更改PWM 周期的話,我們將精度(代碼里面的變量:PWMResolution)降低就行,比如一般調整LED 亮度的話,我們用64 級精度就行。這樣速度就是2x32x64=4ms。就不會閃了。
上傳時間: 2013-10-08
上傳用戶:dingdingcandy