第一章概述
1、什么是SOC型的单片机?
在传统的单片机的基础上再集成了很多外部设备到芯片里,形成的片上系统(System On Chip)就是SOC型的单片机。
2、单片机分为:
?ROM型:内容不可改
?EPROM型:擦写不方便
?无ROM型:需外接ROM
?OTP ROM型:低成本,一次可编程
?E2PROM型:擦写较方便,不能ISP
?Flash ROM(MTP ROM型)型:使用最方便,可以ISP
2、单片机的发展概况:
初级阶段、低性能阶段、高性能阶段、新一代阶段
3、单片机在哪些领域有应用?举例说出10种含有单片机的产品或设备。
智能仪表、机电一体化、实时控制、分布式多机系统、家用电器等消费类领域
空调、冰箱、洗衣机、微波炉、彩电、音响、家庭报警器、电子宠物、手机、MP3
第2章C8051F单片机的结构与原理
1、CIP-51有哪些存储空间?各个存储空间的功能及寻址范围是什么?
物理结构上可分为:
?片内程序存储器
?片外程序存储器
?片内数据存储器
?片外数据存储器
按功能和寻址可分为:
?程序存储器(64KB的flash,以512字节为一个扇区,通常是只读,但可用MOVX写入)
?内部数据存储器(256字节的RAM,0x00-0x1F通用寄存器4*8 0x20-0x2F 可位寻址空间)
?外部数据存储器(64KB的外部数据空间,MOVX、DPTR、R0或R1用间接寻址方式访问;默认情况下MOVX指令访问XRAM,还可用于写Flash)?特殊功能寄存器(0x80-0xFF直接寻址存储器空间,一般在内部RAM的0x30-0xFF单元中开辟堆栈)
?位地址空间(内部RAM中0x20-0x2F单元以及特殊功能寄存器中地址为8的倍数的特殊功能寄存器可以位寻址)
2、中断
22个,分外部中断、串口(UART0、UART1、SPI、SMBus等)、定时/计数器、电压比较器、A/D转换中断
中断使能控制(受中断允许寄存器IE、EIE1、EIE2控制)
中断优先级别的设定(每个中断源都可以设置为高优先级1和低优先级0,由中断优先
级寄存器IP、EIP1、EIP2统一管理)
中断响应时间
最快为5个时钟周期:
?1个周期用于检测中断;
?4个周期完成对ISR的长调用(LCALL)。
如果申请中断时CPU正在执行RETI指令,则需要再执行一条指令才能进入中断服务程序。
最长为18个时钟周期:
?1个时钟周期检测中断;
?5个时钟周期执行RETI;
?8个时钟周期完成DIV指令;
4个时钟周期执行对ISR的长调用(LCALL)
中断响应过程硬件动作
置位优先级状态触发器、断点入栈、执行LCALL转中断入口、清除中断请求标志、对RI、TI而言
相同优先级的硬件查询顺序
中断源同级时的优先顺序
外部中断0
定时器0中断高
外部中断1
定时器1中断
串行口0中断
定时器2中断
……
串行口1中断
外部晶振准备好低
3、端口输入/输出(并行口)
C8051F020有8个8位I/O端口、64个数字I/O引脚;
低端端口(P0~P3)既可以按位寻址也可以按字节寻址
高端端口(P4~P7)只能按字节寻址
所有引脚都耐5V电压,都可以被配置为漏极开路或推挽输出方式和弱上拉
4、优先权交叉开关译码器
C8051F020 内有大量的数字资源需要通过P0~P3才能使用(本身没有对外的引脚)。
引脚的分配通过优先权交叉开关译码实现的。UART0优先权最高,而CNVSTR优先权最低
通过3个特殊功能寄存器XBR0、XBR1、XBR2实现
另外,牢记如果P0撤销勾选,P0后面的跟着缩进(看图,意会)
5、电源管理方式
CIP-51 有两种可编程的电源管理方式(节电方式):
a)空闲方式(等待方式)
i.CPU停止运行,而外设和时钟处于活动状态(10μA~5mA)。内部寄存器
和存储器内容保持不变。
ii.通过置位IDLE(PCON.0)进入
iii.中断和复位可结束空闲方式
b)停机方式(掉电方式)
i.CPU停止运行,所有的中断和定时器(除时钟丢失检测器)等外设都处于非
活动状态,系统时钟停止。(0.2μW)
ii.通过置位STOP(PCON.1)进入
iii.只有系统复位可退出停机方式
6、复位源(看图能说得出来)
总共7个(上电/掉电复位、外部/RST引脚复位、外部CNVSTR信号复位、软件命令复位比较器0复位、时钟丢失检测器、看门狗定时器超市复位)
第3章51单片机编程语言
1、C51存储器类型
如果在变量声明时未声明变量的存储器类型,则该变量的存储器类型,由程序的存储模式来决定。
?小模式(small model):默认data区,缺省模式。
?紧凑模式(compact model):默认pdata区
?大模式(large model):默认xdata区
2、C51特殊数据类型
?bit:位类型(直接声明),如:bit flag;
?sbit:可位寻址的对象(在bdata中声明的变量)如:
int bdata ibase; sbit mybit15=ibase^15;
?sfr:8位特殊功能寄存器,如:sfr ACC=0xE0; sbit signbit=ACC^7;
?sfr16:16位特殊功能寄存器,如:sfr16 T2=0xCC;
第4章 C8051F 单片机的片内功能部件
定时/计数器
能用公式求出定时器初值
例4.1 若f OSC =12MHz ,用系统时钟的十二分频作为计数源,请计算定时2ms 所需的初值,并给出初始化程序。
解:∵ f OSC = 12MHz ,用系统时钟的十二分频作为计数源时,方式2、3的最大定时时间只有0.256ms ,因此要想获得2ms 的定时时间,必须用方式0或方式1。
方式0
? TC=213-2ms/1us=6192=1830H
? 即:TH0=0C1H ;TL0=10H (高三位为0)
方式1
? TC=216-2ms/1us=63536=F830H
? 即:TH0=0F8H ;TL0=30H
void T0_mode1_2ms_init()
{
CKCON &= 0xf7; //T0计数源选择系统脉冲的12分频
TMOD=0x01; //T0方式1定时
TH0=0xf8; //初值
TL0=0x30;
TCON |= 0x10; //启动T0,可用TR0=1代替
}
给定时器赋初值的语句也可以采用如下方法:
TH0=(65536-2000)/256;
TL0=(65536-2000)%256;
或
TH0=-2000/256;
)(a f T N OSC
M T -?=-212)
01(
TL0=-2000%256;
例4.2 若f OSC=12MHz,T1工作于方式1,产生50ms的定时中断,TF1为高级中断源。试编写主程序和中断服务程序,使P1.0产生周期为1s的方波。
解:让P1.0每500ms取反一次即可实现。定时器的单次定时时间不可能达到500ms,但可通过多次定时产生500ms的定时时间,如让T1工作在方式1,单次定时时间为50ms,那么T1中断10次就是500ms的时间。
(1)确定定时常数
?假设使用f OSC的12分频作为计数源,则T计数=12/f OSC=12/(12×106)=1μs
?由公式TC=M-T/T计数,可知TC=216-50×103=15536=3CB0H
?∴TH1=0x3c,TL0=0xb0。
程序清单如下(中断方式)
#include
sbit P1_0 = P1^0;
int count=10; //10次T1中断为500ms
void main( void )
{ CKCON&=0xef; //T1的计数源选择系统脉冲的12分频
TMOD=0x10; //T1方式1
XBR2=0x40; //并行端口输出使能
P1_0=0;
TH1=0x3c; //初值
TL1=0xb0;
IE|=0x88; //允许T1中断
IP|=0x08; //TF1中断为高级中断
TCON|=0x40; //启动T1
While(1); //死循环,等待中断,产生方波
}
void Timer1_ISR (void) interrupt 3
{
TH1=0x3c; //重装初值
TL1|=0xb0; //提高计数精度
count--; //中断计数
if (count==0) //500ms到,重赋计数初值,P1.0取反
{
count=10; P1_0=!P1_0;
}
}
程序清单如下(查询式程序)
#include
sbit P1_0= P1^0;
void main( )
{
int count=10; //10次T1中断为500ms
CKCON&=0xef; //T1的计数源选择系统脉冲的12分频
XBR2=0x40;
TMOD=0x10; //T1方式1
P1_0=0;
TR1=1; //启动T1
For(; ;) //死循环,产生方波
{
TH1=-50000/256; //T1初值
TL1=-50000%256;
Do {} while(!TF1); //查询等待TF1置位,
TF1=0; count--;
If (count==0)
{count=10;P1_0=!P1_0;}
}
}
2、并行通信和串行通信
并行通信是指数据的各位同时进行传送(发送或接收)的通信方式。
串行通信指数据是一位一位按顺序传送的通信方式
3、串行通信的传送方向
单工(或单向)配置,只允许数据向一个方向进行传送;
半双工(或半双向)配置,允许数据向两个方向中的任何一个方向传送,但一次只能有一个发送,一个接收;
全双工(或全双向)配置,允许同时双向传送数据
4、异步通信和同步通信
异步通信以字符为单位,每个字符用起始位0开始,然后从低位到高位逐位传送数据,最后用停止位1表示字符结束
同步通信以数据块为单位,每一数据块开头时发送一个或两个同步字符,使发送与接收双方取得同步。数据块的各个字符间取消了起始位和停止位。
5、UART
发送电路+接收电路+波特率发生器、错误校验电路、多机通信控制电路和交叉开关 TI0:发送中断标志位,该位必须由软件清0
RI0:接收中断标志位,该位必须由软件清0
6、波特率设计和初值X
例4.6 已知C8051F 单片机时钟振荡频率为11.0592MHz ,选用定时器T1工作方式2作波特率发生器,波特率为2400bit/S ,求初值X 。
解:设波特率控制位SMOD0=0,定时器T1计数脉冲控制位T1M=0,则有:
查询方式接收程序
#include
void main(void)
波特率???-=-32)12(2256)11(M T SMODn SYSCLK X H 4F 024*******)12(100592.112256)10(60==????-=-X
{ char data *p; //接收缓冲区地址指针
unsigned char i;
TMOD=0x20; //初始化并启动T1
TH1=0xfd;
TL1=0xfd;
TR1=1;
SCON0=0x50; //UART0初始化,方式1 、允许接收
p=0x20; //地址指针初始化
for(i=0;i<32;i++)
{
while(!RI0); //等待UART0接收一个字符
RI0=0;
*p=SBUF0; //放入接收缓冲区
p++;
}
}
中断方式发送主程序
#include
char data *p; //发送数据块地址指针
void main(void)
{
TMOD=0x20; //初始化并启动T1
TH1=0xfd;
TL1=0xfd;
TR1=1;
SCON0=0x40; //UART0初始化,方式1
p=0x20; //地址指针初始化
EA=1; //开中断
ES0=1;
SBUF0=*p; //发送第一个字符
while(1); //等待发送中断
}
void interrupt_UART0(void) interrupt 4
{
TI0=0; //清发送中断标志
p++;
if(p<0x40)
SBUF0=*P; //发送下一字节
else
ES0=0; //关串口中断,和查询不一样的另一个地方}
例4.8 试编写一个UART0带奇偶校验的发送程序。
设SYSCLK=11.0592MHz,波特率=9600,UART0工作于方式1,发送字符的ASCII码最高位作校验位,用T2作波特率发生器,T2的时间常数计算如下:
#include
#include
char s[]=“C8051F020 Serial Communication”;
char bdata c; sbit c7=c^7;
void main(void)
{
char a,b=0;
T2CON=0x14; //T2作发送波特率发生器,TCLK0=1,TR2=1
SCON0=0x40; //SM20=SM00=0,SM10=1,REN0=0;
RCAP2H=0xff; RCAP2L=0xdc;
a=strlen(s); // 包含在string.h 中