📄 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 + -