




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、目 录keil软件介绍与仿真器设置1实验一、80c51汇编指令练习6实验二、80c51汇编语言程序设计9实验三、中断应用实验13实验四、定时器/计数器应用实验16实验五、a/d转换器应用实验19实验六、d/a转换器应用实验22实验七、综合技能训练(键盘、led显示、d/a、a/d及电机等)(6课时)22实验电路图24keil软件介绍与仿真器设置8051单片机采用cisc指令集,111条汇编指令,因单片机硬件资源远小于8086微机,所以单片机的汇编指令是汇编语言的子集,另外,结合8051单片机硬件特点扩展了一部分汇编指令,有些指令执行的功能也有区别;同样,单片机的c语言仅是ansic的较小子集,
2、使用时须针对单片机硬件结构,随着单片机技术几十年的发展,形成了符合单片机结构特点的c语言风格。要想高效开发实用的单片机系统,就要熟练掌握c语言编程,并至少能读懂汇编指令。单片机应用系统开发的一般过程有项目组织、编制程序、程序编译、仿真调试、编程下载等过程。项目管理针对目标器件设置开发环境参数、配备初始文件等;编译过程将c或汇编程序翻译成机器码,并连接生成可执行文件,在编译过程查找并修改程序的语法性错误;仿真是模拟程序的运行,查找程序功能性错误,验证程序执行效果,其中软件仿真是用pc机模拟程序的运行,硬件仿真是使用仿真器代替单片机接入实际电路中运行。国内常用的单片机开发软件工具有iar、keil
3、、wave等。使用keil可以完成程序编辑、编译、连接、软硬件仿真过程。keil自带simulator软件仿真器,也可以安装使用proteus仿真模拟演示系统的动画效果。keil已安装支持四种种硬件仿真器,使用其它型号仿真器需要安装驱动文件。一. keil界面1. 编辑界面:打开计算机,运行keil c51 集成开发环境,观察菜单和工具栏。图1 keil c项目和文件编辑界面file、edit同一般软件,对单独程序文件的新建、打开、保存、各种编辑.view对各种工具栏、窗口的管理。project项目的建立、设置、编译等工具。windows管理各窗口的排列布局。快捷工具栏里也准备了最常用的工具,
4、鼠标停留时提示操作任务,在图中依次有文件打开、编辑、对齐、标记、查找.调试等,下一行有编译、项目设置工具。左侧是项目窗口,列举出当前项目的各种文件,也可以切换成regs或books区。右侧灰色区域是工作区,对程序文件的编辑。底部是output窗口,显示编译、连接等信息。2. 调试界面:编译完成进入调试界面如图。图2 调试界面debug各种调试操作,主要是运行、断点设置。peripherals对外围模块中断、io口、串口、定时器的观察设置。常用快捷工具如图注释:图3 调试状态快捷工具二. keil操作过程操作方法、步骤不是唯一,可根据实际需求与个人爱好自行确定,基本过程如下:1. 建立工程:pr
5、oject new project. ,输入项目名、选定保存目录。2. 自动跳出select device for target.指定目标器件的窗口,选择atmel公司的at89c51单片机。随后跳出的copy standard 8051 startup.是将文件startup.a51文件添加到项目中,这个文件用于在软件仿真前对ram区清零等,建议选择“是”。3. 建立程序文件:file new.,键入程序代码,保存文件时按类型加后缀,如.asm或.c或.h。4. 为工程添加文件:快捷的添加方法是在工程文件目录区单击选中source group 1 ,右键出现下拉菜单,选add files t
6、o group .,找到文件所在文件夹,指定文件类型,选中文件,单击一次add即可。添加结束后,可以用鼠标点击工程项目窗口中的“+”,展开工程项目内部的文件,从中可以看到添加进来的文件名称。5. 设置工程项目环境: project options for target target1,对,选取其中的“debug”标签,出现如下的项目设置对话框: 图4 keil项目设置在device target 标签下修改xtal(晶振频率)值,在debug标签下设置仿真器:use simulator是软件仿真,图中选择了伟福v系列仿真器,是硬件仿真。其余可选择默认。6. 编译项目:编译是综合环境设置,将程序
7、文件翻译、连接、生成目标文件或可执行文件的过程,要逐条修正出现的错误直至编译成功。translater current file仅编译当前文件,build target连接并生成目标文件,rebuild all target files编译连接所有需要的文件,如果修改了程序和环境设置,在调试前一定要rebuild all target files一次才有效。7. 调试过程:点击start / stop debug session进入和退出调试状态。调试过程中可观察到寄存器、内存、变量.随指令执行的变化情况,可单步、全速执行,可设置断点,需根据要求自行选择。在keil运行期间,ram区可能出现非
8、0随机数,可将如下的程序片段添加到汇编文件开始位置,编译并运行一次软件仿真即可,一旦清零后再次启动keil仍然保持是0,片段如下:mov r0,#200clr aidataloop: mov r0,a djnz r0,idataloop三. 实验注意事项1. 实验前应预习,看懂程序和电路,准备好记录数据的表格。2. 项目安排有一定连贯性,实验结束后及时完成实验报告,解决遗留问题。3. 建议在个人计算机上安装软件。4. 实验期间需要认真思考,禁止手机上网。5 建议将已经掌握的子程序写进自己的包含文件,自带u盘保存。四. 实验报告要求1符合实验报告格式要求。2明确实验目的、实验步骤清晰、实验报告内
9、容充实。3程序关键语句、结构要有注释,注释应清楚、简练。4. 实验现象描述准确,现象要结合实验原理。5. 功能性实验应画出流程图。6字迹清楚,图表数据规范。7实验报告独立完成。8完成思考题。实验一、80c51汇编指令练习一、实验目的1.熟悉keil c51 集成开发环境的使用方法。2掌握数据传送指令的用法。3掌握算术运算指令的用法4. 掌握逻辑运算指令的用法。5掌握位操作指令的用法。6掌握控制转移指令的用法。二、实验步骤1按照keil c51 集成开发环境的要求,建立程序,然后进行编译、调试并记录结果。2完成数据传送指令、算术运算指令、逻辑运算指令的实验。三、实验内容1.将下列汇编指令组合为汇
10、编程序,观察内部ram数据传输指令的功能,记录各指令执行后目标ram的数值,描述寻址方法。org 0000hmov r0,#40h mov r1,#41hmov a, r0 mov 30h,a mov 20h,30h mov a,#30h mov r0,a mov a,30h mov r1,a mov a,r0 mov r7,a mov dptr,#1700h mov 30h,r7 mov 20h,r0 mov 21h,#10hmov r0,21h mov r1,#01h sjmp $end提示:观察内存数据操作打开memory winds,在address栏输入d:0030h即可观看数据存储
11、区从0030h开始的各单元数据,外部数据区用x,程序rom区用c。 在disassembly windows窗可观察汇编指令的机器码和单元地址。2.外部ram数据传输指令org 0000hmov dptr,#0a330hmov a,#80h movx dptr,a mov a,#00h movx a,dptr mov p2,#80hmov r0,#31h mov r1,#32h movx r0,a mov a,#30h movx r1,a movx a,r0 movx a,r1end3. 加法指令练习,观察记录目标寄存器及psw内容、运算对标志位的影响。org 0000hmov 40h,#0f
12、0hmov r0,#3ehmov a,r0add a,r0add a,40hadd a,#0a0haddc a,r0addc a,40hinc a inc r0 inc r0 addc a,r0inc 40h inc r0addc a,#0b2hadd a,r0mov dptr,#0a30fh inc dptr movx dptr,a end4.减法指令练习,观察记录目标寄存器及psw内容org 0000hmov 30h,#37hmov r0,#32h mov a,30h subb a,r0subb a,30hdec r0dec 30h subb a,#0cbhdec r0dec a subb
13、 a,r0dec r0nopend5.逻辑操作指令练习,解释指令并验证执行结果org 0000hmov a,#35hmov r0,#50h mov 50h,#55hmov 30h,#78hanl a,r0orl a,r0cpl aanl a,#9ahorl a,30hxrl 30h,a rl a anl 30h,#0f0h xrl a,r0 orl a,r0xrl 30h,#0d5hanl a,r0end6.位操作指令练习,解释指令并验证执行结果org 0000hmov p1,#74hmov 20h,#31hmov 30h,#00hcpl 05h mov c,00h anl c,01h set
14、b p1.0mov a,#33hanl c,acc.3 orl c,acc.7end7控制转移指令练习,加注释并说明该程序所完成的功能。本实验用硬件仿真,在project options for target.设置使用wave仿真器;用排线连接仿真头p1口与led指示灯(j7)。org 0000hstart: mov a,#01hloop: mov p1,amov r1,#10hdel1: mov r2,#200del2: mov r3,#126del3: djnz r3,del3djnz r2,del2djnz r1,del1rl aajmp loopend观察实验现象,分析程序并画出流程图
15、。四、思考题1.数据传送指令中直接寻址、间接寻址、立即数寻址有什么区别,请各举两例说明。2.内部ram和外部ram的地址范围各是多少?在2中各movx指令是对哪个单元的操作?3.总结影响c、cy、z标志位的操作指令有哪些。4. 逻辑操作有哪些指令?可以不需要a参与的有哪些?5.怎样区别一条指令是位操作还是单元操作?实验二、80c51汇编语言程序设计一、实验目的1. 熟练keil开发环境的使用方法。2掌握子程序的用法。3掌握控制转移指令的用法。4. 练习为硬件电路编写程序。二、实验内容用排线把 p1 口连接至j1,p0.03连接至j2,电路如图所示。本实验利用数码管驱动程序练习汇编语言程序编写、
16、子程序调用等。电路使用三态锁存器74ls573驱动共阳极数码管,在固定=0时,如果le=1则,le=0则锁存。由电路可知,要使数码管显示数字8,需要ag这7个笔画的引脚是低电平,即10000000,方法是单片机输出数据0xc0到j1,再将j2的le电平拉高即可。a为数据低位时,09的十六进制段码分别为0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,小数点0x7f。若想熄灭数码管,将le=0,74ls573输出高阻态。图中位选由74ls138完成,译码器输入000时y0=0,q8导通个位数码管得电得以点亮。如果p03连接至j2,则从高到低(从左
17、)各位位码分别是0xff,0xfd,0xfb,0xf9,0xf7,0xf5,0xf3, 0xf1。1. 输入下列程序,单步执行观察实验现象。 org 00hstart: mov p1,# 82h ; 显示6 mov p0,# 01001b ; 在十位 mov p0,#0 ; 熄灭mov p1,#0a4h ; 显示2 mov p0,# 01000b ; 在个位 mov p0,#0 ; 熄灭 ajmp start ; 重新开始 end以上程序在数码管上某些位混叠加延时解决2. 在两条mov p0,#0 指令前各添加下面延时程序段,全速执行,观察现象并与之前对比。delay: mov r6,#13h
18、dl0: mov r5,#82h djnz r5,$ djnz r6,dl03. 用子程序调用方式改写上述代码。4. 改写上述代码在数码管上显示自己学号后八位。5. 设待显示数字存放在21h28h单元(程序开始用mov 21h,#x方式预先写入或在调试过程中人工修改其中内容),在代码区保存段码,用查表方法显示数字。 org 0100hmov 21h , #x;预置8位待显示数字start:mov r0 , #21h ; 指向最高位数字mov r1 , #0fh ;最高位位码mov dptr, #0200h ;段码首地址loop: mov a ,r0 ;待显示数字保存单元地址movc a , a
19、+dptr ; (a)+(dptr)amov p0,#0 ; 先把之前熄灭mov p1 ,a ; 输出显示mov p0 , r1 ; 显示在指定位inc r0 ;数字地址加1dec r1dec r1 ; 调整显示目标到低一位ajmp loop org 0200hseg: db 0c0h,0f9h,0a4h,0b0h,099h,092h,082h,0f8h,080h,090 end单步运行上述程序,观察现象并分析。6. 上述程序全速执行执行时会出现问题:没有延时数码显示不清晰;循环8次后,段码和位码都不再是预期的正确码值。解决办法:在端口输出后加延时;在循环的首或尾加限制指令。例如以r2作为循环
20、次数计数器,每输出一位数r2减1,当r2=0时重新回到最高位。org 0100hstart: mov r2 , #8 ;循环次数计数器mov r0 , #21h ; mov r1 , #0fh ;最高位位码mov dptr,#seg ;loop: mov a ,r0 ;movc a , a+dptr ; (a)+(dptr)amov p0,#0 ; 先把之前熄灭mov p1 ,a ; 输出显示mov p0 , r1 ; 显示在指定位call delay ;加延时djnz r2 ,conti ;判断,不够8次继续ajmp start ;已经8次则回到程序开始conti: inc r0 ; 8位未
21、显示完,指向下一数字dec r1dec r1 ; 调整显示目标到低一位ajmp loopdelay: ;一般将所有需要调用的子程序定义在主程序体后 mov r6,#13hdl0: mov r5,#82h djnz r5,$ djnz r6,dl0 retorg 0200hseg: db 0c0h,0f9h,0a4h,0b0h,099h,092h,082h,0f8h,080h,090 end7. 在8位数码管上显示12345678数字。分析下面的c语言参考程序,观察汇编输出代码。#include #define uint unsigned int#define uchar unsigned ch
22、aruchar code dis_seg710=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;uchar code dis_bit8= 0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe,0xff;/* kms延时子程序 */void delay(uint k) uint data i,j;for(i=0;ik;i+)for(j=0;j121;j+); /* 主程序, */void main(void)uchar cnt;while(1) for(cnt=0;cnt8;cnt+) /cnt从0增加到7(表中第一个是0的段码
23、) p1=dis_seg7cnt+1; /段码 p0=dis_bitcnt; /位码 delay(1); p0=0xfe; / p0.0=0,74ls573输出高阻态,熄灭之前的显示 参考上面程序,可以编写数码管一位显示的子程序disp_seg,便于其它程序调用(有相同电路接法)。键入下列程序段命名为my.h并保存在keilc51inc文件夹下,使用时在程序头位置添加#include unsigned char code dis_seg710=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;unsigned char code dis_bit
24、9= 0xfe, 0xf1,0xf3,0xf5,0xf7,0xf9,0xfb ,0xfd,0xff, ; /*为对准加oxfe熄灭,1个,2十,3百 */void delay(unsigned int k) unsigned int data i,j;for(i=0;ik;i+)for(j=0;j121;j+); void disp_seg (unsigned char seg , unsigned char dsbit ) p1=dis_seg7seg; /段码 p0=dis_bitdsbit; /位码 delay(1); p0=0xfe;在需要逐位显示时直接调用即可,例如:disp_seg
25、(3,4);是把3显示在第4位(千位)三、思考题1.找出c程序中延时子程序段编译后输出的汇编代码,画出其流程图并与直接汇编程序对比。2.c程序汇编后,对端口的输出操作怎样实现的?3.c程序汇编后,对子程序调用的格式?4.数码管动态扫描时,应根据那些数据确定各位的持续时间?实验三、中断应用实验一、实验目的1. 验证中断响应过程,掌握中断概念。2学习中断处理一般方法。3掌握管理、中断服务子程序编写。二、实验内容为使用实验二子程序,按原图连接实验电路,并连接外部中断p3.2到按键,按下按键低电平。我们已经掌握了延时与数码管显示的程序,可以直接调用。1. 编写并测试c程序实现三位数码管显示#inclu
26、de #include /保证keilc51inc已经存在正确的my.h#define uint unsigned int#define uchar unsigned charunsigned int m=567;/*/void main(void) while(1)disp_seg(m/100,3); disp_seg(m%100/10,2); disp_seg(m%10,1); 上述程序将十进数m的各个位显示到数码管。2. 给上述程序添加定时中断,实现每50ms间隔,m值加1(这是为了简化程序,因为12m晶振下,定时器最大延时65.535ms),这样个位每秒变化20次,十位每秒变化2次,从
27、十位可以观察中断的作用。#include #include /保证keilc51inc已经存在正确的my.h#define uint unsigned int#define uchar unsigned charunsigned int m=000; /m从0开始,这是个全局变量,任何子程序可直接读写/*/void inittimer0(void) /定时器t0初始化 tmod = 0x01; /方式1,16位定时 th0 = 0x3c; /初值0x3cb0 tl0 = 0xb0; /ffff-3cb0=c34f=49999,50ms定时 ea = 1; /开中断 et0 = 1; /t0中断
28、允许 tr0 = 1; /启动t0void timer0interrupt(void) interrupt 1 /以下是t0中断服务子程序 th0=0x3c; tl0=0xb0; /每次定时中断后赋初值 m+; /每次中断m加1void main(void) inittimer0();/在主程序中初始化(含启动定时器)while(1)disp_seg(m/100,3); disp_seg(m%100/10,2); disp_seg(m%10,1); 在主程序中没有对中断服务子程序的显式调用,是每产生中断时就调用。2. 给上述程序添加外部中断,每当按键按下时,显示数值的十位减1 。这是为了能够明
29、显观察到外部中断的作用。#include #include /保证keilc51inc已经存在正确的my.h#define uint unsigned int#define uchar unsigned charunsigned int m=000; /m从0开始,这是个全局变量,任何子程序可直接读写/*/void inittimer0(void) /定时器t0初始化 tmod = 0x01; th0 = 0x3c; tl0 = 0xb0; ea = 1; et0 = 1; tr0 = 1; void initint0(void) ex0 = 1; / 打开外部中断int0 it0=11; /
30、 下降沿触发 ip = 1; / 将int0中断设为高优先级 void timer0interrupt(void) interrupt 1 th0=0x3c; tl0=0xb0; m+; /每次定时中断计数值加1void int0interrupt(void) interrupt 0 /int0的向量地址03h是第一个 m-; /每次按键中断计数值减1void main(void) initint0(); /int0初始化inittimer0(); while(1)disp_seg(m/100,3); disp_seg(m%100/10,2); disp_seg(m%10,1); 程序中有注释
31、的部分是新加的,为理解上思路清晰,又单独定义了int0的初始化子程序,在对int0初始化时还没有打开总中断允许ea,这对本题目没有影响。实际上应该把各个中断的初始化指令放在同一个子程序中,便于统一安排优先级、启动顺序。3. 将int0的初始化子程序中it0=0改为it0=1(下降沿触发),体会两种方式的区别。三、思考题1. 观察反汇编代码,找出各中断入口地址,服务子程序实际地址段,返回语句。2. 编译后,中断服务子程序中哪些寄存器得以入栈保护?3. 在输出到数码管期间,m的数值是否会发生改变?4. 定时中断和外部中断有无同时发生的可能?是否会出现同时响应两种中断而发生程序冲突?5. 外部中断低
32、电平触发和下降沿触发有什么区别?实验四、定时器/计数器应用实验一、实验目的1. 加深对定时/计数器的理解。2学习定时/计数器控制编程。二、实验内容tmod寄存器是定时/计数器模式控制寄存器,根据模式要求确定tmod值。tcon各位在头文件中已定义。tmodgatec/tm1m0gatec/tm1m0tcontf1tr1tf0tr0ie1it0ie0it01. 利用t0的方式0产生1khz方波。使用定时/计数器多采用中断处理方式,较少占用cpu时序。方式0最大计数13位,方式1最大计数16位,溢出后都需要人工重置初值,否则计数从0开始。12m晶振的机器周期1us,1khz方波的半周期500 us
33、,213-500=8192-500=7692。因高八位th0,低五位tl0,7692/32=240+12 7692=32240+12 ,th0=240=0f0h, tl0=0ch 。由此可见,方式0的初值计算较为复杂。#includesbit p1_0=p10;void inittimer(void) tmod=0x0; th0=0xf0; tl0=0xc; void timer0(void) interrupt 1 th0=0xf0; /每次中断后都要重新赋初值 tl0=0xc;p1_0=p1_0; /在p1.0输出方波 void main(void)inittimer();tr0=1;et
34、0=1;ea=1; while(1) /加入while死循环,避免反复执行上述的初始化语句全速运行上述程序,用示波器观察p1.0波形。修改初值实现2khz方波输出。2. 用单片机实现2s定时器,用led灯亮灭翻转指示。2s=2000000us,单一计数器最大仅能65536(10000h),可以用两个计数器级联完成。如果用ct0工作在模式1定时,每次溢出中断经p3.6引脚输出一个脉冲给ct1的时钟输入(t1),2000000=1e8480h,1e8480h10000h=1eh是10000h的整数倍,且ffh,故可以用ct1工作在外部计数模式2(自动重载),初值设为ffh-1eh=e1h。将p3.
35、0作为输出指示连接到led,连接p3.6和t1(p3.5),参考程序如下:#include /含有p10格式的定义,无须再定义sbit p3_6=p36void inittimer(void) tmod=0x61; /ct1方式2计数;ct0方式1定时 th0=0x0; tl0=0x0; th1=0xe2; tl1=0xe2; /ct1进行30次计数void delay10us(void) /10us unsigned char a,b; for(b=1;b0;b-) for(a=2;a0;a-);void timer0(void) interrupt 1 th0=0x0; tl0=0x0;
36、/65536计时 p3_6=1; delay10us() ; /高电平程序10 us p3_6=0; void timer1(void) interrupt 3 p3_0=!p3_0; void main(void) inittimer();tr0=1; et0=1; tr1=1; et1=1;ea=1;while(1) 3. 单片机简易频率计,测量1s内脉冲的个数。用单片机测频率可以有很多方法,本实验利用一个定时器(t0)产生闸门时间,另一个(t1)对外部脉冲计数。12m晶振下单一计数器最大只能产生65.536ms,为了编程计算简单,t0产生50 ms,每次中断时读出t1的计数值送显示,然后
37、清零重新计数。读出数值乘以20即可得到频率近似值。仅关注定时计数器的使用,调用数码管子程序将数值输出显示。#include#include /保证keilc51inc已经存在正确的my.hunsigned int m ; /定义一个全局变量频率值void inittimer(void) / c/t的初始化设置 tmod=0x51; /c/t1计数,c/t0定时,都工作在模式116位 th0=0x3c; /65536-50000=15536 3cb0h tl0=0xb0; th1=0xff; /c1初值 tl1=0xff ea = 1; /时能t0中断和总中断 et0 = 1; tr0 = 1;
38、 tr1 = 1; /启动t0 、t1void timer0(void) interrupt 1 / t0中断号1 , 50ms中断服务子程序 th0 = 0x3c; /模式1需重新赋值 tl0 = 0x0b0; tr0 = 1; /重启动 m=th1; m=m8;m=m+tl1;m=m*20; / 读出并计算频率值th1=0; tl1=0 ; /c1初值void main(void)inittimer();while(1) disp_seg(m%10,1); /取出个位显示disp_seg(m/10%10,2); /取出十位disp_seg(m/100%10,3); /百位disp_seg(
39、m/1000%10,4); /千 disp_seg(m/10000%10,5); /十千disp_seg(m/100000%10,6); /百千 disp_seg(m%100000/10,7); /千千,最大值1000000 当信号频率很低时有较大的测量误差,按照单片机机器周期计,最大只能测量1mhz的信号。用导线将单片机脚(p3.5t1)分别连接a6区j1的413脚,观察并记录显示值,分析异常现象的原因。j112345678910111213f(khz)4096204810245122561286432168421添加程序段,(1)输入4khz的频率信号,用led指示灯观察一个计数区间的t/
40、c1低位值,对比led值与数码管显示值的对应关系;(2)输入8khz的频率信号,用led指示灯观察一个计数区间的t/c1高位值,对比led值与数码管显示值的对应关系。四、思考题1. 在频率计实验中为什么把m定义为全局变量?2. 频率计实验,图示分析当输入信号频率为1khz时,可能的最大误差是多大?3. 频率计实验,用m=(th18+tl1)*20读取计数值是否可行,为什么?实验五、a/d转换器应用实验一、实验目的1. 熟悉并行ad转换器工作时序,掌握ad转换器编程控制。2练习ad转换器实际应用。二、实验内容ad0809的工作时序如图(地址固定,模拟输入固定):1. 当地址线abc电平固定时,时
41、序可简化为:给start、ale下跳沿启动0809;等待0809的eoc有低变高电平;拉高oe使能端电平,并从数据线读出数据。对ad0809这类单片机之外的并行外围器件,典型接法是把它当成外部ram,使用外部数据读写操作控制。推荐电路如图:单片机对外部写操作时=0且p2.x=0,start=ale=1,写操作完成后start=ale=0启动了ad0809;读操作时=0且p2.x=0,使oe=1,读出数据。图中用异或门组合出2个信号,并用异或门把eoc信号反相送给单片机。wrp2.xstartrdp2.xeoc001001010010100100110110连接地址线p2.x是为了能与其它器件相
42、区别,p2.x=0有效,如果选p2.7,则ad0809占据0000hefffh的地址范围;adc0809需要一个频率较低时钟信号,可取自单片机ale的2mhz经4分频得到500khz。转换结果经p0口传送单片机,实验中可用p1口将数据再输出至led灯显示。编写程序启动adc0809后,用外部中断方式读取每次的转换结果。按照下图连接实验电路:b8区的j1int1,j1wr,j1p2.7,j1rdrd;j6p0;j4ale;j2gnd选择in0; p1led 显示结果;参考程序:#include#include / 定义了xbyte型的外部数据类型#define adc0809 xbyte0x00
43、00 / 定义外部xbyte型命名adc0809bit flag; /定义一个转换完成标志位,=0已完成,=1尚在转换delay(unsigned int t)while(t-);init_int1() ea=1; ex1=1; it1=1; /int1中断初始化,使能,边沿触发void int1(void) interrupt 2 /adc0809的eoc触发的外部中断1flag=0; /一次转换完成标志p1=adc0809; / p0从外部读取数据,数据再从p1输出main() init_int1(); while(1) /循环反复 flag=1; /清标志,准备下次转换 adc0809=
44、0xff; /向外部的写操作启动ad0809;读p0口之前应先写ffh读引脚 while(flag); /等待转换转换结束的中断 delay(500); 2. 因为adc0809的数据线是三态驱动,在oe=0时处于tri-state,p0可以复用作为p0口线还可以分时作为其它用途。将p1改接b1区的j1(段码),p0.03接b1区的j2;将my.h文件包含在程序中;控制程序处于输出显示状态,仅在中断时读取adc0809.改写程序实现数字电压表功能。#include#include #include#define adc0809 xbyte0x0000 unsigned int value;in
45、it_int1() ea=1; ex1=1; it1=1; /int1中断初始化,使能,边沿触发void int1(void) interrupt 2 /adc0809的eoc触发的外部中断1p1=0xff ; /关闭数码管/ p1=adc0809; value= adc0809; value= value*50/255; /保留一位小数adc0809=0xff; /影响p0、p2,已读出数据再次启动转换main() init_int1(); while(1) disp_seg (value/10 , 2 );p1=0x7f ; p0= 0xf3 ; /小数点disp_seg (value%1
46、0 , 1 ); 四、思考题1. 在1和2中,adc0809各是怎样启动的?2. adc0809有ale信号,与单片机的ale信号有什么区别?实验中的模拟输入是怎么确定的?3. 设,在5v和2.5v时,转换数值c8h分别代表多高的输入电压?4. 结合反汇编代码,总结单片机c中对外部ram的定义和使用,读写操作是怎样实现的?5. 讨论2中p0口复用的冲突情况。实验六、d/a转换器应用实验一、实验目的1. 验证并熟悉da实现过程。2练习单片机对d/a转换器的控制编程。二、实验内容下图为单片机综合开发平台上的并行d/a转换模块电路,dac0832输出模拟差分电流信号,由双运放转换成电压波形。ile、wr2、xfer已接固定电平,该电路中dac0832工作在单缓冲方式,数据稳定且wr有效的持续时间约需400ns。采用外部ram读取方式:将b1区j1接单片机p0口;j2的脚(dac832wr1)连接单片机wr(p3.6),单片机p2.6接j2的(adc0832的cs),则dac0832的地址范围0000h7fffh,使用7fffh不和任何其它器件冲突
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 新能源行业绿色制造2025年技术创新与新能源政策影响报告
- 废旧塑料回收利用技术革新2025年产业升级与市场拓展前景报告
- 2025广东茂名市供销集团有限公司招聘10人模拟试卷及答案详解1套
- 合资建厂协议书
- 2025年生物质能与煤炭耦合燃烧技术在交通运输行业的应用报告
- 2025广西百色市西林县住房和城乡建设局招聘编外2人模拟试卷(含答案详解)
- 2025广西南宁市消防救援支队政府专职消防员招聘3人考前自测高频考点模拟试题附答案详解(完整版)
- 2025海南陵水黎族自治县中医院(陵水黎族自治县中医院医共体总院)考核招聘(第二批)员额人员考前自测高频考点模拟试题及参考答案详解一套
- 小学蔬菜采购协议书
- 幼儿园宝宝护理常识题库及答案解析
- 2025年中考数学真题知识点分类汇编之二次函数(四)
- 2025年注册会计师题库带答案分析
- 呼吸科出科考试题临床及答案2025版
- 设计管控管理办法
- 物流月结合同协议书范本
- 过敏性皮炎的治疗及护理
- 房颤内科护理学
- 政策变迁课件
- 2025年江西文演集团招聘笔试冲刺题2025
- 物理课程与教学论 课件 第五章 物理教学模式、方法与策略
- 烘焙类产品培训课件
评论
0/150
提交评论