数据采集系统实验
——设计报告
2010年6月28号
实验目的:利用WAVE 6000试验箱上的模块实现数据采集、通过采集旋转电位器上的数
据和压力传感器上的数据,并转化为数字在LED数码管上显示出来
实验内容:通过旋转电位器和按压力传感器来采集数据,并且把采集到的模拟信号量通过
A/D转换成数字信号量,并片选送至LED数码管显示。设置键盘上的1为控制电位器开始采集数据,键盘上的2为控制压力传感器开始采集数据。
- 1 -
实验所使用的功能块: AT80C51单片机 A/D转换模块 LED数码管显示模块
压力传感器 电位器 键盘
实验设计步骤:1、充分了解各单独功能模块的工作原理和功能。
2、根据实验需要结合使用各功能块,设计实验原理图,并连线。 3、完成实验程序的编写
4、利用WAVE 6000仿真软件下载程序到试验箱,编译并运行。
5、通过按键1、2的转换选择数据采集的方式,通过旋转电位器或者按压
压力传感器改变采集的数据并在LED上显示。
实验原理:
(1)51单片机管脚图
P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P1口的管脚 第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器
P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL 门电流。
P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流, P3口写入“1”后,它们被内部上拉为高电平,并用作输入。
(2)ADC0809
ADC0809是采样分辨率为8位的、以逐次逼近原理进行模—数转换的器件。其内部有一个8通道多路开关,它可以根据地址码锁存译码后的信号,只选通8路模拟输入信号中的一个进行A/D转换。
ADC0809是CMOS单片型逐次逼近式A/D转换器,内部结构如图13.22所示,它
- 2 -
由8路模拟开关、地址锁存与译码器、比较器、8位开关树型A/D转换器、逐次逼近。 ADC0809芯片有28条引脚,采用双列直插式封装。 ADC0809的工作过程
首先输入3位地址,并使ALE=1,将地址存入地址锁存器中。此地址经译码选通8位 模拟输入之一到比较器。START上升沿将逐次逼近寄存器复位。下降沿启动 A/D转之后 EOC输出信号变低,指示转换正在进行。直到A/D转换完成,EOC变为高电平,指示A/D 转换结束,结果数据已存入锁存器,这个信号可用作中断申请。当OE输入高电平时,输出 三态门打开,转换结果的数字量输出到数据总线上。
压力传感器
(3)压力传感器原理:
我们通常使用的压力传感器主要是利用压电效应制造而成的,这样的传感器也称为压力 传感器。
压电效应是压电传感器的主要工作原理,压电传感器不能用于静态测量,因为经过外力 作用后的电荷,只有在回路具有无限大的输入阻抗时才得到保存。实际的情况不是这样的, 所以这决定了压电传感器只能够测量动态的应力。
- 3 -
(4)键盘的工作原理
键盘可以分为编码键盘和非编码键盘。微机系统中最常用的键盘是非编码键盘。矩阵键 盘是把若干个按键排列成矩阵形式,每一行和每一列都占用I/O端口的一位。对于矩阵键, 还可以用键盘扫描程序来识别按键的方法通常有两种,即行扫描法和行反转法。
(5)LED数码管显示器的工作原理
七段数码管采用动态方式显示,实验必须向LED显示器输入相应的字型码。本实验中
采用2片74LS273用作扩展的输出口、锁存段码或位码。
软件程序框图:
- 4 -
2
- 5 -
实验测试结果: 软件编译并全速运行后,按下按键1.,则LED数码管上开始显示数
字,旋转电位器,发现LED上显示的数字发生改变,停止转动电位器,开始按压压力传感器,发现LED上显示的数字不会发生改变。按下按键2,则LED数码管上显示另一个数字并且是固定的,这时按下压力传感器,发现LED上数字发生改变,停止按压压力传感器,改为旋转电位器,发现LED上数字并不会发生变化。说明实验分别通过电位器和压力传感器的改变来采集数据,但在软件的控制下,两者是分开来采集并不会互相干扰。
心得体会: 本次数据采集实验以三个同学为一组,在老师的指导下共同完成。在完成
过程中遇到了许多问题,但在老师级组员的共同努力下。发现并解决了问题。使实验取得了成功。
1、通过这次试验设计,在利用试验箱上多个功能模块共同实现数据采集并把数据转换成数字在LED数码管上显示。熟悉了WAVE 6000试验箱上各功能模块的结合应用。
2、本设计用到了A/D转换程序、LED数码管显示程序、判断有键输入并读
键码程序、调用延时程序等等。应用不同功能的汇编程序的相结合,熟悉了主程序和各个子程序的功能调用。实现了不同功能程序的结合应用。
3、在软件程序的编写过程中遇到许多问题,使得程序编译出现很多错误。
后来在老师的指导下发现并改正了程序。并且一开始只编写了一种采集方式,既通过电位器采集数据。后来又修改了,增加了压力传感器的数据采集。
4、在硬件的连接方面,因为根据之前做过的实验。所以连接并未出错,但
是漏接了压力传感器的转换。所以LED上未能实现压力传感器上采集的数据。后来组员发现这一问题并连接上,终于使实验成功
通过这次实验设计我们发现在做设计的时候有时候组员的帮助起着很大的
作用。并且由于对编程不熟悉,所以老师在编程上给了很大的帮助。所以我们要更加努力的学习编程,提高自己的编程水平。
- 6 -
(附)实验程序
OUTBIT equ 08002h ; 位 OUTSEG equ 08004h ; 段 IN equ 08001h ; 键盘 CS08090 equ 09000h ;AD IN0 CS08091 equ 09001h ;AD IN1 LEDBuf EQU 60h
LJMP MAIN ;;;;;;;;数码管显示码;;;;;;;; LEDMAP:
db 3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07h db 7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71h ;;;;;;;;;;;; 延时子程序 ;;;;;;; Delay: mov r7, #0 DelayLoop:
djnz r7, DelayLoop djnz r6, DelayLoop ret
;;;;;;;;;;;;;;r1 使用LED数;;;;;;;;;;;; DisplayLED:
mov r0, #LEDBuf
mov r2, #00100000b ; 从左边开始显示 Loop:
mov dptr, #OUTBIT mov a, #0
movx @dptr, a ; 关所有八段管 mov a, @r0
mov dptr, #OUTSEG movx @dptr, a
mov dptr, #OUTBIT mov a, r2
movx @dptr, a ; 显示一位八段管 mov r6, #1 call Delay
mov a, r2 ; 显示下一位 rr a mov r2, a inc r0
djnz r1, Loop ret TestKey:
- 7 -
mov dptr, #OUTBIT mov a, #0
movx @dptr, a ; 输出线置0 mov dptr, #IN
movx a, @dptr ; 读入 cpl a
anl a, #0fh ; 保留第四位 高位不用 ret
;;;;;;;;;;;;按键码;;;;;;;;;;;;;;;;;;;
KeyTable: db 16h, 15h, 14h, 0ffh db 13h, 12h, 11h, 10h db 0dh, 0ch, 0bh, 0ah db 0eh, 03h, 06h, 09h db 0fh, 02h, 05h, 08h db 00h, 01h, 04h, 07h ;;;;;;;;;;;;;获取键码;;;;;;;;;;;;;;;;;; GetKey:
mov dptr, #OUTBIT mov P2, dph
mov r0, #Low(IN) mov r1, #00100000b mov r2, #6 KLoop:
mov a, r1 ; 找出键所在列 cpl a
movx @dptr, a cpl a rr a
mov r1, a ; 下一列 movx a, @r0 cpl a
anl a, #0fh
jnz Goon1 ; 该列有键入 djnz r2, KLoop
mov r2, #0ffh ; 没有键按下 r2初始化 sjmp Exit Goon1:
mov r1, a ; 键值 = 列 X 4 + 行 mov a, r2 dec a rl a rl a
mov r2, a
- 8 -
mov a, r1 mov r1, #4 LoopC:
rrc a jc Exit
inc r2 djnz r1, LoopC Exit:
mov a, r2 mov dptr, #KeyTable movc a, @a+dptr mov r2, a
;;;;;;;;;;;;;;;;; 等键释放 ;;;;;;;;;;;;;;;;; WaitRelease:
mov dptr, #OUTBIT clr a
movx @dptr, a mov r6, #10 call Delay call TestKey jnz WaitRelease ;;;;;;;;;;;;;;;;;存数;;;;;;;;;;;;;; mov a, r2 ret MAIN:
;;;;;;;;;;;;;;启动AD 0;;;;;;;;; mov dptr,#cs08090 mov a, #0 movx @dptr, a mov a, #40h
djnz ACC, $ movx a, @dptr ;;;;;;;;;;;;;;;数据处理;;;;;;;;;; mov b,#64h div ab
mov dptr,#LEDMAP movc a,@a+dptr mov LEDBuf,a mov a,b mov b,#0ah div ab
movc a,@a+dptr
mov LEDBuf+1,a mov a,b
- 9 -
movc a,@a+dptr mov LEDBuf+2,a
;;;;;;;;;;显示以及功能切换;;;;;;;; mov r1,#03h call DisplayLED call TestKey jz MAIN call GetKey cjne a,#02h,main sjmp MAIN1
MAIN1:
;;;;;;;AD 1;;;;;;;;;;
mov dptr,#cs08091 mov a, #0 movx @dptr, a mov a, #40h
djnz ACC, $ movx a, @dptr mov r6,a anl a,#0ah cjne a,#0ah,next mov LEDBuf,#06h next:
mov LEDBuf,#3fh mov a,r6
;;;;;;;;数据高位处理;;;;;;;;; swap a anl a, #0fh
mov dptr, #LEDMAP movc a, @a+dptr mov LEDBuf+1, a
;;;;;;;;;;数据低位处理;;;;;;;;;; mov dptr,#cs08091 mov a, #0 movx @dptr, a mov a, #40h
djnz ACC, $ movx a, @dptr anl a, #0fh
mov dptr, #LEDMAP movc a, @a+dptr mov LEDBuf+2, a
;;;;;;;;;;;;;;;;显示 功能切换;;;;;;;;;;;;
- 10 -
mov r1,#03h call DisplayLED call TestKey jz MAIN1
call GetKey cjne a,#01h,MAIN1 sjmp MAIN end
- 11 -
因篇幅问题不能全部显示,请点此查看更多更全内容