AD-DA转换带数码管显示

合集下载

AD转换的数码管显示

AD转换的数码管显示

AD转换的数码管显示*本例程采用AD0804 芯片,硬件电路:cs 片选端接P2.3,WR 写数据端写P3.6,RD 读数据端接P3.7,锁存端接P2.6 脚,数码管位选端分别接P3.2,P3.3,P3.4,段选端接P1 口*/#includereg52.h//头文件#define uint unsigned int//宏文件#define uchar unsigned char//宏文件uchar num;//变量void delay3(uint z); //延时定义void dissy();//延时函数定义sbit ge=P3 ;//个位定义sbit shi=P3;//十位定义sbit bai=P3;//百位定义sbit ad_cs=P2;//片选端sbit ad_wr=P3;//写数据端sbit ad_rd=P3;//读数据端sbit pian=P2;//锁存器片选void add();//ad 转换子函数void delay(uint i);//延时子函数申明uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86, 0x8e};//数组/************主函数**********/void main(){while(1){add();//调用AD 转换子函数dissy();//数码管显示子函数} }/************AD 转换子函数**********/void add()//AD 转换子函数{uchar i;ad_cs=1;//将片选关闭ad_cs=0;//将片选打开ad_wr=1;//写数上升沿ad_wr=0;//写数下降沿ad_wr=1;//写数上升沿P1=0xff;//送数到P0 口ad_rd=1;//读数上升沿delay(25);//延时一会儿ad_rd=0;//读数下降沿//////**************因为AD 转换时间周期长,我现在的数码管没有采用锁存器,AD 转换时间大于显示时间,所以显示时会闪烁,解决此问题方法是,连续调用了显示子程序七次,这样显示时就和AD 转换时一至,显示出来的数就不闪了********************//////for(i=0;i7;i++)//调用7 次,相当于delay(255)void dissy();//////**********************************//////num=P1;//将数给计数器num}/************显示子函数**********/void dissy()//显示子函数{P0=table[num/100];//百位显示数据bai=0;//百位打开delay(14);//延时一会bai=1;//。

实验七 DA与AD转换

实验七  DA与AD转换

实验七D/A与A/D转换专业:微电子学姓名:【实验目的】1.学习D/A转换的基本原理和D/A转换芯片DAC0832的性能及编程方法。

2.了解单片机系统中扩展D/A转换芯片的基本方法。

3.学习A/D芯片ADC0809的转换性能及编程方法。

4.了解A/D转换芯片与写单片机的接口方法。

5.通过实验掌握单片机进行数据采集的方法。

【实验原理】1.D/A 转换是把数字量转换成模拟量的变换,从D/A 输出的是模拟信号。

实验程序一是通过在D/A的输入端送入有一定规律的数字量,在输出端产生锯齿波、三角波、正弦波的波形,通过示波器观察来直观地了解D/A的转换功能。

产生锯齿波、三角波只需由A存放的数字量(送入D/A的输入寄存器)的增减来控制;要产生正弦波,较简单的方法是造一张正弦数字量的表,取值范围为一个周期,采样点愈多,精度愈高。

如果电压幅值为M,D/A 转换器的位数是N 位,那么其精度计算公式为:M/(2N-1)。

图6-1 D/A转换逻辑例如,D/A转换器的位数是8位,电压幅值为5V,则转换精度为,5/(28-1)= 0.0196(V)在EL-8051-III实验台上DAC0832与单片机的连接图6-1所示。

由图可以看出,输入寄存器占偶地址端口(A0=0),DAC 寄存器占较高的奇地址端口(A0=1)。

两个寄存器均对数据独立进行锁存。

要把一个数据通过0832输出,要经两次锁存。

典型的程序如下:MOV DPTR, #PORTMOV A , #DATAMOVX @DPTR,AINC DPTRMOVX @DPTR,A其中,第二次写入是一个虚拟写的过程,其目的是产生一个/WR信号,启动D/A。

2.A/D转换是把模拟量转变为数字量的变换。

A/D转换器大致有三类:一是双积分A/D转换器,优点是精度高,抗干扰性好,价格便宜,但速度慢;二是逐次逼近法A/D转换器,精度、速度、价格适中;三是并行A/D转换器,速度快,价格也昂贵。

本实验用的是ADC0809属逐次逼近法A/D转换器,是八位的A/D转换器。

单片机AD与DA转换实验报告【VIP专享】

单片机AD与DA转换实验报告【VIP专享】

对全部高中资料试卷电气设备,在安装过程中以及安装结束后进行高中资料试卷调整试验;通电检查所有设备高中资料电试力卷保相护互装作置用调与试相技互术关,通系电1,力过根保管据护线生高0不产中仅工资2艺料22高试2可中卷以资配解料置决试技吊卷术顶要是层求指配,机置对组不电在规气进范设行高备继中进电资行保料空护试载高卷与中问带资题负料2荷试2,下卷而高总且中体可资配保料置障试时2卷,32调需3各控要类试在管验最路;大习对限题设度到备内位进来。行确在调保管整机路使组敷其高设在中过正资程常料1工试中况卷,下安要与全加过,强度并看工且25作尽52下可22都能护可地1关以缩于正小管常故路工障高作高中;中资对资料于料试继试卷电卷连保破接护坏管进范口行围处整,理核或高对者中定对资值某料,些试审异卷核常弯与高扁校中度对资固图料定纸试盒,卷位编工置写况.复进保杂行护设自层备动防与处腐装理跨置,接高尤地中其线资要弯料避曲试免半卷错径调误标试高方中等案资,,料要编试求5写、卷技重电保术要气护交设设装底备备置。4高调、动管中试电作线资高气,敷料中课并设3试资件且、技卷料中拒管术试试调绝路中验卷试动敷包方技作设含案术,技线以来术槽及避、系免管统不架启必等动要多方高项案中方;资式对料,整试为套卷解启突决动然高过停中程机语中。文高因电中此气资,课料电件试力中卷高管电中壁气资薄设料、备试接进卷口行保不调护严试装等工置问作调题并试,且技合进术理行,利过要用关求管运电线行力敷高保设中护技资装术料置。试做线卷到缆技准敷术确设指灵原导活则。。:对对在于于分调差线试动盒过保处程护,中装当高置不中高同资中电料资压试料回卷试路技卷交术调叉问试时题技,,术应作是采为指用调发金试电属人机隔员一板,变进需压行要器隔在组开事在处前发理掌生;握内同图部一纸故线资障槽料时内、,设需强备要电制进回造行路厂外须家部同出电时具源切高高断中中习资资题料料电试试源卷卷,试切线验除缆报从敷告而设与采完相用毕关高,技中要术资进资料行料试检,卷查并主和且要检了保测解护处现装理场置。设。备高中资料试卷布置情况与有关高中资料试卷电气系统接线等情况,然后根据规范与规程规定,制定设备调试高中资料试卷方案。

用DSP实现AD转换与数码管显示设计(实验四)

用DSP实现AD转换与数码管显示设计(实验四)

如图为 4 位数码管显示原理图,采用共阳极连接方法,即可通过将 GPIO70、 GPIO71、GPIO72、GPIO73 置 1 来控制数码管的位选(1 为选择此位);数码管 的段码输入由串行输入、并行输出的 74HC164 决定。选取 F28335 的 GPIO54SPISOMI 作为 74HC164 的数据输入端,GPIO56-SPICLK 作为 74HC164 的时钟 输入端。SPICLK 每经过一次上升沿跳变,74HC164 锁存数据就右移一位(方向 QA-QH),所以 SPISOMI 数据输出端输出数据时,数据传送采用高位到低位的 方式。 下图为 74HC164 的时序图:
SPI 结合 74HC164 实例: A、设置 SPI 下降沿触发,至少 8 位数据传输以及波特率。 B、设置 SPI 的 FIFO,禁止 SPI 中断。
2、软件设计
主函数:
开始
主循环:
初始化(时钟、GPIO 配置及 初始化、关看门狗、模式初 始化、SPI 初始化、数码管
初始化、ADC 初始化)
主循环
AdcRegs.ADCTRL1.bit.ACQ_PS = ADC_SHCLK; //设置采样窗口时间:(15+1)
*ADCCLK
AdcRegs.ADCTRL3.bit.ADCCLKPS = ADC_CKPS; //ADC内核时钟分频:
HSPCLK/2=6.25MHZ
AdcRegs.ADCTRL1.bit.SEQ_CASC = 1;
#define SET_BIT4 GpioDataRegs.GPCSET.bit.GPIO70 = 1
//与外设板
8_LEDS 端子的 IO70 对应
#define RST_BIT4 GpioDataRegs.GPCCLEAR.bit.GPIO70 = 1

电压采集,AD转换程序,数码管显示

电压采集,AD转换程序,数码管显示

电压采集,AD转换程序,数码管显示#include#includesbit ADC_CS=P3^5; //片选引脚,低电平有效sbit ADC_CLK=P3^4; //ADC0832芯片的时钟输入引脚sbit ADC_DO=P3^3; //数据信号输出引脚,用于将转换的数据输给单片机sbit ADC_DI=P3^3; //数据信号输入引脚,用于通道的选择控制#define DataPort P0 //定义数据端口程序中遇到DataPort 则用P0 替换sbit LATCH1=P2^2;//定义锁存使能端口段锁存sbit LATCH2=P2^3;// 位锁存void Delay(unsigned char x);unsigned char ReadADC(viod);unsigned char TempData[8]; //存储显示值的全局变量unsigned char code dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x 7f,0x6f};// 显示段码值0~9unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码void Display(unsigned char FirstBit,unsigned char Num);void main(){unsigned char a;a=ReadADC();while(1){TempData[0]=dofly_DuanMa[a/100];//分解显示信息,如要显示68,则68/10=6 68%10=8TempData[1]=dofly_DuanMa[(a%100)/10];TempData[2]=dofly_DuanMa[(a%100)%10];Display(2,3);}}// 延时函数void Delay(unsigned char x){unsigned char i;for(i=0;i<x;i--);}// 把模拟电压转换成八位二进制数,并返回unsigned char ReadADC(unsigned char b){unsigned char i,ch;ch=0;ADC_CS=0; //片选引脚,低电平有效,ADC_DO=0; //DO为高阻状态for(i=0;i<10;i++); //稍做延时ADC_CLK=0;Delay(2); //以上那个为准备工作ADC_DI=1;ADC_CLK=1;Delay(2); //第一个脉冲,起始位ADC_CLK=0;Delay(2);ADC_DI=1;ADC_CLK=1;Delay(2); //第2个脉冲,DI=1表示双通道单极性输入ADC_CLK=0;Delay(2);ADC_DI=1;ADC_CLK=1;Delay(2); //第3个脉冲,DI=1表示表示选择CH1,马上准备读取转换数据ADC_CLK=1;Delay(2);ADC_CLK=0;Delay(2);for(i=0;i<8;i++){ADC_CLK=1;Delay(2);ADC_CLK=0;Delay(2);ch=(ch<<1)|ADC_DO;}ADC_CS=1; //取消片选,一个转换周期结束return(ch);}void Display(unsigned char FirstBit,unsigned char Num) {unsigned char i;for(i=0;i<num;i++){DataPort=0; //清空数据,防止有交替重影LATCH1=1; //段锁存LATCH1=0;DataPort=dofly_WeiMa[i+FirstBit]; //取位码LATCH2=1; //位锁存LATCH2=0;DataPort=T empData[i]; //取显示数据,段码LATCH1=1; //段锁存LATCH1=0;Delay(200); // 扫描间隙延时,时间太长会闪烁,太短会造成重影}}</num;i++)</x;i--);。

杭电微机原理AD转换DA转换实验实验报告

杭电微机原理AD转换DA转换实验实验报告

微型计算机原理与接口技术实验报告班级:学号:姓名:指导老师:朱亚萍实验名称: A/D转换实验D/A转换实验(一)D/A转换实验(二)实验一A/D转换实验一、实验目的了解模/数转换基本原理,掌握ADC0809的使用方法。

二、实验内容利用实验系统上电位器提供的可调电压作为0809模拟信号的输入,编制程序,将模拟量转换为数字量,通过数码管显示出来。

三、实验接线图图 1-1四、编程指南1. ADC0809的START端为A/D转换启动信号,ALE端为通道选择地址的锁存信号,实验电路中将其相连,以便同时锁存通道地址并开始A/D采样转换,其输入控制信号为CS和WR,故启动A/D转换只须如下两条指令:MOV DX, ADPORT OUT DX, AL ;ADC0809端口地址;发CS和WR信号并送通道地址2.用延时方式等待A/D转换结果,使用下述指令读取A/D转换结果:MOV DX, ADPORTIN AL, DX;ADC0809端口地址五、实验程序框图图 1-2六、实验步骤1.断电连接导线, 将0809 CS4插孔连到译码输出FF80H插孔,将通道0模拟量输入端IN0连电位器W1的中心插头AOUT1(0-5V)插孔,8MHZ→T;2. 在PC机和实验系统联机状态下,新建实验程序,编辑完成后进行保存(保存后缀为.asm文件);3. 编译下载;4. 全速运行,运行程序;5. 按RST键退出。

七、实验程序DATA SEGMENTBUF DB 6 DUP(0)DATA1: DB0c0h,0f9h,0a4h,0b0h,99h,DB 92h,82h,0f8h,80h,90h,DB88h,83h,0c6h,0a1h,86h,DB8eh,0ffh,0ch,89h,0deh,DB0c7h,8ch,0f3h,0bfh,8fhDATA ENDSCODE SEGMENTASSUME CS: CODE,DS: DATAADC EQU 0FF80H; ADC0809端口地址PA EQU 0FF20HPB EQU 0FF21HPC EQU 0FF22H MAIN PROC FAR START: MOV AX, DATA MOV DS, AXMOV ES, AX ADC_S:MOV AX, 00HMOV DX, ADCOUT DX, ALMOV CX, 0500H DELAY:LOOP DELAYMOV DX, ADPORT IN AL, DXCALL CONVERS CALL DISPJMP ADC_S MAIN ENDPCONVERS PROC NEARMOV AH, AL3.循环不断采样A/D转换的结果,边采样边显示A/D转换后的数字量。

数电 AD DA转换.ppt

数电 AD DA转换.ppt
补充 数—模和模—数转换 9.1 概 述
模拟电路:处理连续变化信号的电路 数字电路:处理数字信号的电路
模数转换(A/D转换):将模拟信号转换为数字信号 数模转换(D/A转换):将数字信号转换为模拟信号
模数转换举例:
模拟 信号
模数 转换
数字 信号
数字显 示电路
数字电压表
数模转换举例:
控制器
开/关 播放/暂停
例:把0~1V的模拟电压转换成3位二进 输入 制代码,即用000~111表示0~1V的电压 信号
解:方法一
1V 7/8V
取最小量化单位为1/8 V,即△ =1/8 V 6/8V
并规定:0~1/8V为0 △, 1/8~2/8V为1 △,…
5/8V 4/8V 3/8V
则最大量化误差为1 △=1/8V。 2/8V
VV+
+A
vO
I0 I1 I2 I3
模拟开关 S0 S1 S2 S3
求和放大器
VREF
d0 d1 d2 d3
LSB
MSB
模拟开关受每各位数码控制
权电阻网络确定每条支路电流的大小
求和放大电路把各支路电流求和并转换成电压
放大器原理
Rf
A为运算放大器
i
与电阻配合构成反相比例运算电路 R
Vii+
A
+
vo
V+
I 4
I3

I 3

I 2
I 2
2R
I VREF
LSB
MSB
d0 d1 d2 d3
S0 S1 S2 S3 I0 I1 I2 I3
2R 2R 2R 2R RRR
I'0 I'1 I'2 I'3 I

5AD转换结果送数码管显示

5AD转换结果送数码管显示
ADC0809是8位8通道A/D转换器,芯片内包括一个8位的逐次逼近型的ADC部分,并提供一个8通道的模拟多路开关和联合寻址逻辑。用该电路可直接采样8个单端的模拟信号,分时进行A./D转换,在多点巡回检测,过程控制等应用领域使用非常广泛。ADC0809的主要技术指标为:
(1)分辨率:8位;
(2)单电源:+5V;
SHR AH,1
INC BX
DEC CL
JNZ DLOOP
MOV DX,OUTBIT
MOV AL,0
OUT DX,AL
RET
DISPLAYLED ENDP
START PROC NEAR
MOV AX,DATA
MOV DS,AX
AGAIN:
MOV AL,0
MOV DX,CS0809
OUT DX,AL
MOV CX,40H
OUT DX,AL
MOV CX,40H
LOOP $
IN AL,DX
MOV DX,PA
OUT DX,AL
JMP AGAIN
CODE ENDS
ENDS START
5、程序设计
(1)编写程序,通过查询EOC转换结束信号实现A/D转换,调试并验证结果。程序如下:
MODE EQU 082H
PA EQU 9000H
CS0809 EQU 09000H
OUTBIT EQU 08002H
OUTSEG EQU 08004H
DATA SEGMENT
LEDBUF DB 2 DUP (?)
NUM DB 1 DUP (?)
DELAYT DB 1 DUP (?)
LEDMAP:
DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H

实验一 12位DA转换,AD转换

实验一 12位DA转换,AD转换

实验1 12位A/D与D/A转换器及其接口
一、实验目的:
实现12位的模拟量到数字量的转换.
对12位数字量进行DA转换
二、实验要求:
1、(1)12位D/A转换;
(2)系统要求:
①12位D/A要求能进行单双极性转换(P30),通过一个开关控制;
②能够进行自动和手动转换控制;自动时,能把数字量从000~FFF循环转换;手动时,要求手动输入数字量(由12位开关给定),然后按确定键开始转换,输入出转换后的模拟量;
③要求系统能显示求的数字量(三位LED数码管),模拟量有正负极性(电压表);
2、(1)12位A/D通过一个开关控制能够完成单/双极性转换;
(2)能够完成自动和手动转换控制;自动时即能够把模拟量转换数字量(000H~FFFH);手动时,要求通过改变电阻值来改变电压,然后通过开设转换的按钮开始转换,输出转换后的数字量(用3个LED观察输出量);
(3)用3个LED数码管显示输出的数字量.
三、原理框图:
四、proteus仿真结果图:。

6.2-AD转换操作+数码管显示

6.2-AD转换操作+数码管显示

6.2-AD转换操作+数码管显示//由通道A TD0进行单通道A/D转换,转换值在B口显示,并用数码管实现二进制值//与B口对应//AN7接电位器0~5V输入#include <hidef.h> /* common defines and macros */#include "derivative.h"/* derivative-specific definitions */const unsigned char DisplayDecode[]={~0x3f,~0x06,~0x5b,~0x4f,~0x66,~0x6d,~0x7d,~0x07,~0x7f,~0x6f,~0x40,~0xff,0x88,0x83,0xc6,0XA1,0x86,0x8e,0xd0,0x89};//'- ABCDEFGH'const unsigned char WeiMa[]={0xfe,0xfd,0xfb,0xf7};void display(unsigned char wei,unsigned char data);void delay_ms(int m);void dis(int time ,int a, int b, int c,int d) ;byte ad_value; //AD转换结果/*-----------------ms 级延时---------------------*/void delay_ms(int m){int i,j;for(j=0;j<m;j++)for(i=0;i<800;i++);}/***---------------初始化程序---------------***/void InitAD(void){ATD0CTL2 = 0XC0; //1100 0000 启动A/D,快速清除标志位//无等待模式,外部触发禁止(bit2=0),//中断禁止(bit1=0)ATD0CTL3 = 0X0C; //0 0001 1 00 转换序列为1 、FIFO模式启动,冻结模式下继续转换ATD0CTL4 = 0XE1; // 1 11 00001 8位精度,24个A TD采样时间// 总线(1+1)*2 = 4 分频,AD时钟= 1MHz ATD0CTL5 = 0X27; // 0 0 1 0 0 111 右对齐,无符号,连续转换,单通道, 起始通道A TD7ATD0DIEN = 0X00; // 数字输入disabled}/***---------------主程序---------------***/void main(void) {InitAD();DDRB=0XFF; // 设PORTB为输出口PORTB=0xff;DDRP=0xFF;DDRT=0xFF;EnableInterrupts; // 开放总中断for(;;) {while(!ATD0ST AT2L_CCF7); //等待转换结束,退出循环ad_value=(byte)ATD0DR7H;//左对齐,右对齐时转换结果都先存储在A TD0DRxH,后存储在A TD0DRxL.PORTB=ad_value; //PORTB输出AD转换结果,并用8个LED发光二极管显示dis(1,(ad_value%100)%10,(ad_value%100)/10,ad_value/100,0);}}void dis(int time ,int a, int b, int c,int d){int i;for(i=1;i<time*25;i++) {display(1,a);display(2,b);display(3,c);display(4,d);}}void display(unsigned char wei,unsigned char data){PTT=WeiMa[wei-1];PTP=DisplayDecode[data];delay_ms(10);}。

数码管显示AD

数码管显示AD

Results[index++] = (ADC12MEM0>>3); // Move results, IFG is cleared
if(index == 32)
{
uchar i;
__interrupt void watchdog_timer(void)
{
P5OUT = 0xff;
P4OUT = scandata[DispBuf[cnt]]; //输出段选信号
P5OUT &= ~(1 << cnt); //输出位选信号
Average = 0;
for(i = 0; i < 32; i++)
Average += Results[i];
Average >>=5;
DispBuf[0] = Average / 1000; //更新数码管显示
uchar DispBuf[4] = {0,0,0,0};
//记录显示位数的全局变量
uchar cnt = 0;
void main(void)
{
WDTCTL = WDT_MDLY_0_5; // 设置内部看门狗工作在定时器模式,1.9ms中断一次0.5
函数名称:watchdog_timer
功 能:看门狗中断服务函数,在这里输出数码管的
段选和位选信号
参 数:无
返回值 :无
********************************************/
#pragma vector=WDT_VECTOR
ADC12CTL0 = ADC12ON + SHT0_15 + MSC; // Turn on ADC12, set sampling time

数码管显示两路AD转换结果(按照书上整理后的完整代码)

数码管显示两路AD转换结果(按照书上整理后的完整代码)

#define F_CPU 4000000UL //4 MHZ#include<avr/io.h>#include<util/delay.h>#define INT8U unsigned char#define INT16U unsigned int//各数字的数码管段码,最后一位为空白const INT8U SEG_CODE[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xf8,0x80,0x90,0xFF}; //两路模拟转换结果显示缓冲,显示格式为:X.XX X.XX ,第4位和第8位不显示INT8U Display_Buffer[]={0,0,0,10,0,0,0,10};//___________________________________________//对通道CH进行模拟数字转换void ADC_Convert(INT8U CH){int Result;ADMUX=CH; //ADC通道选择//读取转换结果,并转换为电压值Result=(int)((ADCL+(ADCH<<8))*500.0/1023.0);//或使用语句:Result=(int)(ADC*500.0/1023.0);//ADC0的结果放入数组0、1、2单元,ADC1的结果放入数组4、5、6单元Display_Buffer[CH*4]=Result/100;Display_Buffer[CH*4+1]=Result/10%10;Display_Buffer[CH*4+2]=Result%10;}//主函数int main(){INT8U i;DDRA=0xFC;//配置AD转换端口ADC0、ADC1为输入DDRC=0xFF;PORTC=0x00;//配置数码管显示端口DDRD=0xFF;PORTD=0x00;ADCSRA=0xE6;//ADC转换置位,启动转换,64分频_delay_ms(3000);//延时等待系统稳定while(1){ADC_Convert(0);ADC_Convert(1);//对2个通道进行A/D转换for(i=0;i<8;i++){PORTC=0xFF;//先关闭段码PORTD=_BV(i);//发送数码管位码PORTC=SEG_CODE[Display_Buffer[i]];//发送数字段码if(i==0||i==4)PORTC&=0x7F;//对整数位加小数点_delay_ms(4);}} }。

数码管显示AD转换的电压值数码管显示秒表

数码管显示AD转换的电压值数码管显示秒表

电子科技大学微电子与固体电子学院实验报告实验名称现代电子技术综合实验姓名:詹朋璇学号:评分:教师签字电子科技大学教务处制电子科技大学实验报告学生姓名:詹朋璇学号:指导教师:熊万安实验地点: 211大楼308 实验时间:2014. 晚一、实验室名称:单片机技术综合实验室实验项目名称:数码管显示A/D转换的电压值&数码管显示秒表二、实验学时: 12三、实验目的与任务:1、熟悉系统设计与实现原理2、掌握KEIL C51的基本使用方法3、熟悉实验板的应用4、连接电路,编程调试,实现各部分的功能5、完成系统软件的编写与调试四、实验器材1、PC机一台2、实验板一块五、实验原理、步骤及内容试验要求:数码管的第1位显示任务号1,第3位到第5位显示、A/D转换的电压值,可调节电压,第7、8位显示两位学号;数码管第2位和第6位显示“-”号;按按键key1进行切换,此时数码管第1位显示任务号2,第7、8位显示循环倒计时的秒表,范围为08秒到01秒后,再过01秒,秒表又显示为08秒;(单片机系统中利用定时器/计数器计数秒表的值:利用定时器T0延时1秒进行计数。

),其它位显示不变,按按键key2时,秒表停止计数,再按按键key2时,秒表继续计数,按key1键,又回到任务1的显示状态。

当电压值大于2伏时,按按键不起作用。

1、硬件设计(可打印)2、各部分硬件原理(可打印)数码管动态扫描TLS549ADC工作时序图3、软件设计按下出中断服务程序。

答:将KEY1与KEY2键通过跳线分别接到INT0与INT1接口上。

开启中断:SysInit(){ …EA=0; 用单片机开发板上丰富的资源可以实现一个有一定功能的系统。

2.懂得利用中断可以使单片机的效率提高。

六、对本实验过程及方法、手段的改进建议实在是没有,都挺好的。

七、附录1、程序/*利用TLC549 A/D转换器实现电压测量与显示*/#include <> //包含8051的SFR寄存器定义头文件#include <> //扩展并行接口所需的绝对地址访问库函数#define LED_dig XBYTE[0x9000] //8位数码管显示器的位选输出控制#define LED_seg XBYTE[0x8000] //8位数码管显示器的段码(字形码)输出控制#define KEY_IN XBYTE[0x8000]//定义TLC549操作接口sbit ADC_CS = P1^7;sbit ADC_DATA = P1^6;sbit ADC_CLK = P1^5;code unsigned char disp_seg[]= //显示段码{0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7c,0x39,0x5f,0x79,0x71,0x40,0x00,0xff};// 0 1 2 3 4 5 6 7 8 9 a b c d e f - blank,全亮unsigned char DispBuf[8]; //定义显示缓冲区(由定时中断程序自动扫描)unsigned char key_value,flag;//定义键盘返回值,任务标志unsigned char y1000,y100,y10,y;//定义秒表的个位,十分位,百分位,千分位unsigned short mbiao;//定义秒表计数单元void delay(int ms); //延时大约1msunsigned char ReadAdc(void);//读取A/D转换结果void AdcInit(void); //初始化ADC接口void key_scan(void);void main(){unsigned char i=0;unsigned char volt, x100, x10, x;TMOD &= 0x0f;TMOD |= 0x10;TH1 = 0xFC;TL1 = 0x66;TR1 = 1;ET1 = 1;TMOD &= 0xf0;TMOD |= 0x01;TH0 = 0xFC;TL0 = 0x66;TR0 = 1;ET0 = 1;EA =1;AdcInit();for(i=0; i<8; i++)DispBuf[i] = 17; //全部8位显示灭 y1000=9;y100=9;y10=9;y=9;mbiao=9999;flag=0;while(1){while(flag ==0){volt = ReadAdc(); //得到A/D转换结果的数字量(0x00~0xff)volt = volt * 250/256; //转换成电压值,其中Vr=x100 = volt/100;x10 = (volt - x100*100)/10;x = (volt - x100*100)%10;DispBuf[0] = 4;DispBuf[1] = 2;DispBuf[2] = 16;DispBuf[3] = x;DispBuf[4] = x10;DispBuf[5] = x100;DispBuf[6] = 16;DispBuf[7] = 1;delay(100);if(key_value == 8&&volt<=200){flag = 1;mbiao=9000;while(key_value == 8);}}while(flag==1){TR0=1;volt = ReadAdc();volt = volt * 250/256; //转换成电压值,其中Vr=x100 = volt/100;x10 = (volt - x100*100)/10;x = (volt - x100*100)%10;DispBuf[0] = y1000;DispBuf[1] = 0;DispBuf[2] = 16;DispBuf[3] = x;DispBuf[4] = x10;DispBuf[5] = x100;DispBuf[6]=16;DispBuf[7]=2;if(key_value == 8&&volt<=200){flag = 0;while(key_value == 8);}else if(key_value == 7&&volt<=200){flag = 2;while(key_value == 7);}}while(flag==2){TR0=!TR0;if(key_value == 7){flag = 1;while(key_value == 7);} }}}/*函数:T1INTSVC()功能:定时器T1的中断服务函数*/void T1INTSVC() interrupt 3{code unsigned char com[] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};static unsigned char n = 0;TR1 = 0;TH1 = 0xFC;TL1 = 0x66;TR1 = 1;LED_dig = 0xFF; //暂停显示if(flag==0){if(n==5)LED_seg = ~(disp_seg[DispBuf[n]]|0x80);elseLED_seg = ~disp_seg[DispBuf[n]];//更新扫描数据}if(flag==1){ if(n==5)LED_seg = ~(disp_seg[DispBuf[n]]|0x80);elseif(n==4)LED_seg = ~( disp_seg[DispBuf[n]] ); //更新扫描数据,elseLED_seg = ~disp_seg[DispBuf[n]]; //更新扫描数据 }if(flag==2){LED_seg = ~disp_seg[DispBuf[n]]; //更新扫描数据 }LED_dig = ~com[n]; //重新显示key_scan();n++;n &= 0x07;}void delay(int ms){unsigned int i,j;for(i=0; i<ms; i++) //延时大约1ms (fosc= {for(j=0; j<100; j++);}}/*函数:ReadAdc()功能:读取A/D转换结果返回:8位ADC代码*/unsigned char ReadAdc(void){unsigned char d; //读取得ADC结果unsigned char n; //ADC bit位计数ADC_CS = 0;n = 5;while ( --n != 0 ); //模拟tsu时间n = 8;do{d <<= 1;if ( ADC_DATA )d = d | 0x01; //或d++;ADC_CLK = 1;ADC_CLK = 0;}while ( --n != 0 );ADC_CS = 1;return d;}/*函数:AdcInit()功能:初始化ADC接口*/void AdcInit(void){ADC_CS = 1;ADC_CLK = 0;ADC_DATA = 1;ReadAdc(); //空读一次,用于启动一次A/D转换过程}void key_scan(void){unsigned char key_in;key_in = KEY_IN;switch(key_in){case 0xff:key_value = 0;break;case ~0x01:key_value = 1;break;case ~0x02:key_value = 2;break;case ~0x04:key_value = 3;break;case ~0x08:key_value = 4;break;case ~0x10:key_value = 5;break;case ~0x20:key_value = 6;break;case ~0x40:key_value = 7;break;case ~0x80:key_value = 8;break;default:break;}}/*函数:T1INTSVC()功能:定时器T0的中断服务函数*/void T0INTSVC() interrupt 1 {TR0 = 0;TH0 = 0xFC;TL0 = 0x66;TR0 = 1;if(mbiao<=9000&&TR0==1)mbiao=mbiao-1;if(mbiao==0)mbiao=9000;y1000=mbiao/1000;y100=(mbiao-y1000*1000)/100;y10=(mbiao-y1000*1000-y100*100)/10;y=(mbiao-y1000*1000-y100*100)%10;}。

AD转换及数码管显示单片机课程设计说明书

AD转换及数码管显示单片机课程设计说明书

目录题目及要求 (1)第1章单片机最小系统 (2)1.1 STC89C51RC单片机 (2)1.2电源电路 (2)1.3时钟电路 (2)1.4复位电路 (2)第2章硬件设计 (5)2.1数码管 (5)2.2A/D转换器 (5)2.3电路设计 (5)第3章软件设计 (5)3.1程序流程图 (5)3.2程序设计 (5)第4章应用系统实现 (5)4.1硬件连接 (5)4.2程序下载 (5)参考文献 (6)题目及要求题目:AD转换及数码管显示要求:使用C语言编程;使用ADC0809通道4,将电位计输入的模拟量转换为数字量;并将转换后的数字量显示在三位数码管上。

第1章单片机最小系统1.1 STC89C51RC单片机STC89C51RC/RD+系列单片机是宏景科技推出的新一代超强抗干扰、高速、低功耗的单片机,指令代码完全兼容传统8051单片机,12时钟机器周期和6时钟机器周期可任意选择,最新的D版内部集成MAX810专用复位电路。

特点:(1).增强型6时钟机器周期和12时钟机器周期8051CPU(2).工作电压:5.5V—3.4V(5V单片机)(3).工作频率范围:0—40MHz,相当于普通8051的0—80MHz.实际工作频率可达48 MHz.(4).用户应用程序空间4K/8K/16K/16K/20K/32K/64K字节(5).片上集成1280字节、512字节RAM(6).通用I/O口(32、36个),复位后:P1/P2/P3/P4是准双向口/弱上拉(普通8051传统I/O口)P0口是开漏输出,作为总线扩展用时,不用加上拉电阻,作为I/O口用时,需加上拉电阻。

(7).EEPROM功能(8).看门狗(9).内部集成MAX810专用复位电路(D版才有),外部晶振20M以下时,可省外部复位电路(10).共3个16位定时器/计数器,其中定时器0还可以当成2个8位定时器使用(11).外部中断4路,下降沿中断或低电平触发中断,Power Down模式可由外部中断低电平触发中断方式唤醒(12).通用异步串行口(UART),还可用定时器软件实现多个UART(13).工作温度范围:0—7℃/—40~+85℃图1-1 STC89C51RC/RD单片机1.2电源电路本例在Vcc端加载+5V电源。

AD-DA转换带数码管显示

AD-DA转换带数码管显示

AD-DA转换带数码管显示/************************************************************** **************** ***** 标题: ************* DA-AD试验******************* **** 1.通过本例程了解并掌握AD-DA转换芯片的基本原理和使用** 2.了解掌握I2C总线接口的工作原理及一般编程方法。

** * * 连接方法:JP8 (P1)与J12用跳线连接**** 通过改变学习板上的2个电位器对应的2段模拟输入,实现模拟输入,学员观察数码管的数字变化情况* 通过改D[4]的值,实现模拟输出,学员观察学习板上DA处LED 的亮度变化**** 请学员认真消化本例程,懂得AD-DA 在C语言中的操作应用* *************************************************************** **************** ****/#include#include#define PCF8591 0x90 //PCF8591 地址//else IOsbit LS138A=P2^2;sbit LS138B=P2^3;sbit LS138C=P2^4;// 此表为LED 的字模// 0 1 2 3 4 5 6 7 8 9 A b c d E - L P U Hidden _ (20)unsigned char code Disp_Tab[] = { 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83 ,0xC6,0xA1,0x86,0xbf,0xc7,0x8 c,0xc1, 0xff, 0xf7 };unsigned char AD_CHANNEL;unsigned long xdata LedOut[8];unsigned int D[32];/************************************************************** ***** DAC 变换, 转化函数*************************************************************** ****/ bit DACconversion(unsigned char sla,unsigned char c, unsigned char Val){Start_I2c(); //启动总线SendByte(sla); //发送器件地址if(ack==0)return(0);SendByte(c); //发送控制字节if(ack==0)return(0);SendByte(Val); //发送DAC的数值if(ack==0)return(0);Stop_I2c(); //结束总线return(1);}/************************************************************** ***** ADC发送字节[命令]数据函数*************************************************************** ****/ bit ISendByte(unsigned char sla,unsigned char c) {Start_I2c(); //启动总线SendByte(sla); //发送器件地址if(ack==0)return(0);SendByte(c); //发送数据if(ack==0)return(0);Stop_I2c(); //结束总线return(1);}/************************************************************** ***** ADC读字节数据函数*************************************************************** ****/ unsigned char IRcvByte(unsigned char sla){ unsigned char c;Start_I2c(); //启动总线SendByte(sla+1); //发送器件地址if(ack==0)return(0);c=RcvByte(); //读取数据0Ack_I2c(1); //发送非就答位Stop_I2c(); //结束总线return(c);}//************************************************************* *****/ main(){ char i,j;while(1){/********以下AD-DA处理*************/switch(AD_CHANNEL){case 0: ISendByte(PCF8591,0x41);D[0]=IRcvByte(PCF8591)*2; //ADC0 模数转换1break;case 1: ISendByte(PCF8591,0x42);D[1]=IRcvByte(PCF8591)*2; //ADC1 模数转换2break;case 2: ISendByte(PCF8591,0x43);D[2]=IRcvByte(PCF8591)*2; //ADC2 模数转换3break;case 3: ISendByte(PCF8591,0x40);D[3]=IRcvByte(PCF8591)*2; //ADC3 模数转换4break;case 4: DACconversion(PCF8591,0x40, D[4]/4); //DAC 数模转换break;}// D[4]=400; //数字--->>模拟输出D[4]=D[3];if(++AD_CHANNEL>4) AD_CHANNEL=0;/********以下将AD的值送到LED数码管显示*************/LedOut[0]=Disp_T ab[D[1]%10000/1000];LedOut[1]=Disp_T ab[D[1]%1000/100];LedOut[2]=Disp_T ab[D[1]%100/10]&0x7f;LedOut[3]=Disp_T ab[D[1]%10];LedOut[4]=Disp_T ab[D[0]%10000/1000];LedOut[5]=Disp_T ab[D[0]%1000/100]&0x7f;LedOut[6]=Disp_T ab[D[0]%100/10];LedOut[7]=Disp_T ab[D[0]%10];for( i=0; i<8; i++){ P1 = LedOut[i];switch(i){case 0:LS138A=0; LS138B=0; LS138C=0; break;case 1:LS138A=1; LS138B=0; LS138C=0; break;case 2:LS138A=0; LS138B=1; LS138C=0; break;case 3:LS138A=1; LS138B=1; LS138C=0; break;case 4:LS138A=0; LS138B=0; LS138C=1; break;case 5:LS138A=1; LS138B=0; LS138C=1; break;case 6:LS138A=0; LS138B=1; LS138C=1; break;case 7:LS138A=1; LS138B=1; LS138C=1; break;}for (j = 0 ; j<90 ;j++) { ;}}P1 = 0XFF;}}/*************************此部分为I2C总线的驱动程序*************************************/#include#include#include#define NOP() _nop_() /* 定义空指令*/#define _Nop() _nop_() /*定义空指令*/sbit SCL=P2^0; //I2C 时钟sbit SDA=P2^1; //I2C 数据bit ack; /*应答标志位*//************************************************************** *****起动总线函数函数原型: void Start_I2c();功能: 启动I2C总线,即发送I2C起始条件.********************************************************************/ void Start_I2c(){SDA=1; /*发送起始条件的数据信号*/_Nop();SCL=1;_Nop(); /*起始条件建立时间大于4.7us,延时*/_Nop();_Nop();_Nop();_Nop();SDA=0; /*发送起始信号*/_Nop(); /* 起始条件锁定时间大于4μs*/_Nop();_Nop();_Nop();_Nop();SCL=0; /*钳住I2C总线,准备发送或接收数据*/_Nop();_Nop();}/************************************************************** *****结束总线函数函数原型: void Stop_I2c();功能: 结束I2C总线,即发送I2C结束条件.*************************************************************** *****/ void Stop_I2c(){SDA=0; /*发送结束条件的数据信号*/_Nop(); /*发送结束条件的时钟信号*/SCL=1; /*结束条件建立时间大于4μs*/_Nop();_Nop();_Nop();_Nop();_Nop();SDA=1; /*发送I2C总线结束信号*/_Nop();_Nop();_Nop();_Nop();}/************************************************************** *****字节数据发送函数函数原型: void SendByte(UCHAR c);功能: 将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对此状态位进行操作.(不应答或非应答都使ack=0)发送数据正常,ack=1; ack=0表示被控器无应答或损坏。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
此状态位进行操作.(不应答或非应答都使ack=0)
发送数据正常,ack=1; ack=0表示被控器无应答或损坏。
********************************************************************/
void SendByte(unsigned char c)
switch(AD_CHANNEL)
{
case 0: ISendByte(PCF8591,0x41);
D[0]=IRcvByte(PCF8591)*2; //ADC0模数转换1
break;
case 1: ISendByte(PCF8591,0x42);
D[1]=IRcvByte(PCF8591)*2; //ADC1模数转换2
bit ISendByte(unsigned char sla,unsigned char c)
{
Start_I2c(); //启动总线
SendByte(sla); //发送器件地址
if(ack==0)return(0);
SendByte(c); //发送数据
if(ack==0)return(0);
Stop_I2c(); //结束总线
return(1);
}
/*******************************************************************
ADC读字节数据函数
*******************************************************************/
* 2.了解掌握I2C总线接口的工作原理及一般编程方法。*
**
*连接方法:JP8(P1)与J12用跳线连接*
**
*通过改变学习板上的2个电位器对应的2段模拟输入,实现模拟输入,学员观察数码管的数字变化情况
*通过改D[4]的值,实现模拟输出,学员观察学习板上DA处LED的亮度变化*
**
*请学员认真消化本例程,懂得AD-DA在C语言中的操作应用*
}
P1 = 0XFF;
}
}
/*************************此部分为I2C总线的驱动程序*************************************/
#include<reg52.h>
#include <intrins.h>
#include <I2C.H>
#define NOP() _nop_() /*定义空指令*/
***********************************************************************************/
#include<reg52.h>
#include <I2C.H>
#define PCF8591 0x90 //PCF8591地址
//else IO
case 5:LS138A=1; LS138B=0; LS138C=1; break;
case 6:LS138A=0; LS138B=1; LS138C=1; break;
case 7:LS138A=1; LS138B=1; LS138C=1; break;
}
for (j = 0 ; j<90 ;j++) { ;}
_Nop();
_Nop();
}
/*******************************************************************
结束总线函数
函数原型: void Stop_I2c();
功能:结束I2C总线,即发送I2C结束条件.
********************************************************************/
SendByte(sla); //发送器件地址
if(ack==0)return(0);
SendByte(c); //发送控制字节
if(ack==0)return(0);
SendByte(Val); //发送DAC的数值
if(ack==0)return(0);
Stop_I2c(); //结束总线
return(1);
void Stop_I2c()
{
SDA=0; /*发送结束条件的数据信号*/
_Nop(); /*发送结束条件的时钟信号*/
SCL=1; /*结束条件建立时间大于4μs*/
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
SDA=1; /*发送I2C总线结束信号*/
_Nop();
_Nop();
起动总线函数
函数原型: void Start_I2c();
功能:启动I2C总线,即发送I2C起始条件.
********************************************************************/
void Start_I2c()
{
SDA=1; /*发送起始条件的数据信号*/
_Nop();
_Nop(); /*保证时钟高电平周期大于4μs*/
_Nop();
_Nop();
_Nop();
SCL=0;
}
_Nop();
_Nop();
SDA=1; /*8位发送完后释放数据线,准备接收应答位*/
_Nop();
_Nop();
SCL=1;
_Nop();
_Nop();_Nop来自);if(SDA==1)ack=0;
/**********************************************************************************
*标题: ************* DA-AD试验******************* *
**
* 1.通过本例程了解并掌握AD-DA转换芯片的基本原理和使用*
unsigned char IRcvByte(unsigned char sla)
{ unsigned char c;
Start_I2c(); //启动总线
SendByte(sla+1); //发送器件地址
if(ack==0)return(0);
c=RcvByte(); //读取数据0
Ack_I2c(1); //发送非就答位
Stop_I2c(); //结束总线
return(c);
}
//******************************************************************/
main()
{ char i,j;
while(1)
{/********以下AD-DA处理*************/
case 1:LS138A=1; LS138B=0; LS138C=0; break;
case 2:LS138A=0; LS138B=1; LS138C=0; break;
case 3:LS138A=1; LS138B=1; LS138C=0; break;
case 4:LS138A=0; LS138B=0; LS138C=1; break;
#define _Nop() _nop_() /*定义空指令*/
sbit SCL=P2^0; //I2C时钟
sbit SDA=P2^1; //I2C数据
bit ack; /*应答标志位*/
/*******************************************************************
_Nop();
SCL=1;
_Nop(); /*起始条件建立时间大于4.7us,延时*/
_Nop();
_Nop();
_Nop();
_Nop();
SDA=0; /*发送起始信号*/
_Nop(); /*起始条件锁定时间大于4μs*/
_Nop();
_Nop();
_Nop();
_Nop();
SCL=0; /*钳住I2C总线,准备发送或接收数据*/
break;
case 2: ISendByte(PCF8591,0x43);
D[2]=IRcvByte(PCF8591)*2; //ADC2模数转换3
break;
case 3: ISendByte(PCF8591,0x40);
D[3]=IRcvByte(PCF8591)*2; //ADC3模数转换4
else ack=1; /*判断是否接收到应答信号*/
SCL=0;
_Nop();
_Nop();
}
/*******************************************************************
字节数据接收函数
函数原型: UCHAR RcvByte();
功能:用来接收从器件传来的数据,并判断总线错误(不发应答信号),
*******************************************************************/
bit DACconversion(unsigned char sla,unsigned char c, unsigned char Val)
{
Start_I2c(); //启动总线
}
/*******************************************************************
相关文档
最新文档