单片机ADDA模块应用

合集下载

常用ADDA芯片的使用并行ADC0809串行ADC0832串行PCF8591docppt

常用ADDA芯片的使用并行ADC0809串行ADC0832串行PCF8591docppt

;接收第二字节
CLR RI
;清接收中断标志
MOV A,SBUF
;读第二字节数据
ANL A,#0FH
;第二字节屏蔽高4位
ANL B,#0FOH
;第一字节屏蔽低4位
ORL A,B
;组合
SWAP A
;高低4位互换,组成正确的A/D数据
MOV @R0,A
;存A/D数据
INC R0
;指向下一存储单元
MOV A,#0EH
⑵ 查询方式
工作在查询方式时,0809 EOC端可不必通过反相器与或相连,
直接与80C51 P1口或P3口中任一端线相连。
【例9-13】 图9-20中,用P1.0直接与0809 EOC端相连,试用查
询方式编制程序,对8路模拟信号依次A/D转换一次,并把结果
存入以40H为首址的内RAM中。
解:
MAIN: MOV R1,#40H
⑴ IN0~IN7:8路模拟信号输入端。 ⑵ C、B、A:8路模拟信号转换选择端。
与低8位地址中A0~A2连接。由A0~A2地址000~111选择IN0~IN7八路 A/D通道。
⑶ CLK:外部时钟输入端。 时钟频率高,A/D转换速度快。允许范围为10~1280KHz 。 通常由80C51 ALE端直接或分频后与0809 CLK端相连接。
; ;延时68S:2机周×17=34机周,2S×34=68S
MOVX A,@DPTR ;读A/D值
MOV @R1,A
;存A/D值
INC DPTR
;修正通道地址
INC R1
;修正数据区地址
DJNZ R7,LOOP ;判8路采集完否?未完继续
RET
;8路采集完毕,返回

ADDA工作原理和应用

ADDA工作原理和应用
0
理想A/D 关系直线
理想转换 曲线
1234567 8888888
VI VREF
(b)理想转换曲线, 量化误差: ±(1/2)LSB
资料仅供参考
编码
❖ 量化得到的数值通常用二进制表示。 ❖ 对有正负极性(双极性)的模拟量一般采用偏移
码表示。 例如,8位二进制偏移码10000000代表数
值0, 00000000代表负电压满量程, 11111111代表正电压满量程
端口1用来向0809输出模拟通道号并锁存; 端口2用于启动转换; 端口3读取转换后的数据结果。 ➢(2) 占用二个I/O端口: 端口1输出模拟通道号并锁存,同时启动转换 ; 端口2读取转换后的数据结果。 ➢(3) 通过并行接口芯片(例如8255A)连接。
资料R IOW
资料仅供参考
➢ ∑-△型模数转换器以串行数据流方式输出结果; ➢ 转换精度为1LSB; ➢ 转换完成后,比较器输出0/1相间的数字流; ➢ 输入模拟量Vin发生变化,输出数字流随之变化。 ➢ 模拟量输入端接有多路开关时,通道切换后要等
待足够长的时间,才能读取转换结果。 ➢ ∑-△型模数转换器抗干扰能力强,转换精度高,常 用于高分辨率(常见为16、18、24位)的中、低频 信号测量。
EOC
N位寄存器
VREF
D7

D6
存 缓 存
D5 D4
D3 D2

D1
D0
OE
资料仅供参考
逐次逼近式的A/D转换器的特点
➢ 转换速度较快,转换时间在1~100μs以内, 分辨率可达18位,适用于高精度、高频信号 的A/D转换;
➢ 转换时间固定,不随输入信号的大小而变化; ➢ 抗干扰能力较双积分型弱。采样时,干扰信号会造

单片机ADC模块(一)2024

单片机ADC模块(一)2024

单片机ADC模块(一)引言概述:单片机ADC(Analog to Digital Converter)模块是一种重要的功能模块,用于将模拟信号转换为数字信号,广泛应用于各种嵌入式系统和电子设备中。

本文将对单片机ADC模块的工作原理、配置方法、应用场景等进行详细介绍。

正文内容:1. 工作原理1.1 模拟信号采样:ADC模块通过外部引脚接收模拟信号,并进行采样;1.2 量化:采样后的模拟信号经过量化处理,根据其幅度将其转换为相应的数字值;1.3 编码:量化后的模拟信号经过编码,得到对应的二进制数字;1.4 存储:编码后的数字信号存储于相应的寄存器中,供单片机后续处理使用。

2. 配置方法2.1 引脚设置:根据模块的引脚定义,将输入信号接入ADC模块对应的引脚;2.2 时钟配置:设置ADC模块的时钟源和频率,确保采样过程的准确性;2.3 触发方式:设置ADC模块的触发方式,包括软件触发和外部触发两种;2.4 分辨率选择:根据需求选择合适的ADC模块的分辨率,平衡精度和速度;2.5 参考电压:配置ADC模块的参考电压源,提高测量精度。

3. 应用场景3.1 传感器数据采集:ADC模块可以将各类传感器采集的模拟信号转换为数字信号,实现实时数据采集;3.2 电池电量检测:通过ADC模块对电池的电压进行采样和转换,可以实现电池电量的实时监测;3.3 温湿度测量:连接温湿度传感器,通过ADC模块将传感器采集的模拟信号转换为数字信号,实现温湿度的准确测量;3.4 光敏电阻应用:使用光敏电阻采集环境光强度信号,通过ADC模块转换为数字信号,实现光敏操作;3.5 声音检测:通过麦克风等传感器采集声音信号,经过ADC 模块转换为数字信号,实现声音的检测与处理。

4. 注意事项4.1 采样速度:根据信号的频率和精度需求,选择合适的采样速度,避免信号失真;4.2 噪声干扰:注意降低模块的输入引脚对噪声的敏感度,采取合适的滤波方法;4.3 温度补偿:考虑环境温度对ADC模块的影响,进行相应的温度补偿,提高测量精度;4.4 参考电压稳定性:保持参考电压的稳定性,避免信号偏差;4.5 数据处理:合理设计数据处理算法,确保从ADC模块获得的数字数据的准确性和可靠性。

第5章单片机系统的扩展ADDA

第5章单片机系统的扩展ADDA

16进制数拆开: 出口: 低4位放进R0间接寻址 指向的单元(79H) 高4位放进R0+1后指 向的单元(7AH)
XS1:LCALL DIS
;显示
DJNZ R2,XS1
INC R6 ;加1
DAC0832 的编程应用举例(硬件实验
SE13:十MOV)SP,#60H
MOV 7EH,#00H 显示
CJNE R6,#0FFH,JIA1 ;不到0FF则继续加
D7
输 入


D0

ILE 1 &
LE1 1
CE 0
1
WR1 0 ≥1
WR2 0
1
XFER 0 ≥1
Vref
DAC
D/A Iout2
寄 存
转 换
Iout1


Rfb LE2
LE=1,Q 跟随 D LE=0,Q 锁存 D
或非门
≥1 输入任一为“1”输出皆为“0” 输入全为“0”,输出才为“1”
非与门
&
ADC0809八路巡回中断式数据采集
ORG 0000H AJMP MAIN ORG 0013H ;外部中断1的中断矢量 AJMP INT MAIN: MOV R0,#0A0H ;存结果的缓冲区:A0HA7H MOV R2,#08H ;待采集的通道数为 8 SETB IT1 ;选择下降沿触发中断 SETB EA ;开中断 SETB EX1 MOV DPTR,#0FEF0H ;通道0的地址 MOVX @DPTR, A ;启动转换。注意:A=? HERE:SJMP HERE ;等待中断
输 入 寄 存
/WR1: 写控制信号1,低有效 D0

