📄 温度测量.c
字号:
#include <REG2051.H>
#include <intrins.h>
#define uchar unsigned char
#define uint signed int
#define uuchar signed char
#define k1 P3_1 //k1功能键
#define k2 P3_2 //k2加键
#define k3 P3_3 //k3复位键
#define bj P3_0 //定值输出
#define adk P3_7
uchar sec20,sec,xm0,xm1,xm2,ki,buffer[3],BitCounter,temp,Dat,dz,i,digit,Number[5]={1,2,3,4,5};
uchar convert[10]={0x3F,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0~9段码
uint Count,zzz,zzbl,t,v,jsz;
static uchar bdata ke,kee; //可位寻址的状态寄存器
sbit stada= P1^7; //Ls164串行数据
sbit sclk = P1^2; //Ls164串行时钟
sbit Sda= P3^5; //2401串行数据
sbit Scl= P3^4; //2401串行时钟
sbit LED1 = P1^3; //数码管位驱动
sbit LED2 = P1^4; //数码管位驱动
sbit LED3 = P1^5; //数码管位驱动
sbit p36 = P3^6;
sbit k11=ke^0;
sbit k12=ke^1;
sbit k22=ke^2;
sbit k21=ke^3;
sbit k33=ke^4;
sbit k31=ke^5;
sbit jsz11=ke^6;
sbit jsz12=ke^7;
sbit jsf11=kee^0;
sbit jsf12=kee^1;
sbit b=kee^2;
sbit c=kee^3;
sbit d=kee^4;
sbit e=kee^5;
sbit cl=kee^6;
void delay(i); //延时函数
void scanLED(); //显示函数
void timeToBuffer(); //显示转换函数
void Sen(); //74Ls164串并转换
void time();
void jpcl();
void fw();
void jy();
void adzhh();
/*起始条件*/
void Start(void)
{
Sda=1;
Scl=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
Sda=0;
_nop_();_nop_();_nop_();_nop_();_nop_();
}
/*停止条件*/
void Stop(void)
{
Sda=0;
Scl=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
Sda=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
}
/*应答位*/
void Ack(void)
{
Sda=0;
_nop_();_nop_();_nop_();_nop_();_nop_();
Scl=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
Scl=0;
}
/*反向应答位*/
void NoAck(void)
{
Sda=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
Scl=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
Scl=0;
}
/*发送数据子程序,Data为要求发送的数据*/
void Send(uchar Data)
{
uchar BitCounter=8; //位数控制
uchar temp; //中间变量控制
do
{
temp=Data;
Scl=0;
_nop_();_nop_();_nop_();_nop_();_nop_();
if((temp&0x80)==0x80) //如果最高位是1
Sda=1;
else
Sda=0;
_nop_();_nop_();_nop_();_nop_();_nop_();
Scl=1;
temp=Data<<1; //RLC
Data=temp;
BitCounter--;
}
while(BitCounter);
Scl=0;
_nop_();_nop_();_nop_();_nop_();_nop_();
}
/*读一个字节的数据,并返回该字节值*/
uchar Read(void)
{
uchar temp=0;
uchar temp1=0;
uchar BitCounter=8;
Sda=1;
do
{
Scl=0;
_nop_();_nop_();_nop_();_nop_();_nop_();
Scl=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
if(Sda) //如果Sda=1
temp=temp|0x01; //temp的最低位置1
else
temp=temp&0xfe; //否则temp的最低位清0
if(BitCounter-1)
{
temp1=temp<<1;
temp=temp1;
}
BitCounter--;
}
while(BitCounter);
return(temp);
}
void WrToROM(uchar Data[],uchar Address,uchar Num)
{
uchar i;
uchar *PData;
PData=Data;
for(i=0;i<Num;i++)
{
Start(); //发送启动信号
Send(0xa0); //发送SLA+W
Ack();
Send(Address+i); //发送地址
Ack();
Send(*(PData+i));
Ack();
Stop();
delay(2000);
}
}
void RdFromROM(uchar Data[],uchar Address,uchar Num)
{
uchar i;
uchar *PData;
PData=Data;
for(i=0;i<Num;i++)
{
Start();
Send(0xa0);
Ack();
Send(Address+i);
Ack();
Start();
Send(0xa1);
Ack();
*(PData+i)=Read();
Scl=0;
NoAck();
Stop();
}
}
void main()
{
EA=1; //开中断
TMOD=0x11; //设定时器0为计数,设定时器1定时
ET0=1; //定时器0中断允许
ET1=1; //定时器1中断允许
TH0=0xD8;
TL0=0xF0; //设定时值为20000us(20ms)
TH1=0x00;
TL1=0x00;
TR0=1;
buffer[0]=0x06;
buffer[1]=0x3F;
buffer[2]=0x4F;
d=0;
while(!d)
{
if (sec>2)
d=1;
scanLED();
}
RdFromROM(Number,0,5);
zzz=Number[0]*256+Number[1];
dz=Number[2];
jsz=Number[3]*256+Number[4];
LED1 = 1;
LED2 = 1;
LED3 = 1;
k12=1;
k22=1;
k31=1;
bj=1;
d=1;
jy();
while(1)
{
adzhh();
timeToBuffer(); //调用转换段码功能模块
scanLED(); //调用显示函数
jpcl();
}
}
void delay(i) //延时子程序
{
while(--i);
}
void scanLED() //显示功能模块
{
Dat=buffer[2];
Sen();
LED1=0;
delay(50);
LED1=1;
Dat=buffer[1];
Sen();
LED2=0;
delay(50);
LED2=1;
Dat=buffer[0];
Sen();
LED3=0;
delay(50);
LED3=1;
}
void timeToBuffer() //转换段码功能模块
{
xm0=jsz/100;
xm1=(jsz-xm0*100)/10;
xm2=jsz-xm0*100-xm1*10;
buffer[0]=convert[xm2];
buffer[1]=convert[xm1];
buffer[2]=convert[xm0];
if (buffer[2]==0x3F)
{
buffer[2]=0x00;
if (buffer[1]==0x3F)
buffer[1]=0x00;
}
}
void Sen() //74Ls164串并转换
{
for( i=0; i<8;i++) //循环8次,转换一位
{
sclk=0;
if((Dat&0x80)==0x80) //依次转换各位数
stada=1;
else stada=0;
sclk=1;
delay(3);
sclk=0;
digit=Dat<<1; //循环左移1位
Dat=digit;
}
}
void KeyAndDis_Time0(void) interrupt 1 using 1 //定时器0中断外理中键扫描和显示
{
TR0=0;
TH0=0xD8;
TL0=0xF0; //设定时值为20000us(20ms)
time();
TR0=1;
}
void time () //计时处理模块
{
sec20++;
if (sec20>=50) // 50 * 20 ms = 1 s
{
cl=1;
sec20=0;
e=~e;
if (e==1)
sec++; //秒计时
if (sec>=200) //
{
sec=0;
}
}
}
void jpcl()
{
k11=k1;
if (!k12&&k11)
b=1;
k12=k11;
k11=k1;
k21=k2;
if (b==1)
{
while(b)
{
buffer[0]=0x77;
buffer[1]=0x77;
buffer[2]=0x77;
sec=0;
c=0;
while(!c)
{
if (sec>=2)
{
c=1;
}
scanLED();
}
c=0;
zzbl=jsz;
jsz=zzz;
timeToBuffer();
while(!c)
{
k11=k1;
k21=k2;
if (!k22&&k21)
{
xm0++;
if (xm0>9)
xm0=0;
}
if (e==1)
buffer[2]=0x40;
else buffer[2]=convert[xm0];
scanLED();
if (!k12&&k11)
{
c=1;
}
k22=k21;
k12=k11;
}
buffer[2]=convert[xm0];
c=0;
while(!c)
{
k11=k1;
k21=k2;
if (!k22&&k21)
{
xm1++;
if (xm1>9)
xm1=0;
}
if (e==1)
buffer[1]=0x40;
else buffer[1]=convert[xm1];
scanLED();
if (!k12&&k11)
{
c=1;
}
k22=k21;
k12=k11;
}
buffer[1]=convert[xm1];
c=0;
while(!c)
{
k11=k1;
k21=k2;
if (!k22&&k21)
{
xm2++;
if (xm2>9)
xm2=0;
}
if (e==1)
buffer[0]=0x40;
else buffer[0]=convert[xm2];
scanLED();
if (!k12&&k11)
{
c=1;
b=0;
zzz=xm0*100+xm1*10+xm2;
}
k22=k21;
k12=k11;
}
buffer[0]=convert[xm2];
}
b=1;
while(b)
{
buffer[0]=0x7C;
buffer[1]=0x7C;
buffer[2]=0x7C;
sec=0;
c=0;
while(!c)
{
if (sec>=2)
{
c=1;
}
scanLED();
}
c=0;
jsz=dz;
timeToBuffer();
while(!c)
{
k11=k1;
k21=k2;
if (!k22&&k21)
{
xm0++;
if (xm0>1)
xm0=0;
}
if (e==1)
buffer[2]=0x40;
else buffer[2]=convert[xm0];
scanLED();
if (!k12&&k11)
{
c=1;
}
k22=k21;
k12=k11;
}
buffer[2]=convert[xm0];
c=0;
while(!c)
{
k11=k1;
k21=k2;
if (!k22&&k21)
{
xm1++;
if (xm1>9)
xm1=0;
}
if (e==1)
buffer[1]=0x40;
else buffer[1]=convert[xm1];
scanLED();
if (!k12&&k11)
{
c=1;
}
k22=k21;
k12=k11;
}
buffer[1]=convert[xm1];
c=0;
while(!c)
{
k11=k1;
k21=k2;
if (!k22&&k21)
{
xm2++;
if (xm2>9)
xm2=0;
}
if (e==1)
buffer[0]=0x40;
else buffer[0]=convert[xm2];
scanLED();
if (!k12&&k11)
{
c=1;
b=0;
dz=xm0*100+xm1*10+xm2;
jsz=zzbl;
}
k22=k21;
k12=k11;
}
buffer[1]=convert[xm2];
}
}
}
void jy()
{
TR0=0;
Number[0]=zzz/256;
Number[1]=zzz%256;
Number[2]=dz;
Number[3]=jsz/256;
Number[4]=jsz%256;
WrToROM(Number,0,5);
delay(50);
TR0=1;
}
void adzhh()
{
if(cl==1)
{
TR0=0;
TR1=0;
TH1=0x00;
TL1=0x00;
adk=1;
delay(50);
p36=0;
i=0;
adk=0;
TR1=1;
while(~p36)
{
i++;
if(i>=900) //上限值
p36=1;
}
TR1=0;
t=TH1;
t=t*256+TL1;
jsz=(t-134)/31;
TH0=0xD8;
TL0=0xF0;
TR0=1;
cl=0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -