《藍(lán)橋杯單片機(jī)設(shè)計(jì)與開發(fā)》課件 第10-18章 信號(hào)頻率測量 -單片機(jī)設(shè)計(jì)與開發(fā)賽題解析_第1頁
《藍(lán)橋杯單片機(jī)設(shè)計(jì)與開發(fā)》課件 第10-18章 信號(hào)頻率測量 -單片機(jī)設(shè)計(jì)與開發(fā)賽題解析_第2頁
《藍(lán)橋杯單片機(jī)設(shè)計(jì)與開發(fā)》課件 第10-18章 信號(hào)頻率測量 -單片機(jī)設(shè)計(jì)與開發(fā)賽題解析_第3頁
《藍(lán)橋杯單片機(jī)設(shè)計(jì)與開發(fā)》課件 第10-18章 信號(hào)頻率測量 -單片機(jī)設(shè)計(jì)與開發(fā)賽題解析_第4頁
《藍(lán)橋杯單片機(jī)設(shè)計(jì)與開發(fā)》課件 第10-18章 信號(hào)頻率測量 -單片機(jī)設(shè)計(jì)與開發(fā)賽題解析_第5頁
已閱讀5頁,還剩334頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

【藍(lán)橋杯】《單片機(jī)應(yīng)用技術(shù)》教學(xué)課件No.10信號(hào)頻率測量

IAP15F2K61S2內(nèi)部集成了3個(gè)16位的定時(shí)/計(jì)數(shù)器T1、T0和T2,其核心部件是兩個(gè)8位加法計(jì)數(shù)器(TH和TL),可合成為一個(gè)16位計(jì)數(shù)器,對脈沖進(jìn)行計(jì)數(shù)。(1)若計(jì)數(shù)脈沖來自內(nèi)部時(shí)鐘,稱為定時(shí)器(Timer);(2)若計(jì)數(shù)脈沖來自T1(P3.5)、

T0(P3.4)或者T2(P3.1)引腳,稱為計(jì)數(shù)器(Counter)。

【REVIEW】定時(shí)/計(jì)數(shù)器T1和T0定時(shí)/計(jì)數(shù)控制寄存器定時(shí)/計(jì)數(shù)模式寄存器在初始化過程中,設(shè)置定時(shí)器或計(jì)數(shù)器的初始值,需要進(jìn)行一些運(yùn)算。計(jì)數(shù)器最大計(jì)數(shù)值為M時(shí)(16位定時(shí)/計(jì)數(shù)器:M=216=65536,

8位定時(shí)/計(jì)數(shù)器:M=28=256),則初值X的計(jì)算方法如下:

【12T】X=M-要求的定時(shí)值

/

(12/系統(tǒng)時(shí)鐘頻率)

【1T】

X=M-要求的定時(shí)值/(1/系統(tǒng)時(shí)鐘頻率)

注:OSC=12MHz時(shí):

【12T】12/系統(tǒng)時(shí)鐘頻率=1,【1T】1/系統(tǒng)時(shí)鐘頻率=1/12。定時(shí)/計(jì)數(shù)器工作之前要進(jìn)行初始化配置,通常包括以下幾個(gè)步驟:STEP1:確定T1和T0的工作方式,對TMOD進(jìn)行賦值;STEP2:計(jì)算定時(shí)/計(jì)數(shù)初值,并寫入TH1、TL1或TH0、TL0;STEP3:開放中斷,對IE進(jìn)行賦值;STEP4:置TR1或TR0為1,啟動(dòng)定時(shí)/計(jì)數(shù)器工作。No.10-1頻率測量方法2.頻率測量的三種方法1.什么是頻率?頻率測量直接測頻法測周期法等精度測量法ISBN:978-7-302-61129-5No.10-2脈沖信號(hào)的頻率測量★定時(shí)/計(jì)數(shù)器應(yīng)用實(shí)踐-信號(hào)頻率測量【任務(wù)描述】在藍(lán)橋杯單片機(jī)開發(fā)板上,用跳線帽將J3的NET_SIG與P34(第15和16針)短接,其中P34為定時(shí)/計(jì)數(shù)器T0的外部計(jì)數(shù)信號(hào)輸入引腳。

新建工程,編寫程序,實(shí)現(xiàn)以下功能:(1)單片機(jī)加電后,關(guān)閉蜂鳴器、繼電器以及8個(gè)LED燈;(2)測量NE555多諧振蕩器輸出信號(hào)的頻率,并應(yīng)用數(shù)碼管按下圖所示格式顯示信號(hào)頻率值。其中“F”為頻率提示符,后5位數(shù)碼管顯示測量的頻率值,單位為Hz。當(dāng)測量的頻率數(shù)值不足5位時(shí),將左側(cè)不需要的數(shù)碼管熄滅。(3)調(diào)節(jié)電位器Rb3,能夠?qū)崟r(shí)測量信號(hào)的頻率值。(4)用示波器測量振蕩器輸出信號(hào)NET_SIG的頻率值,計(jì)算頻率測量誤差。頻率測量時(shí)需要將J3的15(NET_SIG)與16(SIG_out,P3.4)用跳線帽短接!實(shí)現(xiàn)方案(2)單位時(shí)間應(yīng)用T1,設(shè)置為定時(shí)器,工作模式為0。【12T】設(shè)置為50ms定時(shí),賦初值:TH1=(65536-50000)/256;

TL1=(65536-50000)%256;【1T】設(shè)置為5ms定時(shí),賦初值:

TH1=(65536-60000)/256;

TL1=(65536-60000)%256;(1)測脈沖應(yīng)用T0(P3.4)設(shè)置為計(jì)數(shù)器,工作模式為2,初值為0xff。處理思路:(1)測脈沖:用計(jì)數(shù)器!(2)單位時(shí)間:用定時(shí)器!#include<reg52.h>#include"user.c"http://內(nèi)部變量定義unsignedintpulse_cnt=

0;unsignedintfreq_value=

0;//數(shù)碼顯示數(shù)據(jù)緩存區(qū),初設(shè)數(shù)據(jù)為”F(滅滅)00000”unsignedcharDTbuf[]={15,17,17,0,0,0,0,0};voidFreqValue2buf(void);//函數(shù)聲明//定時(shí)器初始化子程序voidTimer01init

()

{//T0用于計(jì)數(shù),模式2,裝初值0xff

TH0=0xff;TL0=0xff;

//T1用于定時(shí),模式0,[12T]50ms,裝初值

TH1=(65536-50000)/256;

TL1=(65536-50000)%256;

//

設(shè)置TMOD

TMOD=0x06;//bit:0000_0110ET0=1;ET1=1;EA=1;TR0=1;TR1=1;}//計(jì)數(shù)器0中斷服務(wù)程序voidTimer0isr()interrupt1

{

pulse_cnt++;}//定時(shí)器1中斷服務(wù)程序voidTime1isr()interrupt3

{

staticunsignedchartimes=

0;

times++;if(times==20){

freq_value=pulse_cnt;

FreqValue2buf();pulse_cnt=0;

times=0;}

}//將頻率值分解為BCD碼存入數(shù)碼顯示緩沖區(qū)voidFreqValue2buf(void){DTbuf[3]=freq_value/10000;

DTbuf[4]=(freq_value/1000)%10;

DTbuf[5]=(freq_value/100)%10;

DTbuf[6]=(freq_value/10)%10;

【12T】信號(hào)頻率測量應(yīng)用程序1(

順序顯示+中斷測量

DTbuf[7]=freq_value%10;

}//頻率值顯示子程序voidDispFreqValue(){DT_drv(0,DTbuf[0]);Delay1ms(2);

//顯示F

//DT_drv(1,DTbuf[1]);Delay1ms(2);//不驅(qū)動(dòng)

//DT_drv(2,DTbuf[2]);Delay1ms(2);//不驅(qū)動(dòng)

if(DTbuf[3])//如果萬位數(shù)不為0,則顯示

{DT_drv(3,DTbuf[3]);Delay1ms(2);}

//如果萬位數(shù)和千位數(shù)不同時(shí)為0,則顯示

if(DTbuf[3]|DTbuf[4])

{DT_drv(4,DTbuf[4]);Delay1ms(2);}

if(DTbuf[3]|DTbuf[4]|DTbuf[5])//百位數(shù){DT_drv(5,DTbuf[5]);Delay1ms(2);}

DT_drv(6,DTbuf[6]);Delay1ms(2);

//十位數(shù)

DT_drv(7,DTbuf[7]);Delay1ms(2);

//個(gè)位數(shù)

}

//主程序voidmain(){

//關(guān)LED

LED_drv(0xff);

//關(guān)BEEP和繼電器BEEP_off();RELAY_off();Timer01init();while(1)DispFreqValue();}

數(shù)碼管顯示刷新率分析:取刷新延時(shí)2ms時(shí),完成6個(gè)數(shù)碼管刷新需要(約)12ms,因此,數(shù)碼管的刷新率能夠達(dá)到80次/秒以上。#include<reg52.h>#include"user.c"http://內(nèi)部變量定義unsignedintpulse_cnt=

0;unsignedintfreq_value=

0;//數(shù)碼顯示數(shù)據(jù)緩存區(qū),初設(shè)數(shù)據(jù)為”F(滅滅)00000”unsignedcharDTbuf[]={15,17,17,0,0,0,0,0};//定時(shí)器初始化子程序voidTimer01init

(){

//

設(shè)置TMOD

TMOD=0x06;//bit:0001_0110

//T0用于計(jì)數(shù),模式2,裝初值0xff

TH0=0xff;TL0=0xff;

//T1用于定時(shí),模式0,[12T]2ms,裝初值

TH1=(65536-2000)/256;

TL1=(65536-2000)%256;

ET0=1;ET1=1;EA=1;

TR0=1;TR1=1;}//定時(shí)器0中斷服務(wù)程序voidTimer0isr()interrupt1

{freq_cnt++;}//將頻率值分解為BCD碼存入數(shù)碼顯示緩沖區(qū)voidFreqValue2buf(void){DTbuf[3]=freq_value/10000;

DTbuf[4]=(freq_value/1000)%10;

DTbuf[5]=(freq_value/100)%10;

DTbuf[6]=(freq_value/10)%10;

DTbuf[7]=freq_value%10;

}//定時(shí)器1中斷服務(wù)程序voidTime1isr()interrupt3

{

staticunsignedinttimes=

0;staicunsignedcharDTno=0xff;//數(shù)碼管序號(hào)

DTno++;

//序號(hào)變量加1DTno&=0x07;

//截取后3位【12T】信號(hào)頻率測量應(yīng)用程序2(純中斷方式)應(yīng)用定時(shí)器T1即實(shí)現(xiàn)1s定時(shí),又驅(qū)動(dòng)數(shù)碼管顯示。

DT_drv(DTno,DTbuf[DTno]);//驅(qū)動(dòng)數(shù)碼管

times++;

if(times==500)

{freq_value=pulse_cnt;

FreqValue2buf();pulse_cnt=0;

times=0;}

}//主程序voidmain(){//關(guān)LED

LED_drv(0xff);

//關(guān)BEEP和繼電器BEEP_off();RELAY_off();Timer01init();while(1);}

1.對同一脈沖頻率,兩種方法的測量結(jié)果是否相同?2.應(yīng)用信號(hào)源兩種應(yīng)用程序的測率誤差,并分析產(chǎn)生測量誤差的主要原因。No.10-3PCA及其應(yīng)用(1)1.測(脈沖)頻率(T0+T1/T2)2.串口(T1/T2)3.數(shù)碼管刷新與事務(wù)處理(T0/T1/T2)4.PWM(周期<100Hz,周期>1kHz)(T2/PCA)5.超聲波測距(T0/T1/PCA)IAP15F2K61S2

STC15系列單片機(jī)的可編程計(jì)數(shù)器陣列(ProgrammableCounterArray,PCA)由16位PCA定時(shí)器/計(jì)數(shù)器和三個(gè)PCA模塊組成,如圖10-6所示。每個(gè)PCA模塊均可設(shè)置為捕獲(capture)、軟件定時(shí)器、高速脈沖輸出和PWM輸出4種工作模式。16位PCA定時(shí)器/計(jì)數(shù)器(CH和CL)是3個(gè)PCA模塊的公共時(shí)間基準(zhǔn)。定時(shí)器/計(jì)數(shù)器的內(nèi)部結(jié)構(gòu)如圖10-7所示,通過特殊功能寄存器CMOD來選擇PCA定時(shí)器/計(jì)數(shù)器的時(shí)鐘源。18.1PCA相關(guān)寄存器PCA的工作狀態(tài)由CCON、CMOD、CCAPMn,以及PCA_PWMn等多個(gè)特殊功能寄存器控制。1.

PCA控制寄存器CCON(可位尋址)特殊功能寄存器CCON包括PCA定時(shí)器/計(jì)數(shù)器的運(yùn)行控制位,PCA定時(shí)器溢出標(biāo)志位和PCA模塊0~2的中斷標(biāo)志位。

STC15系列單片機(jī)中斷系統(tǒng)的總體結(jié)構(gòu)(中斷源max:19)INT:5Timer:5UART:42.PCA模式寄存器CMOD(不可位尋址)

特殊功能寄存器CMOD用于選擇PCA定時(shí)/計(jì)數(shù)器的時(shí)鐘源,以及空閑模式下是否停止PCA計(jì)數(shù)的控制位和PCA計(jì)數(shù)器溢出中斷允許位。3.PCA計(jì)數(shù)值寄存器CH和CL

特殊功能寄存器CH和CL分別為16位PCA計(jì)數(shù)器的高8位和低8位,地址分別為0xF9和0xE9。復(fù)位值均為0x00,用于存儲(chǔ)PCA計(jì)數(shù)器的計(jì)數(shù)值。4.PCA模塊模式寄存器CCAPM0、CCAPM1和CCAPM2

