讲稿《嵌入式系统应用技术》“三”
嵌入式系统应用技术,三、C8051F310+C51应用实例赵玉昆,实例,实例1 通用I/O端口 实例2 A/D转换 实例3 温度测量 实例4 定时器及中断 实例5 UART应用 实例6 SMBus应用(24C0X) 实例7 I2C应用(ZLG7290) 实例8 I2C应用(PCF8563T),实例1 通用I/O端口,1.1 C8051F310端口的特殊性 1.2 通用I/O端口实例 1.3 提高题,1.1 C8051F310端口的特殊性,C8051F310有29个 I/O 引脚(P0、P1、P2、P3-5脚) 通过交叉开关可以使引脚分配给数字外设、模拟外设 未分配给的管脚作为通用 I/O(GPIO) (1)端口相关寄存器 (2)I/O 端口初始化 (3)I/O 端口初始化举例,(1)端口相关寄存器,Pn: 端口寄存器 PnMDIN: 输入方式 1=数字输入,0=模拟输入 PnMDOUT: 输出方式 0=开漏输出,1=推挽输出 PnSKIP: 端口跳过 0=不跳过, 1=跳过 XBR0、XBR1: 交叉开关 0=不分配, 1=分配数字外设其中n=03 为复位值,(2)交叉开关,P0.0P2.3管脚,通过交叉开关,分配给GPIO或数字外设 P2.4P3.4管脚,不通过交叉开关,不分配给数字外设。,UART SMBus 等,P0.07 P1.07 P2.03,交叉 开关,P0.0脚,P2.4脚,P3.4脚,P2.47 P3.04,。,P2.3脚,.,XBR0,XBR1,PnSKIP,(3)I/O 端口初始化,端口 I/O 初始化(教科书P47) 1 输入方式(PnMDIN),端口引脚的输入方式(模拟或数字)。 2 输出方式(PnMDOUT),端口引脚的输出方式(开漏或推挽)。 3 端口跳过寄存器(PnSKIP),交叉开关跳过的引脚。 4 将引脚分配给要使用的外设。(XBR0、XBR1) 5 使能交叉开关(XBARE =1)。 说明:通用I/O端口(P0.0-P2.3)的初始化要做第1、2、5步。通用I/O端口(P2.4-P3.4)的初始化只要做第1、2步。,(3)I/O 端口初始化举例,例如:C8051F310目标板上的发光管D2接到了P3.3脚,按钮S2接到了P0.7脚,模拟量接到了P2.4脚。P3.3做数字输出、 P0.7做数字输入、 P2.4做模拟输入P3MDIN = 0xff; /P3.3做数字输入(默认)P3MDOUT = 0x08; /P3.3推挽输出P0MDIN = 0xff; /P0.7做数字输入(默认)P2MDIN = 0xef; /P2.4做模拟输入,1.2 通用 I/O 端口应用实例,例题:C8051F310目标板上的发光管D2接到了P3.3脚,按钮S2接到了P0.7脚,模拟量接到了P2.4脚。要求:松开S2则D2慢闪,按住S2则D2快闪。,1.2 通用 I/O 端口应用实例(续),#include / C8051F310的SFR定义 sbit LED =P33; / LED位定义 sbit SW =P07; / SW位定义 /- 延时 - void delay(unsigned long v) while(-v); /- 主程序 - void main(void) PCA0MD /SW按下则快闪,否则慢闪 ,1.3 提高题,(1)按一下S2,D2亮,再按一下S2,D2灭,依此类推。 (2)按下S2,D2闪亮3次,松开S2,D2闪亮2次,依此类推。 (3)用C8051F310带动DP-51实验箱,使8个LED左向、右向流水点亮。,实例2 A/D转换,2.1 C8051F310的AD转换器简介 2.2 左右对齐的例子 2.3 ADC相关寄存器 2.4 ADC 输入引脚配置 2.5 A/D转换实例 2.6 提高题,10位ADC原理框图,除P0口,2.1 C8051F310的AD转换器简介,10 位逐次逼近型 ADC, 最高采样率200ksps AMX0P:正输入:23 选 1:P1.0P3.4、温度传感 器、VDD AMX0N:负输入:22 选 1:P1.0P3.4、GND 单端方式:GND作为负输入,其余为差分方式 (略)。 ADC0H、ADC0L:转换结果 AD0LJST 位:决定转换结果左对齐或右对齐Justified 输入范围: 0 VREF*1023/1024 AD值与输入电压( VIN)的关系:,AD值 = ( ) * 1024,2.2 左右对齐的例子,单端方式时左、右对齐的例子,2.3 电压基准VREF,REF0CN: 电压基准控制寄存器REFSL:0=选择外部电压基准(来自P0.0脚)1=或内部电压基准(VDD) TEMPE:1=允许内部温度传感器工作 BIASE:1=内部偏压发生器工作(使用 ADC 时该位必须为1),2.3 ADC相关寄存器,AMUX0P:ADC 正输入通道选择寄存器AMX0P(正端选择):可选P1.0P3.4、温度传感 器、VDDAMUX0N:ADC 负输入通道选择寄存器AMX0N(负端选择):可选P1.0P3.4、GND,2.3 ADC相关寄存器(续1),ADC0CF:配置寄存器每次AD转换约需11个AD时钟脉冲 AD0SC(选择AD时钟):复位后,AD时钟=系统时钟/32 AD0LJST(左对齐) :0=右对齐最低采样率 = 24.5MHz / 32 / 11 = 70ksps 最高采样率200ksps,此时AD0SC = ?11,AD时钟频率=,2.3 ADC相关寄存器(续2),ADC0CN:控制寄存器 地址=0xE8,可位寻址AD0EN(ADC允许):1=允许ADC AD0TM(跟踪方式) :0=正常方式,一直跟踪 AD0INT(结束标志) :1=AD转换结束 AD0BUSY(忙标志):若 AD0CM000,AD0BUSY置1则启动AD转换 AD0CM(启动方式):000=向AD0BUSY 写1时启动AD转换,2.4 ADC 输入引脚配置,注意: 作为 ADC 输入的引脚应: 配置为模拟输入( PnMDIN对应位置 0 ), 使交叉开关跳过(如果是P0.0-P2.3,PnSKIP对应位置 1 ) 。,2.5 A/D转换实例,例题:按图在C8051F310目标板的J6上接一个电位器,要求:向P2.5输出高电平(=VDD),从P2.4读入模拟电压。当输入电压小于VDD一半时,发光管D2慢闪,否则快闪。,2.5 A/D转换实例(续1),#include / C8051F310的SFR定义 sbit LED=P33; / LED位定义 sbit P25=P25; / P2.5位定义 bit bKuai; / 快慢标志 /- 延时 - void delay(unsigned long v) while(-v); /- 初始化 - void First(void) PCA0MD / 允许 ADC0 ,2.5 A/D转换实例(续2),/- 主程序 - void main(void) unsigned int ad; / AD转换结果First (); / 初始化P25 = 1; / 向电位器送出+3.3V电压while(1)AD0BUSY = 1; / 启动 ADC0while(!AD0INT); / 等待AD转换结束AD0INT = 0; / 清除AD转换结束标志LED = !LED; / LED闪烁delay(bKuai ? 5000 : 20000); / 快慢闪ad = ADC0H*256 + ADC0L; / 读取AD值bKuai = (ad > 512); / 决定快慢 ,2.6 提高题,(1)用电位器改变输入电压,电压越高,D2闪烁越快,直至全亮;电压越低,D2闪烁越慢,直至全暗。 (2)用C8051F310带动DP-51实验箱,使8个LED流水点亮。当电压大于2/3满量程,LED左向流动,当电压1/32/3满量程,LED闪烁,当电压小于1/3满量程,LED右向流动。,实例3 温度测量,3.1 片内温度传感器简介 3.2 温度测量实例 3.3 提高题,3.1 片内温度传感器简介,要使用内部温度传感器,REF0CN.2(TEMPE)必须置1。 正端输入 AMX0P=0x1E,选择温度传感器 负端输入 AMX0N=0x1F,选择GND 温度传感器的传输函数 :mV温度=3.35*(温度)+897mV,AD值 = ( ) * 1024,当Vref = VDD = 3.3V时, 1 -> 3.35mV -> 3.35/3300*1024=1.04 AD值,3.2 温度测量实例,例题:利用C8051F310目标板,编程测量环境温度。当温度较低(如低于20)时,发光管D2慢闪,否则快闪。 解:Vref = VDD = 3.3V20的mV温度=3.35*20+897=964mV20的AD值=964/3300*1024=351,3.2 温度测量实例(续1),#include / C8051F310的SFR定义 sbit LED=P33; / LED位定义 bit bKuai; / 快慢标志 /- 延时 - void delay(unsigned long v) while(-v); /- 初始化 - void First(void) PCA0MD / 允许 ADC0 ,3.2 温度测量实例(续2),/- 主程序 - void main(void) unsigned int ad; / AD转换结果First (); / 初始化while(1)AD0BUSY = 1; / 启动 ADC0while(!AD0INT); / 等待AD转换结束AD0INT = 0; / 清除AD转换结束标志LED = !LED; / LED闪烁delay(bKuai ? 5000 : 20000); / 快慢闪ad = ADC0H*256 + ADC0L; / 读取AD值bKuai = (ad > 351); / 决定快慢,根据实际情况修改 ,3.3 提高题,(1)用手指给C8051F310加温,温度越高D2闪烁越快。 (2)用C8051F310带动DP-51实验箱,使8个LED流水点亮。温度越高,流动越快。,实例4 定时器及中断,4.1 定时器的时钟 4.2 定时器的相关寄存器 4.3 定时器的初值 4.4 定时器中断实例 4.5 提高题,4.1定时器的时钟,内部振荡频率=24.5MHz, 系统时钟=24.5MHz / 振荡器分频 T0时钟=系统时钟 / 定时器分频,4.2 定时器的相关寄存器,内部振荡频率=24.5MHz, 系统时钟=24.5MHz / 振荡器分频 OSCICN:内部振荡器控制寄存器IOSCEN:1=内部振荡器使能。 IFRDY:内部振荡器就绪标志。1=就绪 IFCN :内部振荡器到SYSCLK的分频位缺省分频数为8。 系统时钟=24.5/8=3.0625MHz,