打印
[国产单片机]

pcf8591的测试

[复制链接]
886|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yxl15972291790|  楼主 | 2012-9-15 17:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
有哪位高手可以帮我详细分析一下下面这个程序每条指令的含义/*------------------------------------------------------
*本程序版权归 广州手之创电子科技有限公司(手创科技)所有
*公司网站:www.sochange.cn
*2011年5月29日修改
*适用于SC52X开发板、开发箱
*版本V2.2
*实验现象:
数码管上显示0-255的数字值(255为理论值,实际上可能比255小),可以观察到随着光线变化,数值也在变化;
*版权所有,翻版必究
-------------------------------------------------------*/

#include <reg52.H>
#define uchar unsigned char
#define uint unsigned int
unsigned char dispcount;
sbit a=P1^0;//段控制
sbit b=P1^1;//位控制

sbit LeDen=P1^2;//LED灯控制端
sbit Line=P1^3;//点阵行控制端

sbit rst=P3^4;//DS1302复位端,低电平关闭


sbit SDA=P3^2;
sbit SCL=P3^3;

unsigned char
Duanma[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

unsigned char
Weima[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};

uchar temp[8];
uchar tempdata[8];
//bit ack;

///////延时函数//////
void Delay(uint z)
{

uchar x;


for(;z>0;z--)


for(x=123;x>0;x--);

}

void Delayus()
{;;}
//////////启动总线////////
void Start()
{

SDA=1;


SCL=1;


Delayus();


SDA=0;


Delayus();


SCL=0;

}
//////////结束总线///////////
void Stop()
{

SDA=0;


SCL=1;


Delayus();


SDA=1;


Delayus();

}
//////非应答函数/////////
void Noack()
{

SDA=1;


Delayus();


SCL=1;


Delayus();


SCL=0;

}
void Ack()
{

SDA=0;


Delayus();


SCL=1;


Delayus();


SCL=0;

}
/////////数据发送函数//////
void Send(uchar c)
{

uchar bite;


for(bite=0;bite<8;bite++)


{


if((c<<bite)&0x80)SDA=1;


else SDA=0;


SCL=1;


Delayus();


SCL=0;


}


SDA=1;


Delayus();


Delayus();


Delayus();

}
///////接收函数///////////
uchar Rec()
{

uchar byte,bite;


SDA=1;


for(bite=0;bite<8;bite++)


{


SCL=0;


Delayus();


SCL=1;


Delayus();


byte<<=1;


if(SDA==1)byte+=1;


}


SCL=0;


Delayus();


return(byte);

}
//////////显示函数//////////////
void Display(unsigned char FirstBit,unsigned char Num)
{


static uchar i=0;



a=1;


P0=0;


Delayus();


a=0;



b=1;


P0=Weima[i+FirstBit];


Delayus();


b=0;



a=1;


P0=tempdata;


Delayus();


a=0;




i++;


if(i==Num)


i=0;

}
///////定时器初始化//////////
void Init_Timer0(void)
{

TMOD |= 0x01;
//
使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响


EA=1;
//
总中断打开


ET0=1;
//
定时器中断打开


TR0=1;
//
定时器开关打开

}

///////////读取数值////////
uchar Read(uchar AI)
{

uchar z;


Start();


Send(0x90);


Ack();


Send(0x40|AI);
//
括号中的参数AI数值从0--3为四路AD的地址,通过改变该参数可以改变输入通道


Ack();


Start();


Send(0x91);


Ack();


z=Rec();


Noack();


Stop();


return(z);

}
////////主函数////////////
void Main()
{

uchar num=0;


rst=0;//
关闭1302时钟


P0=0X00; //
关闭点阵


Line=0;


P0=0XFF; //
关闭LED灯


LeDen=0;



Init_Timer0();


while(1)


{


num=Read(0);//
括号中的参数0--3为四路AD的地址,通过改变该参数可以改变输入通道





tempdata[0]=Duanma[num/1000];


tempdata[1]=Duanma[num/100];


tempdata[2]=Duanma[(num%100)/10];


tempdata[3]=Duanma[(num%100)%10];


Delay(100);


}

}

void Timer0(void) interrupt 1
{

TH0=(65536-2000)/256;
//
重新赋值


TL0=(65536-2000)%256;


Display(0,8); //
显示函数,使用中断显示


}
特别是为什么要与0x80进行“与”操作

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

11

帖子

0

粉丝