版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、嵌入式系统应用技术三、C8051F310+C511实例实例1 通用I/O端口实例2 A/D转换实例3 温度测量实例4 定时器及中断实例5 UART应用实例6 SMBus应用(24C0X)实例7 I2C应用(ZLG7290)实例8 I2C应用(PCF8563T)2实例1 通用I/O端口1.1 C8051F310端口的特殊性1.2 通用I/O端口实例1.3 提高题31.1 C8051F310端口的特殊性C8051F310有29个 I/O 引脚(P0、P1、P2、P3-5脚)通过交叉开关可以使引脚分配给数字外设、模拟外设未分配给的管脚作为通用 I/O(GPIO)(1)端口相关寄存器(2)I/O 端口
2、初始化(3)I/O 端口初始化举例4(1)端口相关寄存器Pn:端口寄存器PnMDIN:输入方式1=数字输入,0=模拟输入PnMDOUT:输出方式0=开漏输出,1=推挽输出PnSKIP:端口跳过0=不跳过,1=跳过XBR0、XBR1:交叉开关0=不分配,1=分配数字外设其中n=03 为复位值5(2)交叉开关P0.0P2.3管脚,通过交叉开关,分配给GPIO或数字外设P2.4P3.4管脚,不通过交叉开关,不分配给数字外设。UARTSMBus等P0.07P1.07P2.03交叉开关P0.0脚P2.4脚P3.4脚P2.47P3.04。P2.3脚.XBR0,XBR1,PnSKIP.6(3)I/O 端口初
3、始化端口 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步。输入PnMDIN数字模拟10输出PnMDOUT开漏推挽0017(3)I/O 端口初始化举例例如:C8051F310目标板上的发光管D2接到了P3.3脚
4、,按钮S2接到了P0.7脚,模拟量接到了P2.4脚。P3.3做数字输出、 P0.7做数字输入、 P2.4做模拟输入P3MDIN = 0 xff;/P3.3做数字输入(默认)P3MDOUT = 0 x08;/P3.3推挽输出P0MDIN = 0 xff;/P0.7做数字输入(默认)P2MDIN = 0 xef;/P2.4做模拟输入81.2 通用 I/O 端口应用实例例题:C8051F310目标板上的发光管D2接到了P3.3脚,按钮S2接到了P0.7脚,模拟量接到了P2.4脚。要求:松开S2则D2慢闪,按住S2则D2快闪。91.2 通用 I/O 端口应用实例(续)#include / C8051F
5、310的SFR定义sbitLED=P33;/ LED位定义sbitSW=P07;/ SW位定义/- 延时 -void delay(unsigned long v)while(-v);/- 主程序 -void main(void)PCA0MD &= 0 x40;/ WDTE = 0 (禁止看门狗)P3MDIN = 0 xff;/P3.3做数字输入(默认)P3MDOUT = 0 x08;/P3.3推挽输出P0MDIN = 0 xff;/P0.7做数字输入(默认)while(1)LED = !LED;/LED闪烁delay(SW ? 20000 : 5000);/SW按下则快闪,否则慢闪101.3
6、提高题(1)按一下S2,D2亮,再按一下S2,D2灭,依此类推。(2)按下S2,D2闪亮3次,松开S2,D2闪亮2次,依此类推。(3)用C8051F310带动DP-51实验箱,使8个LED左向、右向流水点亮。11实例2 A/D转换2.1 C8051F310的AD转换器简介2.2 左右对齐的例子2.3 ADC相关寄存器2.4 ADC 输入引脚配置2.5 A/D转换实例2.6 提高题1210位ADC原理框图 除P0口132.1 C8051F310的AD转换器简介10 位逐次逼近型 ADC, 最高采样率200kspsAMX0P:正输入:23 选 1:P1.0P3.4、温度传感 器、VDDAMX0N:
7、负输入:22 选 1:P1.0P3.4、GND单端方式:GND作为负输入,其余为差分方式 (略)。ADC0H、ADC0L:转换结果AD0LJST 位:决定转换结果左对齐或右对齐Justified输入范围: 0 VREF*1023/1024AD值与输入电压( VIN)的关系:VINVREFAD值 = ( ) * 1024142.2 左右对齐的例子单端方式时左、右对齐的例子152.3 电压基准VREFREF0CN: 电压基准控制寄存器REFSL:0=选择外部电压基准(来自P0.0脚) 1=或内部电压基准(VDD)TEMPE:1=允许内部温度传感器工作BIASE:1=内部偏压发生器工作(使用 ADC
8、 时该位必须为1) 162.3 ADC相关寄存器AMUX0P:ADC 正输入通道选择寄存器AMX0P(正端选择):可选P1.0P3.4、温度传感 器、VDDAMUX0N:ADC 负输入通道选择寄存器AMX0N(负端选择):可选P1.0P3.4、GND172.3 ADC相关寄存器(续1)ADC0CF:配置寄存器每次AD转换约需11个AD时钟脉冲AD0SC(选择AD时钟):复位后,AD时钟=系统时钟/32AD0LJST(左对齐) :0=右对齐最低采样率 = 24.5MHz / 32 / 11 = 70ksps最高采样率200ksps,此时AD0SC = ?11系统时钟频率AD0SC + 1AD时钟
9、频率=D7D6D5D4D3D2D1D0复位值AD0SCAD0LJST -11111000182.3 ADC相关寄存器(续2)ADC0CN:控制寄存器 地址=0 xE8,可位寻址AD0EN(ADC允许):1=允许ADCAD0TM(跟踪方式) :0=正常方式,一直跟踪 AD0INT(结束标志) :1=AD转换结束AD0BUSY(忙标志):若 AD0CM000,AD0BUSY置1则启动AD转换AD0CM(启动方式):000=向AD0BUSY 写1时启动AD转换 写入1AD0BUSY转换结束启动方式0:192.4 ADC 输入引脚配置注意:作为 ADC 输入的引脚应:配置为模拟输入( PnMDIN对应
10、位置 0 ),使交叉开关跳过(如果是P0.0-P2.3,PnSKIP对应位置 1 ) 。202.5 A/D转换实例例题:按图在C8051F310目标板的J6上接一个电位器,要求:向P2.5输出高电平(=VDD),从P2.4读入模拟电压。当输入电压小于VDD一半时,发光管D2慢闪,否则快闪。C8051F310目标板J6: P2.4P2.5P0.0212.5 A/D转换实例(续1)#include / C8051F310的SFR定义sbitLED=P33;/ LED位定义sbitP25=P25;/ P2.5位定义bitbKuai;/ 快慢标志/- 延时 -void delay(unsigned l
11、ong v)while(-v);/- 初始化 -void First(void)PCA0MD &= 0 x40;/ WDTE = 0 (禁止看门狗)P3MDOUT = 0 x08;/ LED=P3.3推挽输出P2MDOUT = 0 x20;/ P2.5推挽输出,给电位器供电P2MDIN = 0 x10;/ P2.4模拟输入AMX0P = 0 x0c;/ 正输入=P2.4AMX0N = 0 x1f;/ 负输入=GNDADC0CF = 0 xf8;/ 右对齐(默认)ADC0CN = 0 x00;/ 向 AD0BUSY 写 1 时启动 ADC0 转换(默认)REF0CN = 0 x0a;/ VDD作
12、VREF,开偏压AD0EN = 1;/ 允许 ADC0222.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 51
13、2);/ 决定快慢232.6 提高题(1)用电位器改变输入电压,电压越高,D2闪烁越快,直至全亮;电压越低,D2闪烁越慢,直至全暗。(2)用C8051F310带动DP-51实验箱,使8个LED流水点亮。当电压大于2/3满量程,LED左向流动,当电压1/32/3满量程,LED闪烁,当电压小于1/3满量程,LED右向流动。24实例3 温度测量3.1 片内温度传感器简介3.2 温度测量实例3.3 提高题253.1 片内温度传感器简介要使用内部温度传感器,REF0CN.2(TEMPE)必须置1。正端输入 AMX0P=0 x1E,选择温度传感器负端输入 AMX0N=0 x1F,选择GND温度传感器的传输
14、函数 :mV温度=3.35*(温度)+897mVVINVREFAD值 = ( ) * 1024当Vref = VDD = 3.3V时,1 - 3.35mV- 3.35/3300*1024=1.04 AD值263.2 温度测量实例例题:利用C8051F310目标板,编程测量环境温度。当温度较低(如低于20)时,发光管D2慢闪,否则快闪。解:Vref = VDD = 3.3V20的mV温度=3.35*20+897=964mV20的AD值=964/3300*1024=351C8051F310目标板C8051F310片内温度传感器273.2 温度测量实例(续1)#include / C8051F310
15、的SFR定义sbitLED=P33;/ LED位定义bitbKuai;/ 快慢标志/- 延时 -void delay(unsigned long v)while(-v);/- 初始化 -void First(void)PCA0MD &= 0 x40;/ WDTE = 0 (禁止看门狗)P3MDOUT = 0 x08;/ LED=P3.3推挽输出P2MDOUT = 0 x20;/ P2.5推挽输出,给电位器供电P2MDIN = 0 x10;/ P2.4模拟输入AMX0P = 0 x1e;/ 正输入=温度传感器AMX0N = 0 x1f;/ 负输入=GNDADC0CF = 0 xf8;/ 右对齐(
16、默认)ADC0CN = 0 x00;/ 向 AD0BUSY 写 1 时启动 ADC0 转换(默认)REF0CN = 0 x0e;/ Vref=VDD,允许温度传感器,开偏压AD0EN = 1;/ 允许 ADC0283.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 : 20
17、000);/ 快慢闪ad = ADC0H*256 + ADC0L;/ 读取AD值bKuai = (ad 351);/ 决定快慢,根据实际情况修改293.3 提高题(1)用手指给C8051F310加温,温度越高D2闪烁越快。(2)用C8051F310带动DP-51实验箱,使8个LED流水点亮。温度越高,流动越快。30实例4 定时器及中断4.1 定时器的时钟4.2 定时器的相关寄存器4.3 定时器的初值4.4 定时器中断实例4.5 提高题314.1定时器的时钟内部振荡频率=24.5MHz,系统时钟=24.5MHz / 振荡器分频T0时钟=系统时钟 / 定时器分频内部振荡24.5MHzOSCICN:
18、IFCN振荡器分频定时器分频CKCON :T0M、SCAT0时钟系统时钟324.2 定时器的相关寄存器内部振荡频率=24.5MHz,系统时钟=24.5MHz / 振荡器分频OSCICN:内部振荡器控制寄存器IOSCEN:1=内部振荡器使能。IFRDY:内部振荡器就绪标志。1=就绪IFCN :内部振荡器到SYSCLK的分频位缺省分频数为8。系统时钟=24.5/8=3.0625MHzIFCNSYSCLK=0024.5MHz/80124.5MHz/41024.5MHz/21124.5MHz/1334.2 定时器相关的寄存器(续1)T0时钟=系统时钟 / 定时器分频CKCON :时钟控制寄存器T1M:
19、类似于T0M。T0M:0=T0时钟由分频位(SCA)决定。 1=T0时钟为系统时钟SCA:T0、T1 分频位SCAT0、T1时钟00系统时钟/1201系统时钟/410系统时钟/4811外部时钟/8344.3定时器的初值例如:振荡器分频=1,T0分频=12,求定时10ms的初值=?振荡器分频=1:OSCICN |= 0 x03;SYSCLK=24.5MHzT0分频=12(默认):CKCON = 0 x00;T0时钟=24.5/12=2.0417MHz10ms计数=10000(us) * 2.0417(次/us)= 20417T0初值=65536 - 20417内部振荡24.5MHzOSCICN:
20、IFCN振荡器分频定时器分频CKCON :T0M、SCAT0时钟354.4 定时器中断实例例题:用定时器及中断功能,构造C8051F310应用程序框架,具有1ms、10ms、100ms、1s函数调用。利用程序框架,编制发光管D2每秒亮100ms的程序。100ms1s364.4 定时器中断实例(续1)#include / C8051F310的SFR定义/ T0时钟=24.5/12=2.0417MHz,10ms计数=10000(us)*2.0417(次/us)=20417#defineT0_VAL(65536-20417)/ T0初值sbitLED=P33;/ LED位定义bitb10ms;/ 1
21、0ms标志unsigned char Cnt10ms;/- 初始化 -void First(void)PCA0MD &= 0 x40;/ WDTE = 0 (禁止看门狗)P3MDOUT = 0 x08;/ LED=P3.3推挽输出OSCICN |= 0 x03;/ SYSCLK=24.5MHzCKCON = 0 x00;/ 默认值:T0=系统时钟/12TMOD = 0 x01;/ T0方式1TH0 = T0_VAL / 256;TL0 = T0_VAL % 256;TR0 = 1;/ 启动T0ET0 = 1;EA = 1;374.4 定时器中断实例(续2)/- 10ms处理 -void do_
22、10ms(void)/- 100ms处理 -void do_100ms(void)/- 1s处理 -void do_1s(void)LED = !LED;/ LED 亮1秒、暗1秒384.4 定时器中断实例(续3)/- 主程序 -void main(void)First ();/ 初始化while(1)if(b10ms)b10ms = 0;do_10ms();if(Cnt10ms % 10 = 0)do_100ms();if(+Cnt10ms = 100)Cnt10ms=0;do_1s();394.4 定时器中断实例(续4)/- 定时中断 10ms -void T0_Int(void)inte
23、rrupt 1TH0 = T0_VAL / 256;TL0 = T0_VAL % 256;b10ms = 1;注意:中断函数定义函数名任意,加上 interrpt n修饰,n为中断号,T0中断为1号中断。中断函数的入口参数、出口参数均为void。404.4 定时器中断实例(续5)要实现LED每秒亮100ms的效果,只要每秒点亮LED,每100ms熄灭LED即可。/- 100ms处理 -void do_100ms(void)LED = 0;/ 熄灭LED/- 1s处理 -void do_1s(void)LED = 1;/ 点亮LED414.5 提高题(1)用DP-51实验箱,使LED1以1秒闪烁
24、, LED2以2秒闪烁, LED2LED8流水点亮。42实例5 UART应用5.1 交叉开关5.2 交叉开关相关的寄存器5.3 波特率5.4 UART应用实例5.5 UART应用实例b5.6 提高题43数字交叉开关原理框图445.1 交叉开关P0.0P2.3管脚,通过交叉开关,分配给GPIO或数字外设UARTSMBus等P0.07P1.07P2.03交叉开关P0.0脚P2.4脚P3.4脚P2.47P3.04。P2.3脚.XBR0,XBR1,PnSKIP.455.1 交叉开关(续1)交叉开关:优先权交叉开关译码器某些数字资源(如UART、SMBus等)需要引脚,交叉开关为其分配引脚。从P0.0到
25、P2.3按顺序分配(UART0总是使用P0.4和P0.5)。PnSKIP中被置1的那些位,将被跳过。如用于VREF、模拟输入、晶振或 GPIO 的引脚。465.1 交叉开关(续2)没有引脚被跳过(PnSKIP=0 x00)的交叉开关优先权译码表 475.1 交叉开关(续3)晶体引脚被跳过的交叉开关优先权译码表 485.2 交叉开关相关的寄存器XBR0:交叉开关寄存器0SMB0E :SMBus I/O 使能位,1=连到端口引脚。URT0E :UART I/O 使能位,1=连到端口引脚。其他省略位:其他数字外设使能。XBR1:交叉开关寄存器1XBARE :交叉开关使能位。要使用交叉开关,应使XBA
26、RE=1。其他省略位:其他数字外设使能。495.3 波特率使用内部振荡器时的波特率内部振荡24.5MHzOSCICN:IFCN振荡器分频定时器分频CKCON :T1M、SCAT1时钟系统时钟T1定时溢出溢出T1:方式2波特率2T1时钟505.3 波特率(续1)UART0 波特率公式:波特率 = 2例:振荡器分频=1,T1分频=12,波特率=9600,求T1的初值=?解:振荡器分频=1:OSCICN |= 0 x03;SYSCLK=24.5MHzT1分频=12 (默认) :CKCON = 0 x00;T1时钟=24.5/12=2.0417MHz波特率 = 9600T1计数值 = 2041700
27、/ 9600 / 2 = 106T1初值 = 256 106 = 150T1CLK(256-T1H)51RS-2325.4 UART应用实例例题:C8051F310通过串口发送一些信息。通过电脑运行的串口调试软件显示这些信息。C8051F310目标板C8051F310525.4 UART应用实例(续1)#include / C8051F310的SFR定义#include / 可以使用printf等函数#defineT0_VAL(65536-20417)/ T0初值sbitLED=P33;/ LED位定义bitb10ms;/ 10ms标志unsigned char Cnt10ms;/- 初始化
28、-void First(void)PCA0MD &= 0 x40;/ WDTE = 0 (禁止看门狗)P3MDOUT = 0 x08;/ LED=P3.3推挽输出CKCON = 0 x00;/ 默认值:T0=系统时钟/12TMOD = 0 x21;/ T1方式2,T0方式1TH0 = T0_VAL / 256;TL0 = T0_VAL % 256;TR0 = 1;/ 启动T0ET0 = 1;EA = 1;535.4 UART应用实例(续2)/- UART初始化 -void UART_init(void)OSCICN |= 0 x03;/ SYSCLK=24.5MhzXBR0 = 0 x01;/
29、 交叉开关0:允许UARTXBR1 = 0 x40;/ 交叉开关1:允许XBARSCON0 = 0 x10;/ SCON0: 8位,允许接收,TH1 = (256-106);/ 波特率=9600TL1 = TH1; TR1 = 1;/ 启动 Timer1TI0 = 1;/ TI 发送完成545.4 UART应用实例(续3)/- 10ms处理 -void do_10ms(void)/- 100ms处理 -void do_100ms(void)/- 1s处理 -void do_1s(void)LED = !LED;/ LED闪烁printf(“rnHello”);/ 向串口输出字符串555.4 U
30、ART应用实例(续4)/- 主程序 -void main(void)UART_init();/ UART初始化First ();/ 初始化while(1)if(b10ms)b10ms = 0;do_10ms();if(Cnt10ms % 10 = 0)do_100ms();if(+Cnt10ms = 100)Cnt10ms=0;do_1s();565.4 UART应用实例(续5)/- 定时中断 10ms -void T0_Int(void)interrupt 1TH0 = T0_VAL / 256;TL0 = T0_VAL % 256;b10ms = 1;由于系统函数printf()占用资源比
31、较多,建议自己编写简单的字符串输出函数Fs_Str()。575.5 UART应用实例b不使用printf函数,自己构建Fs_Str函数:/- 串口发送1字节 -void Fs_1Byte(unsigned char v)SBUF0 = v;while(!TI0);TI0 = 0;/- 串口发送code字符串 -void Fs_Str(unsigned char code *Str)while(*Str)Fs_1Byte(*Str+);去掉头文件#include 在使用printf(“rnHello);的地方,改为Fs_Str(rnHello);585.4 UART应用实例(续5)无printf
32、、Fs_Str函数时,资源占用:Program Size: data=20.1 xdata=0 code=125用printf函数时,资源占用:Program Size: data=41.2 xdata=0 code=1183推算,printf需要资源:data=41.2-20.1=21.1,code=1183-125=1058用自建Fs_Str函数,资源占用:Program Size: data=23.1 xdata=0 code=194推算, Fs_Str函数需要资源:data=23.1-20.1=3,code=194-125=69595.6 提高题(1)试将上述例题中的波特率改为4800
33、。(2)通过串口,将温度值每秒一次发送到电脑。(3)通过串口,发送以下信息:按一次S2,将C8051F310内部RAM的00H7FH单元的内容发送到电脑显示。60实例6 SMBus应用(24C0X)6.1 SMBus规范6.2 24C0X简介6.3 I2C底层程序6.4 I2C测试程序(24C0X)6.5 提高题(24C0X)616.1 SMBus规范SMBus与I2C兼容用2根导线传递双向信号:SDA:串行数据SCL:串行时钟典型SMBus 连接:626.1 SMBus规范(续1)SMBus规定:SCL=0时,SDA可以变化;SCL=1时,SDA的变化有特殊定义。开始位:SCL=1时,SDA
34、的下跳变。停止位:SCL=1时,SDA的上跳变。数据1:SCL=1时,SDA的1。数据0:SCL=1时,SDA的0。应答ACK:即数据0。应答NACK:即数据1。SCLSDA开始位停止位SCLSDA数据1数据0ACKNACK636.1 SMBus规范(续2)主器件:发开始位、停止位,发SCL。通常由MCU担任。从器件:听从主器件指挥。通常为各种外围功能芯片。可以有1个主器件,多个从器件。每个从器件有从地址SLA,最低位为读写位,0=写,1=读。例如:I2C接口E2PROM芯片24C0X的从地址为1010000X,(0 xA0)I2C接口键盘及LED驱动ZLG7290的从地址为0111000X,
35、(0 x70)I2C接口日历芯片PCF8563的从地址为1010001X,(0 xA2)主、从器件都可以发送、接收。接收者负责返回应答信号ACK或NACK一次通讯过程由1个开始位、若干数据字节+应答、1个停止位组成646.2 24C0X简介24C01A/02A/04A1K/2K/4K位的电擦除PROM。使用标准2线串行接口I2C。同一总线中最多可连接8个24C01/02或4个24C04。有硬件写保护功能。656.3 I2C底层程序例题:以F310为主器件,24C02为从器件为例,编制I2C底层程序和测试程序。1KVCCF310P0.1 SCLP0.0 SDAGND24C02SCL A0SDA
36、A1 A2GND WP666.3 I2C底层程序(续1)/-口位地址定义-sbitSDA= P00;sbitSCK= P01;/-发送1个开始位-void Start(void)SDA=1; SCK=1;SDA=0;SCK=0;SDA=1;/ 释放SDA/-发送1个停止位-void Stop(void)SDA=0;SCK=1;SDA=1;SCLSDA起始位结束位676.3 I2C底层程序(续2)bit bACK;/-发出1个NACK,也用于读入ACK -bit TestACK()SDA=1;SCK=1;bACK=SDA;SCK=0;return(bACK);/-发出1个ACK-void I2C
37、_ACK(void)SDA=0;SCK=1;SCK=0;SDA=1;SCLSDANACKACK686.3 I2C底层程序(续3)/-输出8位。入口 v=发送的数据-void Out8Bit(uchar v)uchar i;for(i=0;i8;i+)SDA=(bit)(v & 0 x80);/ 高位移到SDASCK=1;/ 发1个时钟SCK=0;v=v1;TestACK();/ 发送SDA=1,以接收ACKSCLSDA写出数据1写出数据0696.3 I2C底层程序(续4)/- 输入8位。入口:fACK=发送的ACK,返回:接收的数据 -uchar In8Bit(bit fACK)uchar i
38、,v=0;for(i=0;i8;i+)SCK=1;/ 发1个时钟v=v1;v=v | (uchar)(SDA);/ 读SDASCK=0;if(fACK)I2C_ACK();/ 发ACKelseTestACK();/ 发NACKreturn(v);SCLSDA读到数据1读到数据0706.3 I2C底层程序(续5)MCU写出1字节到E2PROM:从应答主发送0=Wr1 0 1 0 0 0 0 0716.3 I2C底层程序(续6)/-写出1个字节。入口 Addr=8位地址,v=数据 -void I2C_Wr1By(uchar Addr,uchar v)Start();/ 发送1个开始位Out8Bit
39、(0 xa0);/ 发出器件slave地址,24系列为1010XXX0写Out8Bit(Addr);/ 发送存储单元地址Out8Bit(v);/ 发送写数据Stop();/ 发送1个停止位ACKPol();/ ACK轮询,检查写完成/- ACK轮询,等待写完成。-void ACKPol(void)bACK=1;while(bACK)/ 取EE的ACKStart();/ 发送1个开始位Out8Bit(0 xa0);/ 发写命令,如果器件忙,bACK=1Stop();/ 发送1个停止位726.3 I2C底层程序(续7)MCU从E2PROM读入1字节:从应答主应答主发送从发送0=Wr1=Rd1 0
40、1 0 0 0 0 01 0 1 0 0 0 0 1736.3 I2C底层程序(续8)/-读入1个字节。入口 Addr=8位地址,返回读入数据-uchar I2C_Rd1By(uchar Addr)uchar v;Start();/ 发送1个开始位Out8Bit(0 xa0);/发出器件slave地址,24系列为1010XXX0写Out8Bit(Addr);/ 发送存储单元地址Start();/ 再发送1个重启动命令Out8Bit(0 xa1);/ 发出器件slave地址,24系列为1010XXX1读v=In8Bit(0);/ 读入1字节数据,发NACK,告诉器件要结束了Stop();/ 发送
41、1个停止位return(v);746.4 I2C测试程序(24C0X)#include / C8051F310的SFR定义/- 初始化 -void First(void)PCA0MD &= 0 x40;/ WDTE = 0 (禁止看门狗)P0MDOUT = 0 x00;/ P0.0=SDA,P0.1=SCK,OC输出XBR1 = 0 x40;/ 交叉开关1:允许XBAR/- 主程序(测试I2C函数) -void main(void)uchar Addr=0 x02,Wr_v=0 x40,Rd_v;First ();/ 初始化while(1)I2C_Wr1By(Addr,Wr_v);/ 将Wr_
42、v的值写出到Addr地址Rd_v = I2C_Rd1By(Addr);/ 读入Addr地址的值到Rd_vAddr+;Wr_v+;756.5 提高题(24C0X)(1)通过串口读取24C0X:键入“D0”,显示24C0X的00H0FH单元的内容,键入“D1”,显示24C0X的10H1FH单元的内容,依此类推。(2)通过串口读写24C0X:键入一个字符串,以回车结束,保存到24C0X。断电重新启动后,显示一次24C0X中保存的字符串。76实例7 I2C应用(ZLG7290)7.1 ZLG7290简介7.2 F310与ZLG7290的连接7.3 ZLG7290的驱动7.4 ZLG7290测试程序7.
43、5 提高题(ZLG7290)777.1 ZLG7290简介特点LED/键盘驱动芯片I2C串行接口,写:0 x70;读:0 x71可驱动8位共阴数码管和64个按键。可控扫描位数,可控任一数码管闪烁。无需外接元件驱动LED。提供键盘中断。可检测键的连击次数。787.2 F310与ZLG7290的连接C8051F310与ZLG7290连接示意图ZLG7290SDASCLINTRSTF310P10P11P12P13VCC1K位置0797.3 ZLG7290的驱动ZLG7290速度较慢,I2C驱动中要加延时例如:void nop(uchar n)for( ;n!=-1;n-);/*发送1个启动命令*/v
44、oid Start(void)SDA=1;nop(1);SCK=1;nop(1);SDA=0;nop(1);SCK=0;nop(1);SDA=1;nop(1);807.3 ZLG7290的驱动(续1)ZLG7290显示通讯接口:从地址=0 x70内部有寄存器0 x000 x17,7、8号是命令接口在第w个位置处显示v的方法是,连续向7、8号寄存器写入:DP=1:小数点亮Flash=1:闪烁最右边数码管的位置w=0显示值v=0F例如:在第7个位置处显示3:向7、8号送0 x67、0 x03寄存器D7D6D5D4D3D2D1D070110显示位w8DPFlash0显示值v817.3 ZLG7290
45、的驱动(续2)连续写出n个字节的函数:/入口 sla=从地址,Addr=8位地址,*s=指向数据,n=数据个数void I2C_WrnBy(uchar sla,uchar Addr,uchar data *s,uchar n)uchar i;Start();/ 发送1个开始位Out8Bit(sla);/ 发出器件slave地址,ZLG7290为0 x70Out8Bit(Addr);/ 发送存储单元地址for(i=0;in;i+)/ 连续n次Out8Bit(*s+);/ 发送写数据 Stop();/ 发送1个停止位827.3 ZLG7290的驱动(续3)zlg7290 显示命令(在第w位,显示v
46、):#define ZLG7290_sla 0 x70/ZLG7290的从地址=0 x70void ZLG7290_Disp(uchar w,uchar v)uchar Data2;Data0=0 x60+w;Data1=v;I2C_WrnBy(ZLG7290_sla,0 x07,Data,2);Delay(10);例如:在第7个位置处显示3:ZLG7290_Disp(7, 3);837.3 ZLG7290的驱动(续4)ZLG7290键盘通讯接口:当有按键时,ZLG7290发出INT=01号寄存器为键值寄存器,0=无键,116=键值。读键程序:sbit KEY_INT =P12;uchar k
47、ey;if(KEY_INT=0)key=I2C_Rd1By(ZLG7290_sla,1);/ 从1号寄存器读入键值ZLG7290_Disp(0,key);/ 在第0位处,显示键值847.3 ZLG7290的驱动(续4)ZLG7290的复位:初始化时做一次,向RST发出一个负脉冲,延时一段时间,等待ZLG7290完成复位。复位函数:sbit ZLG_RST =P13;/ ZLG_RST管脚要上拉1K电阻,抗干扰/- zlg7290 复位 -void ZLG7290_reset(void)ZLG_RST=0;Delay(1);ZLG_RST=1;Delay(200);857.4 ZLG7290测试
48、程序先在数码管上显示“76543210”,然后,每按一键,在第0位置处显示键值。void main(void)uchar i,key;First ();/ 初始化ZLG7290_reset();for(i=0;i8;i+)ZLG7290_Disp(i,i);/ 在第i位处,显示i值while(1)if(KEY_INT=0)key=I2C_Rd1By(ZLG7290_sla,1);/ 从1号寄存器读入键值ZLG7290_Disp(0,key);/ 在第0位处,显示键值867.5 提高题(ZLG7290)(1)在右边3个数码管上显示一个0255的计数值,每0.1秒增1。(2)在上题基础上,增加以下功能:当按过1号键,每0.1秒增1 ;按过2号键,每0.1秒减1 。87实例8 I2C应用(PCF8563T)8.1 PCF8563T简介8.2 F310与PCF8563T的连接8.3 PCF8563T的驱动8.4 PCF8563T测试程序8.5 提高题(PCF8563T)888.1 PCF8563T简介特点实时时钟日历芯片,I2C串行接口,写:0 xA2;读:0 xA3 可编程时钟输出,报警和定时器.898.2 F310与PCF8563T的连接C8051F310与PCF8563T连接示意图
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 自动售货机产品供应链分析
- 工业物联网行业相关项目经营管理报告
- 人造琥珀制小雕像产品供应链分析
- 手表修理或保养行业相关项目经营管理报告
- 健身指导课程行业相关项目经营管理报告
- 光电转换器产品供应链分析
- 电源电缆项目运营指导方案
- 废水处理工程行业相关项目经营管理报告
- 纺织品清棉机细分市场深度研究报告
- 危险物质仓库储存行业营销策略方案
- 哈贝马斯的沟通行动理论知识课件
- 化疗药物引起的外周神经毒性课件
- 水利部2002预算定额全套版
- 无人机培训心得体会1
- CPA会计知识点总结完美版
- 康复医院设置标准汇总
- CA码生成原理及matlab程序实现
- 国家开放大学《电气传动与调速系统》章节测试参考答案
- 《装配基础知识培训》
- 出口退税的具体计算方法及出口报价技巧
- PCB镀层与SMT焊接
评论
0/150
提交评论