找回密码
 注册会员
更新自动建库工具PCB Footprint Expert 2024.04 Pro / Library Expert 破解版

PCF8591DA转换电压怎样在数码管上显示啊

[复制链接]
admin 发表于 2012-9-2 13:39:43 | 显示全部楼层 |阅读模式

本文包含原理图、PCB、源代码、封装库、中英文PDF等资源

您需要 登录 才可以下载或查看,没有账号?注册会员

×




窗体底端



哪位大虾能指教我这两句啥意思啊?谢谢了

Display[0]=Datatab[(ReadADC(0))/50]|0x80;//处理0通道电压显示
Display[1]=Datatab[((ReadADC(0))%50)/10];












AD_DA_PCF8591


内容提要:此程序通过IIC协议对DAAD芯片操作,读取电位器的电压,并输出模拟量,用LED亮度渐变指示
#include<reg52.h> //
包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include <intrins.h> //包含NOP空指令函数_nop_();


#define AddWr 0x90 //写数据地址
#define AddRd 0x91 //读数据地址
sbit Sda=P1^2; //定义总线连接端口
sbit Scl=P1^1;


bit ADFlag; //定义AD采样标志位
unsigned char code Datatab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//7
段共阴数码管段码表
data unsigned char Display[8];//定义临时存放数码管数值
/*-延时程序-*/
void Delay(unsigned char j)
{
unsigned int i;
for(;j>0;j--)
{
for(i=0;i<125;i++)
{;}
}
}
/*-初始化定时器1-*/
void Init_Timer1(void)
{
TMOD |= 0x10; //定时器1
TH1=0xff; /* 定时器1初值 */
TL1=0x00;
//PT1=1; /* 优先级 */
EA=1; /* 开总中断 */
ET1=1; /* 开定时器1中断*/
TR1=1; //定时器1允许计数
}
/*- 启动IIC总线-*/
void Start(void)
{
Sda=1;
_nop_();
Scl=1;
_nop_();
Sda=0;
_nop_();
Scl=0;
}



/*-
停止IIC总线-*/
void Stop(void)
{
Sda=0;
_nop_();
Scl=1;
_nop_();
Sda=1;
_nop_();
Scl=0;
}



/*-
应答IIC总线-*/
void Ack(void)
{
Sda=0;
_nop_();
Scl=1;
_nop_();
Scl=0;
_nop_();
}



/*-
非应答IIC总线-*/
void NoAck(void)
{
Sda=1;
_nop_();
Scl=1;
_nop_();
Scl=0;
_nop_();
}



/*-
发送一个字节-*/
void Send(unsigned char Data)
{
unsigned char BitCounter=8;
unsigned char temp;


do
{
temp=Data;
Scl=0;
_nop_();
if((temp&0x80)==0x80)
Sda=1;
else
Sda=0;


Scl=1;
temp=Data<<1;
Data=temp;
BitCounter--;
}
while(BitCounter);
Scl=0;
}



/*-
读入一个字节并返回-*/
unsigned char Read(void)
{
unsigned char temp=0;
unsigned char temp1=0;
unsigned char BitCounter=8;


Sda=1;
do
{
Scl=0;
_nop_();
Scl=1;
_nop_();
if(Sda)
temp=temp|0x01;
else
temp=temp&0xfe;


if(BitCounter-1)
{
temp1=temp<<1;
temp=temp1;
}
BitCounter--;
}
while(BitCounter);
return(temp);
}

/*-
写入DA数模转换值-*/
void DAC(unsigned char Data)
{
Start();
Send(AddWr); //
写入芯片地址
Ack();
Send(0x40); //写入控制位,使能DAC输出
Ack();
Send(Data); //写数据
Ack();
Stop();
}


/*- 读取AD模数转换的值,有返回值-*/
unsigned char ReadADC(unsigned char Chl)
{
unsigned char Data;
Start();


Send(AddWr); //写入芯片地址
Ack();
Send(0x40|Chl);//写入选择的通道,本程序只用单端输入,差分部分需要自行添加
//Chl的值分别为0、1、2、3,分别代表1-4通道
Ack();
Start();
Send(AddRd); //读入地址
Ack();
Data=Read(); //读数据
Scl=0;
NoAck();
Stop();
return Data; //返回值
}


/*- 主程序-*/
void main()
{
unsigned char num; //DA
数模输出变量
unsigned char ADtemp; //定义中间变量
Init_Timer1();


while(1)
{
DAC(num); //DA
输出,可以用LED模拟电压变化
num++; //累加,到255后溢出变为0,往复循环。显示在LED上亮度逐渐变化
Delay(20); //延时用于清晰看出变化
if(ADFlag) //定时采集输入模拟量
{
ADFlag=0;


ADtemp=ReadADC(0);
Display[0]=Datatab[(ReadADC(0))/50]|0x80;//
处理0通道电压显示
Display[1]=Datatab[((ReadADC(0))%50)/10];
ADtemp=ReadADC(1);
Display[2]=Datatab[((ReadADC(1))/50)]|0x80;//处理1通道电压显示此通道暂时屏蔽,可以自行添加
Display[3]=Datatab[((ReadADC(1))%50)/10];
ADtemp=ReadADC(2);
Display[4]=Datatab[((ReadADC(2))/50)]|0x80;//处理1通道电压显示此通道暂时屏蔽,可以自行添加
Display[5]=Datatab[((ReadADC(2))%50)/10];
ADtemp=ReadADC(3);
Display[6]=Datatab[((ReadADC(3))/50)]|0x80;//处理1通道电压显示此通道暂时屏蔽,可以自行添加
Display[7]=Datatab[((ReadADC(3))%50)/10];


}
}
}


/*- 定时器中断程序-*/


void Timer1_isr(void) interrupt 3 using 1//定时器1执行数码管动态扫描


{


static unsigned int count,j;
TH1=0xfb; //
重新赋值
TL1=0x00;
j++;
if(j==300)
{j=0;ADFlag=1;} //定时置位AD采样标志位
P0=Display[count];//用于动态扫描数码管
P2=count;
count++;
if(count==8) //表示扫描8个数码管
count=0;


}
*滑块验证:
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

QQ|手机版|MCU资讯论坛 ( 京ICP备18035221号-2 )|网站地图

GMT+8, 2024-11-25 02:26 , Processed in 0.052072 second(s), 10 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表