2545|0

5

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

TC9012的,请教高手!!! [复制链接]

为什么处理好后,显示的是00 FF 数据码 数据码反码

/*-----------------------------------------------
名称:IIC协议 PCF8591ADDA转换
日期:2009.5
修改:无
内容:此程序通过IIC协议对DAAD芯片操作,读取电位器的电压,并输出模拟量(不是电位器的电压),用LED亮度渐变(用num自加)指示
结果:成功!LED
------------------------------------------------*/
#include<reg52.h>
#include<intrins.h>//包含NOP空指令函数_nop_();

#define uint unsigned int
#define uchar unsigned char

#define addwr 0x90
#define addrd 0x91

sbit scl=P1^1;
sbit sda=P1^2;

bit adflag;

uchar code Datatab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//7段数共阴码管段码表
uchar data Display[2];//定义临时存放数码管数值
/*------------------------------------------------
延时程序
------------------------------------------------*/
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/*------------------------------------------------
初始化定时器1
------------------------------------------------*/
void init_timer1()
{
TMOD=0x10;
TH1=0xff;
TH0=0;
EA=1;
TR1=1;
ET1=1;
}
/*------------------------------------------------
启动IIC总线
------------------------------------------------*/
void start()
{
sda=1;
_nop_();
scl=1;
_nop_();
sda=0;
_nop_();
scl=0;
}
/*------------------------------------------------
停止IIC总线
------------------------------------------------*/
void stop()
{
sda=0;
_nop_();
scl=1;
_nop_();
sda=1;
_nop_();
scl=0;
}
/*------------------------------------------------
应答IIC总线
------------------------------------------------*/
void ack()
{
sda=0;
_nop_();
scl=1;
_nop_();
scl=0;
_nop_();
}
/*------------------------------------------------
非应答IIC总线
------------------------------------------------*/
void NoAck()
{
sda=1;
_nop_();
scl=1;
_nop_();
scl=0;
_nop_();
}
/*------------------------------------------------
发送一个字节
------------------------------------------------*/
void send(uchar num)
{
uchar temp,bitcount;
temp=num;
for(bitcount=8;bitcount>0;bitcount--)
{
scl=0;
_nop_();
if((temp&0x80)==0x80)
sda=1;
else
sda=0;
temp=temp<<1;
scl=1;
_nop_();
}
scl=0;
}
/*------------------------------------------------
读入一个字节并返回
------------------------------------------------*/
uchar Read()
{
uchar temp=0;
uchar num=8;
sda=1;
while(num)
{
scl=0;
_nop_();
scl=1;
_nop_();
if(sda)
{
temp=temp|0x01;
}
else
{
temp=temp&0xfe;
}
if(num-1)
{
temp=temp<<1;
}
num--;
}
return(temp);
}
/*------------------------------------------------
写入DA数模转换值
------------------------------------------------*/
void DAC(uchar Data)
{
start();
send(addwr); //写入芯片地址
ack();
send(0x42); //写入控制位,使能DAC输出
ack();
send(Data); //写数据
ack();
stop();
}
/*------------------------------------------------
读取AD模数转换的值,有返回值
------------------------------------------------*/
uchar ReadADC(uchar Ch1)
{
uchar temp;
start();
send(addwr); //写入芯片地址
ack();
send(0x00|Ch1);
ack();//写入选择的通道,本程序只用单端输入,差分部分需要自行添加
//Chl的值分别为0、1、2、3,分别代表1-4通道

start();
send(addrd); //读入地址
ack();
temp=Read(); //读数据
scl=0;
NoAck();
stop();
return(temp);
}
/*------------------------------------------------
主程序
------------------------------------------------*/
void main()
{
uchar num;
init_timer1();
while(1)
{
DAC(num); //DA输出,可以用LED模拟电压变化
num++; //累加,到256后溢出变为0,往复循环。显示在LED上亮度逐渐变化

delay(20); //延时用于清晰看出变化
if(adflag==1) //定时采集输入模拟量
{
adflag=0;
Display[0]=Datatab[(ReadADC(0))/50]|0x80;//处理0通道电压显示
Display[1]=Datatab[((ReadADC(0))%50)/10];

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

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

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

}
}
/*------------------------------------------------
定时器中断程序
------------------------------------------------*/
void Timer1_isr() interrupt 3
{
static unsigned int count,j;
TH1=0xfb; //重新赋值
TL1=0x00;
j++;
if(j==200) //本程序,采样时间多少无所谓
{
j=0;
adflag=1;
}
P0=Display[count];
P2=count;
count++;
if(count==2)
{
count=0;
}
}

点赞 关注

回复
举报
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表