/WR2: 写控制信号2,低有效 /XFER:数据传送控制信号

ADDA转换器的工作原理与应用

ADDA转换器的工作原理与应用

数字信号编码
采样值被转换成二进制码,以数 字信号形式呈现。
脉冲编码调制
ADDA转换器使用脉冲编码调制 (PCM)算法将连续信号转换为 离散信号。
ADDA转换器的应用领域
1 音频和视频处理
2 仪器测量
3 通信和网络
ADDA转换器在音频和视频 处理中广泛使用,能够将 模拟音频和视频信号转换 成数字信号进行处理。
采样值经过量化电路被转换为数字信号。
转换的数字量级由ADDA转换器的分辨率
决定。
3
编码
采样值被编码成可传输的数字信号,通 常使用PCM编码。
实例:ADDA转换器在音频处理中的应用
音频混合器
ADDA转换器在音频混合器中的应 用,可将多个模拟音频信号混合 成数字信号,进行精准的音频处 理。
音频录音机
ADDA转换器在音频录音机中的应 用,可将模拟音频转换为数字信 号来进行录音和存储,从而实现 数字化的音频记录。
ADDA转换器在实验室和工 业测量中也非常常见,可 用于将模拟传感器信号转 换为数字信号来进行数据 采集、分析和控制。
ADDA转换器在数字通信和 网络中也扮演着重要角色, 能够将信号从模拟转换为 数字信号来进行数据传输。
ADDA转换器的优势
高准确度
ADDA转换器能够以非常高的精 度进行信号转换和编码,从而 提供更为准确和可靠的数字信 号。
2 提高信号质量
ADDA转换器还可以降噪、滤波和增强信号。这可以帮助改善音频和视频的质量,提高通 信和控制系统的性能。
3 方便数字信号处理
数字信号可以方便地进行处理、存储和传输。因此,在许多应用中,使用ADDA转换器可 以提高系统的灵活性和可操作性。
ADDA转换器的原理

单片机指令的ADDA转换与传感器接口

单片机指令的ADDA转换与传感器接口

单片机指令的ADDA转换与传感器接口单片机作为嵌入式系统中的核心部件,广泛应用于各个领域。

其中,模拟与数字转换(ADDA)是单片机中一项重要的功能,尤其在与传感器的接口设计中更是必不可少。

本文将详细介绍单片机指令的ADDA转换原理及其在传感器接口中的应用。

1. 原理概述ADDA转换是指将模拟信号转换为数字信号的过程,使得单片机能够处理并分析模拟信号。

其基本原理是利用单片机内部的模数转换器(ADC)对外部模拟信号进行采样并转换为相应的数字信号,然后通过单片机的处理器对该数字信号进行进一步处理。

传感器接口是将传感器的模拟信号与单片机进行连接和交互的接口。

通过ADDA转换,将传感器采集的模拟信号转换为数字信号后,单片机便可以对其进行处理、控制和判断。

2. AD转换的基本过程ADDA转换的过程可以简要分为三个主要步骤:采样、保持和转换。

2.1 采样采样是指将模拟信号转换为一系列离散的采样点。

在采样过程中,单片机的ADC模块将以一定的频率对模拟信号进行采样,将模拟信号的幅值在一段时间内离散化为多个采样点。

采样频率的选择应根据传感器信号的带宽和采样定理进行合理选取,以保证采样信号的准确性和还原性。

2.2 保持保持是指在采样结束后,将当前的采样值保持不变,以便后续转换。

为了保证采样值的精度和准确性,单片机的ADC模块在保持阶段会通过采样保持电路对采样值进行保持,避免因为采样间隔的频繁变化而导致采样信号的失真。

2.3 转换转换是指将保持得到的模拟信号值转换为相应的数字信号。

单片机内部的ADC模块会根据采样值和参考电压进行转换计算,并将其输出为对应的数字信号。

转换的结果通常以一组二进制数的形式存储在单片机的寄存器中,以供后续处理和分析。

3. 传感器接口的设计在传感器接口的设计中,需要将传感器输出的模拟信号与单片机进行连接。

接口设计应考虑以下几个方面的要求:3.1 电压匹配传感器输出的模拟信号通常是以电压形式进行表示,而单片机的输入端通常是有一定的输入电压范围限制的。

stm32的ADDA基础知识

stm32的ADDA基础知识

AD模块即模数转换器(Analog-to-Digital Converter),它能将模拟信号转换为数字信号,为后续的数字处理提供数据。

ADC工作原理ADC的输入端是模拟信号,输入信号首先经过采样保持电路(Sample and Hold),在采样时刻保持下来,然后再经过模数转换电路,将模拟信号转换为数字信号,最终输出数字信号。

ADC的转换精度决定了数字输出值的分辨率,通常用位数来表示,例如12位ADC可以输出4096个数字值,即分辨率为4096。

分辨率越高,输出数字信号的精度越高,能够处理的模拟信号范围也更广。

STM32 ADC模块STM32的ADC模块通常具有多个转换通道和多种转换模式,可以根据应用需要进行选择。

例如,单次转换模式适用于需要单次测量的场合,扫描转换模式适用于需要连续多次测量的场合。

在使用STM32 ADC模块时,需要注意一些配置参数,如参考电压、采样时间、采样周期等。

参考电压是指ADC所采样的电压范围,可以通过外部参考电压或内部参考电压来选择。

采样时间和采样周期是影响ADC转换精度和速度的重要参数,需要根据应用需求进行设置。

DA模块即数字到模拟转换器(Digital-to-Analog Converter),它能将数字信号转换为模拟信号,为外部电路提供控制信号。

DAC工作原理DAC的输入端是数字信号,输入信号首先被分为多个等间隔的级别,然后通过加权电阻网络,将数字信号转换为模拟信号,最终输出模拟信号。

DAC的输出精度决定了数字信号的分辨率,通常用位数来表示,例如12位DAC可以输出4096个数字值,即分辨率为4096。

分辨率越高,输出模拟信号的精度越高。

STM32 DAC模块STM32的DAC模块通常具有多个输出通道和多种输出模式,可以根据应用需要进行选择。

例如,单次输出模式适用于只需要一次性输出模拟信号的场合,DMA输出模式适用于需要连续输出模拟信号的场合。

在使用STM32 DAC模块时,需要注意一些配置参数,如输出电压范围、输出模式、采样周期等。

单片机技术应用与实践 工作模块9 AD与DA转换器使用

单片机技术应用与实践 工作模块9 AD与DA转换器使用
初级能力:实现单片机对模拟信号的采集。 高级能力:对采集的信号进行A/D转换分析。
任务实施
执行思路
电压信号是模拟信号,通过调节电位器来模拟0~5V连续可变的电 压,使用一款A/D芯片采集电压信号并转换成数字信号,单片机读取数 字信号并在数码管上显示。
待测 电压数码管显 示模块
(2)按照输出数字量的有效位数划分,主要有8位、10位、12位、 14位、16位并行输出等,表示A/D转换器的分辨率。
9.1 模数/数模转换器(AD/DA)简介
(三)A/D转换器的主要分类
(3)按照转化速度划分,主要有超高速转换器(转换速度≤1ns)、 高速转换器(转换速度≤20us)、中速转换器(转换速度≤1ms)、低 速转换器(转换速度≤1s)等。
除并行输出的A/D转换器外,随着单片机串行扩展技术的发展,串 行接口的A/D转换器的应用越来越广泛,较为典型的有基于SPI串行接口 的ADS7950、ADS1118、ADS7952、TLC1549(10位)以及I2C串行接口的 PCF8591等。PCF8591的采样速率取决于I2C总线的采样速率,本任务即 通过PCF8591来实现数据采集。
例2:8位A/D转换器ADC0809,满量程输入电压为5V,分辨率为8位,能 分辨出输入电压为5V/2^8=19.53mV的变化。
9.1 模数/数模转换器(AD/DA)简介
(2)转换时间和转换速率。 转换时间是指A/D转换器完成一次转换所需要的时间。转换时间的 倒数为转换速率。根据奈奎斯特采样定理,当采样频率大于所采样模拟 信号最高频率的两倍时,信号才不会发生混叠失真。实际使用时,为了 更加逼真地恢复原始模拟信号,建议A/D采样频率为信号最高频率的5~ 10倍。
(4)线性度。A/D转换器实际的转换数值与理想直线的最大误差。 在测控系统中,传感器和A/D转换器的线性度共同决定整个系统的线性 度。A/D转换器的线性度如图所示。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

单片微型计算机与接口技术姓名:***班级:15电气2班学号:************第一题:ADDA1.系统方案论证及方案选择1.1 总体设计方案题目要求使用AD转换模块,将模拟信号的值转换为数值并通过液晶屏显示;使用矩阵键盘为输入,使其能够设置报警电压,并能够与AD转换值进行比较;使用DA模块通过矩阵键盘能够产生方波,并且能够调节占空比;1.2方案论证与选择1.2.1 设计要求及思路题目要求使用ADDA模块,将数字模拟量互相转换。

我们的设计主要控制是用单片机,它将测得模拟量通过AD模块的转换,在用ASCIl换算成数据显示在液晶屏上。

加入矩阵键盘可以设置报警电压,一旦检测AD模块转换的电压高于报警电压,蜂鸣器发出警报,液晶屏显示“warning”。

使用DA模块与矩阵键盘连接可以调试产生方波,且可以用按键设计占空比。

1.2.2方案论证与选择芯片选择论证方案一:PCF8591TPCF8591是一种具有I2C总线接口的8位A/D ,D/A转换芯片,在与CPU 的信息传输过程中仅靠时钟线SCL与数据线SDA就可以实现。

I2C总线是飞利浦公司推出的串行总线,它与传统的通信方式相比具有读写方便,结构简单,可维护性好,易实现系统扩展,易实现模块化标准化设计,可靠性高等优点;在PCF8591器件上输入输出的地址、控制和数据信号都是通过双线双向I2C 总线以串行的方式进行传输。

PCF8591的功能包括多路模拟输入、内置跟踪保持、8-bit模数转换和8-bit数模转换。

PCF8591的最大转化速率由I2C总线的最大速率决定。

方案二:ADC0809ADC0809 是8 位逐次逼近型A/D转换器。

它由一个8路模拟开关、一个地址锁存译码器、一个A/D 转换器和一个三态输出锁存器组成。

多路开关可选通8个模拟通道,允许8 路模拟量分时输入,共用A/D 转换器进行转换。

三态输出锁存器用于锁存A/D 转换完的数字量,当OE 端为高电平时,才可以从三态输出锁存器取走转换完的数据。

由于ADC0809芯片需要用到的引脚过多,单片机的接口不允许它占用这么多端口,而PCF8591芯片需要的端口较少并可长时间待机,所以我们选择方案一。

2.系统的软硬件2.1主控制芯片STC89c51STC89C51RC是采用8051核的ISP(In System Programming)在系统可编程芯片,最高工作时钟频率为80MHz,片内含4K Bytes的可反复擦写1000次的Flash只读程序存储器,器件兼容标准MCS-51指令系统及80C51引脚结构,芯片内集成了通用8位中央处理器和ISP Flash存储单元,具有在系统可编程(ISP)特性,配合PC端的控制程序即可将用户的程序代码下载进单片机内部,省去了购买通用编程器,而且速度更快。

STC89C51RC系列单片机是单时钟/机器周期(1T)的兼容8051 内核单片机,是高速/ 低功耗的新一代8051 单片机,全新的流水线/精简指令集结构,内部集成MAX810 专用复位电路。

2.2矩阵键盘矩阵键盘是单片机外部设备中所使用的排布类似于矩阵的键盘组。

在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式。

在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。

这样,一个端口(如P1口)就可以构成4*4=16个按键,比之直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显,比如再多加一条线就可以构成20键的键盘,而直接用端口线则只能多出一键(9键)。

由此可见,在需要的键数比较多时,采用矩阵法来做键盘是合理的。

2.3液晶显示1602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。

它由若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用。

在本次设计中使用液晶屏双行显示报警电压与实测电压,也显示方波的占空比。

2.4蜂鸣器本次实验设计使用蜂鸣器作为报警器,蜂鸣器端口默认为高电平(即为1),不发出警报;当蜂鸣器端口为低电平(即为0)时,蜂鸣器即发出警报;2.5数模转换模块数模转换就是将离散的数字量转换为连接变化的模拟量。

与数模转换相对应的就是模数转换,模数转换是数模转换的逆过程。

D/A转换:发送给PCF8591的第三个字节被存储到DAC数据寄存器,并使用片上D/A转换器转换成对应的模拟电压。

这个D/A转换器由连接至外部参考电压的具有256个接头的电阻分压电路和选择开关组成。

模拟输出电压由自动清零单位增益放大器缓冲。

这个缓冲放大器可通过设置控制寄存器的模拟输出允许标志来开户或关闭。

在激活状态,输出电压保持到新的数据字节被发送。

A/D转换:A/D转换器采用逐次逼近转换技术。

在A/D转换周期将来临时片上D/A抓换器和高增益比较器。

一个A/D转换周期总是开始于发送一个有效读模式地址给PCF8591之后。

A/D转换周期在应答时钟脉冲的后沿被触发,并在传输前一次转换结果时执行。

一旦一个转换周期被触发,所选通道的输入电压采样将保存到芯片被转换为对应的8为二进制码。

3.系统操作显示流程图ADDA流程图附件1 说明书按键布局使用说明:附件2 程序#include <reg52.h>#include <intrins.h>#include<math.h>#define OP_WRITE 0x90 //PCF8591地址#define OP_READ 0x91#define uchar unsigned char#define uint unsigned intsbit BEEP = P2^3; //蜂鸣器sbit SDA = P2^0; //I2C串行数据sbit SCL = P2^1; //I2C串行时钟sbit RS=P1^0;sbit RW=P1^1;sbit EN=P1^2;uchar K,Key;char b[10]="v safe ";double aa;char pd,n,xsd,d=50,l=50;char a[]="0123456789. ";uchar table1[10]="v warning";void delayNOP(){_nop_();_nop_();_nop_();_nop_();void delay(unsigned char t) {char i;while(t--)for(i=0;i<125;i++);}void start(){SDA = 1;SCL = 1;delayNOP();SDA = 0;delayNOP();SCL = 0;}void stop(){SDA = 0;delayNOP();SCL = 1;delayNOP();}uchar shin()// 从AT24C02移出数据到MCU{uchar i,read_data;for(i = 0; i < 8; i++){SCL = 1;read_data <<= 1;read_data |= SDA;SCL = 0;}return(read_data);}bit shout(uchar write_data)// 从MCU移出数据到AT24C02{uchar i;bit ack_bit;for(i = 0; i < 8; i++) // 循环移入8个位{SDA = (bit)(write_data & 0x80); //写数据,将R/W置1 _nop_();delayNOP();SCL = 0;write_data <<= 1; //左移1位,高位移出}SDA = 1; // 读取应答delayNOP();SCL = 1;delayNOP();ack_bit = SDA;SCL = 0;return ack_bit; // 返回AT24C02应答位}void write_byte(uchar addr, uchar write_data)// 在指定地址addr处写入数据write_data{start();shout(OP_WRITE); //发出写命令shout(addr); //先输出地址shout(write_data); //后写数据stop();delay(10);// 写入周期}uchar read_current()// 在当前地址读取{uchar read_data;start();shout(OP_READ);read_data = shin();stop();return read_data;}uchar read_random(uchar random_addr) // 在指定地址读取{start();shout(OP_WRITE);shout(random_addr);return(read_current());}void wcmd(uchar cmd){RS=0;RW=0;P0=cmd;delay(5);EN=1;delay(5);EN=0;delay(5);}void wdat(uchar dat) {RS=1;RW=0;P0=dat;delay(5);EN=1;delay(5);EN=0;delay(5);}void init(){EN=0;wcmd(0x01); delay(5);wcmd(0x06); delay(5);wcmd(0x0c);delay(5);wcmd(0x38);delay(5);}unsigned char data1_conve(unsigned char dat_temp){unsigned char data1;data1=(unsigned char)(((float)dat_temp/255)*5); //换算为电压值的个位值data1=data1+48; //转换为对应的ASCII码,因为0对应ASCII码的48,以此类推return data1;}unsigned char data0_convert(unsigned char dat_temp){unsigned char data0,data1;data1=(unsigned char)(((float)dat_temp/255)*5); //换算为电压值的个位值data0=(unsigned char)((((float)dat_temp/255)*5-data1)*10); //换算为为电压值的小数点后第一位的那个值data0=data0+48;return data0; //转换为对应的ASCII码}unsigned char Keycan(void) //按键扫描程序P3.0--P3.3为行线P3.4--P3.7为列线{unsigned char rcode, ccode;P3 = 0xF0; // 发全0行扫描码,列线输入if((P3&0xF0) != 0xF0) // 若有键按下{delay(3);// 延时去抖动if((P3&0xF0) != 0xF0){ rcode = 0xFE; // 逐行扫描初值while((rcode&0x10) != 0){P3 = rcode; // 输出行扫描码if((P3&0xF0) != 0xF0) // 本行有键按下{ccode = (P3&0xF0)|0x0F;while((P3&0xF0) != 0xF0); //等待键释放return ((~rcode) + (~ccode)); // 返回键编码}elsercode = (rcode<<1)|0x01; // 行扫描码左移一位}}}return 0; // 无键按下,返回值为0}void KeyDeal(unsigned char Key){if(Key!=0){switch(Key){case 0x11: K=0; break;case 0x21: K=1; break;case 0x41: K=2; break;case 0x81: K=3; break;case 0x12: K=4; break;case 0x22: K=5; break;case 0x42: K=6; break;case 0x82: K=7; break;case 0x14: K=8; break;case 0x24: K=9; break;case 0x44: K=10;xsd=1;break;case 0x84: K=11;break;case 0x18: K=12;if(l>10||l<100){d=d+10;l=l-10;}break;case 0x28: K=13; if(d>10||d<100){l=l+10;d=d-10;}break;case 0x48: K=14;pd=2;break;case 0x88: K=15;pd=1;break;default: break;}if(K<10){if(xsd==0)aa=aa*10+K;else{n++;aa=aa+pow(0.1,n)*K;}}if(K<=10){wdat(a[K]);}}}void main(){uchar ll,dd,i,j;wcmd(0x80);SDA=1;SCL=1;while(1){Key = Keycan();KeyDeal(Key);//单端输入,读出通道0的值if(pd==1){wcmd(0xc0);wdat(data1_conve(read_random(0x02)));wcmd(0xc1);wdat('.');wcmd(0xc2);wdat(data0_convert(read_random(0x02)));if (((float)read_random(0x02)/255)*5 > aa) {BEEP = 0;for(i=0;i<9;i++)wdat(table1[i]);}else{BEEP = 1;for(j=0;j<9;j++)wdat(b[j]);}delay(5);}if(pd==2){ll=l;dd=d;wcmd(0x85);wdat(ll/10);wcmd(0x86);wdat(ll%10)while(l--)write_byte(0x40, 255);while(d--)write_byte(0x40, 0 );}}。

相关文档
最新文档