C8051F学习笔记1:C8051F最小系统
C8051F是Silicon Laboratories公司推出的增强型51单片机,当然功能很强大,我觉得最吸引人的要算峰值能指令运行达到25MIPS(Million Instructions Per Second(每秒百万条指令)),即与8051相比,在相同时钟下单周期指令运行速度为原来的12倍;整个指令集平均运行速度为原来8051的9.5倍,使8051兼容机系列进入了8位高速单片机行列。
哈哈,下面开始一步步教你制作C8051F的最小系统:
要进行C8051F开发无非要有这些东西:下载线+最小系统开发板+编译软件。
下载线:
这个可以自己制作,网上也有这方面的电路图,为了省事,我是在淘宝上买的,卖家东西很好,是自己开发的USB口下载线,同时也是一个仿真器(C8051F USB口的JTAG/C2下载线 U-EC5仿真器)
http://hi.baidu.com/microgo/blog/item/7ecfc86377bcb4dbe7113afa.html
卖家还把教程、软件、例程和在官网下的应用笔记刻成光盘,这样就省去了我学习C8051F的很多时间(
C8051F最小系统
我没有买开发板,是在万用板上焊接的。C8051F有很多型号,有些还有100多个管脚,这很费事,所以我选用C8051F320,管脚少,LQFP32封装,只有32个管脚,管脚间距也大,1.27mm。在中发买那种有贴片焊盘的万用板。
C8051F选型
http://www.xhl.com.cn/xxzn/xxzn.asp
C8051F开发板参考电路图
http://www.xhl.com.cn/pcb/1.htm
C8051F最小系统构成
3.3V电源+低电平复位+JTAG/C2+(晶振)
电源部分
电源采用AMS1117-3.3V,AMS1117的好处是电压压降低,大于1.7V,所以输入用5V电源的话,也可以稳压到3.3V。当然C8051F在2.7V~3.6V之间都能正常工作。如果没有1117的话,也可以采用可调的稳压芯片LM317,不过对于LM337,在接入电路前最好把输出电压调节到3.3V左右。
AMS1117
1- Ground/Adjust
2- VOUT
3- VIN
AMS1117有两种版本,一种是可调的,1脚为ADJ,电路如下图。一种是1脚直接接地。所以购买的时候要注意(买AMS1117-3.3V)。
LM317/LM217/LM117 1.2~25V可调电压稳压电路
复位部分
要注意c8051f单片机采用低电平复位,而at89x5x采用高电平复位。
传统51单片机复位电路(高电平复位)
传统51单片机复位也可以采用复位芯片(MAX810/STC810)
C8051F复位电路(低电平复位)
C8051单片机复位芯片选择MAX809.
JTAG/C2
C8051F单片机有两种接口形式,JTAG和C2接口。
当MCU 为C8051F00X/01X/02X/04X/06X/12X/2XX 系列时,选择JTAG;
当MCU 为C8051F3XX、4XX、5XX 系列时,选择C2。
最好参考对应的原理图。
JTAG方式:
C2方式:
如果你用的C8051F单片机为C2接口,只需要留三个口即可,即C2D、C2CK、GND,注意的是C2CK上需要加一个2K-10K的上拉电阻。
振荡器
在上面的C8051F最小系统原理图中,可以看到外接了晶振,其实这部分对于C8051F来说可以省略。
C8051F有内部振荡器,所以在要求不高的时候可以只是用内部振荡就行了。C8051F也自带外部振荡驱动电路,外部振荡器电路可以驱动外部晶体、陶瓷谐振器、电容或RC网络。也可以使用一个外部CMOS时钟提供系统时钟。
编译软件
编译软件可以采用IAR Embedded Workbench for MCS-51、Keil μVsion2/3、Silicon Laboratories IDE软件。下载线与编译软件的连接方法可以参考USB Debug Adapter For C8051F MCU 用户
手册
华为质量管理手册 下载焊接手册下载团建手册下载团建手册下载ld手册下载
。
part1 part2 part3
我用万用板焊接的C8051F最小系统(C8051F最小系统+2个按键+2个LED+RS232+USB)
C8051F学习笔记2:C8051F振荡器
C8051F320/1有一个可编程内部振荡器、一个外部振荡器驱动电路和一个4倍时钟乘法器。
系统时钟(SYSCLK)可以来自内部振荡器、外部振荡器电路或4倍时钟乘法器二分频。
USB时钟(USBCLK)可以来自内部振荡器、外部振荡器电路或4倍时钟乘法器。
振荡器框图
可编程内部振荡器
系统复位后内部振动器默认系统时钟并工作在1.5MHz。
两个寄存器:OSCICL(内部振荡器校准寄存器)和OSCICN(内部振荡器控制寄存器)。
OSCICL(内部振荡器校准寄存器)
OSCICL复位值已经过工厂校准,对应的基频为12MHz,精度为±1.5%,该频率适合作为USB时钟。软件可以下面所述修改内部振荡器的频率。 一般情况下是不用对OSCICL进行配置。
OSCICN(内部振荡器控制寄存器)
IOSCEN:为内部振荡器使能位,0禁止,1使能,手册上写复位值为0,是错误的,应该为1,这样,复位后系统时钟默认为内部振荡器。
IFCN1-0:内部振荡器分频选择,复位后为00,系统默认为1.5MHz
内部振荡器初始化
OSCICN |= 0x03; //内部振荡器输出为12MHz
程序也可以这样写
OSCICN = 0x83;
//内部振荡器输出为0x83——12MHz; 0x82——6MHz;0x81 3MHz
当程序没有对振荡器初始化时,默认系统时钟采用内部振荡器,并运行在1.5MHz频率下。
OSCICN = 0x83;
外部振荡器驱动电路
外部振荡器电路可以驱动外部晶体、陶瓷谐振器、电容或RC网络和外部CMOS时钟提供系统时钟。
当使用外部振荡器电路时,必须对所用端口引脚进行配置。端口I/O交叉开关应被配置为跳过被振荡器占用的引脚。
当外部振荡器电路被配置为CMOS时钟方式时,端口引脚P0.3被用作XTAL2。
当外部振荡器电路被配置为晶体/谐振器方式时,端口引脚P0.2和P0.3分别被用作XTAL1和XTAL2
当外部振荡器电路被配置为RC方式时,端口引脚P0.3被用作XTAL2。
当外部振荡器电路被配置为电容方式时,端口引脚P0.3被用作XTAL2。
OSCXCN:外部振荡器控制寄存器
OSCXCN(外部振荡器控制寄存器)的具体配置方法可以参考应用笔记“AN002 配置内部和外部振荡器”。
下载:
使用外部RC或外部C连接要注意:
1.由于RC振荡频率误差较大,建议在可能的情况下,波特率尽可能小,以免通讯失误。
2.如果单片机之间通讯,且单片机为同型号,均采用相同值的RC振荡,只要按相同的值设定波特率即可。
3.如果产品是与计算机通讯的,可让计算机以300波特率发00H,用单片机测一下,需编程处理。
4.其它测定频率的办法:
(1)用带有晶振振荡的单片机来测,需编程处理。
(2)用仿真机来测,需编程处理。
(3)用RC振荡的单片机测定频率信号源(频率要稳、准、低),
需编程处理。
4倍时钟乘法器
用CLKMUL寄存器配置4倍时钟乘法器。配置和使能4倍时钟乘法器的步骤如下:
1.通过向寄存器CLKMUL写0x00来复位时钟乘法器。
2.用MULSEL位选择时钟乘法器的输入。
3.用MULEN位使能时钟乘法器(CLKMUL | = 0x80)。
4.延时大于5 μs。
5.用MULINIT位初始化时钟乘法器(CLKMUL | = 0xC0)。
6.查询等待MULRDY =>‘1’。
注意:当使用外部振荡器作为4倍时钟乘法器的输入时,外部振荡源必须在乘法器被初始化之前被使能并稳定运行。
CLKMUL:时钟乘法器控制寄存器
要注意的是,4倍时钟乘法器使能(MULEN=1),MULSEL选择4倍时钟乘法器的输入,如果选择的是内部振荡器(MULSEL=00),则4倍时钟乘法器的输出为24MHz(12MHzX4÷2),与IFCN1-0无关,既是无论内部振荡器是不分频还是2,4,8分频,4倍时钟乘法器的输出都是24MHz。(系统初始的出厂校准频率为12MHz,OSCICL没动)
例子:
void Oscillator_Init()
{
int i = 0;
CLKMUL = 0x80; //时钟乘法器使能,连接时钟乘法器的是内部振荡器
for (i = 0; i < 20; i++); // Wait 5us for initialization
CLKMUL |= 0xC0;
while ((CLKMUL & 0x20) == 0);
CLKSEL = 0x02; //4倍时钟乘法器/2
OSCICN = 0x83; //使能内部振荡
}
void Oscillator_Init()
{
int i = 0;
OSCXCN = 0x20; //外部COMS时钟方式
CLKMUL = 0x82; //时钟乘法器使能,连接时钟乘法器的是外部振荡器
for (i = 0; i < 20; i++); // Wait 5us for initialization
CLKMUL |= 0xC0;
while ((CLKMUL & 0x20) == 0);
CLKSEL = 0x02; //4倍时钟乘法器/2
OSCICN = 0x03; //禁止内部振荡
}
系统时钟和USB时钟选择
这不是真正的振荡器框图,只是对时钟选择寄存器(CLKSEL)的示意图。CLKSEL的位1-0 CLKSL1-0三选一,在
内部振荡器(由寄存器OSCICN中IFCN位选择分频系数)12MHz/6MHz/3MHz/1.5MHz
外部振荡器
内部振荡器24MHz/外部振荡器频率
三个中选择一个作为系统时钟。
CLKSEL:时钟选择寄存器
选择振荡器的过程很繁琐,我们可以借助Configuration Wizard 可以为Silicon Laboratories MCU自动生成振荡器的初始化代码,简化了C8051F的开发。
振荡器配置有5个标签页。
内部振荡器设置(OSCICN)
外部振荡器设置(OSCXCN)
内部振荡器使能(Enable Internal Oscilator)和外部振荡器禁止(External Oscilator Off)要同时有效。
4倍时钟乘法器选择(CLKMUL)
系统时钟选择(CLKSEL)
如果选择了4倍时钟乘法器使能(Enable Clock Multiplier),系统时钟选择就选择(Use Clock Multiplier/2 as SYSCLK),否则根据前面是内部振荡器使能还是外部振荡器使能,选择系统时钟。
SYSCLK是系统时钟的缓冲输出,输出的是系统时钟。可以在交叉开关中允许其输出到输出端口引脚。也可以通过输出SYSCLK,测试振荡器设置是否满足设计的预期。
配置管脚P0.0(C8051F320的2脚)为系统时钟SYSCLK输出,数字推免输出。
void Port_IO_Init()
{
// P0.0 - SYSCLK, Push-Pull, Digital
P0MDOUT = 0x01;
XBR0 = 0x08;
XBR1 = 0x40;
}
下面程序把C8051F320配置成内部振荡,4倍时钟乘法器,SYSCLK管脚输出24MHz频率。
程序下载:
C8051F学习笔记3:优先权交叉开关译码器
数字和模拟资源可以通过25个I/O引脚(C8051F320)每个端口引脚都可以被定义为通用I/O(GPIO)或模拟输入。P0.0 ~ P2.3可以被分配给内部数字资源
特点:
所有端口I/O都耐5V电压。
端口I/O单元可以被配置为漏极开路或推挽方式。
端口I/O初始化 端口 I/O 初始化包括以下步骤:
1. 用端口输入方式寄存器(PnMDIN)选择所有端口引脚的输入方式(模拟或数字)。
2. 用端口输出方式寄存器(PnMDOUT)选择所有端口引脚的输出方式(漏极开路或推挽)。
3. 用端口跳过寄存器(PnSKIP)选择应被交叉开关跳过的那些引脚。
4. 将引脚分配给要使用的外设(XBR0、XBR1)。
5. 使能交叉开关(XBARE = ‘1’)。
下面以端口P0为例
PnMDIN: 端口输入方式寄存器
对应的P0MDIN[n] =0 模拟输入
P0MDIN[n]=1 数字输入(默认)
PnMDOUT: 端口出方式寄存器
对应的P0MDOUT[n] =0 漏极开路(默认)
P0MDOUT[n] =1 推挽输出
推挽输出,push-pull,不需要外加驱动电路,可以直接驱动外面的芯片。
推挽输出的时候,端口输出高电平,NMOS截止,PMOS导通,把IO口拉高;端口输出为低电平,PMOS截止,NMOS导通,把IO口拉低,适合驱动一些TTL负载,LED,或是通讯时用作数据或时钟发送;
漏极开路,open-drain,需要外加电阻上拉到电源。
漏极开漏输出时PMOS被禁止,只有保留NMOS,当端口输出低电平时,NMOS导通,把IO拉低;但输出端口为高电平时,NMOS截止,端口没有输出了高阻浮空状态),如果加上外部上拉电阻,输出就变成了高电平1,适合线与或是用作I2C通讯。
模拟输入,Analog in
模拟输入被使能时,其它IO方式将被禁止,模拟信号直接经过一个Pass Gate 送入MCU内部的ADC;
数字输入,Digital in
当数字输入时,IO口输出禁止,数字信号经过 Schmitt Trigger(施密特触发器 )送入内部逻辑。
特别需要注意的是当IO口用作输入端口时:
有两种方法:
1、 禁止IO输出,配置为数字输入。注意是所有的IO端口的输出方式都被禁止
2、 配置为OD方式。这时外部的高电平会保持,低电平会把IO拉低。
通常中断输入,数据输入时可以这样配置
不管交叉开关是否将端口引脚分配给某个数字外设,都需要对端口驱动器的输出方式进行设置。例外情况是SMBus上的SDA和SCL及UART的RXD引脚,这些引脚被自动配置为漏极开路。
关于推免和漏极开漏可参考
1)C8051F单片机中IO的使用
http://blog.ednchina.com/espace/45355/message.aspx
2)漏级开路 VS 推挽方式
http://qzone.qq.com/blog/4458920-1217831198
3)8051 P0口
P0SKIP:端口0跳过寄存器
PnSKIP[n]=0 引脚不被交叉开关跳过;(默认)
PnSKIP[n]=0 引脚被交叉开关跳过。
XTAL1(P0.2)脚和XTAL2(P0.3)脚用作外部振荡器输入管脚时,要跳过交叉开关优先权译码表(P0SKIP = 0x0C)。
XBR0:端口I/O交叉开关寄存器0
XBR1:端口I/O交叉开关寄存器1
交叉开关负责SMBus、SPI、UART、定时器捕捉模块、外部PCA输入、比较器输出、定时器外部输入、/SYSCLK以及A/D转换启动输入的引脚分配。必须在访问这些外设的I/O之前配置和允许交叉开关
未指定的端口引脚作为通用I/O 。
XBARE=0 交叉开关禁止;
XBARE=1 交叉开关使能。
在交叉开关被使能之前,外部引脚保持标准端口I/O方式(输入)。
没有引脚被跳过的交叉开关优先权译码表
可以通过Silicon Labs IDE软件的配置向导(Configuration Wizard)配置I/O管脚,如下图,配置UART0和SPI0和SMBus。UART0的TX0、RX0固定在P0.4和P0.5上,由于SPI0的优先级比SYSCLK高,所以SPI的SCK和MISO依次配置到管脚P0.0、P0.1、(P0.1的优先级比P0.1高,依次类推)。P0.2和P0.3跳过交叉开关,用于外部振荡器输入(XTAL1和XTAL2)。由于P0.4和P0.5已占,所以SPI剩下的MOSI和NSS配置在P0.6和P0.7。SYSCLK配置在P1.0。
void Port_IO_Init()
{
// P0.0 - SCK (SPI0), Push-Pull, Digital
// P0.1 - MISO (SPI0), Push-Pull, Digital
// P0.2 - Skipped, Push-Pull, Digital
// P0.3 - Skipped, Push-Pull, Digital
// P0.4 - TX0 (UART0), Push-Pull, Digital
// P0.5 - RX0 (UART0), Push-Pull, Digital
// P0.6 - MOSI (SPI0), Push-Pull, Digital
// P0.7 - NSS (SPI0), Push-Pull, Digital
// P1.0 - SYSCLK, Push-Pull, Digital
P0MDOUT = 0xFF;
P1MDOUT = 0x01;
P0SKIP = 0x0C;
XBR0 = 0x0B;
XBR1 = 0x40;
}
要注意的是,首先要使能优先权交叉译码器(Enable Crossbar)。
1)为使端口P0、P1和P2.0 ~ P2.3工作在标准端口I/O输入/输出方式,交叉开关必须被使能。当交叉开关被禁止时,端口输出驱动器被禁止。P2.4 ~ P2.7和P3.0总是作为标准GPIO使用。
2)未被交叉开关分配的端口引脚和未被模拟外设使用的端口引脚都可以作为通用I/O。
C8051F学习笔记4:UART0
C8051F有一个UART0。
UART0特点:
1) UART0是一个异步、全双工串口;
2) UART0具有增强的波特率发生器电路,波特率由定时器1工作在8位自动重载方式产生;
3) 定时器1应被配置为方式2,即8位自动重装载方式。定时器1的重装载值应设置为使其溢出频率为所期望的波特率频率的两倍;
4) 定时器1的时钟可以在6个时钟源中选择:SYSCLK、SYSCLK/4、SYSCLK/12、SYSCLK/48、外部振荡器时钟/8和外部输入T1;
5) UART0的波特率由下面方程决定;
其中T1CLK是定时器1时钟频率,TH1是定时器1的高字节(重装载值);
6) UART0 有两个相关的特殊功能寄存器:
串行控制寄存器(SCON0)和串行数据缓冲器 (SBUF0)。
用同一个 SBUF0 地址可以访问发送寄存器和接收寄存器。
写 SBUF0 时自动访问发送寄存器;
读 SBUF0 时自动访问接收寄存器,不可能从发送数据寄存器中读数据。
7) 如果UART0中断被允许:
每次发送完成 (SCON0中的TI0位被置‘1’),接收到数据字节(SCON0中的RI0位被置‘1’)时将产生中断。
当CPU转向中断服务程序时硬件不清除UART0中断标志。中断标志必须用软件清除,这就允许软件查询UART0中断的原因(发送完成或接收完成)。
由于对UART0相关寄存器的配置比较繁琐,所以借助Silicon Labs IDE软件的配置向导(Configuration Wizard)。
1. UART Mode UART模式选择
8 Bit UART 8位UART
每个数据字节共使用10位:一个起始位、8个数据位(LSB在先)和一个停止位。数据从TX0引脚发送,在RX0引脚接收。在接收时,8个数据位存入SBUF0,停止位进入RB80(SCON0.2)。
8位UART时序图
9 Bit UART 9位UART
在9位UART方式,每个数据字节共使用11位:一个起始位、8个数据位(LSB在先)、一个可编程的第九位和一个停止位。
第九发送数据位由TB80(SCON0.3)中的值决定,由用户软件赋值。它可以被赋值为PSW中的奇偶位P(用于错误
检测
工程第三方检测合同工程防雷检测合同植筋拉拔检测方案传感器技术课后答案检测机构通用要求培训
),或用于多处理器通信。在接收时,第九数据位进入RB80(SCON0.2),停止位被忽略。
8位UART时序图
2. Multiprocessor Communications Enable
UART Mode选相应位时,此选项相应可选
UART Mode="8" bit UART,可选下面两个选项
Logic level of stop bit ignored
RI0 will only be activated if stop bit is logic level 1
UART Mode="9" bit UART,可选下面两个选项
Logic level of ninth bit ignored
RI0 is set and an interrupt is generated only when the ninth bit is logic 1
可参考SCON0的位7和位5
默认是8位UART,停止位逻辑电平忽略。
3. Receive Enable UART接收允许
通常是允许UART0接收,所以
REN0=1;
4. Configure UART Interrupts 配置UART中断
允许UART中断(Enable UART0 Interrupt)
允许总中断 (Enable All Interrupts)
IE = 0x90; //IE位7 EA =1 总中断允许
//IE位4 ES0=1 UART0中断允许位
中断优先级设置
每个中断源都可以被独立地编程为两个优先级中的一个:低优先级或高优先级。一个低优先级的中断服务程序可以被高优先级的中断所中断,但高优先级的中断不能被中断。如果这两个中断的优先级相同,则由固定的优先级顺序决定哪一个中断先得到服务。
5. Configure UART Baud Rate 配置波特率
首先先选择振荡频率(Change Clock Frequency),C8051学习笔记1对震荡器的配置有详细的描述,这里就不详说了,配制成内振荡器+4倍乘法选择器,系统时钟为24MHz。
CLKMUL = 0x80;
for (i = 0; i < 20; i++); // Wait 5us for initialization
CLKMUL |= 0xC0;
while ((CLKMUL & 0x20) == 0);
CLKSEL = 0x02;
OSCICN = 0x83;
选择波特率(Target Baud Rate)为19200bps,T1时钟自动配置成SYSCLK/4 (Prescaled Clock Inputs)。要注意,最后配置出来的实际波特率为19230bps,是有误差的,只要误差小于0.45%,串口通信时就不会有误码。
同时打开定时器1(Enable Timer)。
TCON = 0x40; //TR1=1
TMOD = 0x20;
CKCON = 0x01;
TH1 = 0x64;
6. Configure Port I/O 配置优先权交叉译码器
注意:
要注意的是,首先要使能优先权交叉译码器(Enable Crossbar)。
1)为使端口P0、P1和P2.0 ~ P2.3工作在标准端口I/O输入/输出方式,交叉开关必须被使能。当交叉开关被禁止时,端口输出驱动器被禁止。P2.4 ~ P2.7和P3.0总是作为标准GPIO使用。
2)未被交叉开关分配的端口引脚和未被模拟外设使用的端口引脚都可以作为通用I/O。
UART0管脚分配到P0.4和P0.5,还有一个系统时钟输出,便于检测,SYSCLK分配到P0.0。全都是数字管脚,推挽输出。
P0MDOUT = 0x31;
XBR0 = 0x09;
XBR1 = 0x40;
下面程序是系统时钟(SYSCLK)为24MHz,波特率为19200bps,上电复位后PC机串口调试助手显示: blog.ednchina.com/tengjingshu
PC机通过串口向C8051F发送字符,C8051F串口回传这个字符。
由于C8051F的电源是3.3V,所以RS232电平转换芯片采用MAX3232,我也换过用MAX232,好像也行(