江苏大学单片机复习资料.doc

上传人:wj 文档编号:4891945 上传时间:2023-05-07 格式:DOC 页数:12 大小:225KB
下载 相关 举报
江苏大学单片机复习资料.doc_第1页
第1页 / 共12页
江苏大学单片机复习资料.doc_第2页
第2页 / 共12页
江苏大学单片机复习资料.doc_第3页
第3页 / 共12页
江苏大学单片机复习资料.doc_第4页
第4页 / 共12页
江苏大学单片机复习资料.doc_第5页
第5页 / 共12页
江苏大学单片机复习资料.doc_第6页
第6页 / 共12页
江苏大学单片机复习资料.doc_第7页
第7页 / 共12页
江苏大学单片机复习资料.doc_第8页
第8页 / 共12页
江苏大学单片机复习资料.doc_第9页
第9页 / 共12页
江苏大学单片机复习资料.doc_第10页
第10页 / 共12页
江苏大学单片机复习资料.doc_第11页
第11页 / 共12页
江苏大学单片机复习资料.doc_第12页
第12页 / 共12页
亲,该文档总共12页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

江苏大学单片机复习资料.doc

《江苏大学单片机复习资料.doc》由会员分享,可在线阅读,更多相关《江苏大学单片机复习资料.doc(12页珍藏版)》请在冰点文库上搜索。

江苏大学单片机复习资料.doc

第一章概述

1、什么是SOC型的单片机?

在传统的单片机的基础上再集成了很多外部设备到芯片里,形成的片上系统(SystemOnChip)就是SOC型的单片机。

2、单片机分为:

•ROM型:

内容不可改

•EPROM型:

擦写不方便

•无ROM型:

需外接ROM

•OTPROM型:

低成本,一次可编程

•E2PROM型:

擦写较方便,不能ISP

•FlashROM(MTPROM型)型:

使用最方便,可以ISP

2、单片机的发展概况:

初级阶段、低性能阶段、高性能阶段、新一代阶段

3、单片机在哪些领域有应用?

举例说出10种含有单片机的产品或设备。

智能仪表、机电一体化、实时控制、分布式多机系统、家用电器等消费类领域

空调、冰箱、洗衣机、微波炉、彩电、音响、家庭报警器、电子宠物、手机、MP3

第2章C8051F单片机的结构与原理

1、CIP-51有哪些存储空间?

各个存储空间的功能及寻址范围是什么?

v 物理结构上可分为:

•片内程序存储器

•片外程序存储器

•片内数据存储器

•片外数据存储器

v按功能和寻址可分为:

•程序存储器(64KB的flash,以512字节为一个扇区,通常是只读,但可用MOVX写入)

•内部数据存储器(256字节的RAM,0x00-0x1F通用寄存器4*80x20-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统一管理)

中断响应时间

v最快为5个时钟周期:

•1个周期用于检测中断;

•4个周期完成对ISR的长调用(LCALL)。

v如果申请中断时CPU正在执行RETI指令,则需要再执行一条指令才能进入中断服务程序。

v最长为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存储器类型

如果在变量声明时未声明变量的存储器类型,则该变量的存储器类型,由程序的存储模式来决定。

•小模式(smallmodel):

默认data区,缺省模式。

•紧凑模式(compactmodel):

默认pdata区

•大模式(largemodel):

默认xdata区

2、C51特殊数据类型

•bit:

位类型(直接声明),如:

bitflag;

•sbit:

可位寻址的对象(在bdata中声明的变量)如:

intbdataibase;sbitmybit15=ibase^15;

•sfr:

8位特殊功能寄存器,如:

sfrACC=0xE0;sbitsignbit=ACC^7;

•sfr16:

16位特殊功能寄存器,如:

sfr16T2=0xCC;

第4章C8051F单片机的片内功能部件

v定时/计数器

定时器工作方式

定时器0和定时器1

定时器2

定时器3

定时器4

方式0

13位定时器/计数器

自动重装载的16位定时器/计数器

自动重装载的16位计数器/定时器

自动重装载的16位定时器/计数器

方式1

16位定时器/计数器

带捕捉的16位定时器/计数器

带捕捉的16位定时器/计数器

方式2

8位自动重装载的定时器/计数器

UART0的波特率发生器

UART1的波特率发生器

方式3

两个8位定时器/计数器(只限于定时器0)

能用公式求出定时器初值

例4.1若fOSC=12MHz,用系统时钟的十二分频作为计数源,请计算定时2ms所需的初值,并给出初始化程序。

解:

∵fOSC=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

voidT0_mode1_2ms_init()

{

CKCON&=0xf7; //T0计数源选择系统脉冲的12分频

TMOD=0x01; //T0方式1定时

TH0=0xf8; //初值

TL0=0x30;

TCON|=0x10; //启动T0,可用TR0=1代替

}

v给定时器赋初值的语句也可以采用如下方法:

TH0=(65536-2000)/256;

TL0=(65536-2000)%256;

TH0=-2000/256;

TL0=-2000%256;

例4.2若fOSC=12MHz,T1工作于方式1,产生50ms的定时中断,TF1为高级中断源。

试编写主程序和中断服务程序,使P1.0产生周期为1s的方波。

解:

让P1.0每500ms取反一次即可实现。

定时器的单次定时时间不可能达到500ms,但可通过多次定时产生500ms的定时时间,如让T1工作在方式1,单次定时时间为50ms,那么T1中断10次就是500ms的时间。

(1)确定定时常数

•假设使用fOSC的12分频作为计数源,则T计数=12/fOSC=12/(12×106)=1μs

•由公式TC=M-T/T计数,可知TC=216-50×103=15536=3CB0H

•∴TH1=0x3c,TL0=0xb0。

程序清单如下(中断方式)

#include

sbitP1_0=P1^0;

intcount=10; //10次T1中断为500ms

voidmain(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); //死循环,等待中断,产生方波

}

voidTimer1_ISR(void)interrupt3

{

TH1=0x3c; //重装初值

TL1|=0xb0;//提高计数精度

count--; //中断计数

if(count==0) //500ms到,重赋计数初值,P1.0取反

{

count=10;P1_0=!

P1_0;

}

}

程序清单如下(查询式程序)

v#include

sbitP1_0=P1^0;

voidmain()

{

intcount=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

voidmain(void)

{ chardata*p; //接收缓冲区地址指针

unsignedchari;

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

chardata*p;//发送数据块地址指针

voidmain(void)

{

TMOD=0x20; //初始化并启动T1

TH1=0xfd;

TL1=0xfd;

TR1=1;

SCON0=0x40; //UART0初始化,方式1

p=0x20; //地址指针初始化

EA=1; //开中断

ES0=1;

SBUF0=*p; //发送第一个字符

while

(1); //等待发送中断

}

voidinterrupt_UART0(void)interrupt4

{

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

chars[]=“C8051F020SerialCommunication”;

charbdatac;sbitc7=c^7;

voidmain(void)

{

chara,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中

for(;b

{

c=s[b];

ACC=c;//形成校验位

c7=P; //最高位作校验位

SBUF0=c;

while(!

TI0);

TI0=0;

}

}

接收端的核心代码:

 RI=0;       

 ACC=SBUF;   //执行此指令,P是接收8位数据的奇偶信息  

 if(c7==P)  //c7是发送端数据的奇偶消息,P是实际收到8位数据的奇偶消息

   {

   dat=SBUF;    

   }

方式2、3中也可以使用TB8、RB8作校验位

发送端:

TB8=P;   //以上2句将dat的奇偶信息放入TB8,随数据发送

接收端:

if(RB8==P)//RB8是发送端数据的奇偶消息,P是实际收到8位数据的奇偶消息

第5章模数和数模转换器

1、模数转换原理及性能指标

A/D转换器的种类很多,根据转换原理可以分计数式、并行式、双积分式、逐次逼近式等

衡量A/D性能的主要参数:

分辨率(resolution)指输出的数字量变化一个相邻的值所对应的输入模拟量的变化值

转换精度(conversionaccuracy)由模拟误差和数字误差组成

C8051F020的ADC0功能结构:

包括一个9通道的可编程模拟多路选择器(AMUX0),一个可编程增益放大器(PGA0)和一个100ksps、12位分辨率的逐次逼近型ADC,ADC中集成了跟踪保持电路和可编程窗口检测器(看图说话)

C8051F020的ADC0有4种转换启动方式,由ADC0CN中的ADC0启动转换方式位(AD0CM1,AD0CM0)的状态决定。

•00:

向AD0BUSY写1时启动

•01:

定时器3溢出时启动

•10:

CNVSTR上升沿启动

•11:

定时器2溢出时启动

2、查询方式编程步骤

(1)写0到AD0INT;

(2)向AD0BUSY写1,启动转换;

(3)查询并等待AD0INT变1;

(4)处理ADC0数据

AD0INT=0;

AD0BUSY=1;

while(!

AD0INT);

result=ADC0;

3、跟踪方式(每次ADC转换之前必须有一段最小的跟踪时间,以保证得到精确的转换结果)

连续跟踪(默认)

当AD0TM=1,ADC0工作在低功耗跟踪保持方式。

每次转换之前都有3个SAR时钟的跟踪周期(在启动转换信号有效之后)。

当CNVSTR信号用于在低功耗跟踪保持方式启动转换时,ADC0只在CNVSTR为低电平时跟踪;在CNVSTR的上升沿开始转换。

当整个芯片处于低功耗待机或休眠方式时,跟踪可以被禁止(关断)

4、转换结果格式

12位转换结果存放在ADC0H、ADC0L中

AD0LJST=0:

数据右对齐,ADC0H的位7-4为位3的符号扩展位、位3-0是12位ADC0数据字的高4位。

ADC0L的位7-0为12位ADC0数据字的低8位。

AD0LJST=1:

数据左对齐,ADC0H位7-0为12位ADC0数据字的高8位。

ADC0L的位7-4为12位ADC0数据字的低4位,ADC0L的位3-0恒为0。

4、可编程窗口检测器(提供一个中断)

下限值<上限值时,检测值位于极限值内时有效,可引起中断。

下限值>上限值时,检测值位于极限值以外时有效,可引起中断。

5、程序应用举例(片内温度传感器数据采集)

(1)查询法程序

voidmain(void){

longtemperature; //温度

inttemp_int,temp_frac; //温度的整数和小数部分

WDTCN=0xde; //禁止看门狗定时器

WDTCN=0xad;

SYSCLK_Init(); //初始化振荡器

PORT_Init(); //初始化数据交叉开关和通用IO口

UART0_Init(); //初始化UART0

ADC0_Init(); //初始化和使能ADC

while

(1){

AD0INT=0;  //清除转换结束标记,见P208步骤

AD0BUSY=1;  //启动转换

while(AD0INT==0); //等待转换结束

temperature=ADC0; //读ADC0数据

temperature=temperature-41857;  //减去偏移量,对应0℃的值。

temperature=(temperature*100L)/154; //计算出对应的温度值

temp_int=temperature/100; //得到温度值的整数部分

temp_frac=temperature-(temp_int*100); //得到温度值的小数部分

printf(“Temperatureis%+02d.%02d\n”,temp_int,temp_frac);//串口输出

}

}

问题:

temperature为什么要定义成long类型?

因为要乘以100,2个字节不够存放,先放大100倍,再除以100,商为整数

(2)中断方式

主程序

Timer3_Init(SYSCLK/SAMPLERATE0);//初始化定时器3溢出为采样速率

ADC0_Init(); //初始化ADC

AD0EN=1; //使能ADC

EA=1; //使能所有中断

while

(1){

EA=0; //禁止中断

temperature=result;

EA=1; //重新使能中断

temperature=temperature-41857;//计算温度(百分之一精度)

temperature=(temperature*100L)/154;

temp_int=temperature/100;

temp_frac=temperature-(temp_int*100);

printf(“Temperatureis%+02d.%02d\n”,temp_int,temp_frac);

}

中断服务程序

//得到ADC0采样值,将它加到运行总数accumulator中,

//当int_dec为0时,在全局变量result放置数字滤波后的结果

voidADC0_ISR(void)interrupt15

{staticunsignedint_dec=INT_DEC;//数字滤波计数器,

//int_dec=0时重设新值

staticlongaccumulator=0L;

AD0INT=0; //清除ADC转换结束标志

accumulator+=ADC0; //读ADC值并加到运行总数中

int_dec--; //更新数字滤波计数器

if(int_dec==0){ //如果为0,计算结果

int_dec=INT_DEC;      //重设计数器

result=accumulator>>8;    //除以256,求平均值(数字滤波)

accumulator=0L;       //复

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 幼儿教育 > 幼儿读物

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2