L2接P2.4;
3.18外部中断实验
P2.0→L7;P2.1→L8;P3.6→”下降沿脉冲”;P3.7→”下降沿脉冲”.
按下单脉冲按钮AN0,产生一个下降沿脉冲,进入中断后,相应发光二极管也同时闪烁一次.
3.8WDT看门狗实验
一、实验目的熟悉汇编语言编程,掌握C8051F020内部WDT的应用。
二、实验内容通过改变延时程序的延时值,使延时值分别小于和大于WDT设置的定时间隔,运行程序,观察P0.0控制的发光二极管L8的变化。
三、实验原理介绍
MCU内部有一个使用系统时钟的可编程看门狗定时器(WDT)。
当看门狗定时器溢出时,WDT将强制CPU进入复位状态。
为了防止复位,必须在溢出发生前由应用软件重新触发WDT。
如果系统出现了软件/硬件错误,使应用软件不能重新触发WDT,则WDT将溢出并产生复位,这样可以防止系统失控。
WDT是一个使用系统时钟的21位定时器。
该定时器检测对其控制寄存器的两次写操作的时间间隔。
如果这个时间间隔超过了编程的极限值,将产生WDT复位。
可以根据需要用软件允许和禁止WDT,或根据需要将其设置为永久性允许状态。
可以通过看门狗定时器控制寄存器(WDTCN)控制看门狗的功能。
(1)允许/复位WDT
看门狗定时器的允许和复位是通过向WDTCN寄存器写入0xA5来实现的。
用户的应用软件应周期性地向WDTCN写入0xA5,以防止看门狗定时器溢出。
每次系统复位都将允许并启动WDT。
(2)禁止WDT
向WDTCN寄存器写入0xDE后再写入0xAD将禁止WDT。
下面的代码说明禁止WDT的过程:
CLREA;禁止所有中断
MOVWDTCN,#0DEh;禁止看门狗定时器
MOVWDTCN,#0ADh
SETBEA;重新允许中断
必须在4个时钟周期之内写0xDE和写0xAD,否则禁止操作将被忽略。
在这个过程期间应禁止中断,以避免两次写操作之间延时。
(3)锁定WDT
向WDTCN写入0xFF将使禁止功能无效。
WDT一旦被锁定,在下一次复位之前禁止操作将被忽略,写0xFF并不允许或复位看门狗定时器。
如果应用程序想一直使用看门狗,则应在初始化代码中向WDTCN写入0Xff.
(4)设置WDT定时间隔
WDTCN.[2~0]控制看门狗的超时间隔。
超时间隔由下式给出:
TWDT=43+WDTCN[2~0]×TSYSCLK
其中TSYSCLK为系统时钟周期。
对于2MHz的系统时钟,超时间隔的范围是0.032~524ms。
在设置超时间隔是时,WDTCN.7必须为0。
读WDTCN将返回超时间隔的编程值。
在系统复位后,WDTCN.[2~0]为111b.
四、实验程序框图
五、实验步骤
通过调整程序中的延时值(调整RO寄存器值),来判断是否使用WDT复位功能。
A:
本程序中,当R0取值小于4F时,程序总的执行小于WDT定时器值,程序不会进入WDT复位,程序正常执行,由P0.0控制发光二极管L8闪烁。
B:
当R0取值大于5F时,程序总的执行大于WDT定时器值,程序总是进入WDT复位,p0.0总是保持
在低电平状态。
用导线将P0.0与发光二极管L8相连。
注:
光盘已经提供源程序,可直接打开项目:
路径:
“DICE-C8051f实验例程”→“WDT看门狗实验”→项目名“WDT-RESET”→汇编源程序“WDT-RESET.ASM”。
六、程序清单文件名:
WDT-RESET·ASM
;程序看门狗(WDT)实验。
;R0值小于4F时,程序中我们取值3F,编译、运行程序,程序总的执行时间小于WDT定时器值,程序正常执行,P0.0控制发光二极管闪烁。
;R0值大于5F时,程序中我们取值6F,编译、运行程序,程序总的执行时间大于WDT定时器值,程序总是进入WDT复位,P0.0总是保持在低电平。
$INCLUDE(C8051F020.INC);Registerdefinitionfile.
ORG0000H
LJMPSTART
ORG00B3H;EndofInterruperVectorspace
Start:
MOVWDTCN,#07h;设置WDT定时间隔
MOVXBR0,#00h;InitialXBR0
MOVXBR1,#00h;Disableallmaps
MOVXBR2,#40h;EnabletheIO_Crossbar
MOVP0MDOUT,#0FFH
MOVOSCXCN,#00h;InitialOSCXCN
MOVOSCICN,#04h;InitialOSCICNas2.0MHz
MOVCPT0CN,#8fh;Enablecomparator0(CPT0)andselectP/Nhysteresis
CLRP0.0
MOVWDTCN,#0a5h;ResetWDT
MOVR0,#3fh;Setdatainr0lessthan4fhcanavoidreseting
LCALLDelay;andmorethan5fhcancauseresetingprogram
Wait:
SETBP0.0
MOVR0,#3fh;设置R0小于4FH可以避免进入WDT复位,程序正常工作
LCALLDelay;如果设置R0大于5FH,则使延时值大于WDT设置的定时间
MOVWDTCN,#0a5h;隔,使程序不断进入WDT复位状态
LJMPWait;Waithere
Delay:
MOVR1,#0fh
Delay1:
MOVR2,#0ffh
Delay2:
DJNZR2,Delay2
DJNZR1,Delay1
DJNZR0,Delay
RET
END
3.9定时器实验
一、实验目的掌握C8051F020内部定时器/计数器的应用。
二、实验内容本文件是LED灯闪烁实验程序;使用定时器0定时1秒,LED灯每隔1秒亮1秒;使用外部22.1184MHz晶振。
三、实验原理介绍
C8051F020内部有5个计数器/定时器T0,T1,T2,T3和T4。
这些计数器/定时器都是16位,其中T0、T1、T2与标准8051中的计数器/定时器兼容。
T3、T4可用于ADC、SMBus或作为通用定时器使用,T4还可用作C8051F02x中第二串口(UART1)的波特率发生器。
这些计数器/定时器可以用于测量时间间隔,对外部事件计数或产生周期性的中断请求。
定时器0和定时器1几乎完全相同,有4种工作方式。
定时器2增加了一些时器0和定时器1中所没有的功能。
定是器3与定时器2类似,但没有捕捉和波特率发生器方式。
定时器4与定时器2完全相同,可用作UART1的波特率发生器。
下表所列为定时器的工作方式:
定时器0和定时器1
定时器2
定时器3
定时器4
13位计数器/定时器
自动重装载的16位计数器/定时器
自动重装载的16位计数器/定时器
自动重装载的16位计数器/定时器
16位计数器/定时器
带捕捉的16位计数器/定时器
带捕捉的16位计数器/定时器
自动重装载的8位计数器/定时器
UART(0)的波特率发生器
UART1的波特率发生器
两个8位计数器/定时器(仅限于定时器0)
本实验中使定时器0工作在方式1(TMOD=0x01),TIM0定时器时钟为系统时钟的1/12(CKCON=0x00)。
具体寄存器定义请参照教科书。
四、实验程序框图
五、实验步骤
P3.5口接L1发光二极管。
调入程序、装载、运行,观察发光二极管是否每隔1秒亮1次。
注:
光盘已经提供源程序,可直接打开项目:
路径:
“DICE-C8051f实验例程”→“timer_test”→项目名“TIMER”。
3.10内部时钟选择实验
一、实验目的掌握C8051F020内部系统时钟的使用。
二、实验内容本文件是LED灯闪烁实验程序;根据程序选用芯片内部不同的系统时钟。
三、实验原理介绍
C8051FxxxMCU有一个内部振荡器和一个外部振荡器驱动电路,每个驱动电路都能产生系统时钟。
MCU在复位后从内部振荡器启动,内部振荡器的启动是瞬间完成的。
内部振荡器可以被允许和禁止,其振荡频率可以通过对内部振荡控制寄存器(OSCICN)编程为2MHZ、4MHZ、8MHZ或者16MHZ。
位7
位6
位5
位4
位3
位2
位1
位0
MSCLKE
-
-
IFRDY
CLKSL
IOSCEN
IFCN1
IFCN0
R/W
R/W
R/W
R
R/W
R/W
R/W
R/W
位7MSCLKE时钟丢失检测器允许位
1禁止时钟丢失检测器
2允许时钟丢失检测器;检测到时钟丢失将触发复位
位6~5未用。
读=00b,写=忽略
位4IFRDY内部振荡器频率准备好标志
1内部振荡器频率不是按IFCN位指定的速度运行
2内部振荡器频率按IFCN位指定的速度运行
位3CLKSL系统时钟源选择位
1选择内部时钟源作为系统时钟
2选择外部时钟源作为系统时钟
位2IOSCEN内部振荡器允许位
1内部振荡器禁止
2外部振荡器禁止
位1~0IFCN1~0内部振荡器频率控制位
00内部振荡器频率控制为2MHZ
01内部振荡器频率控制为4MHZ
02内部振荡器频率控制为8MHZ
03内部振荡器频率控制为16MHZ
四、实验程序框图
五、实验步骤
P3.5接L1发光二极管。
调入程序、装载、运行,观察发光二极管是否闪烁。
修改OSCICN寄存器的值,可设置系统时钟分别工作在2、4、8、16MHZ,观察发光二极管L1在不同系统时钟下的闪烁速度。
OSCICN=0x87;16MHZ
OSCICN=0x86;8MHZ
OSCICN=0x85;4MHZ
OSCICN=0x84;2MHZ
注:
光盘已经提供源程序,可直接打开项目:
路径:
“DICE-C8051f实验例程”→“内部时钟选择实验”→项目名“SYSCLK”。
3.11外部时钟选择实验
一、实验目的掌握C8051F020外部系统时钟的使用。
二、实验内容本文件是LED灯闪烁实验程序;选用芯片外部晶振作为系统时钟
三、实验原理介绍
外部振荡器需要有外部振荡源连接到XTAL1/XTAL2引脚才能工作,外部振荡源可以是外部谐振器、并行方式的晶体、电容或RC网络。
通过对OSCXCN寄存器编程来选择振荡源,也可以使用一个外部CMOS时钟接到XTAL1引脚提供系统时钟。
即使在MCU已经切换到内部振荡器时,外部振荡器仍可保持允许状态并运行。
XTAL1和XTAL2引脚的耐压值是3.6V,而不是5V。
位7
位6
位5
位4
位3
位2
位1
位0
XTLVLD
XOSCMD2
XOSCMD1
XOSCMD0
-
XFCN2
XFCN1
XFCN0
R
R/W
R/W
R/W
R/W
R/W
R/W
R/W
位7XTLVLD外部晶体振荡器有效标志(只在XOSCMD=11x是有效)
1晶体振荡器未用或未稳定
2晶体振荡器正在运行并且工作稳定
位6~4XOSCMD2~0外部振荡器方式位
00x关闭。
XTAL1引脚内部接地
010系统时钟为来自XTAL1引脚的外部CMOS时钟
011系统时钟为来自XTAL1引脚的外部CMOS时钟的2分频
10xRC/C振荡器方式2分频
110晶体振荡器方式
111晶体振荡器方式2分频
位3保留。
读=无定义,写=忽略
位2~0XFCN2~0外部振荡器频率控制位
000~111见下表
XFCN
晶体(XOSCMD=11x)
RC(XOSCMD=10x)
C(XOSCMD=10x)
000
f≤12.5kHz
f≤25kHz
K因子=0.44
001
12.5kHz<f≤30.35kHz
25kHz<f≤50kHz
K因子=1.4
010
30.35kHz<f≤93.8kHz
50kHz<f≤100kHz
K因子=4.4
011
93.8kHz<f≤267kHz
100kHz<f≤200kHz
K因子=13
100
267kHz<f≤722Hz
200kHz<f≤400Hz
K因子=38
101
722kHz<f≤2.23MHz
400kHz<f≤800MHz
K因子=100
110
2.23MHz<f≤6.74MHz
800kHz<f≤1.6MHz
K因子=420
111
f>6.74MHz
1.6MHz<f≤3.2MHz
K因子=1400
四、实验程序框图
五、实验步骤
P3.5接L1发光二极管。
调入程序、装载、运行,观察发光二极管L1是否每隔1秒亮一次
注:
光盘已经提供源程序,可直接打开项目:
路径:
“DICE-C8051f实验例程”→“外部时钟选择实验”→项目名“SYSCLK”。
3.12PCA(可编程计数器)频率输出
一、实验目的熟悉PCA的频率输出功能。
二、实验内容此程序利用捕捉/比较模块0实现PCA频率输出方式,将捕捉/比较模块0的CEX0配置在P0.0口,用示波器测量P0.0的波形,如果正确有不断变化频率的方波输出。
三、实验原理介绍
C8051F02x单片机内部有一个可编程计数器阵列(PCA)。
PCA提供增强的定时器功能,与标准8051的计数器/定时器相比,它需要较少的CPU干预。
PCA由一个专用的16位计数器/定时器和5个16位捕捉/比较模块组成,每个捕捉/比较模块有自己的I/0线(CEXn)。
当被允许时,I/O线通过交叉开关连到端口I/O(见对端口和交叉开关译码器的介绍)。
计数器/定时器由一个可编程的时基信号驱动,时基信号可以在6个输入源中选择:
定时器0溢出、ECI线上的外部时钟信号、系统时钟12分频、系统时钟4分频、系统时钟和外部振荡器时钟8分频。
C8051F02x的PCA有6种工作方式:
边沿触发捕捉、软件定时器、高速输出、频率输出、8位脉宽调制器和16位脉宽调制器。
本实验主要介绍频率输出方式:
C8051F02x的PCA有频率输出方式,用该方式可在对应的CEXn引脚产生可编程频率的方波。
捕捉/比较寄存器的高字节