📄 1.c
字号:
#include <reg52.h>
#include <intrins.h>
#include <absacc.h>
#define uchar unsigned char
#define uint unsigned int
sbit p2_4=P2^4;
sbit p1_1=P1^1;
sbit p1_2=P1^2;
sbit p2_7=P2^7;
sbit p2_5=P2^5;
sbit p2_6=P2^6;
sbit p3_3=P3^3;
sbit p3_4=P3^4;
sbit p3_5=P3^5;
sbit scl=P3^6;
sbit sda=P3^7;
sbit le=P2^3; //锁存器控制位;
uint idata AcH;
uint idata ArH;
uint idata jpn=0; //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
uchar idata clocknum0;/*200~1000HZ输出变量*/
uchar idata clocknum1;
uchar idata buffer[3];
bit idata flag; //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!1
void outmeasure(void) interrupt 3 //内中断2,输出200~1000HZ频率
{
uchar i=100; //固定时间
TH1=clocknum0;/*125ms*/
TL1=clocknum1;
p1_2=1;
while(i>0)
{
i--;
}
p1_2=0;
}
void delay() //延时n毫秒
{
static uchar k;
for(k=0;k<100;k++)
{}
}
void display0(uchar *p) //显示//p
{
uchar code codeled[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//共阳极0~9
p2_5 = 0;
P0=codeled[*p];
delay();
p++;
p2_5=1;
p2_6= 0;
P0=codeled[*p];
delay();
p++;
p2_6=1;
p2_7=0;
P0=codeled[*p];
delay();
p2_7=1;
}
void comput2(float s)
{
float y0;
uint y1;
y0=s*200+200; //0%~4%CH4对应200~1000
y1=65536-250000/y0;
clocknum0=(y1&0xff);/*200HZ输出定时初值*/
clocknum1=y1>>8;
}
void delay0(void) //时间不知道是否合适
{
_nop_();
_nop_();
}
void DelayX1ms(uint s)
{
uint j,k;
for(j=0;j<s;j++)
for(k=0;k<60;k++)
{};
}
void I2cStart(void) //iic bus 起始信号
{
sda=1;
scl=1;
delay0();
sda=0;
delay0();
scl=0;
}
void I2cStop(void) //iic bus 停止信号
{
sda=0;
delay0();
scl=1;
delay0();
sda=1;
}
bit I2cSendChar(uchar bytedata) //传送一个char数据到I2c上
{
static uchar i;
bit ack;
for(i=0;i<8;i++)
{
if(bytedata&0x80)
sda=1;
else
sda=0;
bytedata<<=1;
delay0();
scl=1;
delay0();
scl=0;
delay0();
}
sda=1;
delay0();
scl=1;
delay0();
ack=sda;
scl=0;
delay0();
return ack;
}
uchar I2cReceiveChar(void) //从I2c上读一数据
{
static uchar i;
static uchar bytedata=0;
for(i=0;i<8;i++)
{
scl=1;
delay0();
bytedata<<=1;
if(sda)
bytedata|=0x01;
scl=0;
delay0();
}
return bytedata;
}
void SendAcknowledge(bit ack) //传送确认信号
{
sda=ack;
scl=1;
delay0();
scl=0;
}
void EEprom24c02Write(uchar address,uchar bytedata) //向 24c02写数据
{
I2cStart();
I2cSendChar(0xa0);
I2cSendChar(address);
I2cSendChar(bytedata);
I2cStop();
DelayX1ms(10);
}
uchar EEprom24c02Read(uchar address) //从24c02读数据
{
uchar bytedata;
I2cStart();
I2cSendChar(0xa0);
I2cSendChar(address);
I2cStart();
I2cSendChar(0xa1);
bytedata=I2cReceiveChar();
SendAcknowledge(1);
I2cStop();
return bytedata;
}
//--------------------------------------------------------------------------//
void WriteK0(float s)
{
uchar i,addr=0x13,m;
uint y[4];
y[0]=s;
y[1]=s*10-y[0]*10;
y[2]=s*100-y[0]*100-y[1]*10;
y[3]=s*1000-y[0]*1000-y[1]*100-y[2]*10;
for(i=0;i<4;i++)
{
m=y[i];
EEprom24c02Write(addr,m);
addr++;
}
}
//-----------------------------------------------------------------//
void oldbjz (void) //显示存储的报警值
{
uchar add=0x10;//#10h,#11h存报警值
uchar i; //p
uint j=200;
uchar *q=buffer; //p
for(i=0;i<3;i++) //读出报警值
{
buffer[i]=EEprom24c02Read(add);//二进制数需转换成bcd,送显示
add+=1;
}
while(j)
{
display0(q);
j--;
}
}
//----------------------------------------------------------------------------//
void shuzi(uint count)
{
bit j=1;
uchar a;
uchar *p;
uint num;
uchar code codeled[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//共阳极0~9
while(j)
{
if(p3_5==0)
{
j=0;
if(num>9)
num=0;
p=buffer+count;
DelayX1ms(100);
a=num;
le=1;
num++;
if(count==0)
{
p2_4 = 0;
buffer[0]=a;
P0=codeled[*p];
DelayX1ms(10);
p2_4 = 1;
}
if(count==1)
{
p2_5= 0;
buffer[1]=a;
P0=codeled[*p];
DelayX1ms(10);
p2_5= 1;
}
if(count==2)
{
p2_6=0;
buffer[2]=a;
P0=codeled[*p];
DelayX1ms(10);
p2_6=1;
}
}
}
}
//--------------------------------------------------------------------------//
uint yiwei(uint count)
{
uint b;
uchar *p;
uchar code codeled[11]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xBF};//共阳极0~9+"-"
b=count%3;
p=buffer+b;
le=1;
switch (b)
{
case 0: p2_4 = 0;
P0=codeled[*p];
DelayX1ms(20);
p2_4 = 1;
break;
case 1: p2_5= 0;
P0=codeled[*p];
DelayX1ms(20);
p2_5= 1;
break;
case 2: p2_6=0;
P0=codeled[*p];
DelayX1ms(20);
p2_6=1;
break;
}
return b;
}
//----------------------------------------------------------//
void shuru(uchar aress)
{
uchar add=aress;
uchar i; //是否需要初赋值
uchar *q=buffer;
static uint j=500;
for(i=0;i<3;i++)
{
EEprom24c02Write(add,buffer[i]); //写入报警值
add+=1;
while(j)
{
display0(q);
j--;
}
}
}
//--------------------------------------------------------//
void baojinzhi() //3
{
uint m;
uint c=0;
oldbjz(); //显示报警值、
if(p3_4==1)
{
DelayX1ms(1);
if(p3_4==1)
{
m=yiwei(c);
c++;
}
}
if(p3_5==1)
{
DelayX1ms(1);
if(p3_5==1)
{
shuzi(m);
}
}
if(p3_3==1)
{
DelayX1ms(1);
if(p3_3==1)
{
shuru(0x10);
flag=0;
}
}
}
//----------------------------------------------//
void tiaoling(void) //1
{
float c;
uchar *q;
uint j=500;
if((p3_4==1)||(p3_5==1))
{
DelayX1ms(1);
if((p3_4==1)||(p3_5==1))
{
c=(float)AcH/ArH; //把当前比值写入24c02
WriteK0(c);
le=1;
buffer[0]=0;
buffer[1]=0;
buffer[2]=0;
q=buffer;
while(j)
{
display0(q);
j--;
}
}
}
if(p3_3==1)
{
DelayX1ms(1);
if(p3_3==1)
{
flag=0;
}
}
}
//-----------------------------------------------------------------//
void tiaojing() //2
{
float k0; //u为比值,k0为更新值
uchar *q;
uint j=500;
if((p3_4==1)||(p3_5==1))
{
DelayX1ms(1);
if((p3_4==1)||(p3_5==1))
{
k0=(float)AcH/ArH*1.0811; //为 0.925的倒数,uc/(ur*k0)=0.925=k',k'为2%瓦斯时的k值
WriteK0(k0);
le=1;
buffer[0]=2;
buffer[1]=0;
buffer[2]=0; //开复用口
q=buffer;
le=1;
while(j)
{
display0(q);
j--;
}
}
}
if(p3_3==1)
{
DelayX1ms(1);
if(p3_3==1)
{
flag=0;
}
}
}
//--------------------------------------------------------------------//
void duandian(void) //4
{
uchar *q;
uint n=0;
bit j1=0;
uint j=500;
if(p3_4==1)
{
DelayX1ms(1);
if(p3_4==1)
{
j1=1;
}
}
while(j1)
{
n++;
j1=0;
if(n>5)
n=1;
if(n==1)
{
buffer[0]=0;
buffer[1]=5;
buffer[2]=0;
}
else if(n==2)
{
buffer[0]=0;
buffer[1]=7;
buffer[2]=5;
}
else if(n==3)
{
buffer[0]=1;
buffer[1]=0;
buffer[2]=0;
}
else if(n==4)
{
buffer[0]=1;
buffer[1]=2;
buffer[2]=5;
}
else if(n==5)
{
buffer[0]=1;
buffer[1]=5;
buffer[2]=0;
}
q=buffer;
le=1;
while(j)
{
display0(q);
j--;
}
}
if(p3_3==1)
{
DelayX1ms(1);
if(p3_3==1)
{
shuru(0x20);
flag=0;
}
}
}
//-------------------------------555555----------------------------------//
void zijian()
{
uchar *q;//指针指向显示存储区
uint i;
le=1;
buffer[0]=2;
buffer[1]=0;
buffer[2]=0; //开复用口
q=buffer;
for(i=0;i<200;i++)
display0(q); //显示2.00
comput2(2);
flag=0;
}
//-----------------------------------------------------//
void jianpan()
{
uchar code codeled[11]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xBF};//共阳极0~9+"-
bit suremark=1;
while(flag)
{
while(suremark)
{
if(jpn>5)
jpn=1;
p2_4 = 0;
P0=codeled[jpn];
DelayX1ms(10);
p2_4 = 1;
if(p3_3==1)
{
DelayX1ms(1);
if(p3_3==1)
{
jpn++;
}
}
if(p3_4==1)
{
DelayX1ms(1);
if(p3_4==1)
suremark=0;
}
}
if(jpn==1)
{
while(flag)
{
tiaoling();
}
}
if(jpn==2)
{
while(flag)
{
tiaojing();
}
}
if(jpn==3)
{
while(flag)
{
baojinzhi();
}
}
if(jpn==4)
{
while(flag)
{
duandian();
}
}
if(jpn==5)
{
while(flag)
{
zijian();
}
}
}
}
void main()
{
IP=0x01;
EA=1;/*开总中断*/
ET1=1;/*开T1中断*/
TMOD=0x11;/*T0方式1,定时,只受TR0控制*/
TH1=0xFB;/*200HZ*/
TL1=0x1E;
TR1=1;/*允许计数*/
if(p3_3==1)
{
DelayX1ms(1);
if(p3_3==1)
{
flag=1;
jianpan();
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -