k8255ctrl equ 203h
k8255a equ 200h
k8255b equ 201h
k8255c equ 202h
c8279 equ 20ah
d8279 equ 208h
ledmod equ 0
ledfeq equ 38h
code segment
assume cs:code
;主程序
main:
mov dx,c8279
mov al,ledmod
out dx,al
mov al,ledfeq
out dx,al
mov al,0d3h
out dx,al ;8279初始化
mov ax,cs
mov ds,ax
mov dx,k8255ctrl ;8255初始化
mov al,88h ;a,b口输出,c口高四位输入,pc7作开关测试口
out dx,al
mov al,0ffh ;8255输出数据初始化,显示全灭
mov dx,k8255a
out dx,al
mov dx,k8255c
out dx,al
test1: mov dx,k8255c
in al,dx ;检测工作/非工作开关状态
and al,80h
jz p1
call work
p1: call nowork
jmp test1
;工作状态子程序
work proc
p2: mov dx,k8255c
in al,dx
and al,80h
jnz p3
ret ;检测工作/非工作开关状态
p3: mov si,offset xszt
mov al,[si]
mov dx,k8255a
out dx,al ;led显示第1种状态:东西绿,南北红
mov cx,3 ;3次调用1s延时子程序
mov al,05h ;数码管显示时间
p4: push cx
mov cx,100 ;确定延时1s系数
call delay ;调用1s延时
pop cx
dec al ;数码管显示的时间减1
das
loop p4
mov si,offset xszt
mov al,[si+1]
mov dx,k8255a
out dx,al ;led显示第2种状态:东西黄,南北红
mov al,02 ;数码管显示时间
mov cx,100
call delay ;调用1s延时
dec al
mov cx,100
call delay ;调用1s延时
mov si,offset xszt
mov al,[si+2]
mov dx,k8255a
out dx,al ;led显示第3种状态:东西红,南北绿
mov cx,3 ;3次调用1s延时子程序
mov al,05h ;数码管显示时间
p5: push cx
mov cx,100
call delay ;调用1s延时
pop cx
dec al ;数码管显示的时间减1
das
loop p5
mov si,offset xszt
mov al,[si+3]
mov dx,k8255a
out dx,al ;led显示第4种状态:东西红,南北黄
mov al,02h ;数码管显示时间
mov cx,100
call delay ;调用1s延时
dec al
mov cx,100
call delay ;调用1s延时
jmp p2
work endp
;非工作状态子程序
nowork proc
p6: mov dx,k8255c
in al,dx
and al,80h
jz p7
ret ;检测工作/非工作开关状态
p7: mov al,0ffh
mov dx,k8255a
out dx,al ;灯全灭
mov cx,100
p8: call delay5ms
loop p8
mov dx,c8279 ;数码管清屏
mov al,0d3h
out dx,al
mov al,0f0h
mov dx,k8255a
out dx,al ;红灯全亮
mov cx,100
p9: call delay5ms
loop p9
jmp p6
nowork endp
;延时1s子程序
delay proc
lp: call delay5ms
call display1 ;调用动态显示子程序
loop lp ;10ms为一个周期,有100个
ret
delay endp
;动态显示子程序
display1 proc
push ax
mov dx,c8279
mov al,81h ;选位
out dx,al
pop ax
mov bh,al
push ax
shr bh,1
shr bh,1
shr bh,1
shr bh,1 ;截取显示时间的高位数
mov ax,offset table1 ;显示缓冲区首地址
add al,bh
mov si,ax
mov al,[si]
mov dx,d8279
out dx,al ;显示时间的高位数
call delay5ms
mov dx,c8279
mov al,80h
out dx,al
pop ax
mov bh,al
push ax
and bh,0fh ;截取显示时间的低位数
mov ax,offset table1 ;显示缓冲区首地址
add al,bh
mov si,ax
mov al,[si]
mov dx,d8279
out dx,al ;显示时间的低位
pop ax
ret
display1 endp
delay5ms proc
lp2: mov si,3aah
lp1:pushf
popf
dec si
jnz lp1 ;延时5ms
ret
delay5ms endp
xszt db 5ah,50h,0a5h,0a0h ;4种led发光二极管显示状态
table1 db 3fh,06h,5bh,4fh,66h ;0~9数码显示
db 6dh,7dh,07h,7fh,6fh
code ends
end main
小哥儿 一看就是工大的
这是个AD转换控制程序,并将结果在LCD上显示的程序。不过程序比较罗嗦,个人觉得有些程序没用。
说明的部分用“////”标注了,应该比较清楚了。你自己看吧。
LED_0 EQU 30H ;
LED_1 EQU 31H
LED_2 EQU 32H ;存放段码
ADC EQU 35H ;/////////AD转换结果存储单元
CLOCK BIT P24 ;定义ADC0808时钟位
ST BIT P25
EOC BIT P26
OE BIT P27
ORG 00H
SJMP START
ORG 0BH
LJMP INT_T0
START: MOV LED_0,#00H
MOV LED_1,#00H
MOV LED_2,#00H
MOV DPTR,#TABLE ;段码表首地址
MOV TMOD,#02H
MOV TH0,#245
MOV TL0,#00H
MOV IE,#82H
SETB TR0
////////////启动AD转换//////////////////
WAIT: CLR ST
SETB ST
CLR ST ;启动AD转换
JNB EOC,$ ;等待转换结束
SETB OE
MOV ADC,P1 ;读取AD转换结果
CLR OE
MOV A,ADC
/////////////////分别取AD结果的个/十/百/位/////////////////////////////
MOV B,#100 ;AD转换结果转换成BCD码
DIV AB
MOV LED_2,A
MOV A,B
MOV B,#10
DIV AB
MOV LED_1,A
MOV LED_0,B
/////////////LCD显示///////////////////////
LCALL DISP
SJMP WAIT
INT_T0: CPL CLOCK ;提供ADC0808时钟信号
RETI
///////送LCD显控制的子程序//////////////
DISP: mov dptr,#table
MOV A,LED_0 ;数码显示子程序
MOVC A,@A+DPTR
CLR P23
MOV P0,A
LCALL DELAY
SETB P23
mov dptr,#table
MOV A,LED_1
MOVC A,@A+DPTR
CLR P22
MOV P0,A
LCALL DELAY
SETB P22
mov dptr,#table
MOV A,LED_2
MOVC A,@A+DPTR
setb acc7
CLR P21
MOV P0,A
LCALL DELAY
SETB P21
RET
/////////这段程序,比较怪,因为你没说具体功能,我没看明白//////////
/////////只知道是对AD结果按TAB表进行处理,也是取个/十/百/位/////////
DELAY: MOV R6,#10 ;延时5毫秒
D1: MOV R7,#250
DJNZ R7,$
DJNZ R6,D1
ntov:
mov dptr,#tab
mov a,adc
movc a,@a+dptr
mov b,#2
div ab
mov r1,b
mov r1,b
mov b,#10
div ab
mov led_2,a
mov led_1,b
cjne r1,#01,kk1
mov led_0,#05
back: ret
kk1: mov led_0,#00
ajmp back
RET
TABLE: DB 3FH,06H,5BH,4FH,66H
DB 6DH,7DH,07H,7FH,6FH
tab:
db 0, 0 , 0 , 1, 0, 2, 0, 0, 3, 0
db 4, 0, 0, 5, 0, 6, 0, 0, 7, 0
db 8, 0, 0, 9, 0, 0, 10, 0, 11, 0
db 0, 12, 0, 13, 0, 0, 14, 0, 15, 0
db 0, 16, 0, 17, 0, 0, 18, 0, 19, 0
db 0, 20, 0, 0, 21, 0, 22, 0, 0, 23
db 0, 24, 0, 0, 25, 0, 26, 0, 0, 27
db 0, 28, 0, 0, 29, 0, 0, 30, 0, 31
db 0, 0, 32, 0, 33, 0, 0, 34, 0, 35
db 0, 0, 36, 0, 37, 0, 0, 38, 0, 39
db 0, 0, 40, 0, 0, 41, 0, 42, 0, 0
db 43, 0, 44, 0, 0, 45, 0, 46, 0, 0
db 47, 0, 48, 0, 0, 49, 0, 50, 0, 0
db 51, 0, 0, 52, 0, 53, 0, 0, 54, 0
db 55, 0, 0, 56, 0, 57, 0, 0, 58, 0
db 59, 0, 0, 60, 0, 0, 61, 0, 62, 0
db 0, 63, 0, 64, 0, 0, 65, 0, 66, 0
db 0, 67, 0, 68, 0, 0, 69, 0, 70, 0
db 0, 71, 0, 0, 72, 0, 73, 0, 0, 74
db 0, 75, 0, 0, 76, 0, 77, 0, 0, 78
db 0, 79, 0, 0, 80, 0, 0, 81, 0, 82
db 0, 0, 83, 0, 84, 0, 0, 85, 0, 86
db 0, 0, 87, 0, 88, 0, 0, 89, 0, 90
db 0, 0, 91, 0, 0, 92, 0, 93, 0, 0
db 94, 0, 95, 0, 0, 96, 0, 97, 0, 0
db 98, 0, 99, 0, 0, 100, 0, 0, 0
END
本文介绍了用ADC0808集成电压转换芯片和AT89C51单片机设计制作的数字直流电压表。在测量仪器中,电压表是必须的,而且电压表的好坏直接影响到测量精度。具有一个精度高、转换速度快、性能稳定的电压表才能符合测量的要求。为此,我们设计了数字电压表,此作品主要由A/D0808转换器和单片机AT89C51构成,A/D转换器在单片机的控制下完成对模拟信号的采集和转换功能,最后由数码管显示采集的电压值。此设计通过调试完全满足设计的指标要求。电路设计简单,设计制作方便有较强的实用性。
关键词:
ADC0808;单片机AT89C51;数字电压表
Abstract:
In this paper, with ADC0808 voltage converter integrated chips and microcontroller designed AT89C51 the number of DC voltage table In measuring instruments, voltage meter is necessary, and voltage meter will have a direct impact on measurement accuracy With a high precision, the conversion speed and stable performance of the voltage meter to conform to the requirements of measurement To this end, we design a digital voltage meter, this works mainly by A/D0808 converter and a microcontroller AT89C51, A / D converter under the control of the MCU to complete the acquisition and analog signal conversion functions, from the final Acquisition of the digital display voltage value This design through debugging to fully meet the design requirements of the target Circuit design simple, designed to facilitate a more practical
Key words:
ADC0808; SCM AT89C51; Digital Voltmeter
目 录
1.设计方案……………………………………………………………………………………1
2 系统硬件设计……………………………………………………………………………2
2.1单片机芯片……………………………………………………………………………2
2.1.1.单片机芯片选择……………………………………………………………2
2.1.2.单片机管脚说明……………………………………………………………3
2.2.A/D转换器……………………………………………………………………………5
2.2.1.A/D转换器芯片选择………………………………………………………5
2.2.2.A/D转换器管脚说明………………………………………………………6
2.3.电压显示电路…………………………………………………………………………7
3系统程序设计……………………………………………………………………………………8
3.1.软件总体框架设计……………………………………………………………………8
4系统总图及程序…………………………………………………………………………………9
5参考文献………………………………………………………………………………………………12
6.结束语……………………………………………………………………………………………………13
1.设计方案
在电量的测量中,电压、电流和频率是最基本的三个被测量,其中电压量的测量最为经常。而且随着电子技术的发展,更是经常需要测量高精度的电压,所以数字电压表就成为一种必不可少的测量仪器。数字电压表(Digital Voltmeter)简称DVM,它是采用数字化测量技术,把连续的模拟量(直流或交流输入电压)转换成不连续、离散的数字形式并加以显示的仪表。由于数字式仪器具有读数准确方便、精度高、误差小、灵敏度高和分辨率高、测量速度快等特点而倍受青睐。本设计从各个角度分析了由单片机组成的数字电压表的设计过程及各部分电路的组成及其原理,并且分析了程序如何驱动单片机进而使系统运行起来的原理及方法。框图如下:
本设计主要分为两部分:硬件电路及软件程序。而硬件电路又大体可分为A/D转换电路、LED显示电路,各部分电路的设计及原理将会在硬件电路设计部分详细介绍;程序的设计使用汇编语言编程,利用WAVE和PROTEUS 软件对其编译和仿真,详细的设计算法将会在程序设计部分详细介绍。
2系统硬件电路设计
21 单片机芯片
211单片机芯片选择
AT89C51简介
AT89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—Falsh Programmable and Erasable Read Only Memory)的低电压,高性能CMOS8位微处理器,俗称单片机。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。AT89C单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。外形及引脚排列如图所示
图21_1 AT89C51引脚图
212单片机管脚说明
主要特性:
与MCS-51 兼容
4K字节可编程闪烁存储器
寿命:1000写/擦循环
数据保留时间:10年
全静态工作:0Hz-24Hz
三级程序存储器锁定
128×8位内部RAM
32可编程I/O线
两个16位定时器/计数器
5个中断源
可编程串行通道
低功耗的闲置和掉电模式
片内振荡器和时钟电路
管脚接法说明:
VCC:供电电压我们接+5V。
GND:接地。
P0口:在这个设计中我们将AT89C51做为BCD码的输出口与LED显示器相连。由于P0口输出驱动电路中没有上拉电阻,所以我们在外接电路上接上拉电阻。
P1口:把AT89C51中的P1口与ADC0808的输出端相连,做为数字信号的接收端。
P2口:我们把P2口做为位码输出口,以P20—23输出位控线与LED显示器相连
P3口:利用P30,P31,P32,P34,P35,P36分别与ADC0808的OE,EOC,START/ALE,A,B,C端相连。
XTAL1 ,XTAL2:外接一振荡电路。
图212 振荡电路
RST:在此端接一复位电路。
图213 复位电路
22 A/D转换器与单片机接口电路
221A/D转换器芯片选择
A/D转换器是模拟量输入通道中的一个环节,单片机通过A/D转换器把输入模拟量变成数字量再处理。
随着大规模集成电路的发展,目前不同厂家已经生产出了多种型号的A/D转换器,以满足不同应用场合的需要。如果按照转换原理划分,主要有3种类型,即双积分式A/D转换器、逐次逼近式A/D转换器和并行式A/D转换器。目前最常用的是双积分和逐次逼近式。
双积分式A/D转换器具有抗干扰能力强、转换精度高、价格便宜等优点,比如ICL71XX系列等,它们通常带有自动较零、七段码输出等功能。与双积分相比,逐次逼近式A/D转换的转换速度更快,而且精度更高,比如ADC0808、ADC0809等,它们通常具有8路模拟选通开关及地址译码、锁存电路等,它们可以与单片机系统连接,将数字量送入单片机进行分析和显示。
本设计中,由于对精度没做很大要求,我们采用逐次逼近式A/D转换ADC0808,精度为002,所以四位LED显示中的最后一位我们设置为V。
图221 ADC0808引脚图
222A/D转换器ADC0808的管脚说明:
IN0~IN7:为模拟量的输入口,我们选取IN3口为入口,外接可变电阻,通过改变阻值来控制模拟量的输入。
A、B、C:3位地址输入,2个地址输入端的不同组合选择八路模拟量输入。这里我们将A,B接高电平,C为低电平。
ALE:地址锁存启动信号,在ALE的上升沿,将A、B、C上的通道地址锁存到内部的地址锁存器。
D0~D7:八位数据输出线,A/D转换结果由这8根线传送给单片机。
OE:允许输出信号。当OE=1时,即为高电平,允许输出锁存器输出数据。
START:启动信号输入端,START为正脉冲,其上升沿清除ADC0808的内部的各寄存器,其下降沿启动A/D开始转换。
EOC:转换完成信号,当EOC上升为高电平时,表明内部A/D转换已完成。
CLK:时钟输入信号,选用频率500KHZ。
图222 时钟信号
23 电压显示电路:
设计中采用的是4段LED数码管来显示电压值。LED具有耗电低、亮度高、视角大、线路简单、耐震及寿命长等优点,它由4个发光二极管组成,其中3个按‘8’字型排列,另一个发光二极管为圆点形状,位于右下角,常用于显示小数点。把4个发光二极管连在一起,公共端接高电平,叫共阳极接法,相反,公共端接低电平的叫共阴极接法,我们采用共阴极接法。当发光二极管导通时,相应的一段笔画或点就发亮,从而形成不同的发光字符。其8段分别命名为dp g f e d c b a。例如,要显示“0”,则dp g f e d c b a分别为:00111111B;若要显示多个数字,只要让若干个数码管的位码循环为高电平就可以了。
根据设计要求,显示电路需要至少4位LED数码管来显示电压值,我们再多加一位用来显示电压单位“V”,则有7位LED循环显示。利用单片机的I/O口驱动LED数码管的亮灭,设计中由P0口驱动LED的段码显示,即显示字符,由P2口选择LED位码,即选择点
亮哪位LED来显示。
图23 LED管
另外,一般I/O接口芯片的驱动能力是很有限的,在LED显示器接口电路中,输出口所能提供的驱动电流一般是不够的尤其是设计中需要用到多位LED,此时就需要增加LED驱动电路。驱动电路有多种,常用的是TTL或MOS集成电路驱动器,在本设计中采用了ADC0808芯片驱动电路。
3系统程序设计
31软件总体框架设计
在编写汇编语言时,先存放数码管的段码,再存放转换后的数据,选取通道并设值再将AD转换结果转换成BCD码,通过换算LED上显示
再换算中,利用关系得到LED上个位,十位,百位的显示,然后设置小数点:
开始
预设初值
选取通道3
启动A/D转换
否
是
数码显示子程序
延时显示结果
结束
在系统上电开始测量前,要用万用表的电压档对被测电压进行估测,然后再测。
4系统总图及程序
LED_0 EQU 30H;
LED_1 EQU 31H;
LED_2 EQU 32H;
LED_3 EQU 33H;
ADC EQU 35H;
ST BIT P32;
OE BIT P30;
EOC BIT P31;
ORG 00H;
START: MOV LED_0,#00H;
MOV LED_1,#00H;
MOV LED_2,#00H;
MOV LED_3,#00H;
MOV DPTR,#TABLE;
SETB P34;
SETB P35;
CLR P36;
WAIT: CLR ST;
SETB ST;
CLR ST;
JNB EOC,$;
SETB OE;
MOV ADC,P1;
CLR OE;
MOV A,ADC;
MOV B,#51;
DIV AB;
MOV LED_3,A;
MOV A,B;
MOV B,#5;
DIV AB;
MOV LED_2,A;
MOV LED_1,B;
LCALL DISP;
SJMP WAIT;
DISP: MOV A,#3EH;
CLR P23;
MOV P0,A;
LCALL DELAY;
SETB P23;
MOV A,LED_1;
MOVC A,@A+DPTR;
CLR P22;
MOV P0,A;
LCALL DELAY;
SETB P22;
MOV A,LED_2;
MOVC A,@A+DPTR;
CLR P21;
MOV P0,A;
LCALL DELAY;
SETB P21;
MOV A,LED_3;
MOVC A,@A+DPTR;
ORL A,#80H;
CLR P20;
MOV P0,A;
LCALL DELAY;
SETB P20;
RET;
DELAY: MOV R6,#10;
D1: MOV R7,#250;
DJNZ R7,$;
DJNZ R6,D1;
RET
TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,
END
数字直流电压表的总图
28. 数字电压表
1. 实验任务
利用单片机AT89S51与ADC0809设计一个数字电压表,能够测量0-5V之间的直流电压值,四位数码显示,但要求使用的元器件数目最少。
2. 电路原理图
图1281
3. 系统板上硬件连线
a) 把“单片机系统”区域中的P10-P17与“动态数码显示”区域中的ABCDEFGH端口用8芯排线连接。
b) 把“单片机系统”区域中的P20-P27与“动态数码显示”区域中的S1S2S3S4S5S6S7S8端口用8芯排线连接。
c) 把“单片机系统”区域中的P30与“模数转换模块”区域中的ST端子用导线相连接。
d) 把“单片机系统”区域中的P31与“模数转换模块”区域中的OE端子用导线相连接。
e) 把“单片机系统”区域中的P32与“模数转换模块”区域中的EOC端子用导线相连接。
f) 把“单片机系统”区域中的P33与“模数转换模块”区域中的CLK端子用导线相连接。
g) 把“模数转换模块”区域中的A2A1A0端子用导线连接到“电源模块”区域中的GND端子上。
h) 把“模数转换模块”区域中的IN0端子用导线连接到“三路可调电压模块”区域中的VR1端子上。
i) 把“单片机系统”区域中的P00-P07用8芯排线连接到“模数转换模块”区域中的D0D1D2D3D4D5D6D7端子上。
4. 程序设计内容
i 由于ADC0809在进行A/D转换时需要有CLK信号,而此时的ADC0809的CLK是接在AT89S51单片机的P33端口上,也就是要求从P33输出CLK信号供ADC0809使用。因此产生CLK信号的方法就得用软件来产生了。
ii 由于ADC0809的参考电压VREF=VCC,所以转换之后的数据要经过数据处理,在数码管上显示出电压值。实际显示的电压值 (D/256VREF)
5. 汇编源程序
ADC0809中文资料
ADC0809是带有8位A/D转换器、8路多路开关以及微处理机兼容的控制逻辑的CMOS组件。它是逐次逼近式A/D转换器,可以和单片机直接接口。
(1)ADC0809的内部逻辑结构
由下图可知,ADC0809由一个8路模拟开关、一个地址锁存与译码器、一个A/D转换器和一个三态输出锁存器组成。多路开关可选通8个模拟通道,允许8 路模拟量分时输入,共用A/D转换器进行转换。三态输出锁器用于锁存A/D转换完的数字量,当OE端为高电平时,才可以从三态输出锁存器取走转换完的数 据。
(2). ADC0809引脚结构
ADC0809各脚功能如下:
D7-D0:8位数字量输出引脚。
IN0-IN7:8位模拟量输入引脚。
VCC:+5V工作电压。
GND:地。
REF(+):参考电压正端。
REF(-):参考电压负端。
START:A/D转换启动信号输入端。
ALE:地址锁存允许信号输入端。
(以上两种信号用于启动A/D转换)
EOC:转换结束信号输出引脚,开始转换时为低电平,当转换结束时为高电平。
OE:输出允许控制端,用以打开三态数据输出锁存器。
CLK:时钟信号输入端(一般为500KHz)。
A、B、C:地址输入线。
ADC0809对输入模拟量要求:信号单极性,电压范围是0-5V,若信号太小,必须进行放大;输入的模拟量在转换过程中应该保持不变,如若模拟量变化太快,则需在输入前增加采样保持电路。
地址输入和控制线:4条
ALE为地址锁存允许输入线,高电平有效。当ALE线为高电平时,地址锁存与译码器将A,B,C三条地址线的地址信号进行锁存,经译码后被选中的通道的模 拟量进转换器进行转换。A,B和C为地址输入线,用于选通IN0-IN7上的一路模拟量输入。通道选择表如下表所示。
C B A 选择的通道
0 0 0 IN0
0 0 1 IN1
0 1 0 IN2
0 1 1 IN3
1 0 0 IN4
1 0 1 IN5
1 1 0 IN6
1 1 1 IN7
数字量输出及控制线:11条
ST为转换启动信号。当ST上跳沿时,所有内部寄存器清零;下跳沿时,开始进行A/D转换;在转换期间,ST应保持低电平。EOC为转换结束信号。当 EOC为高电平时,表明转换结束;否则,表明正在进行A/D转换。OE为输出允许信号,用于控制三条输出锁存器向单片机输出转换得到的数据。OE=1,输 出转换得到的数据;OE=0,输出数据线呈高阻状态。D7-D0为数字量输出线。
CLK为时钟输入信号线。因ADC0809的内部没有时钟电路,所需时钟信号必须由外界提供,通常使用频率为500KHZ,
VREF(+),VREF(-)为参考电压输入。
2. ADC0809应用说明
(1). ADC0809内部带有输出锁存器,可以与AT89S51单片机直接相连。
(2). 初始化时,使ST和OE信号全为低电平。
(3). 送要转换的哪一通道的地址到A,B,C端口上。
(4). 在ST端给出一个至少有100ns宽的正脉冲信号。
(5). 是否转换完毕,我们根据EOC信号来判断。
(6). 当EOC变为高电平时,这时给OE为高电平,转换的数据就输出给单片机了。
3. 实验任务
如下图所示,从ADC0809的通道IN3输入0-5V之间的模拟量,通过ADC0809转换成数字量在数码管上以十进制形成显示出来。ADC0809的VREF接+5V电压。
4. ADC0809应用电路原理图
6. 程序设计内容
(1). 进行A/D转换时,采用查询EOC的标志信号来检测A/D转换是否完毕,若完毕则把数据通过P0端口读入,经过数据处理之后在数码管上显示。
(2). 进行A/D转换之前,要启动转换的方法:
ABC=110选择第三通道
ST=0,ST=1,ST=0产生启动转换的正脉冲信号
C语言源程序
#include
unsigned char code dispbitcode[]={0xfe,0xfd,0xfb,0xf7,
0xef,0xdf,0xbf,0x7f};
unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,0x00};
unsigned char dispbuf[8]={10,10,10,10,10,0,0,0};
unsigned char dispcount;
sbit ST="P3"^0;
sbit OE="P3"^1;
sbit EOC="P3"^2;
unsigned char channel="0xbc";//IN3
unsigned char getdata;
void main(void)
{
TMOD=0x01;
TH0=(65536-4000)/256;
TL0=(65536-4000)%256;
TR0=1;
ET0=1;
EA=1;
P3=channel;
while(1)
{
ST=0;
ST=1;
ST=0;
while(EOC==0);
OE=1;
getdata=P0;
OE=0;
dispbuf[2]=getdata/100;
getdata=getdata%100;
dispbuf[1]=getdata/10;
dispbuf[0]=getdata%10;
}
}
void t0(void) interrupt 1 using 0
{
TH0=(65536-4000)/256;
TL0=(65536-4000)%256;
P1=dispcode[dispbuf[dispcount]];
P2=dispbitcode[dispcount];
dispcount++;
if(dispcount==8)
{
dispcount=0;
}
dispbuf[i]=temp;
ST=1;
ST=0;
}
}
}
void t0(void) interrupt 1 using 0
{
CLK=~CLK;
}
void t1(void) interrupt 3 using 0
{
TH1=(65536-4000)/256;
TL1=(65536-4000)%256;
P1=dispcode[dispbuf[dispcount]];
P2=dispbitcode[dispcount];
if(dispcount==7)
{
P1=P1 | 0x80;
}
dispcount++;
if(dispcount==8)
{
dispcount=0;
}
}
以上就是关于新手问题!请问如何用ADC0809实现直流电压表汇编语言的全部的内容,包括:新手问题!请问如何用ADC0809实现直流电压表汇编语言的、是可以详细给解释一下这个单片机汇编语言、利用单片机AT89C51与ADC0808设计一个数字电压表,能够测量0~5V的直流电压值,精度越高越好等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)