您的位置:首页 > 其它

c8051f320学习,单片机不外乎时钟、IO、串口、USB等外设用法

2016-05-20 01:49 441 查看
时钟
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.2、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

}

ADC

用配置器来配置:
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

[align=left]P2MDIN = 0xEF;//P2.4设置为模拟输入,portinit处[/align]
[align=left] [/align]
[align=left]还要串口配置和时钟2[/align]

I2C
void SMBus_Init(void);

void SMBus_ISR(void);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: