第1个回答 2011-05-03
本人估计,你是用proteus仿真做的吧,因为DAC0832的工作脉冲你是靠IO口取反来实现的,以下是我对程序的注释,由于你没给出原理图,有不合理之处在所难勉.
有些地方我认为没必要说的就不细说,不明再问
#include<reg51.h>
#include<absacc.h> //头文件,可使用其中定义的宏来访问绝对地址
#define dac0832 XBYTE[0X7fff] //DAC位置定义,跟据实际原理图而定
unsigned char code shu[]=; //数码管码值表
float s;
/*******************DAC0832控制位的定义,视实际原理图而定*************/
sbit ALE=P3^0; //DAC0832 ALE脚工作脉冲位定义
sbit START=P3^1; //DAC0832 START位定义
sbit EOC=P3^2; //转换结束标志位
sbit OE=P3^3; //输出允许位
sbit SHCP=P2^0; //数码管驱动芯片(如595)位定义
sbit DS=P2^1; //同上
sbit STCP=P2^2; //同上
sbit P11=P3^5;
sbit P12=P3^7;
sbit clk=P2^6; //DAC0832 工作脉冲
/************************************************/
unsigned char j,k,m,n,i,a;
unsigned int b;
void delay(unsigned char t)
{ while(t--);
}
void display() //静态数码管的显示
{
j=0x01;
for(i=0;i<8;i++)
{ if((shu[m]&j)==0)
else
SHCP=1;
SHCP=0;
j<<=1;
}
P12=0;
P11=1;
STCP=0;
STCP=1;
delay(200);
j=0x01;
for(i=0;i<8;i++)
{ if((shu[n]&j)==0)
else
SHCP=1;
SHCP=0;
j<<=1;
}
P11=0;
P12=1;
STCP=0;
STCP=1;
delay(200);
}
void main()
{
P2=0X87;
/////////定时器1初始化////////////////
TMOD=0X20;
TH1=0X06;
TL1=0X06;
EA=1;
ET1=1;
TR1=1;
while(1)
{
//DAC0832地址锁存脉冲
ALE=1;
ALE=0;
//DAC0832 开始转换脉冲
START=1;
START=0;
while(EOC==0); //等待转换完毕
OE=1; //开始读
k=P1; //读数据
a=P1; //读数据
b=a*6;
m=b/1000; //取千位数
n=b%1000/100; //取百位数
dac0832=k;
display(); //数码管显示
}
}
void time() interrupt 3 //DAC0932脉冲
{
clk=!clk; //位取反