17958-单片机开发入门及应用实例课件第5章_第1页
17958-单片机开发入门及应用实例课件第5章_第2页
17958-单片机开发入门及应用实例课件第5章_第3页
17958-单片机开发入门及应用实例课件第5章_第4页
17958-单片机开发入门及应用实例课件第5章_第5页
已阅读5页,还剩65页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1SPCE061A内部ADC2SPCE061A的ADC8通道10位模-数转换器。7个通道(Line_IN)用于将模拟量信号转换为数字量信号,可以直接通过引线(IOA[0~6])输入。1个通道只作为语音输入通道,通过内置有自动增益控制放大器的麦克风通道(MIC_IN)输入。3使用ADC步骤:1、选择ADC通道2、使能ADC3、启动ADC4、判断转换是否完成5、完成后读取数据4P_ADC_MUX_CtrlP_ADC_MUX_Ctrl(读/写)(702BH)

ADC多通道(Line_IN)控制是通过对P_ADC_MUX_Ctrl(702BH)单元编程实现的。5P_ADC_MUX_Ctrl设置寄存器6

r1=0x0001 //选择ADC通道0 [P_ADC_MUX_Ctrl]=r1

?Loop: r1=[P_ADC_MUX_Ctrl] testr1,0x8000 //判断转换是否完成?

jz?Loop//没有则继续转换

7P_ADC_Ctrl(7015H)设置对照表8

r1=0x0001 //使能ADC [P_ADC_Ctrl]=r1

9ADC

Line_IN数据寄存器P_ADC_MUX_Data(读)(702CH)P_ADC_MUX_Data单元用于读出LINE_IN[7:1]10位ADC转换的数字数b15~b6b5~b0ADC转换结果----10r1=[P_ADC_MUX_Data] //启动ADC第一次读取时用于启动ADC,以后读取时用于取转换数据11使用ADC步骤:1、选择ADC通道2、使能ADC3、启动ADC4、判断转换是否完成5、完成后读取数据12

r1=0x0001 //选择ADC通道0 [P_ADC_MUX_Ctrl]=r1 r1=0x0001 //使能ADC [P_ADC_Ctrl]=r1 r1=[P_ADC_MUX_Data] //启动ADC13?Loop: r1=[P_ADC_MUX_Ctrl] testr1,0x8000 //判断转换是否完成?

jz?Loop//没有则继续转换

r1=[P_ADC_MUX_Data]//取转换数据

14

r1=r1lsr4 r1=r1lsr2//右移八位,只取八位数据进行显示

15Line_IN输入通道性能信号输入电压范围

0-3.3V电压16Line_IN输入通道相关接口输入端口

IOA[6:0],用到的相应设为悬浮输入方式。

r1=0x0000 //设置IOA口为悬浮输入口

[P_IOA_Dir]=r1 r1=0xffff [P_IOA_Attrib]=r1 r1=0x0000 [P_IOA_Data]=r1

17.DEFINE P_IOA_Data 0x7000.DEFINE P_IOA_Dir 0x7002.DEFINE P_IOA_Attrib 0x7003.DEFINE P_IOB_Data 0x7005.DEFINE P_IOB_Dir 0x7007.DEFINE P_IOB_Attrib 0x700818.DEFINE P_ADC 0x7014.DEFINE P_ADC_Ctrl 0x7015.DEFINE P_ADC_MUX_Ctrl 0x702B.DEFINE P_ADC_MUX_Data 0x702C.DEFINE P_Watchdog_Clear 0x701219.CODE.PUBLIC _main_main:20

r1=0x0000 //设置IOA口为悬浮输入口

[P_IOA_Dir]=r1 r1=0xffff [P_IOA_Attrib]=r1 r1=0x0000 [P_IOA_Data]=r1

21 r1=0xffff //设置IOB口为同相低电平输出口

[P_IOB_Dir]=r1 r1=0xffff [P_IOB_Attrib]=r1 r1=0x0000 [P_IOB_Data]=r122

r1=0x0001 //选择ADC通道0 [P_ADC_MUX_Ctrl]=r1 r1=0x0001 //使能ADC [P_ADC_Ctrl]=r1 r1=[P_ADC_MUX_Data] //启动ADC23?Loop: r1=[P_ADC_MUX_Ctrl] testr1,0x8000 //判断转换是否完成?

jz?Loop//没有则继续转换

r1=[P_ADC_MUX_Data]//取转换数据

r1=r1lsr4 r1=r1lsr4//右移八位,只取八位数据进行显示

[P_IOB_Data]=r1//显示这8位数据24

r1=0x0001 [P_Watchdog_Clear]=r1//清看门狗

jmp?Loop

25abcdefgCOM(—)IOB0IOB1IOB2IOB3IOB4IOB5IOB6IOB口设置为同相输出口26abcdefg0000000000111111=0x003f27abcdefg0000000000000110=0x000628bcdefg0000000001011011=0x005b29abcdefg0000000001001111=0x004f30abcdefg0000000001100110=0x006631abcdefg0000000001101101=0x006d32abcdefg0000000001111101=0x007d33abcdefg0000000001111111=0x007f34abcdefg0000000001101111=0x006f35abcdefgCOM(—)IOB0IOB1IOB2IOB3IOB4IOB5IOB6IOB口设置为同相输出口36abcdefgdp

G1G2IOB15IOB1437COM(—)COM(—)a-IOB0b-IOB1c-IOB2d-IOB3e-IOB4f-IOB5g-IOB6IOB口设置为同相输出口abcdefgabcdefgIOB15IOB141000000001101111=0x806f//第一位数码管显示0。0x806f=0x8000(位选)+0x006f(段选)38COM(—)COM(—)a-IOB0b-IOB1c-IOB2d-IOB3e-IOB4f-IOB5g-IOB6abcdefgabcdefgIOB15IOB14第一位位选0x8000,第二位位选0x400039COM(—)COM(—)a-IOB0b-IOB1c-IOB2d-IOB3e-IOB4f-IOB5g-IOB6abcdefgabcdefgIOB13IOB12第三位位选0x2000,第四位位选0x100040.data//以.data开头C_Address://标号表明一组常量的开始.dw0x003f,0x0006,0x005b,0x004f,0x0066,0,1,2,3,4,0x006d,0x007d,0x0007,0x007f,0x006f5,6,7,8,9一组常量的定义C_Address在这里表明的是第一个数据存放的地址,我们称之为首地址。存放一组数据的地址连续。410x003f0x00060x005b0x004f0x00660x006d0x007d0x00070x007f0x006fC_Address:0123456789r1=C_Addressr2=[r1]//取第0个数,显示0r1+=5r2=[r1]//取第5个数,显示5一组数据中存放任何一个数据的地址与首地址的差值称为偏移量。0x00200x00210x00220x00230x00240x00250x00260x00270x00280x002942现在如果要取这组数据中的任何一个,该怎么办呢。首先得到该数据的地址首地址+偏移量如:显示数字5,其地址等于首地址+5.data//以.data开头C_Address://标号表明一组常量的开始.dw0x003f,0x0006,0x005b,0x004f,0x0066,0,1,2,3,4,0x006d,0x007d,0x0007,0x007f,0x006f5,6,7,8,943.data//以.data开头C_Address://标号表明一组常量的开始.dw0x003f,0x0006,0x005b,0x004f,0x0066,0,1,2,3,4,0x006d,0x007d,0x0007,0x007f,0x006f5,6,7,8,9c_dig:.dw0x8000,0x4000,0x2000,0x1000440x003f0x00060x005b0x004f0x00660x006d0x007d0x00070x007f0x006fC_Address:01234567890x80000x40000x20000x1000c_dig:如在第二位显示5R1=C_AddressR1+=5R2=[R1]//R2=0x006dR3=c_digR3+=1R4=[R3]//R4=0x4000R2|=R4//0x406d45如在第三位显示9R1=C_AddressR1+=9R2=[R1]R3=c_digR3+=2R4=[R3]R2|=R40x003f0x00060x005b0x004f0x00660x006d0x007d0x00070x007f0x006fC_Address:01234567890x80000x40000x20000x1000c_dig:46第一位数字第二位数字第三位数字第四位数字.ram.varR_DIG_Buf:.4Dup(?)申请一组连续的RAM地址,用来存放要显示的数字

R_DIG_Buf代表第一位数字存放的地址(首地址),第二位数字存放的地址为首地址+1,第二位数字存放的地址为首地址+2,第二位数字存放的地址为首地址+347如何连续显示四位数字数字1数字2数字3数字4R_DIG_Buf

:0x80000x40000x20000x1000c_dig:0x003f0x00060x005b0x004f0x00660x006d0x007d0x00070x007f0x006fC_Address:0123456789定一个变量R_CurDIG,其值从0-3变化,指示当前显示哪一位。48

r1=[R_CurDIG]r2=r1+c_digr2=[r2]

0x80000x40000x20000x1000c_dig:程序的开头对R_CurDIG

初始化

r1=R_CurDIGr2=0[r1]=r2

49

r3=R_DIG_Bufr3+=r1r3=[r3]r4=r3+C_Addressr4=[r4]数字1数字2数字3数字4R_DIG_Buf

:0x003f0x00060x005b0x004f0x00660x006d0x007d0x00070x007f0x006fC_Address:012345678950r2|=r4[P_IOB_Data]=r2

r1+=1cmpr1,4jb?DIG_NEXTr1=0?DIG_NEXT:[R_CurDIG]=r1 ….….51.publicF_DIG_DriveF_DIG_Drive:pushr1,r5to[sp]r1=[R_CurDIG]r2=r1+c_digr2=[r2]r3=R_DIG_Bufr3+=r1r3=[r3]r4=r3+C_Addressr4=[r4]

r2|=r4[P_IOB_Data]=r2r1+=1cmpr1,4jb?DIG_NEXT?DIG_Reverse:r1=0?DIG_NEXT:[R_CurDIG]=r1popr1,r5from[sp]retf52

.public_irq_Initial_irq_Initial:pushr1to[sp]r1=0x0010[P_INT_Ctrl]=r1intirqpopr1from[sp]retf;externvoidirq_Initial(void);53

.TEXT.public_IRQ4_IRQ4:pushr1,r5to[sp]callF_DIG_Driver1=0x0010[P_INT_Clear]=r1popr1,r5from[sp]reti54数字1数字2数字3数字4R_DIG_Buf

:如何存放显示数字

R3=R_DIG_BufR3+=r1//r1指0,1,2,3这样的参数

[R3]=r2//r2存放要显示的数字55写成函数形式

.publicDIG_setDIG_set:R3=R_DIG_BufR3+=r1//r1指0,1,2,3这样的参数

[R3]=r2//r2存放要显示的数字retf56r1=0r2=5callDIG_setr1=1r2=1callDIG_setr1=2r2=2callDIG_setr1=3r2=9callDIG_set5129R_DIG_Buf

:57C语言调用汇编时的参数传递

.public_DIG_set_DIG_set:R3=R_DIG_BufR3+=r1//r1指0,1,2,3这样的参数

[R3]=r2//r2存放要显示的数字retf58C语言调用汇编时的参数传递

externvoidDIG_set(unsignedintx,unsignedinty)….DIG_set(0,5);DIG_set(1,6);….50PCSRSP59

.publicDIG_setDIG_set:PUSHBPTO[SP];PUSHR1,R3TO[SP];BP=SP+1;R1=[BP+6];//取得第二个参数R2=[BP+7];//取得第一个参数R3=R_DIG_BufR3+=r1//r1指0,1,2,3这样的参数[R3]=r2//r2存放要显示的数字retf50PCSRBPR1R2R3BPSP60.public_ADC_Initial_ADC_Initial: pushr1to[sp] r1=0x0001 //选择ADC通道0 [P_ADC_MUX_Ctrl]=r1 r1=0x0001 //使能ADC [P_ADC_Ctrl]=r1 r1=[P_ADC_MUX_Data] //启动ADC popr1from[sp] retfexternvoidADC_Initial(void);61

.public_ADC_ADC:

?Loop: r1=[P_ADC_MUX_Ctrl] testr1,0x8000 //判断转换是否完成?

jz?Loop//没有则继续转换

r1=[P_ADC_MUX_Data] retfexternunsignedintADC(void);利用R1产生返回值62.public_IO_Initial_IO_Initial:pushr1to[sp]r1=0x0000[P_IOA_Dir]=r1r1=0x0000[P_IOA_Attrib]=r1r1=0x0000[P_IOA_Data]=r1

63r1=0xffff[P_IOB_Dir]=r1[P_IOB_Attrib]=r1r1=0x0000[P_IOB_Data]=r1r1=R_CurDIGr2=0[r1]=r2popr1from[sp]retf;externvoidIO_Initial(void);64#include"spce061a.h"externvoidIO_Initial(void);externvoidADC_Initial(void);externvoidirq_Initial(void);externvoidDIG_set(unsignedintA,unsignedintB);externunsignedintADC(void);65intmain(void){unsignedintuishi=0,uige=0,uixiao=0,uibfw=0,b;floatk,a;IO_Initial();irq_Initial();ADC_Initial();DIG_set(0,0);DIG_set(1,0);DIG_set(2,0);DIG_set(3,0);

66

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论