傻大方


首页 > 学习 >

单片机|单片机与嵌入式系统



按关键词阅读: 系统 单片机 嵌入式

1、单片机与嵌入式系统实验指导书赵学军计算机系自控实验室2006年5月刖訂2实验一、输入输出接口编程3实验二、键盘与显示编程5实验三、定时与计数器编程6实验四、外部中断的编程7实验五、模数转换与数据采集8实验六、模数转换与信号发生9实验七、串行通讯编程10实验八、电子钟程序设计11实验九、简单计算器程序设计12嵌入式系统的在电子产品中得到广泛的应用 , 其硬件以单片机或嵌入式微处理器为 核心进行设计 。
常用的单片机有:MCS51系列、AT90系列、PIC系列、68HC系列、MSP430系列、C8051F系列;常用嵌入式微处理器有:X86系列、68000、ARM7、ARM9 等 。
在低端电子产品开发中 , MC 。

2、S51系列有着广泛的软硬件资源 , 低档有 MCS51系列 价格低廉 , 高档C8051F系列性能达到8951的50倍 , 接近ARM7的性能 。
在高端电子 产品开发中 , ARM7、ARM9内核的嵌入式微处理器为主流 , ARM7系列价格适中 , 得 到广泛于网络通讯、信息家电、数码产品、工业控制等领域 。
在软件设计开发中 , 用汇 编语言和C语言进行程序设计 , 一般简单软件设计中采用前后台的程序结构 , 在复杂软件设计中要以嵌入式实时RTOS为平台 , 以简化程序设计提高开发效率 。
我们用的开发装置是周立功 DP51PROC单片机综合仿真实验仪 , 支持ASM语言和 C语言的编程 , 提供了数码管显示、图形 LCD显示、键盘、发光二极管、拨 。

3、动开关、 串行A/D、串行D/A等硬件资源;能进行I2C接口、USB接口、CAN总线、RS485 RS232串行、红外等计算机通信实验;实验前一定要进行全面的预习 , 画出程序框图并编写出程序 , 作为预习报告进行检 查 , 在预习的基础上进行实验 , 才能得到满意的收获 。
鼓励同学们自学单片机 C语言来 完成本实验 。
实验一、输入输出接口编程、实验目的1掌握单片机的开发工具的使用 。
2、掌握单片机基本I/O 口的编程二、实验内容1单片机的开发过程学习单片机实验仪的一般操作 , 在开发环境下练习单片机ASM语言或C语言程序的录入、编译、下载、执行和调试等过程 。
2、霓虹灯控制程序用P1 口控制8个LED , 按P3 口输入信 。

4、号的不同模式选择4种16次循环点亮方式 ,用软件延时实现1秒的扫描周期 。
三、实验原理单片机的P0P3为双向端口 , 每一位都可以独立地定义为输入或输出 ,在作输入时 必须先向该位写“1” , 该位才能作为输入 。
本实验中要实现循环输出 , 最常用的方法是循环计数实现循环次数控制 , 对计数器 值进行查表转换得出输出值 , 输出到 P1 口进行显示 , “ 0”表示灯亮 , “ 1”表示灯灭 。
本实验中的延时 , 用软件延时方法产生 , 延时时间 二程序总机器周期数*循环次数, 机器周期 。
实验程序框图如下:输出表格确定发光模式 , 实验中定义表格如下:TAB1: DB 01H,03H,02H,06H,04H,0CH,08H,18HTAB2 。

5、: DB 01H,02H,04H,08H,10H,20H,40H,80HTAB3: DB 80H,40H,20H,10H,08H,04H,02H,01H,TAB4: DB用户自己定义输入信号使用P3 口的2个位 , 如P3.0和P3.1,可以确定4种模式 四、实验预习1学习汇编语言编程的有关知识2、提前编写程序 , 写出预习报告五、实验报告1总结出实验的详细步骤 。
2、写出调试正确的程序及框图*参考程序ORG 0000HLP:MOV P1,#0FFHSETB P3.0SETB P3.1;
P1 , P3.0 , FLP0:MOV R7,#8MOV R4,#0;置旋环次数LP1:LCALL GETDPTR;判断取何 。

6、表值MOV A,R4MOVC A,A+DPTRCPL A;查表MOV P1,AINC R4LCALL DELAY1DJNZ R7,LP1SJMP LP0;送 P1 口;
(250);
延时一秒DELAY1: MOV R5,#250复位LL1:LCALL DELAY0LCALL DELAY0DJNZ R5,LL1RETDELAY0: MOV R6,#250LL0:NOPNOPJNZ R6,LL0RETGETDPTR:MOV A,P3ANL A,#03HL0:JNZ L1MOV DPTR,#TAB1RET;
P3.1P3.0=00 的情况L1:CJNE A,#01H ,L2MOV DPTR,#TAB2R 。

7、ET;
P3.1P3.0=01 的情况L2:CJNE A,#02 H,L3MOV DPTR,#TAB3RET;
P3.1P3.0=10 的情况的情况RETTAB1:DB 03H,06H,0CH,18H,30H,60H,0C0H,81HTAB2:DB 01H,02H,04H,08H,10H,20H,40H,80HTAB3:DB 0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,7FHTAB4:DB 80H,40H,20H,10H,08H,04H,02H,01HEND实验二、键盘与显示编程、实验目的1、熟悉ZLG7290芯片的接口和编程2、掌握键盘与数码管显示程序的设计二、实验内容 。

8、设计单片机程序 , 读取键盘的按键值(键值为116) , 并将键值在数码管上以10进 制进行显示 。
三、实验原理数码管动态扫描显示的基本原理是 , 单片机依次向每个数码管发出段选码和对应的 位选码 , 对数码管逐个循环点亮 , 选择适当的扫描速度 , 利用人眼的视觉暂留效应 , 使 得虽然每个时刻只有一个数码管在显示 , 但得看上去好像同时显示 , 动态扫描在定时中 断中调用 , 以保证准确的扫描速度 。
需要显示的数字必须先进行译码变成能显示的段码 才能进行显示 , 译码可以通过查表来实现 。
键盘扫描的基本原理是 , 首先进行判断扫描 , 如有键被按下则进行读键扫描 , 确定 被按下键的键值 。
判断扫描过程为 , 在列线全输出低电平 , 读行线是否全为高电平 , 如。

9、不全为高电平则表明有键被按下 。
读键扫描过程为 , 列线逐列输出低电平 , 同时检测行 线的电平 , 如其中有低电平时 , 表明当位于前行列位置上的键被按下 , 然后由行和列确 定键值 。
在按键处理操作中 , 键被按下再被释放为一次按键操作 , 另外还进行键盘去抖 动处理 , 用软件延时方法解决 。
ZLG7290是I2C接口的键盘与数码管显示 , 接口如下图2.1所示 , 可以管理8个数码管和64个按键 , 具有自动译码和键盘扫描功能 , 相关命令参考有关资料 。
四、电路接线图四、实验预习1学习有关数码管扫描显示和键盘扫描的知识 。
2、学习有关I2C接口协议和ZLG7290芯片的知识3、提前编写程序 , 写出预习报告 。
五、实验报告1总结出实验的详细步骤2 。

10、、写出调试正确的程序及框图;
+RSTBITP1.0;
复位 ZLG7290SDABITP1.1;
I2C总线数据SCLBITP1.2;
I2C总线时钟KEYBITP1.3;键盘中断ACKBIT10H;应答标志位ZLG7290EQU70H;
ZLG7290的器件地址MTDEQU40H;
发送数据缓冲器MRDEQU49H;接收数据缓冲器SLADATA50H;器件的从地址SUBADATA 51H;
器件的子地址NUMBYTEDATA52H ;
读/写的字节数变量ORG0000H;
复位地址LJMPMAINORG0030H;主程序MAIN:MOVSP,#60HCLRRST;
ZLJ7290 复位LCALLDELAY ;
。

11、延时子程序SETB RSTWAIT:JB KEY, NEXTLCALL SCANKEYNEXT:MOV R0,#0MOV R1,MRD;等待按键;调用按键读取程序;数码管位置;显示内容;
调用显示子程序;
将按键的数值变为SJMP WAIT$INCLUDE(VI2C_AS M.INC) $INCLUDE(ZLG7290NC)10进制进行显示;
包含VIIC软件包;
包含ZLG7290软件包LCALL DISPLAY 在此添加程序完成如下要求的功能实验三、定时器/计数器编程、实验目的1、掌握定时器的基本编程方法 。
2、掌握计数器的基本编程方法 。
二、实验内容设计单片机程序 , 用T0作定时器产生周期为1秒的方波 。

