5

帖子

0

TA的资源

一粒金砂(中级)

21
 

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;
 }
}


回复

10

帖子

0

TA的资源

一粒金砂(中级)

22
 
应该是用13.5/0.256算出来的   但是应该是36,这样也不会报错的
 
 

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

查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表