時鐘
IO(輸入、輸出,如何配置)
IO
數字和模擬資源能夠經過25個I/O 引腳(C805 1F3 2 0 ),每一個端口引腳均可以被定義爲
1
通用I/O(GPIO)或 0 模擬輸入
全部端口I/O 都耐5V電壓
端口I/O 單元能夠被配置爲
漏極開路或推輓方式,口輸出方式寄存器PnMDOUT 中設置,n = 0,1, 2, 3
P1MDOUT |= 0x0F;//0000 1111
置P1的0-3口爲1即推輓輸出方式
P2MDOUT |= 0x0C;//0000 1100 對應 P2.二、P2.3推輓輸出
寄存器XBR0 和XBR1 用於爲數字I/O 資源分配物理I/O 引腳
PnMDIN 選擇全部端口引腳的輸入方式(模擬或數字)
注意:爲使端口P0、P1和P2. 0 ~ P2 .3 工做在標準端口I/O 輸入/輸出方式,交叉開關必
須被使能。當交叉開關被禁止時,端口輸出驅動器被禁止。P2.4 ~ P2.7 和P3.0 老是做爲標準
GPIO 使用
XBR1 |= ( 1<<6 );
USB時鐘
C8051F 320/ 1 有一個
可編程內部振盪器、一個外部振盪器驅動電路和一個4 倍時鐘乘法器。
能夠經過對OSCICN 和OSCICL 寄存器編程來使能/ 禁止內部振盪器和調節其輸出頻率(如圖
13.1 所示)。系統時鐘(SYSCLK )能夠來自內部振盪器、外部振盪器電路或4 倍時鐘乘法器
二分頻。USB 時鐘(USBCLK )能夠來自內部振盪器、外部振盪器電路或4 倍時鐘乘法器。
表13.3 給出了內部振盪器的電氣特性
一旦內部振盪器的頻率被修改,則它不能再被用做USB 時鐘
4 倍時鐘乘法器容許使用12 M Hz 振盪器產生全速USB 通訊所須要的48MHz 時鐘
用CLKMUL寄存器配置4 倍時鐘乘法器。配置和使能4 倍時鐘乘法器的步驟以下:
1 .經過向寄存器CLKMUL寫0x00來複位時鐘乘法器。
2 .用MULSEL位選擇時鐘乘法器的輸入。
3 .用MULEN位使能時鐘乘法器(CLKM UL | = 0x80 )。
4 .延時大於5 µs 。
5 .用MULINIT位初始化時鐘乘法器(CLKMUL | = 0 x C 0 )。
6 .查詢等待MULRDY => ‘1 ’。
//都是同樣的乘法寄存器配置
void Clock_Init( void )
{
INT8U i;
if( ( CLKMUL & ( 1<<5 ) ) ) return;//如乘法寄存器鎖定,則返回
CLKMUL = 0;
CLKMUL |= ( 1<<7 );//時鐘乘法器使能位
for( i = 0; i < 250; i ++ );//延遲
CLKMUL |= 0xC0;//1100 0000 ,初始化時鐘乘法器
for( i = 0; i < 250; i ++ );
while( !( CLKMUL & ( 1<<5 ) ) );//時鐘乘法器穩定後,MULRDY的讀出值爲‘1 ’
CLKSEL = ( 2<<0 );
}
void Port_Init (void)
{
XBR1 = 0x40; // Enable crossbar and weak pullups
XBR0 = 0x01;
P0MDOUT |= 0x10; // Set TX pin to push-pull
}
void UART0_Init (void)
{
SCON0 = 0x10; // 0x0001 0000
8位UART 無 中止位的邏輯電平被忽略 UART0接收容許
// SCON0: 8-bit variable bit rate
// level of STOP bit is ignored
//
RX enabled
// ninth bits are zeros
// clear RI0 and TI0 bits
//配置
T1M 、
SCA1:0
if (SYSCLK/BAUDRATE/2/256 < 1) {
TH1 = -(SYSCLK/BAUDRATE/2);
CKCON |= 0x08; //
T1M = 1; SCA1:0 = xx
} else if (SYSCLK/BAUDRATE/2/256 < 4) {
TH1 = -(SYSCLK/BAUDRATE/2/4);
CKCON &= ~0x0B; // T1M = 0; SCA1:0 = 01
CKCON |= 0x01;
} else if (SYSCLK/BAUDRATE/2/256 < 12) {
TH1 = -(SYSCLK/BAUDRATE/2/12);
CKCON &= ~0x0B; // T1M = 0; SCA1:0 = 00
} else if (SYSCLK/BAUDRATE/2/256 < 48) {
TH1 = -(SYSCLK/BAUDRATE/2/48);
CKCON &= ~0x0B; // T1M = 0; SCA1:0 = 10
CKCON |= 0x02;
} else {
while (1); // Error. Unsupported baud rate
}
TL1 = TH1; // init Timer1
TMOD &= ~0xf0; // TMOD: timer 1 in 8-bit autoreload
TMOD |= 0x20;
TR1 = 1; // START Timer1
TI0 = 1; // Indicate TX0 ready
}
用配置器來配置:
ADC0CN = 0x02; // ADC0 disabled, normal tracking,
// conversion triggered on TMR2 overflow ADC0
用時鐘2來觸發
EIE1 |= 0x08; // enable ADC0 conversion complete int.
中斷配置
在ADCMUX設置那裏選P2.4,和GND。
引腳配置
AMX0P = 0x0C; // ADC0 positive input = P2.4
AMX0N = 0x1F; // ADC0 negative input = GND
// i.e., single ended mode
P2MDIN = 0xEF;//P2.4設置爲模擬輸入,portinit處
還要串口配置和時鐘2
I2C
void SMBus_Init(void); void SMBus_ISR(void);