⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 24c02.c

📁 c51读写24C02原程序
💻 C
字号:
#include <reg52.h> 
#include <intrins.h> 


//定义一下方便使用 
#define uchar unsigned char
#define uint unsigned int 


//数码管段码和位码定义 
/****************--0-----1------2-----3-----4------5-----6-----7-----8-----9---全选-**/ 
uchar code duan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}; 
/****************-1-----2-----3------4-----5-----6------7-----8---全选-***********/ 
uchar code wei[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0xff}; 


uchar k[9]={0,0,0,0,0,0,0,0,10};
uchar j; 


//按键调节定义 
sbit k1=P0^0; 
//加按键 
sbit k2=P0^1; 
//减按键 
sbit k3=P0^2; 
//功能键 


//AT24C02管脚定义 
sbit SCL =P1^4; 
//24c02时钟信号 
sbit SDA=P1^5; 
//24c02数据端 


//74HC595管脚定义


sbit SCK =P3^1; 
//移位时钟 
sbit RCK =P3^0; 
//锁存时钟 
sbit SER = P3^2; 
//数据输入 


//TLC0834管脚定义 
sbit ADC_CLK=P3^0; 
//转换时钟 
sbit ADC_CS =P3^1; 
//转换片选 
sbit ADC_DIO = P3^2; 
//串行数据输入输出,DI和 DO接在一起使用 


/******************************24c02声明**********************************/ 


/************************************

延时程序 


*************************************/ 
void delay() 
{ 


uchar i; 
for(i=248;i>0;i--); 
} 


/************************************

开始总线 


*************************************/ 
void start() 
{ 


SDA=1; 
SCL=1; 
SDA=0; 
SCL=0; 


} 


/*************************************

结束总线 


**************************************/ 
void stop() 
{ 


SCL=0; 
SDA=0; 
SCL=1; 
SDA=1; 


} 



/*************************************

ack0 
**************************************/ 
void noack() 
{ 


SDA=1; 
SCL=1; 
SCL=0; 


} 


/*************************************

应答子函数 


**************************************/ 
bit ack() 
{ 


bit e; 
SDA=1; 
SCL=1; 
e=SDA; 
SCL=0; 
return(e); 


} 


/**************************************
8个 
bit到 
24C02
为写字节作准备 


**************************************/ 
void wb(uchar input) 
{ 


uchar j; 
for(j=8;j>0;j--) 
{ 


SDA=(bit)(input&0x80); 
SCL=1; 
SCL=0; 
input=input<<1; 


} 
} 


/***************************************

写一个字节到 
24c02 
****************************************/ 
void w(uchar d,uchara) 
{ 


start(); 


wb(0xa0); 
ack(); 
//写入指令 0xa0,该指令表示准备对 24c02进行写操作 
wb(a); 
ack(); 
//先写要存数据的地址 
wb(d); 
ack(); 
//再写要存数据 
} 
stop(); 
delay(); 


/**************************************
24C02中读 
8个 
bit
为读字节作准备 


***************************************/ 
uchar rb() 
{ 


uchar j,rb=0; 
for(j=8;j>0;j--) 
{ 


SCL=1; 
rb=rb<<1; 
rb=rb|((uchar)(SDA)); 
SCL=0; 


} 
return(rb); 
} 


/****************************************

24c02中读一个字节 
*****************************************/ 
uchar r(uchara) 
{ 


uchar d; 
//读操作得到的数据 


start(); 
wb(0xa0); 
//写入指令 0xa0,该指令表示准备对 24c02进行写操作 
ack(); 
wb(a); 
//写入要读数据的地址 a 



ack(); 


start(); 
wb(0xa1); 
ack(); 
d=rb(); 
noack(); 
stop(); 
//写入指令 0xa1,该指令表示准备对 24c02进行读操作 
//从地址 a中读出数据 
} 
return(d); 
//返回得到的数据 


/****************************24c02声明结束********************************/ 


