📄 12864和1302和18b20的综合.c
字号:
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit E = P1^2; // 使能端 //
sbit RW = P1^1; // 读写控制端 //
sbit RS = P1^0; // 数据或指令寄存器选择端 //
sbit psb= P1^3; //H=并口; L=串口;
sbit LCDrst= P1^4; //Reset Signal 低电平有效
unsigned char code name00[]={"蚕种催青综合控制"};
unsigned char code name01[]={"温度 . 湿度 . "};
unsigned char code name02[]={"时间 "};
unsigned char code name03[]={"菜单 确定 取消"};
unsigned char hour,minute,second;
unsigned int counter=0; //250us计数单元
unsigned char n,n10;
/****************/
void Show_Welcome(void);
/****************/
void delay_1(unsigned char tt)//延时1ms
{
unsigned char j;
while(tt--)
{
for(j=0;j<125;j++)
{;}
}
}
//******************/
void wr_com(unsigned char value)//写指令,写指令时必须为RS=0;RW=0;
{
E=0;
RS=0;
RW=0;
delay_1(1);
P0=value;
E=1;
delay_1(2); //如果没有延时就必须要加查忙指令
E=0;
}
//****************************/
void wr_data(unsigned char sj)//写数据,写数据时必须为 RS=1;RW=0;
{
E=0;
RS=1;
RW=0;
P0=sj;
E=1;
delay_1(1);//如果没有延时就必须要加查忙指令
E=0;
}
//**************************/
void reset (void)
{
LCDrst=1;
psb=1;
wr_com(0x30);/*30---基本指令动作*/
wr_com(0x01);/*清屏,地址指针指向00H*/
wr_com(0x06);/*光标的移动方向*/
wr_com(0x0c);/*开显示,关游标*/
}
//********************************/
//outChinese 为函数名
//place 为显示地址的首地址
//unit 字符长度
//charcode[] 要显示数据的内容
void outChinese(unsigned char place,unsigned char unit,unsigned char charcode[] )
{
unsigned char i;
wr_com(place);
for(i=0;i<unit*2;i++)//一个汉字为两个字符
{wr_data(charcode[i]);}
}
//***********************************/
/*void outchar(unsigned char place,unsigned char unit,unsigned char charcode[] )
{
unsigned char i;
wr_com(place);
for(i=0;i<unit;i++)
{wr_data(charcode[i]);}
}
//***********************************/
void display(unsigned char *s) //写字符串
{
for(;*s!='\0';s++)
wr_data(*s);
}
//**************************************/
void Show_Welcome(void)
{
outChinese(0x80,8,name00);//第一行:80-87H
outChinese(0x90,8,name01);//第二行:90-97H
outChinese(0x88,8,name02);//第三行:88-8fH
outChinese(0x98,8,name03);//第四行:98-9fH
}
////////////////////////////////////////////////////////////
////////////---------------------18B20---------------------/
////////////////////////////////////////////////////////////
sbit b=P3^3;
sbit a=P3^4;
unsigned char D,TH,TL,TA,TB,TC,TD;
//延时--------------------------------------------------------------------
void YS(unsigned int n)
{
while(n)n--;
}
//复位--------------------------------------------------------------------
void REST(void)
{
a=0;
YS(60);//600us
a=1;
YS(50);
}
//写0--------------------------------------------------------------------
void Write_0(void)
{
a=0;
YS(5);//50us
a=1;
}
//写1--------------------------------------------------------------------
void Write_1(void)
{
a=0;
a=0;
a=1;
YS(5);//50us
}
//写1Byte--------------------------------------------------------------------
void Write_Byte(unsigned char D)
{
unsigned char i;
for(i=0;i<8;i++)
{
if(D&0x01)Write_1();else Write_0(); //从低位开始写
D=D>>1;
}
}
//读1Byte--------------------------------------------------------------------
unsigned char Read_Byte(void)
{
unsigned char i; D=0;
for(i=0;i<8;i++)
{
a=0;
a=0;
a=0;
a=0;
a=1;
D=D>>1;
if(a){D|=0x80;}
YS(5); //50us
}
return D;
}
//读T--------------------------------------------------------------------
void Read_T(void)
{
REST();
Write_Byte(0XCC);
Write_Byte(0X44);
REST();
Write_Byte(0XCC);
Write_Byte(0XBE);
TL=Read_Byte();
TH=Read_Byte();
REST();
TH=(TL>>4)|(TH<<4);
TL=(TL&0x0f)*25/4;
TA=TH/10+48;
TB=TH%10+48;
TC=TL/10+48;
TD=TL%10+48;
}
//-------------------------------------------------------------
//-------------------------------------------------------------
//-------------------------------------------------------------
//----------第二个18B20----------------------------------------
//-------------------------------------------------------------
//-------------------------------------------------------------
//复位--------------------------------------------------------------------
void bREST(void)
{
b=0;
YS(60);//600us
b=1;
YS(50);
}
//写0--------------------------------------------------------------------
void bWrite_0(void)
{
b=0;
YS(5);//50us
b=1;
}
//写1--------------------------------------------------------------------
void bWrite_1(void)
{
b=0;
b=0;
b=1;
YS(5);//50us
}
//写1Byte--------------------------------------------------------------------
void bWrite_Byte(unsigned char D)
{
unsigned char i;
for(i=0;i<8;i++)
{
if(D&0x01)bWrite_1();else bWrite_0(); //从低位开始写
D=D>>1;
}
}
//读1Byte--------------------------------------------------------------------
unsigned char bRead_Byte(void)
{
unsigned char i; D=0;
for(i=0;i<8;i++)
{
b=0;
b=0;
b=0;
b=0;
b=1;
D=D>>1;
if(b){D|=0x80;}
YS(5); //50us
}
return D;
}
//读T--------------------------------------------------------------------
void bRead_T(void)
{
bREST();
bWrite_Byte(0XCC);
bWrite_Byte(0X44);
bREST();
bWrite_Byte(0XCC);
bWrite_Byte(0XBE);
TL=bRead_Byte();
TH=bRead_Byte();
bREST();
TH=(TL>>4)|(TH<<4);
TL=(TL&0x0f)*25/4;
TA=TH/10+48;
TB=TH%10+48;
TC=TL/10+48;
TD=TL%10+48;
}
//--------------------------------------------
//----------------DS1302----------------------
//--------------------------------------------
//--------------------------------------------
sbit CLK =P3^5;
sbit IO =P3^6;
sbit RST =P3^7;
//--------------WriteOneByteData-----------------/
void WriteByte(uchar ucda)
{
uchar i;
for(i=8;i>0;i--)
{
IO=(bit)(ucda&0x01);
CLK=1;
CLK=0;
ucda>>=1;
}
}
//--------------ReadOneByteData-----------------/
uchar ReadByte(void)
{
uchar i,a;
for(i=8;i>0;i--)
{
a>>=1;
if(IO)a|=0x80;
CLK=1;
CLK=0;
}
return(a);
}
//--------------WriteAddrFist,ThenWriteData-----------------/
void write1302(uchar Addr,uchar Data)
{
RST=0;
CLK=0;
RST=1;
WriteByte(Addr);
WriteByte(Data);
CLK=1;
RST=0;
}
//--------------WriteAddrFirst,ThenReadData-----------------/
uchar read1302(uchar Addr)
{
uchar Data;
RST=0;
CLK=0;
RST=1;
WriteByte(Addr);
Data=ReadByte();
CLK=1;
RST=0;
return(Data);
}
////////////////ds1302初始化//////////////////
void csh1302(void)
{
CLK=0;
RST=0;
write1302(0x8e,0x00);//打开写保护
write1302(0x90,0x06);//禁止充电
/////////////////////////////////////////////////
write1302(0x80,0x00);//预置秒
write1302(0x82,0x08);//预置分
write1302(0x84,0x91);//预置时
write1302(0x86,0x26);//预置日期
write1302(0x88,0x04);//预置月
write1302(0x8a,0x06);//预置星期
write1302(0x8c,0x08);//预置年
////////////////////////////////////////////////
write1302(0x80,0x00);//启动时钟
write1302(0x8e,0x80);//关闭写保护
}
main()
{
//csh1302();
CLK=0;
RST=0;
reset();
Show_Welcome();
while(1)
{
wr_com(0x8b);
n=read1302(0x85); //时
n&=0x1f;
wr_data(n/10+48); //注意是映射码,液晶中是写入的内部规定的映射表
wr_data(n%10+48);
display(":");
n10=read1302(0x83); //分
n=read1302(0x83)&0x0f;
n10=n10>>4;
n10=n10&0x07;
wr_data(n10+48);
wr_data(n+48);
display(":");
n10=read1302(0x81); //秒
n=read1302(0x81)&0x0f;
n10=n10>>4;
n10=n10&0x07;
wr_data(n10+48);
wr_data(n+48);
//////////////////////////////////////////////
Read_T();
wr_com(0x92);
wr_data(TA);
wr_data(TB);
display(".");
wr_data(TC);
// wr_data(TD);
bRead_T();
wr_com(0x96);
wr_data(TA);
wr_data(TB);
display(".");
wr_data(TC);
// wr_data(TD);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -