#include "reg52.h"
#include "intrins.h"
#define ad_con P2 //转换控制
#define addata P0 // 数据
#define disdata P1 // 显示
#define uchar unsigned char
#define uint unsigned int
uchar number=0x00
sbit ALE=P2^3
sbit START=P2^4
sbit OE=P2^5
sbit EOC=P3^7
sbit KEY1=P3^5//单路-循环
sbit KEY2=P3^6//通道选择
sbit DISX=disdata^7
sbit FLAG=PSW^5
uchar code dis_7[11]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xFF}
uchar code scan_con[4]={0xfe,0xfd,0xfb,0xf7}
uchar data ad_data[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}
uint data dis[5]={0x00,0x00,0x00,0x00,0x00}
////////////////////////////////////////////////////////////
delay1ms(uint t)//延时
{
uint i,j
for (i=0i<ti++)
for(j=0j<120j++)
}
/////////////////////////////////////////////////////////////////
keytest()//按键处理
{
if (KEY1==0)
{
FLAG=!FLAG//标志翻转
while (KEY1==0)
}
if (FLAG==1) //单路
{
if (KEY2==0)
{
number++ //通道选择
if (number==8) {number=0}
while (KEY2==0)
}
}
}
////////////////////////////////////////////////////////////////
scan()//扫描显示
{
uchar k,n
int h
if (FLAG==0) //循环
{
dis[3]=0x00 //显示通道 0
for (n=0n<8n++)
{
dis[2]=ad_data[n]/51 //百位 /51与转换值有关,调试时看实际值
dis[4]=ad_data[n]%51
dis[4]=dis[4]*10
dis[1]=dis[4]/51//十位
dis[4]=dis[4]%51
dis[4]=dis[4]*10
dis[0]=dis[4]/51//个位
for (h=0h<500h++)
{
for (k=0k<4k++)
{
disdata=dis_7[dis[k]]
if (k==2){DISX=0}
P3=scan_con[k]delay1ms(1)P3=0xff
}
}
dis[3]++ //通道显示+1
keytest()
}
}
if (FLAG==1)//单路
{
dis[3]=number //通道选择
dis[2]=ad_data[n]/51 //百位
dis[4]=ad_data[n]%51
dis[4]=dis[4]*10
dis[1]=dis[4]/51 //十位
dis[4]=dis[4]%51
dis[4]=dis[4]*10
dis[0]=dis[4]/51 //个位
for (k=0k<4k++)
{
disdata=dis_7[dis[k]]
if (k==2) {DISX=0}
P3=scan_con[k]delay1ms(1)P3=0xff
}
keytest()
}
}
/////////////////////////////////////////////////////////
test()//AD转换
{
uchar m
uchar s=0x00
ad_con=s
for (m=0m<8m++)
{
ALE=1_nop_()_nop_()ALE=0
START=1_nop_()_nop_()START=0
_nop_()_nop_()_nop_()_nop_()
while (EOC==0)
OE=1ad_data[m]=addataOE=0
s++ad_con=s
}
ad_con=0x00
}
///////////////////////////////////////////////////////
main()
{
P0=0xff
P2=0x00
P1=0xff
P3=0xff
while (1)
{
test()//AD转换
scan()//显示
}
}
这个容易的,你网上查一下7135AD芯片,利用它给的外围电路连接方式,就可以制作的,再有问题给我发邮件xwq34@126.com1)原理图我博客上有
(2)程序清单:
名称:数字电压表
作者w418781840,日期:2008.6.12
功能:实验现0~~5V电压的测量,测量值用三位数管显示
CLK BIT P3.5定义CLK
ORG 0000H
LJMP MAIN 转入主程序
ORG 0013H
LJMP AGA 中断TNT1,用于读取转换后的数据
ORG 001BH
LJMP WQ T1中断入口,用于产生时钟和显示
主程序
ORG 0030H
MAIN: MOV TMOD,#10H 工作方式1
MOV TH1,#(65536-200)/256 产生500HZ
MOV TL1,#(65536-200)%256
SETB EA 开总中断.
SETB ET1 开T1中断
SETB TR1 启动T1
SETB EX1 开外部中断1
SETB IT1 边沿触发
MOV DPTR ,#1FFFH 指向通道INC0
MOVX @DPTR,A 启动转换
LOOP: LCALL DISPLAY 调用显示程序.
SJMP LOOP
外部1中断,;显示数据转为3位BCD码子程序
;显示数据转为3位BCD码存入33H,34H,35H(最大值约为5.00V)
AGA: MOV DPTR,#1FFFH
MOVX A,@DPTR 读取转换后的数据.
MOV B,#51 255÷51=5.00V运算
DIV AB
MOV 33H,A ;个位数放入33H
MOV A,B ;余数大于19H,F0为1,乘法溢出,结果加5
CLR F0
SUBB A,#1AH
MOV F0,C
MOV A,#10
MUL AB
MOV B,#51
DIV AB
JB F0,LOOP2
ADD A,#5
LOOP2: MOV 34H,A ;小数后第一位放入34H
MOV A,B
CLR F0
SUBB A,#1AH
MOV F0,C
MOV A,#10
MUL AB
MOV B,#51
DIV AB
JB F0,LOOP3
ADD A,#5H
LOOP3: MOV 35H,A ;小数后第二位放入35H
MOVX @DPTR,A 启动转换
RETI
显示程序
DISPLAY: MOV R1,#33H 指向显示数据首址
MOV R0,#0FEH 扫描控制字初值
PLAY: MOV A,R0 扫描字放入A
MOV P2,A 从P2口输出
MOV A,@R1 取显示数据到A
MOV DPTR,#TAB 取段码表地址
MOVC A,@A+DPTR 查显示数据对应段码
CJNE R0,#0FEH,PAP 查看是第一位否.
ORL A,#80H 是,则取小数点.
PAP: MOV P1,#0FFH 防闪烁.
MOV P1,A 段码放入P1口
LCALL DL1MS 显示1MS
INC R1 指向下一地址
MOV A,R0 扫描控制字放入A
JNB ACC.2,ENDOUT ACC.3=0时一次显示结束
RL A A中数据循环左移
MOV R0,A 放回R5内
AJMP PLAY 跳回PLAY循环
ENDOUT: RET
TAB: DB 3fH,06H,5bH,4fH,66H,6dH,7dH,07H,7fH,6fH
延时程序
1MS延时程序,LED显示程序用
DL1MS: MOV R6,#14H
DL1: MOV R7,#19H
DL2: DJNZ R7,DL2
DJNZ R6,DL1
RET
T1定时器中断服务程序,用于给ADC0809产生时钟周期
WQ: MOV TH1,#(65536-200)/256
MOV TL1,#(65536-200)%256
CPL CLK 取反.
RE: RETI
END
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)