寄存器CCAPMn(n=0~2)分別用于設(shè)置PCA模塊0~2的工作模式。CCAPM0的SFR地址為0xDA。單片機(jī)復(fù)位后,CCAPM0的初值為x000_0000。5.PCA模塊捕獲值/比較值寄存器CCAPnH和CCAPnL

當(dāng)模塊用于捕獲或者比較時(shí),CCAPnH和CCAPnL(n=0~2)用于存儲(chǔ)模塊的16位捕獲值。設(shè)置模塊為PWM輸出模式時(shí),CCAPnH和CCAPnL用來控制輸出PWM的占空比。CCAPnH和CCAPnL對應(yīng)的地址分別為0xFA和0xEA、0xFB和0xEB、0xFC和0xEC。單片機(jī)復(fù)位后,CCAPnH和CCAPnL的復(fù)位值均為0x00。

6.PCA模塊PWM模式寄存器PCA_PWM0、PCA_PWM1和PCA_PWM2STC15系列單片機(jī)的PCA模塊0~2可以通過設(shè)置寄存器PCA_PWMn(n=0~2)中的比特位EBSn_1和EBSn_0,設(shè)置模塊0~2工作于8位PWM、7位PWM或者6位PWM模式。18.4*PCA的應(yīng)用-脈沖占空比測量思考與練習(xí)

1.占空比(duty)定義為周期信號(hào)高電平的持續(xù)時(shí)間與周期的比值,如圖所示。怎樣測量信號(hào)的占空比?2.參考測率測量應(yīng)用程序,編寫能夠測量555定時(shí)器輸出信號(hào)占空比的應(yīng)用程序,在數(shù)碼管上同時(shí)顯示信號(hào)的頻率值和占空比值,顯示格式定義如圖所示?!舅{(lán)橋杯】《單片機(jī)設(shè)計(jì)與開發(fā)》教學(xué)課件【共4篇】1.基礎(chǔ)篇;2.應(yīng)用篇;3.器件篇;4.實(shí)戰(zhàn)篇。No.11PWM的產(chǎn)生與應(yīng)用1.脈沖2.脈沖特性參數(shù)

PWM廣泛應(yīng)用于開關(guān)電源和電機(jī)調(diào)速中。

要控制直流電機(jī)的速度,通常采用脈沖周期固定、占空比可調(diào)的PWM信號(hào)通過驅(qū)動(dòng)電路控制直流電機(jī)的轉(zhuǎn)速,其中SSR為固態(tài)繼電器(SolidStateRelay)。PWM是PulseWidthModulation(脈沖寬度調(diào)制)的縮寫,是對模擬信號(hào)的幅度進(jìn)行數(shù)字化編碼的方法。簡單理解:PWM就是周期不變占空比可調(diào)的脈沖序列。3.PWM

SPWM波產(chǎn)生的原理如下圖所示,其中三角波稱為載波,正弦波稱為調(diào)制波?!竟こ虒?shí)踐1】

LED亮度和閃爍頻率控制(1)

【任務(wù)描述】新建工程,編寫代碼,產(chǎn)生頻率為100Hz的PWM控制LED的亮度。具體要求如下:(1)單片機(jī)上電后,先關(guān)閉蜂鳴器和繼電器,并預(yù)設(shè)PWM信號(hào)的占空比為50%;(2)定義按鍵S7為LED“亮度控制”鍵。按下S7時(shí),PWM信號(hào)的占空比按“0→10%→20%→30%→50%→90%”循環(huán)變化,以控制LED的亮度;(3)定義按鍵S6為LED“閃爍頻率控制”鍵。未按下S6之前,LED以0.5為間隔閃爍。按下S6時(shí),LED的閃爍頻率以0.2s、0.5s和0.8s為間隔依次切換。分析:(1)PWM信號(hào)頻率為100Hz時(shí),周期為10ms。(2)若定義PWM信號(hào)周期由10個(gè)計(jì)數(shù)點(diǎn)組成,則可以控制PWM信號(hào)的占空比按10%步進(jìn)變化,滿足占空比步進(jìn)要求。(3)對于100Hz的PWM信號(hào),每個(gè)PWM周期取10個(gè)計(jì)數(shù)點(diǎn)時(shí),則每個(gè)計(jì)數(shù)點(diǎn)之間的時(shí)間間隔為(10ms/10=)1ms。因此,需要應(yīng)用定時(shí)器每隔1ms產(chǎn)生一次中斷,10次中斷對應(yīng)一個(gè)PWM周期。(4)在一個(gè)PWM周期內(nèi),根據(jù)占空比的要求應(yīng)用條件運(yùn)算符(或條件語句)產(chǎn)生高、低電平,輸出相應(yīng)占空比的PWM信號(hào)。(5)控制LED以0.2s、0.5s和0.8s為間隔閃爍時(shí),需要產(chǎn)生周期為0.4s、1s和1.6s的方波信號(hào),用方波信號(hào)控制PWM是否輸出驅(qū)動(dòng)LED。根據(jù)上述分析,控制LED亮度和閃爍頻率的具體設(shè)計(jì)思路是:(1)將T0設(shè)置為定時(shí)器,定時(shí)間隔為1ms,根據(jù)占空比要求應(yīng)用條件運(yùn)算符產(chǎn)生相應(yīng)的PWM信號(hào);(2)將T1設(shè)置為定時(shí)器,定時(shí)間隔為2ms,用于數(shù)碼管刷新顯示,同時(shí)根椐條件產(chǎn)生周期為0.4s、1s或1.6s的方波信號(hào)SQwav。(3)用方波SQwav控制PWM信號(hào)驅(qū)動(dòng)LED閃爍。

根據(jù)上述設(shè)計(jì)思路,預(yù)定義PWM信號(hào)的占空比為50%、LED以0.5s為間隔閃爍,應(yīng)用數(shù)碼管顯示狀態(tài)、占空比和閃爍參數(shù),應(yīng)用按鍵S7和S6分別控制LED亮度和閃爍頻率的應(yīng)用程序代碼參考如下。數(shù)碼管顯示格式定義如下表所示。//文件名CP11_PWMduty_twinkling.c#include<reg52.h>#include"user.c"#defineSQ0p2s100//快速閃爍參數(shù)定義#defineSQ0p5s250//中速閃爍參數(shù)定義#defineSQ0p8s400//慢速閃爍參數(shù)定義sbitS7=P3^0;//按鍵I/O定義sbitS6=P3^1;//數(shù)碼顯示數(shù)據(jù)緩沖區(qū)定義unsignedcharDTbuf[8]={3,16,5,0,16,2,5,0};//按鍵消抖采樣字節(jié)變量定義unsignedcharS7buf=0xff,S6buf=0xff;//狀態(tài)變量,取值范圍為0~5unsignedcharstate=3;//占空比控制變量,預(yù)設(shè)為50%

unsignedcharDuty=3;

//方波輸出控制變量,預(yù)設(shè)以0.5s為間隔閃爍unsignedintSQmode=SQ0p5s;bitPWM;//PWM輸出bitSQwav;//方波輸出//定時(shí)器T1和T0初始化voidTimer01Init(){//AUXR&=0x3F; //設(shè)置T1和T0時(shí)鐘均為12T//設(shè)置T1和T0為定時(shí)器,模式0TMOD=0x00;

//T0用于1ms定時(shí),裝初值TH0=(65536-1000)/256;TL0=(65536-1000)%256;

//T1實(shí)現(xiàn)2ms定時(shí),裝初值TH1=(65536-2000)/256;TL1=(65536-2000)%256;ET0=1;ET1=1;//允許T0和T1中斷EA=1;//開放總中斷TR0=1;TR1=1;//啟動(dòng)T0和T1}//T0中斷服務(wù)程序,用于產(chǎn)生PWMvoidTimer0isr()interrupt1{//PWM計(jì)數(shù)點(diǎn)變量

staticunsignedcharPWMcnt=0;PWMcnt++;//中斷次數(shù)加1//PWMcnt為10時(shí)對應(yīng)一個(gè)PWM周期if(PWMcnt=10)PWMcnt=0;//生成PWM信號(hào)PWM=(PWMcnt<Duty)?1:0;}

/*T1中斷服務(wù)程序,用于刷新數(shù)碼管、鍵值采樣和產(chǎn)生方波信號(hào)*/voidTimer1isr()interrupt3{//數(shù)碼管序號(hào)變量

staticunsignedcharDTno=0xff;

//中斷次數(shù)統(tǒng)計(jì)變量

staticunsignedintSQcnt=0;DTno++;//數(shù)碼管刷新過程DTno&=0x07;DT_drv(DTno,DTbuf[DTno]);//鍵值采樣過程S7buf=(S7buf<<1)|S7;S6buf=(S6buf<<1)|S6;

SQcnt++;//中斷次數(shù)加1if(SQcnt>=SQmode)//方波輸出控制{SQcnt=0;SQwav=~SQwav;}}//按鍵處理子程序voidKeysProcess(){if(S7buf==0x00)

//如果S7按下{//LED亮度控制

switch(state)

{

case0:state=1;Duty=1;break;

case1:state=2;Duty=2;break;

case2:state=3;Duty=3;break;

case3:state=4;Duty=5;break;

case4:state=5;Duty=9;break;

case5:state=0;Duty=0;break;default:state=3;Duty=3;}DTbuf[0]=state;//更新顯示DTbuf[2]=Duty;

//DTbuf[3]=0;while(S7buf!=0xff);//等待S7釋放}if(S6buf==0x00)//如果S6按下{

switch(SQmode)

//LED閃爍頻率調(diào)整{

caseSQ0p2s:SQmode=SQ0p5s;break;

caseSQ0p5s:SQmode=SQ0p8s;break;

caseSQ0p8s:SQmode=SQ0p2s;break;default:SQmode=SQ0p5s;}DTbuf[5]=SQmode/100;DTbuf[6]=(SQmode%100)/10;DTbuf[7]=SQmode%10;while(S6buf!=0xff);//等待S6釋放}}//主程序voidmain(){BEEP_off();//關(guān)閉蜂鳴器RELAY_off();//斷開繼電器Timer01Init();//T0和T1初始化while(1){KeysProcess();//按鍵處理

//SQwav和PWM均為1時(shí)if(SQwav&PWM)LED_drv(0x00);//點(diǎn)亮LEDelse//否則LED_drv(0xff);//熄滅LED}}【工程實(shí)踐2】PWM應(yīng)用進(jìn)階-呼吸流水燈

【任務(wù)描述】在藍(lán)橋杯開發(fā)板上,將鍵盤設(shè)置為獨(dú)立按鍵模式,然后編寫程序,應(yīng)用PWM信號(hào)實(shí)現(xiàn)呼吸流水燈。具體任務(wù)如下:(1)系統(tǒng)上電后,關(guān)閉蜂鳴器和繼電器,并點(diǎn)亮LED4和LED5,其余LED熄滅;(2)按下S4按鍵并松開后,8個(gè)LED燈從左向右呼吸點(diǎn)亮,即:LED1緩慢點(diǎn)亮→LED1緩慢熄滅→LED2緩慢點(diǎn)亮→LED2緩慢熄滅→。。?!鶯ED8緩慢點(diǎn)亮→LED8緩慢熄滅→LED1緩慢點(diǎn)亮→。。。,其中緩慢點(diǎn)亮的時(shí)間設(shè)置為0.5s,緩慢熄滅的時(shí)間為0.5s;(3)再次按下S4按鍵并松開后,切換流水方向,即從當(dāng)前LED開始從右向左呼吸流水;(4)在按鍵S4按下期間,LED暫停呼吸并保持現(xiàn)有的亮度,直到S4松開后從當(dāng)前狀態(tài)恢復(fù)呼吸流水;(5)按下按鍵S7時(shí),暫停流水并保持當(dāng)前LED亮度,同時(shí)用數(shù)碼管顯示當(dāng)前LED的序號(hào)和亮度,如圖所示。松開S7后數(shù)碼碼熄滅,恢復(fù)呼吸流水。分析:(1)要求每個(gè)LED燈,緩慢點(diǎn)亮0.5s,緩慢熄滅0.5s,因此一次呼吸過程為1s;(2)若將緩慢點(diǎn)亮過程和緩慢熄滅過程均定義為10級(jí)占空比,按10%步進(jìn),則每級(jí)占空比的PWM信號(hào)持續(xù)時(shí)間為0.5s/10=50ms;(3)若定義每級(jí)占空比包含10個(gè)PWM周期,則每個(gè)PWM的周期為50ms/10=5ms;(4)若定義每個(gè)PWM周期包含10個(gè)計(jì)數(shù)點(diǎn),則每個(gè)計(jì)數(shù)點(diǎn)的間隔為5ms/10=0.5ms,因此需要設(shè)計(jì)定時(shí)器每0.5m產(chǎn)生一次中斷,計(jì)數(shù)一次;(5)根據(jù)上述分析,一次呼吸過程需要2000個(gè)計(jì)數(shù)值:(1)0~999為緩慢點(diǎn)亮過程,每級(jí)占空比對應(yīng)100個(gè)計(jì)數(shù)值,包含10個(gè)PWM周期,每個(gè)PWM周期對應(yīng)10個(gè)計(jì)數(shù)點(diǎn);(2)1000~1999為緩慢熄滅過程,每級(jí)占空比對應(yīng)100個(gè)計(jì)數(shù)值,包含10個(gè)PWM周期,每個(gè)PWM周期對應(yīng)10個(gè)計(jì)數(shù)點(diǎn)。//文件名CP11_LEDbreath_twinkling.c#include<reg52.h>#include"user.c"http://按鍵引腳定義sbitS7=P3^0;//顯示當(dāng)前狀態(tài)信息鍵sbitS4=P3^3;//呼吸燈流動(dòng)方向控制鍵//全局變量定義unsignedcharS4no=0;//S4按鍵次數(shù)統(tǒng)計(jì):0~2unsignedcharDuty=0;//占空比,初值為0unsignedcharLEDno=0;//當(dāng)前LED燈號(hào):0~7bitKEYpressed;//按鍵按下狀態(tài)標(biāo)志bitPWM;//PWM信號(hào)

//狀態(tài)信息顯示子程序

voidLEDinfo_display(void){DT_drv(0,LEDno+1);Delay1ms(5);//顯示LED號(hào)DT_drv(6,Duty);Delay1ms(5);//顯示占空比

DT_drv(7,0);Delay1ms(5);//顯示0}//定義關(guān)閉所有數(shù)碼管子程序

voidAllDT_off(void){P0=0xff;DTseg_en;ALL_off;P0=0xff;DTbit_en;ALL_off;}//T0初始化子程序voidTimer0Init(){//AUXR&=0x7F;//設(shè)置定時(shí)器T0為12T時(shí)鐘//設(shè)置T0為16位定時(shí)器,自動(dòng)重裝初值方式TMOD&=0xf0;//位與后賦值//定時(shí)0.5ms,@12MHzTH0=(65536-500)/256; TL0=(65536-500)%256;ET0=1;//開T0中斷EA=1;//開放總中斷TR0=1;//啟動(dòng)T0}

//T0中斷服務(wù)程序voidTimer0isr()interrupt1

{//中斷次數(shù)統(tǒng)計(jì)變量:0~2000staticunsignedinttimes=0;

//若S4未按下過,則顯示初始狀態(tài),關(guān)閉數(shù)碼管返回if(S4no==0){LED_drv(~0x18);AllDTs_off();return;}

//如果按鍵處于按下狀態(tài),不處理直接返回if(KEYpressed)return;//PWM信號(hào)生成與LED驅(qū)動(dòng)

times++;//中數(shù)次數(shù)計(jì)數(shù)

//如果一次呼吸過程結(jié)束if(times==2000){times=0;//重新開始計(jì)數(shù)

//根據(jù)S4按鍵的次數(shù)調(diào)整呼吸燈流動(dòng)方向

if(S4no==1)LEDno++;elseLEDno--;//LED序號(hào)越界處理,截取變量LEDno后3位LEDno&=0x07;}//每計(jì)數(shù)100次重新定義占空比(0~9)if((times%100)==0)if(times<1000)Duty=(times/100);elseDuty=19-(times/100);

//每計(jì)數(shù)10次生成一個(gè)PWM周期PWM=((times%10)<Duty)?1:0;

//驅(qū)動(dòng)LED顯示if(PWM)LED_drv(~(0x01<<LEDno));elseLED_drv(0xff);}

//按鍵掃描子程序voidScanKeys()

{

//如果S4按下if(S4==0){Delay1ms(20);//延時(shí)消抖

if(S4==0)KEYpressed=1;//如果S4仍處于按下狀態(tài),設(shè)置KEYpressed有效while(S4==0);//等待S4釋放

//S4已釋放,設(shè)置KEYpressed無效

KEYpressed=0;S4no++;//S4按鍵次數(shù)加1//如果S4按鍵次數(shù)大于2,則轉(zhuǎn)為1if(S4no>2)S4no=1;}

//如果S7按下if(S7==0){Delay1ms(20);//延時(shí)消抖if(S7==0)//如果S7仍處于按下狀態(tài){KEYpressed=1;//設(shè)置KEYpressed有效//S7按下期間,顯示當(dāng)前燈號(hào)及占空比while(S7==0)LEDinfo_display();}//S7已釋放,設(shè)置KEYpressed無效KEYpressed=0;AllDT_off();//關(guān)閉所有數(shù)碼管}}//主程序voidmain(){//關(guān)閉蜂鳴器和繼電器BEEP_off();RELAY_off();

AllDTs_off();

//T0初值化

Timer0Init();//主循環(huán),只檢測按鍵

while(1)ScanKeys();}

PCA及其應(yīng)用(2)18.3*PWM輸出模式

將比較/捕獲模式寄存器CCAPMn的比特位ECOMn和PWMn同時(shí)置1時(shí),即可配置PCA模塊n工作于PWM模式,然后再通過PWM寄存器PCA_PWMn將PCA模塊配置為8位PWM、7位PWM或者6位PWM模式。

設(shè)置PWM寄存器中PCA_PWMn中的比特位[EBSn_1,EBSn_0]=[0,0]或者[1,1]時(shí),則PCA模塊n工作于8位PWM輸出模式,此時(shí)PCA模塊的內(nèi)部結(jié)構(gòu)如圖11-7所示,通過將{0,CL[7:0]}與[EPCnL,CCAPnL[7:0]]進(jìn)行比較產(chǎn)生PWM波。綜合訓(xùn)練題11-1.設(shè)計(jì)模擬風(fēng)扇控制系統(tǒng),用按鍵控制風(fēng)扇的運(yùn)行模式和設(shè)置定時(shí)時(shí)間。具體的功能要求描述如下:1.運(yùn)行模式風(fēng)扇有“睡眠風(fēng)”、“自然風(fēng)”和“正常風(fēng)”三種工作模式,對應(yīng)的PWM占空比分別為20%、30%和70%。2.顯示格式數(shù)碼管以表題11-1所示的格式顯示當(dāng)前工作模式和剩余工作時(shí)間。3.按鍵功能描述(1)定義按鍵S4為工作模式切換鍵。每次按下S4后,依次按“睡眠風(fēng)”、“自然風(fēng)”和“正常風(fēng)”的順序切換工作模式;(2)定義按鍵S5為定時(shí)時(shí)間設(shè)置鍵。每次按下S5后,定時(shí)時(shí)間在1、2和3分鐘之間倍依次切換,然后以倒計(jì)時(shí)方式顯示剩余工作時(shí)間。剩余工作時(shí)間為0時(shí),停止PWM輸出。(3)定義按鍵S7為停止鍵。按下S7后,將剩余工作時(shí)間清0,同時(shí)停止PWM輸出,直到應(yīng)用按鍵S5重新設(shè)置定時(shí)時(shí)間。4.LED指示驅(qū)動(dòng)L5~L8指示PWM的占空比。同時(shí),

(1)僅在“睡眠風(fēng)”模式時(shí)點(diǎn)亮L1;(2)僅在“自然風(fēng)”模式時(shí)點(diǎn)亮L2;(3)在“正常風(fēng)”模式時(shí)點(diǎn)亮L3。【藍(lán)橋杯】《單片機(jī)設(shè)計(jì)與開發(fā)》教學(xué)課件【共4篇】1.基礎(chǔ)篇;2.應(yīng)用篇;3.器件篇;4.實(shí)戰(zhàn)篇。No.12串行口通信No.12-1通信基礎(chǔ)知識(shí)1.通信通信是指消息的傳遞或交換,分為模擬通信和數(shù)字通信兩大類。(1)模擬通信是利用正弦波的幅度、頻率或相位的變化(AM、FM或PM),或者利用脈沖的幅度、寬度或者脈沖的相對位置來傳遞信息(PAM、PWM和PPM),以達(dá)到通信的目的。另外,還有脈沖編碼調(diào)制(PCM)。(2)數(shù)字通信是用數(shù)字信號(hào)對載波進(jìn)行調(diào)制后來傳遞信息的通信方式,通常有的幅移鍵控ASK、頻移鍵控FSK、相移鍵控PSK、差分幅移鍵控DPSK、正交幅度調(diào)制QAM和正交頻分復(fù)用調(diào)制OFDM等多種類型。

通信協(xié)議是指通信雙方完成信息的傳遞或交換應(yīng)遵循的規(guī)則和約定,可以理解為計(jì)算機(jī)與計(jì)算機(jī)、或者計(jì)算機(jī)與設(shè)備之間進(jìn)行通信所使用的共同語言。

通信協(xié)議主要由以下三個(gè)要素組成:

語法:是如何通信,包括數(shù)據(jù)格式和編碼等;

語義:是通信內(nèi)容,包括數(shù)據(jù)含義和控制信息等;

時(shí)序:是何時(shí)通信,包括通信的順序和傳輸速率等。①

并行通信/串行通信;②

同步通信/異步通信;③

有線通信/無線通信;④近距離通信/遠(yuǎn)距離通信...

2.通信協(xié)議3.通信方式近距離無線通信(1)Bluebooth(2)WIFI(3)NFC(4)ZigBee(5)Lora近距離有線通信(1)RS-232(2)RS-422(3)RS-485板級(jí)通信(1)UART(2)I2C(3)SPI汽車級(jí)總線:CAN并行通信串行通信并行通信的特點(diǎn):傳送控制簡單、速度快,但傳輸線較多,成本高。串行通信的特點(diǎn):傳送控制復(fù)雜、速度慢,傳輸線少,成本低。USB:UniversalSerialBus異步通信起始位(1位);數(shù)據(jù)位(8位);奇偶校驗(yàn)位(0/1位);停止位(1位)。

特點(diǎn)易于實(shí)現(xiàn)效率不高異步通信特征:收、發(fā)設(shè)備時(shí)鐘獨(dú)立,以數(shù)據(jù)幀為單位傳輸

遠(yuǎn)距離有線通信調(diào)制解調(diào)器調(diào)制解調(diào)

DTE:數(shù)據(jù)終端設(shè)備DCE:數(shù)據(jù)通信設(shè)備近距離有線通信RS-232C是DTE與DCE間的接口標(biāo)準(zhǔn)。DB-25連接器DB-9連接器

RS-232C采用負(fù)邏輯電平:-3~-25V為邏輯“1”,+3~+25V為邏輯“0”。新標(biāo)準(zhǔn)RS-485改善了傳輸特性,應(yīng)用廣泛。4.近距離有線通信接口標(biāo)準(zhǔn)

RS232接口定義插針序號(hào)信號(hào)名稱功能信號(hào)方向1

PGND保護(hù)接地

2(3)TXD發(fā)送數(shù)據(jù)(串行輸出)DTE→DCE

3(2)RXD接收數(shù)據(jù)(串行輸入)DTE←DCE

4(7)RTS請求發(fā)送DTE→DCE

5(8)CTS允許發(fā)送DTE←DCE

6(6)DSRDCE就緒(數(shù)據(jù)建立就緒)DTE←DCE

7(5)

SGND信號(hào)接地

8(1)DCD載波檢測DTE←DCE

20(4)DTRDTE就緒(數(shù)據(jù)終端準(zhǔn)備就緒)DTE→DCE

22(9)RI振鈴指示DTE←DCE奇偶校驗(yàn)傳輸速率碼元:在串行數(shù)字通信中用時(shí)間間隔相同的符號(hào)來表示數(shù)字。

這樣的時(shí)間間隔內(nèi)的信號(hào)稱為碼元,這個(gè)間隔稱為碼元長度。比特率:表示數(shù)字信號(hào)的傳輸速率,以每秒傳輸二進(jìn)制碼位數(shù)表示。

比特率單位:bit/s波特率:每秒鐘傳送信息的位數(shù),單位:波特(Baud)。常用波特率為:2400、4800、9600、14.4K、19.2K,...,115200傳輸距離與傳輸速率的關(guān)系傳輸距離隨波特率的增加而減小。CRC

如果在數(shù)字通信中,如果每個(gè)碼元用兩個(gè)二進(jìn)制數(shù)字表示,例如,用00、01、10和11分別表示0V、2V、4V和6V,即四相調(diào)制:每個(gè)碼元有2個(gè)比特位。此時(shí)波特率等于比特率一半。

循環(huán)冗余校驗(yàn)(CyclicRedundancyCheck),是數(shù)據(jù)通信領(lǐng)域中最常用的一種查錯(cuò)校驗(yàn)碼,其特征是信息字段和校驗(yàn)字段的長度可以任意選定。5.串行通信的兩個(gè)相關(guān)概念

藍(lán)橋杯4T開發(fā)板外圍功能器件:(1)1線(1-wire)-DS18B20:數(shù)字溫度傳感器(2)2線(I2C)-AT24C02:E2PROM存儲(chǔ)器

-PCF8591:A/D和D/A轉(zhuǎn)換器(3)3線(2+)-DS1302:

實(shí)時(shí)時(shí)鐘芯片(3)4線(SPI)-93C66,TLC5615,TLC549,LTC2308串行通信的傳輸方向

單工

半雙工

全雙工No.12-2計(jì)算機(jī)串行口1.串行口的結(jié)構(gòu)

UART為通用異步收發(fā)器(UniversalAsynchronousReceiver/Transmitter),通常稱為串口,其特點(diǎn)是通信線路簡單,成本低,適用于對數(shù)字信號(hào)傳輸速率要求不高的應(yīng)用場合。

計(jì)算機(jī)UART通常使用DB-9物理接口,應(yīng)用兩條信號(hào)線和地線就能夠進(jìn)行全雙工通信。其中TxD為數(shù)據(jù)發(fā)送口,RxD為數(shù)據(jù)接收端。單向傳輸數(shù)字信號(hào)時(shí),只需要一條信號(hào)線和地線。2.串行口通信協(xié)議

UART以幀(frame)為單位傳輸數(shù)據(jù),由1比特起始位(START)、(5~)8比特的數(shù)據(jù)位(D0~D7)、0~1比特奇偶校驗(yàn)位(PARITY)和1~2比特停止位(STOP)構(gòu)成。其中START恒為低電平,表示數(shù)據(jù)幀開始;STOP恒為高電平,表示數(shù)據(jù)幀結(jié)束。在幀前和幀后,傳輸線為高電平,為空閑狀態(tài)。UART支持50、100、300、600、1200、2400、4800、9600、38400、19200和115200bits/s等多種傳輸速率,以適應(yīng)不同的設(shè)備接口。在嵌入式系統(tǒng)設(shè)計(jì)中,UART常用于主機(jī)與設(shè)備之間,或者上位機(jī)與下位機(jī)之間的字符通信。

串行口應(yīng)用異步通訊協(xié)議,只傳輸數(shù)據(jù)不傳輸時(shí)鐘,所以收發(fā)時(shí)需要事先約定傳輸速率(波特率或者比特率)和數(shù)據(jù)格式,從而能夠使接收數(shù)據(jù)能夠與發(fā)送的數(shù)據(jù)相對應(yīng)。3.單片機(jī)串行口AT89系列單片機(jī)UART的接收緩沖器和發(fā)送緩沖器邏輯同名、物理分開;收發(fā)雙緩沖。(2)串行口控制寄存器SCON(★)(1)中斷允許寄存器IE:ESSM0和SM1:工作方式控制位TI:UART發(fā)送完成中斷標(biāo)志位,需要手動(dòng)清0RI:UART接收完成中斷標(biāo)志位,需要手動(dòng)清0ES:串行口中斷允許控制位:=1允許中斷,=0禁止中斷;REN:串行接收使能位:

=1允許接收,=0禁止接收;不建議學(xué)習(xí)!(3)電源控制寄存器PCON:SMODSMOD:波特率倍增位。當(dāng)SMOD=1時(shí),波特率提高一倍。復(fù)位時(shí),SMOD=0。不建議學(xué)習(xí)!(4)串行口工作方式:0/1/2/3方式0:用作同步移位寄存器,

用于擴(kuò)展并行口;

波特率=fosc/12。RXD:輸入或輸出引腳TXD:移位脈沖輸出引腳發(fā)送和接收都是8位波特率固定為:fosc/12CR用于對74LS164清0S/L下降沿將并行數(shù)據(jù)裝入,高電平啟動(dòng)數(shù)據(jù)移入。

不建議學(xué)習(xí)!

方式1:8位UART(10位幀數(shù)據(jù))

起始位:1位數(shù)據(jù)位:8位停止位:1位

方式2/方式3:9位UART(11位幀數(shù)據(jù))起始位:1位數(shù)據(jù)位:9位停止位:1位串口發(fā)送時(shí)序(寫SBUF啟動(dòng)發(fā)送過程)串口接收時(shí)序(置REN=1啟動(dòng)接收過程)(5)串行口發(fā)送/接收時(shí)序【方式0/2】固定波特率:

方式2波特率=(2SMOD/64)*fosc【方式1/3】可變波特率:波特率=(2SMOD/32)*

定時(shí)器T1溢出率

定時(shí)器T1溢出率=fosc/{12×[256-(TH1)]}fosc=11.0592MHz時(shí):方式0波特率=921600;方式2波特率=345600/172800.方式0波特率=fosc/12

波特率要選擇標(biāo)稱值。由于TH1的初值是整數(shù),為了獲得標(biāo)稱值,依公式晶振頻率要選11.0592MHz。

方式1和方式3波特率與TH1初值的對應(yīng)關(guān)系:波特率/(b/s)19.2k9600480024001200TH1初值FDHFDHFAHF4HE8HSMOD10000(6)串口波特率STEP1:設(shè)置定時(shí)器T1(工作方式2),作為波特率發(fā)生器。STEP2:選擇UART波特率,裝載TH1和TL1STEP3:啟動(dòng)定時(shí)器T1(設(shè)置TR1=1)STEP4:確定串行口工作方式(SCON),

并使AUXR=0x00(default);STEP5:允許串口中斷(設(shè)置ES=1)STEP6:打開總中斷(設(shè)置EA=1)(7)串行口初始化(8)串行口的基本應(yīng)用//文件名CP12_UARTdemo.c#include<STC15F2K60S2.h>#include"user.c"http://串口初始化子程序

voidUartS1Init(void)//9600bps@11.0592MHz{PCON&=0x7F; //波特率不倍速SCON=0x50; //8位數(shù)據(jù),可變波特率AUXR&=0xBF; //設(shè)置定時(shí)器1時(shí)鐘為Fosc/12,即12TAUXR&=0xFE; //選擇定時(shí)器1為波特率發(fā)生器TMOD&=0x0F; //清除定時(shí)器1模式位TMOD|=0x20; //設(shè)定定時(shí)器1為8位自動(dòng)重裝方式TL1=0xFD; //設(shè)定定時(shí)初值【任務(wù)描述】應(yīng)用UART實(shí)現(xiàn)單片機(jī)與STC-ISP串口助手的數(shù)據(jù)收發(fā)。

設(shè)置UART為10位幀數(shù)據(jù)模式,波特率為9600bps。數(shù)據(jù)發(fā)送采用查詢方式,數(shù)據(jù)接收采用中斷方式。單片機(jī)每接收到一個(gè)字節(jié)數(shù)據(jù)后,返回該字節(jié)數(shù)據(jù)和字符串“received”給串口助手進(jìn)行驗(yàn)證。TH1=0xFD;//設(shè)定定時(shí)器重裝值ET1=0;//禁止定時(shí)器1中斷TR1=1;//啟動(dòng)定時(shí)器1ES=1;//允放串口中斷

EA=1;//開放總中斷}//發(fā)送一個(gè)字節(jié)數(shù)據(jù)voidSend_byte(unsignedcharTxData){SBUF=TxData;//將發(fā)送數(shù)據(jù)送入SBUF時(shí),自動(dòng)啟動(dòng)發(fā)送過程while(TI==0);//等待發(fā)送結(jié)束(發(fā)送結(jié)束TI由硬件自動(dòng)置1)TI=0;//發(fā)送結(jié)束,將TI清零,允許發(fā)送下一個(gè)字節(jié)數(shù)據(jù)。}//發(fā)送字符串子程序voidSend_string(unsignedchar*str){while(*str!='\0')//'\0'為字符串結(jié)束標(biāo)志{Send_byte(*str);//發(fā)送1個(gè)字符str++;//指向下一個(gè)要發(fā)送的字符}}//串口接收中斷服務(wù)程序

voidUART_RecvByte(void)interrupt4{unsignedcharRxData;

//將接收中斷標(biāo)志位清零,允許串口繼續(xù)接收數(shù)據(jù)RI=0;RxData=SBUF;//讀取接收到的數(shù)據(jù)

LED_drv(~RxData);//用于分析數(shù)據(jù)編碼Send_byte(RxData);//發(fā)回接收到的數(shù)據(jù)進(jìn)行驗(yàn)證Send_string("received\r\n");//發(fā)送反饋信息“received”}voidmain(void){BEEP_off();//關(guān)閉蜂鳴器RELAY_off();//斷開繼電器LED_drv(0xff);//熄滅LEDUartS1Init();//串口S1初始化while(1);//空循環(huán),等待接收中斷}提示:如果應(yīng)用方式0(16位自動(dòng)重裝)作為波特發(fā)生器,與應(yīng)用方式2(8位自動(dòng)重裝)作為波特發(fā)生器的方式相比,能夠得到相對準(zhǔn)確的波特率,從而增強(qiáng)串口通信的可靠性?!竟こ虒?shí)踐】LED亮度和閃爍頻率控制(2)

新建工程,編寫代碼,產(chǎn)生頻率為100Hz的PWM控制LED的亮度。具體要求如下:(1)單片機(jī)上電后,先關(guān)閉蜂鳴器和繼電器,并預(yù)設(shè)PWM信號(hào)的占空比為30%;(2)通過STC-ISP串口助手發(fā)送數(shù)字“7”時(shí),PWM信號(hào)的占空比按“0→10%→20%→30%→50%→90%”循環(huán)變化,以控制LED的亮度;(3)通過STC-ISP串口助手發(fā)送數(shù)字“6”時(shí),LED的閃爍頻率以0.2s、0.5s和0.8s為間隔依次切換;(3)通過發(fā)送字符“?”查詢狀態(tài)和閃爍間隔。分析

串行口S1默認(rèn)使用定時(shí)器T1為波特率發(fā)生器,與11.2節(jié)原應(yīng)用程序中定時(shí)器T1用于數(shù)碼管刷新和產(chǎn)生方波信號(hào)相沖突。解決方案:

(1)11.2節(jié):T0用產(chǎn)生PWM,T1用于數(shù)碼管刷新和產(chǎn)生方波信號(hào);

修改:定時(shí)器T1替換為定時(shí)器T2,。。。。

(2)改用定時(shí)器T2作為串行口S1的波特率發(fā)生器。設(shè)計(jì)

改用定時(shí)器T2作為串行口S1的波特率發(fā)生器,通過串口助手發(fā)送數(shù)字“7”和“6”替代按鍵S7和S6控制LED亮度和閃爍頻率,并通過發(fā)送字符“?”查詢當(dāng)前狀態(tài)和閃爍間隔的應(yīng)用程序代碼參考如下。//文件名CP12_PWMduty_twinkling.c#include<STC15F2K60S2.h>#include"user.c"#defineSQ0p2s100//快速閃爍參數(shù)定義#defineSQ0p5s250//中速閃爍參數(shù)定義#defineSQ0p8s400//慢速閃爍參數(shù)定義//數(shù)碼顯示數(shù)據(jù)緩沖區(qū)定義。顯示格式:狀態(tài)1B-占空比2B-閃爍參數(shù)3BunsignedcharDTbuf[8]={3,16,3,0,16,2,5,0};//全局變量定義unsignedcharDuty=3;//占空比控制變量,預(yù)設(shè)占空比30%unsignedintSQmode=SQ0p5s;//方波輸出控制變量,預(yù)設(shè)以0.5s閃爍unsignedcharstate=3;//狀態(tài)變量,預(yù)設(shè)為3bitPWM;//PWM輸出bitSQwav;//方波輸出信號(hào)//定時(shí)器T1和T0初始化voidTimer01Init(){//設(shè)置T1和T0時(shí)鐘均為12T//AUXR&=0x3F; //設(shè)置T1和T0均為定時(shí)器,模式0:16位定時(shí),自動(dòng)重裝初值

TMOD=0x00;

//T0用于1ms定時(shí),裝初值TH0=(65536-1000)/256;TL0=(65536-1000)%256;//T1實(shí)現(xiàn)2ms定時(shí),裝初值TH1=(65536-2000)/256;TL1=(65536-2000)%256;ET0=1;ET1=1;//允許T0和T1中斷TR0=1;TR1=1;//啟動(dòng)T0和T1//EA=1;//開放總中斷}//串口初始化子程序

voidUartS1Init(void) //9600bps@12.000MHz{SCON=0x50; //8位UART,允許接收

AUXR|=0x01; //設(shè)置定時(shí)器T2作為波特率發(fā)器AUXR&=0xFB; //設(shè)置定時(shí)器T2時(shí)鐘為12TT2L=0xE6; //設(shè)置T2計(jì)數(shù)初值T2H=0xFF; //設(shè)置T2計(jì)數(shù)初值IE2&=0xFB;//設(shè)置IE2比特位ET2=0,禁止T2中斷AUXR|=0x10;//設(shè)置AUXR比特位T2R=1,啟動(dòng)T2ES=1;//允許串口中斷

EA=1;//開放總中斷}//T0中斷服務(wù)程序,用于產(chǎn)生PWM信號(hào)voidTimer0isr()interrupt1{staticunsignedcharPWMcnt=0;//PWM計(jì)數(shù)點(diǎn)變量PWMcnt++;//中斷次數(shù)加1//PWMcnt為10時(shí)對應(yīng)一個(gè)PWM周期if(PWMcnt>=10)PWMcnt=0;//生成PWM信號(hào)PWM=(PWMcnt<Duty)?1:0;}//T1中斷服務(wù)程序,用于刷新數(shù)碼管、鍵值采樣和產(chǎn)生方波信號(hào)voidTimer1isr()interrupt3{staticunsignedcharDTno=0xff;//數(shù)碼管序號(hào)變量staticunsignedintSQcnt=0;//中斷次數(shù)統(tǒng)計(jì)變量DTno++;//數(shù)碼管刷新過程DTno&=0x07;DT_drv(DTno,DTbuf[DTno]);SQcnt++;//中斷次數(shù)加1if(SQcnt>=SQmode)//方波輸出控制{SQcnt=0;SQwav=~SQwav;}}//串口發(fā)送字節(jié)數(shù)據(jù)子程序voidSend_byte(unsignedcharTxData){SBUF=TxData;//將數(shù)據(jù)送到SBUF,自動(dòng)啟動(dòng)發(fā)送過程while(TI==0);//等待發(fā)送結(jié)束(結(jié)束時(shí)TI由硬件自動(dòng)置1)TI=0;//將TI清零,允許發(fā)送下一字節(jié)數(shù)據(jù)。}//串口發(fā)送字符串子程序voidSend_string(unsignedchar*str){while(*str!='\0')//'\0'為字符串結(jié)束標(biāo)志{Send_byte(*str);//發(fā)送1個(gè)字符str++;//指向下一個(gè)發(fā)送字符}}//串口接收中斷服務(wù)程序

voidUART_RecvData(void)interrupt4{

unsignedcharRxData;RI=0;//將接收中斷標(biāo)志位清零(讓串口可以繼續(xù)接收數(shù)據(jù))

RxData=SBUF;//讀取接收到的數(shù)據(jù)

if(RxData==0x37)//接收的命令為7時(shí)(注:7的ASCII為0x37){switch(state)//根據(jù)狀態(tài)碼調(diào)整LED亮度{case0:state=1;Duty=1;break;case1:state=2;Duty=2;break;case2:state=3;Duty=3;break;case3:state=4;Duty=5;break;case4:

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論