I/O口配置
STC2C5201AD系列單片機所有I/O口均可由軟件配置成4種工作類型之一,如下表所示。4種類型分別為:準雙向口/弱上拉(標準8051輸出模式)、強推挽輸出/強上拉、僅為輸入(高阻)或開漏輸出功能。每個口由2個控制寄存器中的相應位控制每個引腳工作類型。STC- 2C5201AD系列單片機上電復位后為準雙向口/弱上拉(傳統805 的I/O口)模式。2V以上時為高電平,0.8V以下時為低電平。每個I/O口驅動能力均可達到20mA,但整個芯片最大不得超過90mA。
P3口設定 <P3.7,P3.6,P3.5,P3.4,P3.3,P3.2,P3.1,P3.0口>(P3口地址:B0H)口地址:B0H))
P3M1 [7:0] |
P3M0 [7 : 0] |
I/O 口模式 |
0 |
0 |
準雙向口(傳統805 I/O 口模式) , 灌電流可達20mA , 拉電流為230μA , 由于制造誤差, 實際為250uA~ 50uA |
0 |
1 |
強推挽輸出( 強上拉輸出, 可達20mA, 要加限流電阻) |
1 |
0 |
僅為輸入( 高阻) |
1 |
1 |
開漏(Open Drain), 內部上拉電阻斷開, 要外上拉 |
MOV P3M1,#10100000B
MOV P3M0 #10010000B
P3.7為開漏P3.5為高阻P3.4為強推挽輸出,其他為準雙向
PWM輸出時I/O口的狀態
當某個I/O口作為PWM輸出用時,該口的狀態:
PWM 之前口的狀態
|
PWM時口的狀態
|
弱上拉/準雙向口 |
強推挽輸出/強上拉輸出,要加輸出限流電阻10K ~1K |
強推挽輸出 |
強推挽輸出/強上拉輸出,要加輸出限流電阻10K ~1K |
僅為輸入/高阻 |
PWM無 |
開漏 |
開漏 |
普通I/O口---〉限流電阻用(10K到1K)-----〉接負載
4.6.如何讓I/O口上電復位時為低電平
普通8051單片機上電復位時普通I/O口為弱上拉高電平輸出,而很多實際應用要求上電時某
些I/O口為低電平輸出,否則所控制的系統(如馬達)就會誤動作,現STC12系列單片機由于既有弱上拉輸出又有強推挽輸出,就可以很輕松的解決此問題。現可在STC12系列單片機I/O口上加一個下拉電阻(1K/2K/3K),這樣上電復位時,雖然單片機內部I/O口是弱上拉/高電平輸出,但由于內部上拉能力有限,而外部下拉電阻又比較小,無法將其拉高,所以該I/O口上電復位時外部為低電平。如果要將此I/O口驅動為高電平,可將此I/O口設置為強推挽輸出,而強推挽輸出時,I/O口驅動電流可達20mA,故肯定可以將該口驅動為高電平輸出。
10.3.4 脈寬調節模式(PWM)
脈寬調制(PWM,Pulse Width Modulation)是一種使用程序來控制波形占空比、周期、相位波形的技術,在三相電機驅動、D/A轉換等場合有廣泛的應用。STC 2C520 AD系列單片機的PCA模塊可以通過程序設定,使其工作于8位PWM模式。PWM模式的結構如下圖所示。
所有PCA模塊都可用作PWM輸出(上圖)。輸出頻率取決于決于PCA定時器的時鐘源。
由于所有模塊共用僅有的PCA定時器,所有它們的輸出頻率相同。各個模塊的輸出占空
是獨立變化的,與使用的捕獲寄存器[EPCnL,CCAPnL]有關。當寄存器寄存器CL的值小于[EPCnL, CCAPnL]時,輸出為低;當寄存器CL的值等于或大于[EPCnL,CCAPnL]時,輸出為高。當CL的值由FF變為00溢出時,[EPCnH,CCAPnH]的內容裝載到[EPCnL,CCAPnL]中。這樣就可實現無干擾地更新PWM。要使能PWM模式,模塊CCAPMn寄存器的PWMn和ECOMn位必須置位。由于PWM是8位的,所以: PWM的頻率=:PCA時鐘輸入源頻率/256 PCA時鐘輸入源可以從以下8種中選擇一種:SYSclk,SYSclk/2,SYSclk/4,SYSclk/6,SYSclk/8,SYSclk/ 2,定時器0的溢出,ECI/P3.4輸入。。
舉例:要求PWM輸出頻率為38KHz,選SYSclk為PCA/PWM時鐘輸入源,求出SYSclk的值
由計算公式38000=SYSclk/256 ,得到外部時鐘頻率SYSclk=38000 x 256 x =9,728,000
如果要實現可調頻率的PWM輸出,可選擇定時器0的溢出率或者ECI腳的輸入作為PCA/PWM的時鐘輸入源
當EPCnL = 0及CCAPnL=0x00H時,PWM固定輸出高
當EPCnL = 1及CCAPnL=0xFFH時,PWM固定輸出低
例:
#define PCA_IDLE_DISABLE 0 //1:MCU在IDLE模式時禁止PCA工作。 0: MCU在IDLE模式時允許PCA工作。
#define PCA_SOURCE_SELECT 1 //選擇PCA的基準時鐘源。
//0:系統時鐘Fosc/12。
//1:系統時鐘Fosc/2。
//2:定時器0的溢出。
//3:ECI/P3.4腳的外部時鐘輸入(最大=Fosc/2)。
//4:系統時鐘Fosc。
//5:系統時鐘Fosc/4。
//6:系統時鐘Fosc/6。
//7:系統時鐘Fosc/8。
void en_PCA(void)
{
CMOD= (PCA_IDLE_DISABLE << 7) | (PCA_SOURCE_SELECT << 1); //初始化PCA模式寄存器。
CL= 0x00; //清除PCA計數機
CH= 0x00;
CR= 1; //啟動PCA計數機 CL 00->FF
}
void initPWM()
{
PWM=0x00;
PCA_PWM0=0x02; //初始化輸出0
CCAP0H= 0xFF; //初始化輸出0
CCAPM0= 0x42; //設置PCA模塊0工作在PWM模式 .......................
PCA_PWM1=0x02; //初始化輸出0
CCAP1H= 0xFF; //初始化輸出0
CCAPM1= 0x42; //設置PCA模塊1工作在PWM模式
en_PCA(); //打開PMW
}
DALE R01F采樣電阻,阻值是 0.01歐
RXD 為接收數據的引腳,TXD 為發送數據的引腳
PMW0 輸出全1
PCA_PWM0=0x00;
CCAP0H = 0x00;
PMW0輸出全0
PCA_PWM0=0x00;
CCAP0H = 0x00; //set PWM wide