12、在P3.0输出 , 以逻辑笔进 行指示 , 用T1作计数器对该脉冲进行计数并在 LED上显示 。
三、实验原理当晶振为12M时机器周期为1微秒 , 要实现500毫秒的定时 , 需要500000个机器 周期 , 对于51单片机内部定时器来说 , 最大只能定时65536个机器周期 , 能定时65.535 毫秒 , 不能满足要求 , 为此必须借助软件循环进行扩展 , 当中断定时为10毫秒时 , 扩展50倍可得到500毫秒的定时 , 当到达500毫秒时 , 在输出P3.0输出一个脉冲信号 。
让T1工作于计数器模式 , 就可以对外部引脚 P3.5的脉冲进行计数 , 所以将 P3.5 与P3.0相连 , 能对P3.0进行计数 。
对计数值进行显示需要读出T1的计数值 , 送到LED 。

13、 上显示 。
有关定时计数器的特殊功能寄存器 , 请参考课本 。
四、实验预习1、学习有关定时器和计数器的知识2、提前编写程序 , 写出预习报告五、实验报告1、总结出实验的详细步骤2、写出调试正确的程序及框图:+MAIN:DISP:ORG0000HAJMPMAINORG000BHAJMPIINT0ORG0030HMOVR4,#00HMOVR6,#10MOVTMOD,#61HMOVTL0,#LOW(-50000)MOVTH0,#HIGH(-50000)MOVIE,#82HSETBTR0MOVTL1,#0MOVTH1,#0SETBTR1MOVA,TL1CPL AMOV P1,ASJMP DISPIINT0:PUS 。

14、H ACCPUSH PSWMOV TL0,#LOW(-50000)MOV TH0,#HIGH(-50000)DJNZ R6,LOOP3CPL P3.0MOV R6,#10LOOP3:POP PSWPOP ACCRETIEND实验四、外部中断的编程、实验目的1掌握外部中断的基本编程方法 。
2、掌握计数器的扩展编程 。
二、实验内容设计单片机程序 , 基于TO用定时中断设计秒表 , 秒计数结果在 LED上输出 , 用外 部中断INTO (边沿触发方式)对秒计数结果进行清零 , 用外部中断 INT1 (边沿触发方 式)对秒计数进行启动和停止控制 。
三、实验原理TO定时中断50毫秒 , 进行20次中断得到1秒的定时 , 秒计数结果送 。

15、P1 口进行LED 显示 , 将外部中断设置成边缘触发方式 。
P1 口接 LED ;P3.0 接 SW1 ;P3.2 接 K1 ;四、实验预习1、学习外部中断的有关知识 。
2、提前编写程序 , 写出预习报告 。
五、实验报告1、总结出实验的详细步骤 。
2、写出调试正确的程序及框图;+SECDATA30HRUNBITP3.0ORG0000HAJMPMAIN0003HORGMOVRETIORGAJMPORGMAIN:MOVMOVSETBMOVMOVSEC,#0000BHIINT00030HSP,#60HR6,#20RUNTMOD,#01HTL0,#L0W(-50000)MOV TH0,#HIGH(-50000)MO 。

16、VSETBSETBIE, #10000011BIT0TR0MOVA,SECCPLAMOVP1,ASJMPLOOP0PUSH ACCPUSHPSWMOVTL0, #LOW(-50000)MOVTH0, #HIGH(-50000)DJNZR6, LOOP3MOVR6, #20JNBRUN, LOOP3 ;
RUNINCSECPOPPSWPOPACCRETIENDLOOPO:IINTO:LOOP3:、实验目的1、掌握2、掌握实验五、模数转换A/D转换与单片机的接口方法;
A/D芯片TLC549的编程方法;
3、掌握数据采集程序的设计方法;
二、实验内容利用实验开发装置上的 TLC549做A/D转换器 , 对电位 。

