📄 all.c
字号:
#include<intrins.h>
#include <reg51.h>
#define LCM_RS RS
#define LCM_RW RW
#define LCM_EN E
#define Busy 0x80
#define uchar unsigned char
#define uint unsigned int
#define DATAPORT P0
#define SomeNop(); _nop_();_nop_();_nop_();_nop_();_nop_();
sbit CLOCK=P1^2;
sbit D_IN=P1^3;
sbit D_OUT=P3^2;
sbit _CS=P3^3;
sbit E=P1^7;
sbit RW=P1^6;
sbit RS=P1^5;
sbit I2C_SDA=P1^1;
sbit I2C_SCK=P1^0;
sbit LIGHT=P3^4;
sbit COLUMN1=P2^0;
sbit COLUMN2=P2^1;
sbit LED=P3^1;
uchar AH; //A/D转换高2位
uchar AL;
uchar TH[4],TL[4];uchar address=0x02;
uchar high,low;
uint m=1;
int KEY;
uchar code str0[]={"TEMP("};
uchar code str1[]={"):"};
uchar code str2[]={"TL:"};
uchar code str3[]={"TH:"};
//uint temp;
bit I2C_Start(void);
void I2C_Stop(void);
void I2C_Ack(void);
void I2C_Nack(void);
bit I2C_Send_Byte( uchar);
uchar I2C_Receive_Byte(void);
void AT24C64_R(void *mcu_address,uint AT24C64_address,uint count);
void AT24C64_W(void *mcu_address,uint AT24C64_address,uint count);
uint read1543(uchar port);
void showtempt(void);
void ReadStatusLCM(void);
void WriteCommandLCM(uchar WCLCM,uchar BusyC);
void WriteDataLCM(uchar WDLCM);
void DisplayOneChar(uchar X,uchar Y,uchar DData);
void DisplayListChar(uchar X,uchar Y,uchar *DData);
void InitLcd();
void keyboard(void);
void wait_5ms(void) //***延时子程序***//
{
uint con;
for(con=0;con<1500;con++);
}
void wait_1s(void) //***延时子程序***//
{
uint con;
for(con=0;con<30000;con++);
for(con=0;con<30000;con++);
}
void Delay_10_uS(void)
{
char i=10;
while(i--);
}
void Delay_N_mS( uint n_milisecond)
{
uchar i;
while(n_milisecond--)
{
i=37;
while(i--);
}
}
void delay(uint k)
{
uint i,j;
for(i=0;i<k;i++)
{
for(j=0;j<60;j++);
}
}
//**AD转换并显示**//
void ad1543v_3(bit a1,bit a2,bit a3,bit a4)
{
uchar i;
AH=AL=0;
CLOCK=0;
_CS=0;
for(i=0;i<6;i++)
;
D_IN=a1; /*送入高位地址*/
CLOCK=1;
if(D_OUT==1)
{
(AH)+=1;
}
(AH)=(AH)<<1;
CLOCK=0;
;
;
D_IN=a2;
; /*送入次高位地址*/
CLOCK=1;
;
if(D_OUT==1)
{
(AH)+=1;
}
CLOCK=0;
;
D_IN=a3;
; /*送入次低位地址*/
CLOCK=1;
if(D_OUT==1)
{
(AL)+=1;
}
(AL)=(AL)<<1;
CLOCK=0;
;
;
D_IN=a4; /*送入低位地址*/
CLOCK=1;
if(D_OUT==1)
{
(AL)+=1;
}
for(i=0;i<6;i++) /*采样循环???*/
{
(AL)=(AL)<<1;
CLOCK=0;
;
;
CLOCK=1;
if(D_OUT==1)
{
(AL)+=1;
}
}
CLOCK=0;
;
;
_CS=1;
; /*转换结束*/
}
uint adc(bit b1,b2,b3,b4)
{
unsigned long h;
uchar w;
uint temp;
ad1543v_3(b1,b2,b3,b4);
h=(AH)*256+(AL);
h=h*500;
w=h/1024;
temp=w-110;
return(temp);
}
uint read1543(uchar port) //从TLC1543读取采样值,形参port是采样的通道号
{
uint data ad;
uint data i;
uchar data al=0,ah=0;
CLOCK=0;
_CS=0;
port<<=4;
for (i=0;i<4;i++) //把通道号打入1543
{
D_IN=(bit)(port&0x80);CLOCK=1;CLOCK=0;
port<<=1;
}
for (i=0;i<6;i++) //填充6个CLOCK
{
CLOCK=1;CLOCK=0;
}
_CS=1;_nop_();_nop_();_CS=0; //等待AD转换
for (i=0;i<2;i++) //取D9,D8
{
D_OUT=1;
CLOCK=1;
ah<<=1;
if (D_OUT) ah|=0x01;
CLOCK=0;
}
for (i=0;i<8;i++) //取D7--D0
{
D_OUT=1;
CLOCK=1;
al<<=1;
if (D_OUT) al|=0x01;
CLOCK=0;
}
_CS=1;
ad=(uint)ah;ad<<=8;ad|=al; //得到AD值
return (ad);
delay(2500);
}
void Ten_to_String(uint h,uchar w[3])
{
w[0]=h/100+0x30;
w[1]=(h%100)/10+0x30;
w[2]=h%10+0x30;
}
void showtempt(void)
{
uchar v[4];uint h;
//h=read1543(0x00);delay(1000);
//h+=read1543(0x00);delay(1000);
//h+=read1543(0x00);delay(1000);
//h+=read1543(0x00);delay(1000);
//h+=read1543(0x00);delay(1000);
// h/=5;
h=adc(0,0,0,0);
h+=adc(0,0,0,0);
h+=adc(0,0,0,0);
h+=adc(0,0,0,0);
h+=adc(0,0,0,0);
h/=5;
if(h>=low&&h<=high)
{
LIGHT=1;
}
else
{
LIGHT=0;
}
AT24C64_W((char *)h,address++,1);
wait_1s;
Ten_to_String(h,v);
DisplayListChar(8,0,v);
}
//**显示程序**//
void ReadStatusLCM(void)
{
do
{
DATAPORT=0xFF;
LCM_RS=0;
LCM_RW=1;
LCM_EN=0;
LCM_EN=0;
LCM_EN=1;
}
while(DATAPORT&Busy);
LCM_EN=1;
}
void WriteCommandLCM(uchar WCLCM,uchar BusyC)
{
if(BusyC) ReadStatusLCM();
DATAPORT=WCLCM;
LCM_RS=0;
LCM_RW=0;
LCM_EN=0;
LCM_EN=0;
LCM_EN=1;delay(10);
}
void WriteDataLCM(uchar WDLCM)
{
ReadStatusLCM();
DATAPORT=WDLCM;
LCM_RS=1;
LCM_RW=0;
LCM_EN=0;
LCM_EN=0;
LCM_EN=1;delay(10);
}
void DisplayOneChar(uchar X,uchar Y,uchar DData)
{
Y&=0x01;
X&=0x0F;
if(Y)X|=0x40;
X|=0x80;
WriteCommandLCM(X,0);
WriteDataLCM(DData);
}
void DisplayListChar(uchar X,uchar Y,uchar *DData)
{
uchar ListLength=0;
Y&=0x01;
X&=0x0F;
if(X<=15)
{
while(DData[ListLength])
{
DisplayOneChar(X,Y,DData[ListLength]);
ListLength++;
X++;
}
}
}
void InitLcd()
{
WriteCommandLCM(0x01,1);
WriteCommandLCM(0x02,1);
WriteCommandLCM(0x38,1);
WriteCommandLCM(0x06,1);
WriteCommandLCM(0x0c,1);
}
//**24c64存取程序**//
bit I2C_Start(void)
{
Delay_10_uS();
I2C_SDA =1;
Delay_10_uS();
I2C_SCK =1;
Delay_10_uS();
if ( I2C_SDA == 0) return 0;
if ( I2C_SCK == 0) return 0;
I2C_SDA = 0;
Delay_10_uS();
I2C_SCK = 0;
Delay_10_uS();
return 1;
}
void I2C_Stop(void)
{
Delay_10_uS();
I2C_SDA = 0;
Delay_10_uS();
I2C_SCK = 1;
Delay_10_uS();
I2C_SDA = 1;
Delay_10_uS();
}
void I2C_Ack(void)
{
Delay_10_uS();
I2C_SDA=0;
Delay_10_uS();
I2C_SCK=1;
Delay_10_uS();
I2C_SCK=0;
Delay_10_uS();
}
void I2C_Nack(void)
{
Delay_10_uS();
I2C_SDA=1;
Delay_10_uS();
I2C_SCK=1;
Delay_10_uS();
I2C_SCK=0;
Delay_10_uS();
}
bit I2C_Send_Byte( uchar d)
{
uchar i = 8;
bit bit_ack;
while( i-- )
{
Delay_10_uS();
if ( d &0x80 ) I2C_SDA =1;
else I2C_SDA =0;
Delay_10_uS();
I2C_SCK = 1;
Delay_10_uS();
I2C_SCK = 0;
d = d << 1;
}
Delay_10_uS();
I2C_SDA = 1;
Delay_10_uS();
I2C_SCK = 1;
Delay_10_uS();
bit_ack = I2C_SDA;
I2C_SCK =0;
Delay_10_uS();
return bit_ack;
}
uchar I2C_Receive_Byte(void)
{
uchar i = 8, d;
Delay_10_uS();
I2C_SDA = 1;
while ( i--)
{
d = d << 1;
Delay_10_uS();
I2C_SCK =1;
if ( I2C_SDA ) d++;
Delay_10_uS();
I2C_SCK =0;
}
return d;
}
void AT24C64_W(void *mcu_address,uint AT24C64_address,uint count)
{
while(count--)
{
I2C_Start();
I2C_Send_Byte( 0xa0);
I2C_Send_Byte( AT24C64_address/256 );
I2C_Send_Byte( AT24C64_address %256 );
I2C_Send_Byte( *(uchar*)mcu_address );
I2C_Stop();
Delay_N_mS(10); /* waiting for write cycle to be completed */
((uchar*)mcu_address)++;
AT24C64_address++;
Delay_N_mS(5);
}
}
void AT24C64_R(void *mcu_address,uint AT24C64_address,uint count)
{
while(count--)
{
I2C_Start();
I2C_Send_Byte( 0xa0);
I2C_Send_Byte( AT24C64_address/256 );
I2C_Send_Byte( AT24C64_address % 256 );
I2C_Start();
I2C_Send_Byte( 0xa1 );
*(uchar*)mcu_address = I2C_Receive_Byte();
I2C_Nack();
I2C_Stop();
((uchar*)mcu_address)++;
AT24C64_address++;
}
}
//**键盘响应程序**//
void keyboard(void)
{
uchar jz;
COLUMN1=0; /*查询第4行*/
COLUMN2=1;
Delay_N_mS(1);
KEY=~(P2)&0xf0;
Delay_N_mS(20);
switch(KEY)
{
case 32: /*第4行第3列,报警上限值减一*/
{
jz=1;
high--;
break;
}
case 64: /*第4行第2列,通道逆循环*/
{
jz=2;
switch(m)
{
case 1:m=3;break;
case 2:m--;break;
case 3:m--;break;
}
break;
}
case 128: /*第4行第1列,报警下限值减一*/
{
jz=3;
low--;
break;
}
default:
{
jz=0;
break;
}
}
if(jz!=0)
goto NEXT0;
else
{
COLUMN1=1; /*查询第3行*/
COLUMN2=0;
Delay_N_mS(1);
KEY=~(P2)&0xf0;
Delay_N_mS(20);
switch(KEY)
{
case 32: /*第3行第3列,报警上限值加一*/
{
jz=4;
high++;
break;
}
case 64: /*第3行第2列,通道正循环*/
{
jz=5;
switch(m)
{
case 1:m++;break;
case 2:m++;break;
case 3:m=1;break;
}
break;
}
case 128: /*第3行第1列,报警下限值加一*/
{
jz=6;
low++;
break;
}
default:
{
jz=0;
break;
}
}
NEXT0:
P2=0xFF;
AT24C64_W(&high,0x0,1);wait_1s;
AT24C64_W(&low,0x1,1);wait_1s;
Ten_to_String(low,TL);
Ten_to_String(high,TH);
DisplayListChar(3,1,TL);
DisplayListChar(10,1,TH);
DisplayOneChar(5,0,m+0x30);
Delay_N_mS(2500);
}
}
//**主程序**//
void main(void)
{
delay(500);
InitLcd();
AT24C64_R(&low,0x1,1);wait_1s;
AT24C64_R(&high,0x0,1);wait_1s;
Ten_to_String(low,TL);
Ten_to_String(high,TH);
DisplayOneChar(5,0,0x31);
DisplayListChar(0,0,str0);
DisplayListChar(6,0,str1);
DisplayListChar(0,1,str2);
DisplayListChar(7,1,str3);
DisplayListChar(3,1,TL);
DisplayListChar(10,1,TH);
do
{
showtempt();
keyboard();
}
while(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -