C8051F340单片机应用实验

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

C8051F340单片机应用实验
作者:游小侠原创,实际调试通过
1实验内容
用C8051F340单片机开发板完成下述实验:定时器T0以固定周期产生中断,中断处理程序控制I/O口输出,使P2.3脚所接发光二极管闪烁。

对P2.5脚的输入模拟电压进行A/D转换,由A/D转换结果控制发光二极管的闪烁频率。

2实验原理
1)I/O口输出
C8051F340有5组8位I/O端口,通过配置交叉开关,可以定义每个端口为通用I/O端口或连接到特殊功能模块。

作为通用I/O时,所有端口I/O都耐5V 电压,兼有模拟输入功能,Pn(n=0~4,下同)是端口数据锁存器,端口输入方式寄存器PnMDIN选择相应端口为数字输入或模拟输入方式,端口输出方式寄存器PnMDOUT选择相应端口为漏极开路或推挽输出方式。

通过交叉开关可将片内的计数器/定时器、串行总线、硬件中断、比较器输出等资源连接到I/O端口,这一特性允许用户根据自己的特定应用选择通用I/O 端口和所需数字资源的组合。

交叉开关配置寄存器XBR0、XBR1、XBR2选择哪些内部资源需要连接到I/O端口,端口跳过寄存器P0SKIP、P1SKIP、P2SKIP 选择哪些I/O端口不参与交叉开关的配置。

这些寄存器的值确定后,交叉开关就按固定的优先级顺序依次将单片机内部资源配置到I/O端口。

端口初始化可按以下步骤进行:
用端口输入方式寄存器(PnMDIN)选择端口输入方式(模拟或数字);
用端口输出方式寄存器(PnMDOUT)选择端口输出方式(漏极开路或推挽);
用端口跳过寄存器(PnSKIP)选择需被交叉开关跳过的那些引脚;
用交叉开关配置寄存器XBR0、XBR1、XBR2选择需要连接到I/O引脚的资源;
使能交叉开关:XBARE = 1(XBRE1.6)。

2)定时器
C8051F340内部有4个计数器/定时器T0、T1、T2、T3,还有一个可编程计数阵列(PCA)。

T0、T1的使用方法与传统MCS-51相同,T2、T3是16位自动重装载计数器/定时器,可用于ADC、SMBus、USB或作为普通计数器/定时器使用。

PCA由1个16位计数器和6个捕捉/比较模块组成,每个捕捉/比较模块
都可通过交叉开关配置到I/O口。

T0有4种工作方式:13 位计数/定时器、16 位计数器/定时器、8 位自动重装载的计数器/定时器、两个8位计数器/定时器。

本实验使用T0的工作方式1即16 位计数器/定时器方式。

与T0有关的控制寄存器有工作方式控制寄存器TMOD、定时器控制寄存器TCON、时钟控制寄存器CKCON、计数值低字节寄存器TL0、计数值高字节寄存器TH0。

TMOD中的方式选择位T1M1~T0M0用来选择工作方式,如下表所列。

TCON用于使能定时器0和定时器1以及指示它们的状态。

CKCON用来选择计数器的输入时钟。

TL0保存计数值低字节,TH0保存计数值高字节,两字节需分开写。

3)中断
除复位外有17个中断向量,优先级对应为0~16级。

与中断有关的寄存器有:3个中断使能寄存器IE、EIE1、EIE2,3个中断优先级控制寄存器IP、EIP1、EIP2。

IE、EIE1、EIE2可以控制允许或禁止相应的中断,IP、EIP1、EIP2可以定义相应中断为低优先级或高优先级。

EA位(EI.7)是中断允许或禁止的总开关,EA=0时,禁止所有中断,EA=1时,某项中断允许与否由中断使能寄存器中的对应位决定。

T0溢出中断编号为1,中断向量地址为0x000B。

通过将IE寄存器中的ET0位置1来允许定时器0中断,当T0的计数值溢出(从全1变为全0)时,TF0位(TCON.5)被硬件置1,若中断被允许,则引起T0溢出中断。

TF0可以软件清0,当T0中断服务程序被执行时,TF0自动清0。

4)A/D转换
ADC子系统有1个最高速度达200ksps的10位逐次逼近型ADC和1个温度传感器。

ADC有两个输入端口,可编程配置为单端输入或差分输入方式,由模拟通道选择寄存器AMX0P、AMX0N控制,AMX0P选择模拟输入的正端,AMX0N选择模拟输入的负端。

将AMX0N的低5为置为全1,即选择负端接地,
ADC工作在单端输入方式;当负端选择其他端口时,ADC工作在差分输入方式。

其他与AD转换有关的寄存器还有配置寄存器ADC0CF、高位数据寄存器ADC0H、低位数据寄存器ADC0L、控制寄存器ADC0CN。

ADC0CF的高5位用于选择AD转换的时钟,ADC0CN用于控制A/D转换,包括使能ADC模块、选择启动转换的方法、启动转换、指示转换状态等。

向AD0BUSY(ADC0CN.4)写1可以启动转换,转换过程中AD0BUSY=1,转换结束时,AD0BUSY变为0,同时中断标志位ADC0INT被置1。

ADC0H、ADC0L合起来保存10位A/D转换结果,转换结果在两个寄存器中的存放可以有左对齐和右对齐两种方式,由AD0LJST(ADC0CF.2)决定。

A/D转换启动方法有6种,除向AD0BUSY写1可以启动外,T0、T1、T2、T3的溢出都可启动,还有CNVSTR的上升沿触发启动。

本实验A/D转换过程是:向AD0BUSY写1启动转换,读AD0INT状态等待转换结束,当AD0INT=1时,读取结果,处理结果并启动下一次转换。

3实验程序
本实验程序包括主程序和T0中断服务程序。

主程序完成系统初始化、A/D 转换和结果计算处理等功能,中断服务程序控制P2.2脚发光二极管亮灭和闪烁的时间间隔。

程序流程图如下图所示。

源程序如下:
#include <c8051F340.h>//寄存器定义
unsigned int ti,tn;//定时参数
sbit LED2 = P2^2;//P2.2口发光二极管
sbit LED3 = P2^3;//P2.3口发光二极管
unsigned char h,l;//AD转换中间值unsigned int r,rh;
unsigned int x[20];//20次AD转换结果unsigned int sum;//20次AD转换结果之和unsigned int adr;//20次AD转换结果平均值
void AD_Init()
{ //AD初始化,单端输入方式
AMX0P = 0x04;//ADC正端选P2.5
AMX0N = 0xFF;//ADC负端选GND
ADC0CF = 0x40;//选择转换时钟
AD0EN = 1;//使能AD模块
AD0BUSY = 1;//启动转换
}
unsigned int AD_RW()
{ //读取AD转换结果并启动下一次转换
h = ADC0H;//AD转换结果高2位
l = ADC0L;//AD转换结果低8位
rh = (h & 3);
r = rh * 256;
r = r + l;
AD0INT = 0;//中断标志位置0
AD0BUSY = 1;//启动下一次AD转换
return r;
}
void T0_Init()
{ //T0初始化
TMOD = 0x01;//方式1
TH0 = 0xF4;//计数值
TL0 = 0x47;
TCON |= 0x10;//开始计数
}
void P2_Init()
{ //P2口初始化
P2MDOUT |= 0x0C;//P2.2、P2.3推挽输出
P2MDIN = 0xDF;//P2.5模拟输入
P2SKIP = 0x2C;//P2.2、P2.3、P2.5不参与交叉开关分配
XBR1 = 0x40;//使能交叉开关
}
void ISR_Init()
{ //中断初始化
IE |= 0x82;//使能T0中断
}
void T0_ISR() interrupt 1
{ //T0中断服务程序
ti ++;
if(ti >= tn)
{
ti = 0;
LED2 = ~LED2;//发光二极管状态改变
}
T0_Init();//重新启动T0
}
void main()
{
unsigned char adn = 0;
PCA0MD &= ~0x40;//关闭看门狗
//变量初始化
ti = 0;
tn = 5;
sum = 0;
P2_Init();//P2口初始化
AD_Init();//AD初始化
T0_Init();//T0初始化
ISR_Init();//中断初始化
while(1)
{
if(AD0INT == 1)//转换完毕
{
EA = 0;//关中断
x[adn] = AD_RW();//读取AD转换结果并启动下一次转换
EA = 1;//开中断
sum = sum + x[adn];
adn ++;
}
if(adn > 19)//读取了20个值
{
adn = 0;
adr = sum / 20;//求平均值
sum = 0;
tn = adr /10;//确定发光二极管闪烁周期
}
LED3 = 1;//P2.3口发光二极管一直亮
}
}
4实验结果
P2.3口发光二极管一直为点亮状态。

P2.2口发光二极管闪烁,调节电位器,可发现其闪烁频率与P2.5端口输入电压成反比。

附:C8051F340单片机开发板电路原理图。

相关文档
最新文档