17、器提供的模拟电压信号进行定时中断采样, 结果在LED上进行显示 。
时钟位 数据位 选片位A/D 转换芯片TLC549CLK P1.5DAT P1.6CS P1.7VREF 接 +5V三、实验线路将TLC549的CLK接P1.5、DAT接P1.6、CS接P1.7 , 将模拟电压输入端连到电位器的电压输出端 , 并接万用表进行输入电压测量 。
四、实验步骤在PC机输入源程序并汇编 , 然后下载到单片机上 , 进行调试 。
调节电位器 , 电压从 0V到5V变化 , 记录数码管的显示数值 。
记录到表中 。
输入电压V00.511.522.533.544.55A/D结果五、实验报告(1) 整理好实验程序和实验记录 , 进行数据处理分析并做图 。
( 。

18、2) 数据采集中 , 如何实现精确的定时数据采集?(3) 数码管动态扫描显示程序设计中 , 显示刷新的时间如何确定?;+CSBITP3.0DATBITP3.1CLKBITP3.2ADCDATA30HORG0000HMAIN:MOVSP,#60HWAIT:ACALL TLC549LCALLDELAYACALL TLC549;
读取上次ADCMOVA,ADCCPLAMOVP1,ASJMPWAITTLC549:CLRCLKCLRCS;
选中 TLC549MOVR6,#8TLCAD:SETBCLKMOVC,DAT值 , 并再次启动AD转换RLCCLRCLK;DAT = 0 , 为读出下一位数据作准备DJNZSETBSET 。

19、BR6,TLCADCS;
禁能TLC549 , 再次启动 AD转换CLKMOVADC,ARETDELAY:MOV R7,#250DJNZ R7,$RETEND实验六、模数转换、实验目的1掌握模数转换芯片2、掌握模数转换芯片TLC5620的接口技术 。
TLC5620的编程方法 。
、实验内容编写程序实现下列要求:1、通过SW输入8位数值 , 由TLC5620变为模拟电压输出 , 记录数值与对应的对应关系 。
2、 利用TLC5620输出一个从0V开始逐渐升至5V再降至0V ,周期为1秒的三角波 。
三、实验线路将TLC5620的信号线接到相应的端口 , 在OutA、OutB、OutC、OutD、输出0-5V电压接万用表 。
D/A 。

20、 芯片 TLC5620LDAC接 GND;
LOAD接 P3A0;
装载CLK接 P3A1;
时钟DAT接 P3A2;
数据Vref接+5V;
4 -4y. 参考四、实验预习1、学习模数转换的原理与编程2、提前编写程序 , 写出预习报告 五、实验报告1、总结出实验的详细步骤 。
2、写出调试正确的程序及框图;+SCLBITP3.0SDABITP3.1LOADBITP3.2DACDATA30HNUMDATA31HORG0000HMOVSP,#60HCLRSCLCLRSDASETBLOADMOVP1,#0FFHMOVA,P1MOVDAC,AMOVNUM,#0LCALLDAC5620MAIN:WAIT:SJMP WA 。

21、ITDAC5620: MOV A,R1CLR SCLMOV A,NUMLCALL SENDADMOV A,R2CLR SCLMOV A,DACLCALL SENDDBCLR LOADSETB LOADRETSENDDB: MOV R7,#8LPDB:SETB SCLRLC AMOV SDA,CCLR SCLDJNZR7,L PDBRETSENDAD: MOV R7,#3SETB CRLC ALPAD:SETB SCLRLC AMOV C,ACC.3MOV SDA,CCLR SCLDJNZ R7,L PADRETEND实验七、串行通讯编程一、实验目的单片机的串行通讯编程方法 。
二、实验内容编写程序 。

22、 , 设置单片机与 PC机之间通讯波特率为4800BPS,要求单片机将PC机 发送来的数据在通过P1 口在LED上显示 , 同时不断将该数字传送给 PC机 。
三、实验原理实现串行通讯要求通讯双方有共同的通讯协议 , 如波特率、编码方式、桢格式、物 理媒质等 。
在近板内通讯直接用TTL电平 , 近距离的通讯中用RS232,中等距离用RS485 或 CAN 。
四、实验步骤五、实验预习1学习串行通讯的原理与编程2、提前编写程序 , 写出预习报告 。
六、实验报告1总结出实验的详细步骤 。
2、写出调试正确的程序及框图 。
七、附加要求要求改为多机通讯 , 请编程实现 。
;+DAT DATA30HSOK BIT OOHORG 0000HLJMP 。

23、 MAINORG 0023HLJMP UARTORG 0050HMAIN:MOV IE,#10010000BMOV SP,#60HMOV TMOD,#21HMOV SCON,#50HMOV PCON,#80HMOV TH1,#-13;
12MHZ/4800SETB TR1MOV DAT,#AWAIT:CLR SOKMOV SBUF,DA TJNB SOK,$LCALL DELAYSJMP WAITUART:PUSH ACCPUSH PSWJNB RI,NEXTMOV A,SBUFMOV DAT,AMOV P1,ANEXT:MOV C,TIMOV SOK,CCLR TIPOP PSWPOP ACC 。

24、RETIDELAY:MOV R6,#250DEL:MOV R7,#250DJNZ R7,$DJNZ R6,DELRETEND实验八、电子钟程序设计一、实验目的1、掌握嵌入式系统的程序设计与调试 。
2、掌握键盘处理程序的设计 。
二、实验内容设计单片机程序 , 实现时、分、秒时钟 , 在数码管上显示 , 并能用键盘对时钟进行 调整 。
三、实验原理实时时钟在测控应用中很常见 , 可以用专用时钟芯片实现 , 也可以用机内定时器编 程实现 , 在本实验中要求用定时器中断实现 , 在10毫秒定时的基础上进行扩展 , 依次实现秒、分、时的时间 , 在6个数码管上进行显示 。
显示扫描程序仍然要在定时中断中 进行调用 , 在显示扫描程序负责将内存中显示缓冲区 。

25、的段码数据依次送出显示 。
对时间的修改 , 依靠键处理程序实现 , 可以定义功能键与数字键配合使用 , 数字键 为09,功能键为设时键、设分键、设秒健和确认键 。
按相应的功能键后进入设定状态, 用键盘输入数值 , 按确认键将结果写入 , 并返回时钟显示状态 。
该程序的设计思想是 , 在定时中断中完成数码管扫描显示 , 在主程序中完成键盘扫 描与键处理 , 与显示配合实现时钟的修改 。
四、实验预习1、学习嵌入式软件的程序结构2、提前编写程序 , 写出预习报告五、实验报告1总结出实验的详细步骤 。
2、写出调试正确的程序及框图六、附加要求在6个按键时如何设计键盘处理程序 , 定义 加1键、减1键、设时键、设分键、设 秒健和确认键 。
;+SDABITP 。

26、1.0;
I2C总线定义SCLBITP1.1KEYBITP1.2ACKBIT10H;
应答标志位ZLG7290EQU70H;
ZLG7290的器件地址MTDEQU40H;
发送数据缓冲器MRDEQU49H;
发送数据缓冲器SLADATA50H;
器件的从地址SUBADATA51H;
器件的子地址NUMBYTEDATA52H;
读/写的字节数变量SECDATA55HMINDATA56HHOURDATA57HTIMDATA58HLEDBITP1.7ORG0000HLJMPMAINORG000BHAJMPIINT0ORG0030HMOVSP,#70HMOVTMOD,#61HMOVIE,#82HMOVTL0,#LOW 。

27、(-50000)MOVTH0,#HIGH(-50000)SETBTR0MOVTIM,#20MOVSEC,#20MOVMIN,#58MOVHOUR,#23MAIN:WAIT:JB KEYQISPLCALL SCANKEY;调用按键读取程序LCALL KEYPROCDISP:MOVA,SECMOVB,#10DIVABMOVR0,#1MOVR1,ALCALL DISPLAYMOVR0,#0MOVR1,BLCALL DISPLAYMOVA,MINMOVB,#10DIVABMOVR0,#4MOVR1,ALCALL DISPLAYMOVR0,#3MOVR1,BLCALL DISPLAYMOVA,HOURM 。

28、OVB,#10DIVABMOVR0,#7MOVR1,ALCALL DISPLAYMOVR0,#6MOVR1,BLCALL DISPLAYSJMPWAITKEYPROC:MOVA,MRDKEY1:CJNEA,#8,KEY2INCSECRETIKEY2:CJNEA,#16,KEY3DECSECRETKEY3:CJNEA,#4,KEY4INCMINRETKEY4:CJNEDECRETA,#12,KEY5MINKEY5:CJNEA,#1,KEY6INCHOURRETKEY6:CJNEA,#9,KEY7DECHOURKEY7:RETIINT0:PUSHACCPUSHPSWMOVTL0,#LOW(-500 。

29、00)MOVTH0,#HIGH(-50000)DJNZTIM,EXITMOVTIM,#20CPLLEDINCSECMOVA,SECCJNEA,#60,EXITMOVSEC,#0INCMINMOVA,MINCJNEA,#60,EXITMOVMIN,#0INCHOURMOVA,HOURCJNEA,#24,EXITMOVHOUR,#0EXIT:POPPSWPOPACCRETI;包含VIIC软件包;
包含7290软件包$INCLUDE(VI2C_ASM.INC)$INCLUDE(ZLG729ONC)END;
+;
ZLG7290.INC;
+;
发送命令子程序SENDCMD:MOV SLA,#ZLG7290MO 。

30、V SUBA,#07HMOV NUMBYTE,#02HLCALL IWRNBYTERET;
指定器件地址;
指定子地址;
发送2字节数据;
调用写n字节数据程序;
键盘扫描 , 读键值程序SCANKEY:MOV SLA,#ZLG7290MOV SUBA,#01HMOV NUMBYTE,#01HLCALL IRDNBYTERET;
指定器件地址;
指定子地址;
读1字节数据;
调用读n字节数据程序DELAY:DEL:DJNZDJNZRETDISPLAY: MOVADDMOVMOVMOV R4,#100MOV R5,#100R5,$R4,DELA,#60HA,R0MTD,AMTD+1,R1LCALL SENDCMDLC 。

31、ALL DELAYRET;
+;
VI2C_ASM.INC;
+ ;
启动I2C总线子程序START:SETB SDANOPNOPNOP;
起始条件建立时间大于4.7usSETB SCLNOPNOPNOPNOPCLR SDANOPNOPNOPNOPCLR SCLNOPNOPRET;结束总线子程序STOP:CLR SDANOPNOPNOPSETB SCLNOPNOPNOPNOPSETB SDANOPNOPNOPRET;发送应答信号子程序MACK:CLRSDANOPNOPNOPSETBSCLNOPNOPNOPNOPCLRSCLNOPNOPNOPRET;发送非应答信号MNACK:SETB SDANOPNOPN 。

32、OPSETBSCLNOPNOP;钳住总线 , 准备发数据;发送结束条件的时钟信号;结束总线;将SDA置0;将SDA置1;保持数据时间 , 即SCL为高时间大于4.7usNOPNOPCLR SCLNOPNOPRET;检查应答位子程序;
返回值 , ACK=1时表示有应答CACK:SETB SDANOPNOPNOPSETB SCLCLR ACKNOPNOPNOPNOPMOV C,SDAJC CENDSETB ACK;
判断应答位CEND:NOPNOPCLR SCLNOPNOPRET;发送字节子程序;字节数据放入ACC;每发送一字节要调用一次 CACK子程序 , 取应答位WRBYTE:MOVR0,#08HWLP:RLC 。

33、JCAWR1;取数据位SJMPWR0;判断数据位WLP1:DJNZNOPNOPRETR0,WLPWR1:SETBNOPNOPSDA;
发送1NOPSETB SCLNOP;发送0NOPNOPNOPCLRSCLSJMPWLP1WR0:CLRNOPSDASETBNOPNOPNOPNOPSCLCLRSCLSJMPWLP1;读取字节子程序;
读出的值在ACC;每取一字节要发送一个应答/非应答信号RDBYTE:MOVR0,#08HRLP:SETBSDANOPNOPNOPSETBSCL;
时钟线为高 , 接收数据位NOP;
+1NOP;
+1NOP;
+1NOP;
+1MOVC,SDA;
读取数据位MOVA,R2CLRSCL;
。

34、将SCL拉低 , 时间大于4.7usRLCA;
进行数据位的处理MOVR2,ANOP;
+1NOP;
+1NOP;
+1NOP;
+1NOP;
+1NOP;
+1DJNZR0,RLP;
未够8位 , 再来一次RET以下是用户接口子程序;
无子地址器件写字节数据;入口参数:数据为ACC、器件从地址SLA;占用:A、R0、CYIWRBYTE: PUSHACCIWBLOOP: LCALLSTART;起动总线MOVA,SLALCALLWRBYTE;发送器件从地址LCALLCACKJNBACK,RETWRB;无应答则跳转POPACC;写数据LCALL WRBYTELCALL CACKLCALL STOPRETRETWRB: PO 。

35、P ACCLCALL STOPNUMBYTERET;无子地址器件读字节数据;入口参数:器件从地址SLA;出口参数:数据为ACC;占用:A、R0、R2、CYIRDBYTE: LCALLSTARTMOVA,SLA;发送器件从地址INCALCALLWRBYTELCALLCACKJNBACK,RETRDBLCALLRDBYTE;进行读字节操作LCALLMNACK;发送非应信号RETRDB:LCALLSTOP;结束总线RET;向器件指定子地址写 N字节数据;入口参数:器件从地址SLA、器件子地址SUBA、发送数据缓冲区 MTD、发送字节数;
占用: A、R0、R1、R3、CYIWRNBYTE: MOVA, 。

36、NUMBYTEMOVR3,ALCALLSTART;起动总线MOVA,SLALCALLWRBYTE;发送器件从地址LCALLCACKJNBACK,RETWRN;无应答则退出MOVA,SUBA;指定子地址LCALLLCALLMOVWRDA:MOVLCALLLCALLJNBINCWRBYTECACKR1,#MTDA,R1WRBYTECACKACK,IWRNBYTER1;
开始写入数据;判断写完没有DJNZ R3,WRDARETWRN:LCALL STOPRET;
向器件指定子地址读取 N字节数据;
入口参数:器件从地址SLA、器件子地址SUBA、接收字节数NUMBYTE;
出口参数:接收数据缓冲区MTD;占 。

37、用:A、RO、 R1、R2、 R3、 CYIRDNBYTE:MOVR3,NUMBYTELCALLSTARTMOVA,SLALCALLWRBYTE;
发送器件从地址LCALLCACKJNBACK,RETRDNMOVA,SUBA;
指定子地址LCALLWRBYTELCALLCACKLCALLSTART;
重新起动总线MOVA,SLAINCA;
准备进行读操作LCALLWRBYTELCALLCACKJNBACK,IRDNBYTEMOVR1,#MRDRDN1:LCALLRDBYTE;读操作开始MOVR1,ANOP;
+1NOP;
+1DJNZR3,SACKLCALLMNACK;最后一字节发非应答位RETRDN:L 。

38、CALLSTOP;
并结束总线RETSACK:LCALLMACKINCR1SJMPRDN1;无子地址器件写N字节数据;入口参数:器件从地址SLA、发送数据缓冲区 MTD、发送字节数NUMBYTE;占用:A、RO、R1 、R3、CY;不发送子地址SUBA,直接发送多个数据.IWRNBYTEEXT:MOVA,NUMBYTEMOVR3,ALCALLSTART;起动总线MOVA,SLALCALLWRBYTE;发送器件从地址LCALLCACKJNBACK,RETWRNE;无应答则退出MOVR1,#MTDMOVA,R1LCALLWRBYTE;
开始写入数据LCALLCACKJNBACK,RETWRNEINCR 。

【单片机|单片机与嵌入式系统】39、1DJNZR3,WRDAE;判断写完没有WRDAE:RETWRNE:LCALL STOPRET;无子地址器件读取N字节数据;入口参数:器件从地址SLA、器件子地址SUBA、接收字节数NUMBYTE;出口参数:接收数据缓冲区MTD;占用:A、RO、 R1、R2、 R3、 CY;说明:此函数不发送子址 , 也不重新启动总线 , 而是直接读取多个数据.IRDNBYTEEXT:MOVR3,NUMBYTELCALLSTARTMOVA,SLAINCALCALLWRBYTE;发送器件从地址LCALLCACKJNBACK,RETRDNEMOVR1,#MRDRDNE1:LCALLRDBYTE;读操作开始MOVR1,ADJNZR3,SACKELCALLMNACK;最后一字节发非应答位RETRDNE:LCALLSTOP;
并结束总线RETSACKE:LCALLMACKINCR1SJMP RDNE1 。


    稿源:(未知)

    【傻大方】网址:/a/2021/0808/0023523934.html

    标题:单片机|单片机与嵌入式系统


    上一篇:2021|2021年董事长秘书个人年度总结

    下一篇:2021|2021年药师年度工作总结