📄 数控电源.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=P1^0; //加按键
sbit k2=P1^1; //减按键
sbit k3=P1^2; //功能键
sbit SCL=P1^7; //24c02时钟信号
sbit SDA=P1^6; //24c02数据端
sbit SCK= P2^0; //移位时钟
sbit RCK= P2^1; //锁存时钟
sbit SER= P2^2; //数据输入
/***************************************************************************************
****************************************************************************************
**** 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,uchar a)
{
start();
wb(0xa0); //写入指令0xa0,该指令表示准备对24c02进行写操作
ack();
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(uchar a)
{
uchar d; //读操作得到的数据
start();
wb(0xa0); //写入指令0xa0,该指令表示准备对24c02进行写操作
ack();
wb(a); //写入要读数据的地址a
ack();
start();
wb(0xa1); //写入指令0xa1,该指令表示准备对24c02进行读操作
ack();
d=rb(); //从地址a中读出数据
noack();
stop();
return(d); // 返回得到的数据
}
/***************************************************************************************
****************************************************************************************
**** 24c02声明结束 ****
****************************************************************************************
***************************************************************************************/
/****************************************
595显示函数
*****************************************/
void In595(uchar m,uchar n)
{
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; //锁存
}
/****************************************************
主函数
****************************************************/
void main(void)
{
bit t=0;
uchar temp;
TMOD=0x01; //定时器T0的计时方式为1;
TH0=0xec;
TL0=0x78; //5ms定时
TR0=1; //启动T0
ET0=1; //容许定时器T0中断
EA=1; //CPU开中断
P3=0x3c;
P3=r(0x02); //从0x02中读出值
while(1)
{
if(k3==0) t=~t; //功能键
while(k3==0);
if(k1==0) //加键
{
if(t==0) P3++;
if(t==1) P3=P3+10;
while(k1==0);
if(P3>0x78)
P3=0x3c;
}
if(k2==0) //减键
{
if(t==0) P3--;
if(t==1) P3=P3-10;
while(k2==0);
if((P3<0x00)|(P3>0xf5))
P3=0x3c;
}
temp=P3;
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;
}
}
/***********************************************
5m显示一次
************************************************/
void t0() interrupt 1
{
TH0=0xec;
TL0=0x78;
for(j=0;j<9;j++)
{
In595(k[j],j);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -