A. 关于C8051的学习
8051单片机学习笔记/概要/总结/备忘
*.I/O引脚和I/O端口
P0(P0.7~P0.0)
1.P0是一个漏极开路型准双向I/O口.
2.在访问外存时, 它是数据总线和地址总线的低8位分时复用接口.
3.在EPROM编程时, 它接收指令字节; 在验证程序时, 输出指令字节, 并要求外接上拉电阻.
P1(P1.7~P1.0) 1.P1口是带内部上拉电阻的8位双向I/O口, 它是通用I/O口.
2.在EPROM编程和程序验证时, 它接收低8位地址.
P2(P2.7~P2.0) 1.P2是带内部上拉电阻的8位双向I/O口.
2.在访问外存时, 它输出8位高地址.
3.在对EPROM编程时和程序验证时, 它接收8位高地址.
P3(P3.7~P3.0) 1.P3是带内部上拉电阻的8位双向I/O口, 它是双功能I/O口.
2.除基本输入/输出功能外, 每个引脚还有特殊功能.
I/O口 特殊/专用功能
P3.0 RXD:串行数据接收
P3.1 TXD:串行数据发送
P3.2 /INT0:外部中断0输入请求
P3.3 /INT1:外部中断1请求输入
P3.4 T0:定时器0外部计数脉冲输入
P3.5 T1:定时器1外部计数脉冲输入
P3.6 /WR:外部数据存储器写信号
P3.7 /RD:外部数据存储器读信号
*.复位寄存器状态
寄存器
内容
寄存器
内容
PC 0000H TMOD 00H
A 00H TCON 00H
B 00H TH0 00H
PSW 00H TL0 00H
SP 07H TH1 00H
DPTR 0000H TL1 00H
P0~P3 0FFH SCON 00H
IP XXX00000B SBUF XX
IE 0XX00000B PCON 00H
*.特殊功能寄存器
特殊功能寄存器
功能名称
地址
复位状态
B 通用寄存器 F0H 00H
A 累加器 E0H 00H
PSW 程序状态字 D0H 00H
IP 中断优先级控制 B8H XXX0000B
P3 P3端口 B0H 0FFH
IE 中断使能控制 A8H 0XX00000B
P2 P2端口 A0H 0FFH
SBUF 串行发送/接收缓冲器 99H XXH
SCON 串行口控制 98H 00H
P1 P1端口 90H 0FFH
TH1 T1定时器高8位 8DH 00H
TH0 T0定时器高8位 8CH 00H
TL1 T1定时器低8位 8BH 00H
TL0 T0定时器低8位 8AH 00H
TMOD 定时器/计数器方式控制 89H 00H
TCON 定时器控制 88H 00H
PCON 电源控制 87H 00H
DPH 地址寄存器高8位 83H 00H
DPL 地址寄存器低8位 82H 00H
SP 堆栈指针 81H 07H
P0 P0端口 80H 0FFH
*.可位寻址的特殊功能寄存器
寄存器名
D7
D6
D5
D4
D3
D2
D1
D0
电源控制寄存器 PCON SMOD GF1 GF0 PD IDL
波特率倍乘位 用户标志 用户标志 掉电方式位 待机方式位
定时器方式控制寄存器 TMOD GATE C/-T M1 M0 GATE C/-T M1 M0
T1门控位 T1定时器/计数器选择 T1工作方式选择 T0门控位 T0定时器/计数器选择 T0工作方式选择
程序状态字 PSW CY AC F0 RS1 RS0 OV P
进位标志 辅助进位标志 用户标志 工作寄存器组选择标志 溢出标志 奇偶标志
中断优先级控制器 IP PS PT1 PX1 PT0 PX0
串口优先级设置 T1优先级设置 /INT1优先级设置 T0优先级设置 /INT0优先级设置
中断使能寄存器 IE EA ES ET1 ETX ET0 EX0
CPU总中断使能 串口中断使能 T1中断使能 /INT1中断使能 T0中断使能 /INT0中断使能
串口控制寄存器 SCON SM0 SM1 SM2 REN TB8 RB8 TI RI
串口工作方式选择位 允许接收 发送数据第9位 接收数据第9位 发送完成中断标志 接收数据中断标志
定时器控制寄存器 TCON TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
T1溢出标志 T1运行控制位 T0溢出位 T0运行控制位 /INT1中断标志 /INT1触发方式 /INT0中断标志 /INT0触发方式
*.中断系统
中断源
入口地址
长度
中断允许
中断标志
中断优先级位
触发方式
中断标志清零方式
同级内部优先级
/INT0 0003H 8 EX0(IE.0) IE0(TCON.1) PX0(IP.0) IT0(TCON.0)
0:电平触发
1:下降沿触发
电平触发时需软件清零 最高
T0 000BH 8 ET0(IE.1) TF0(TCON.5) PT0(IP.1) 无需软件清零
/INT1 0013H 8 EX1(IE.2) IE1(TCON.3) PX1(IP.2) IT1(TCON.2) 电平触发时需软件清零
T1 001BH 8 ET1(IE.3) TF1(TCON.7) PT1(IP.3) 无需软件清零
串口 0023H 8 ES(IE.4)
RI(SCON.0)
TI(SCON.1)
PS(IP.4) 需软件清零 最低
*.定时器/计数器工作方式
M1
M0
工作方式
功能
0 0 方式0 13位计数器
0 1 方式1 16位计数器
1 0 方式2 可自动重新装入的8位计数器
1 1 方式3 T0分为两个独立的8位计数器,T1停止
*.串口工作方式
SM0
SM1
方式
说明
0 0 0 位移寄存器方式(用于I/O扩展)
0 1 1 8位UART,波特率可变(T1溢出率/n)
1 0 2 9位UART,波特率为fosc/64或fosc/32
1 1 3 9位UART,波特率可变(TI溢出率/n)
注:表中n为32/2SMOD,SMOD为PCON的第7位波特率倍乘位
*.定时器/计数器初值的计算
环境:
晶振:12.0000MHz
定时器:T0
溢出条件:(TH0<<8|TL0)由0FFFFH变为0000H(0FFFFH+1 产生的进位置位TF0产生中断)
假设延时时间为50ms,则:
频率:ft = 12.0000MHz
时钟周期:Tt = 1/ft (SI)
机器周期:Tm = 12*Tt = 12*1/(12*10^6),(SI) = 12*1/12 (us) = 1 (us)(前面的12是因为51是12分频,即12个时钟周期为1个机器周期)
所以:
50ms == 50000us == 50000个机器周期
由 0FFFFH 到 10000H 为 1个机器周期,则:
初值:start = 0FFFFH + 1H - 50000D = 65536D - 50000D = 15536D = 3CB0H
于是:TH0 = 0x3C,TL0 = 0xB0
若晶振频率为:ft = 11.0592MHz
同样:机器周期Tm = 12*Tt = 12*1/(11.0592*10^6),(SI) = 12/11.0592 (us) = 1.085069(us)
所以:
50ms == 50000us = 50000/1.085069 = 46080D 个机器周期
初值:start = 0FFFFH + 1H - 46080D = 65536D - 46080D = 19456D = 4C00H
于是:TH0 = 0x4C, TL0 = 0x00
*.串口通信中定时器工作方式下波特率初值计算以及晶振的选择
当串口工作方式为1(8位UART),T1为定时器时:
k=13:定时器工作方式0; k=16, 工作方式1, k=8, 工作方式2, ...
T1溢出率 = Fosc/(12*(2k-初值)),即每秒溢出次数,Fosc:晶振频率,*12:转换为时钟周期
所以 波特率 = T1溢出率/(32/2SMOD) = 2SMOD */32*T1溢出率 = 2SMOD * Fosc /(32*12*(2k-初值))
常用波特率:9600bps,192000bps,4800bps, ...
所以当波特率=9600bps, SMOD=0, k=8时:
波特率 = 2SMOD * Fosc /(32*12*(2k-初值)) = Fosc/(384*(256-初值)) = 9600
当晶振为11.0592Mhz时:9600=11.0592*106/(384(256-初值)),求得:初值=253D = 0FDH,此时恰为整数(即TH1=TL1 = 0xFD)
当晶振为12.0000MHz时:初值为252.744791, 不为整数
这就是为什么在进行串行通信时要选择11.0592MHz晶振, 不选择12MHz晶振的原因.
*.由定时器1产生的常用波特率
波特率 bps
晶振频率 Fosc
波特率倍乘
SMOD
定时器1
C/-T
模式
重装载值
62500 12 1 0 2 0FFH
19200 11.0592 1 0 2 0FDH
9600 11.0592 0 0 2 0FDH
4800 11.0592 0 0 2 0FAH
2400 11.0592 0 0 2 0F4H
1200 11.0592 0 0 2 0E8H
137500 11.0592 0 0 2 1DH
110 6 0 0 2 72H
110 12 0 0 1 0FEEBH
B. 如何用c8051F330 编程
#define uchar unsigned char
sbit led =P1^3;
void delay (uchar a);
void main ()
{ P1MDIN |=0x08;
P1MDOUT=0x08; //设置io端口为推挽模式
while (1)
{
led =~led;
delay(100) ;
}
}
void delay (uchar a)
C. 求推荐IAR For c8051 c语言编程资料
IAR的C实际上是EC++,即所谓的嵌入式C++,与标准的C和C++略有不同,但无论如何,C与C++这一块知识都是一样的,本身与硬件关系不大多。
另一方面,C语言作为一种比较接近低层的语言,在不同的系统上都会做一些与硬件有关的扩展,这一部分,可以查系统附带的帮助手册,再结合系统的一些例子程序,动手做一下。51系统有个好处就是它的汇编比较简单,写完程序看看生成的汇编代码就基本上可以确定效果。
国内8051还是Keil用的多,IAR确实用的少,资料也少。用IAR的好处是它支持的CPU种类很多,写好的C代码比较方便在多种CPU之间移植。当然,这个方便也是相对的,实际上很有限。所以,如果你的程序不会在多种CPU上进行移植,还是用Keil吧,就8051来说,还是Keil比较专业。
D. c8051f330 这款单片机烧写程序
1、C8051F330通常的烧写办法应该是利用离线编程工具(如U-EC5)和软件(Silicon C8051F编程器V6.00)。在线仿真模式也可下载程序。
2、由于F330支持对FLASH的擦写。感觉能做个课题,来支持串口升级程序方案。(但这不像STC的串口编程。有这功夫,估计项目也做完了。建议,直接购买离线编程器,120元左右,还支持在线仿真。)
E. C8051F系列单片机开发与C语言编程
你这是什么问题?我没看懂啊?
F. silicon laboratories ide 和Keil C在C8051编程中只用一个就可以吗
silicon laboratories IDE 其实包含有 Keil C 的试用版。
试用版对程序有 2K 的限制。
如果你做的项目代码不超过2K,直接用IDE附带的试用版就可以了;
如果代码超过了2K, 则需要正式版的 KEIL C;
G. C8051系列单片机的C语言编程问题
交叉开关引脚分配时出现问题
当交叉开关配置寄存器XBR0 XBR1 和XBR2 中外设的对应允许位被设置为逻辑1时,交叉开关将端口引脚分配给外设。
因为交叉开关寄存器影响器件外设的引出脚,所以它们通常在外设被配置前由系统的初试化代码配置,一旦配置完毕将不再对其重新编程。
交叉开关寄存器被正确配置后,通过将XBARE(XBR2.6)设置为逻辑1,来使能交叉开关,在XBARE被设置为逻辑1之前,端口0-3的输出驱动器被禁止,以防止对交叉开关寄存器和其它寄存器写入时在端口引脚上产生争用。
H. C8051F单片机编程的问题
可以,配置如下
P1MDIN =0x07;
XBR0 =0x1F;
XBR1 =0x20;
XBR3 =0x01;
XBR2 =0x48;
一般P0口上的端口分配是不变的,P1,P2,P3端口可以通过配置为模拟输入来跳过,AIN0.n 不需要配置,端口是固定的
I. silicon c8051f 编程器 ver6.00 使用说明
还是用Keil吧,安装c8051的驱动后用着比新华龙的好用的多了
J. 关于C8051单片机控制电机转动的编程
#define uchar unsigned char
#define uint unsigned int
sbit KEY1 = P3^2; //步进电机逆时针方向转
sbit KEY2 = P3^3; //步进电机顺时针方向转
sbit KEY3 = P3^4; //步进电机调速
uchar step = 0;
bit AB_flag = 0;
unsigned char code A_Rotation[8]={0x08,0x18,0x10,0x30,0x20,0x60,0x40,0x48}; //顺时针转表格
unsigned char code B_Rotation[8]={0x48,0x40,0x60,0x20,0x30,0x10,0x18,0x08}; //逆时针转表格
/********************************************************************
* 名称 : Delay_1ms()
* 功能 : 延时子程序,延时时间为 1ms * x
* 输入 : x (延时一毫秒的个数)
* 输出 : 无
***********************************************************************/
void Delay(uint i)
{
uchar x,j;
for(j=0;j<i;j++)
for(x=0;x<=148;x++);
}
void KEY(void)
{
if(KEY1 == 0) //按P3.2,实现步进电机的逆时针转动
{