/**************************************** 


595显示函数 
*****************************************/ 
void In595(ucharm,ucharn) 
{ 


uchar i,temp; 

temp=duan[m]; 
//先传段 
if(n==1);//加小数点 
temp=temp&0x7f; 
for(i=0;i<8;i++) 
{ 


SCK=0; 
SER=temp&0x80; 
temp<<=1; 
SCK=1; 


} 
temp=wei[n]; 
//再传位 
for(i=0;i<8;i++) 
{ 


SCK=0; 
SER=temp&0x80; 
temp<<=1; 
SCK=1; 


} 


RCK=0; 


RCK=1; 
//锁存 
} 


/**************************************** 


TLC0834驱动部分 
*****************************************/ 
//TLC0834驱动函数 
//支持最大时钟 600kHz 250kHz--32us完成转换 
unsigned charTLC0834_Start(bit sgl, bit odd, bit sel) 
{ 


unsigned char i; 
unsigned char temp; 


ADC_CLK= 0; 
ADC_CS =1; 


ADC_CS =0; 
ADC_DIO = 1; 
//发送启动位 
ADC_CLK= 1; 
//_nop_(); 


ADC_CLK= 0; 
ADC_DIO = sgl; 
//发送 
ADC_CLK= 1; 
//_nop_(); 


ADC_CLK= 0; 
ADC_DIO = odd; 
//发送 
ADC_CLK= 1; 
//_nop_(); 


ADC_CLK= 0; 
ADC_DIO = sel; 
//发送 
ADC_CLK= 1; 
//_nop_(); 
ADC_CLK= 0; 
//_nop_(); 


for(i=8;i>0;i--) 
//发送 8个转换时间脉冲 


{ 
ADC_CLK= 1; 
//_nop_(); 
ADC_CLK= 0; 
//_nop_(); 


} 


for(i=8;i>0;i--) 
//第 12个时钟下降沿,此时数据线上已经发出 LSB信号 


{ 


temp>>= 1; 


if(ADC_DIO) temp|= 0x80; 


ADC_CLK= 1; 


ADC_DIO = 1;//先写 1后再读,否则读出的数据不可预期 


//_nop_(); 


ADC_CLK= 0; 


} 


ADC_CS = 1; 
//结束本次操作 


return(temp); 
} 


/****************************************************

主函数 
****************************************************/ 
void main(void) 
{ 


bit t=0; 


uchar temp; 


uchar AD_Data; 


TMOD=0x01; 
//定时器 T0的计时方式为 1; 


TH0=0xec; 


TL0=0x78; 
//5ms定时 


TR0=1; 
//启动 T0 


ET0=1; 
//容许定时器 T0中断 


EA=1; 
//CPU开中断 


P2=r(0x02); 
//从 0x02中读出值 


while(1) 


{ 


if(k3==0)t=~t; 
//功能键 


while(k3==0); 


if(k1==0) 
//加键


{ 
if(t==0)P2++; 
if(t==1)P2=P2+10; 
while(k1==0); 
if(P2>0x78) 
P2=0x3c; 


} 


if(k2==0) 
//减键 


{ 
if(t==0)P2--; 
if(t==1)P2=P2-10; 
while(k2==0); 
if((P2<0x00)|(P2>0xf5)) 
P2=0x3c; 


} 


temp=P2; 
w(temp,0x02); 
//写 temp到地址 0x02 


k[0]=temp%10; 
k[1]=temp/10%10; 
k[2]=temp/100%10; 


// k[3]=vot/1000%10; 
// k[4]=vot/10000%10; 
// k[5]=vot/100000%10; 
// k[6]=vot/1000000%10; 
// k[7]=vot/10000000; 


AD_Data = TLC0834_Start(1,0,0); 
//单端方式,偶数通道,偶数第一个通道.即 CH0 
If(AD_Data>26) 
//如果输出电流大于 500mA则断开电源 
{ 

P1^3=0; 
//开启继电器,断开电源,输出电压为 0 
} 
} 
} 


/*********************************************** 


5ms显示一次 
************************************************/ 
void t0()interrupt 1 
{ 

TH0=0xec; 
TL0=0x78; 
for(j=0;j<3;j++) 
{ 


In595(k[j],j); 
} 
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -