📄 text1.c
字号:
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define outdat P2
sbit DQ0=P1^0; //定义变量DQ0与P1^0相同,即温度传感器数据总线DQ0与单片机P1.0连接
sbit DQ1=P1^1;
sbit cs2= P3^1;
sbit rw = P3^3;
sbit rs= P3^4;
sbit cs1= P3^2;
sbit e= P3^0;
/***********************************************************************************************/
/* 字形码 */
/***********************************************************************************************/
char code wen[32]={0x02,0xFE,0x01,0x40,0x7F,0x41,0x41,0x7F,0x41,0x41,0x7F,0x41,0x41,0x7F,0x40,0x00,
0x10,0x21,0x86,0x70,0x00,0x7E,0x4A,0x4A,0x4A,0x4A,0x4A,0x7E,0x00,0x00,0x00,0x00};
char code du[32]={0x80,0x60,0x1F,0x80,0x80,0x42,0x46,0x2A,0x12,0x12,0x2A,0x26,0x42,0xC0,0x40,0x00,
0x00,0x00,0xFC,0x04,0x24,0x24,0xFC,0xA5,0xA6,0xA4,0xFC,0x24,0x24,0x24,0x04,0x00};
char code zhuang[32]={0x04,0x02,0x01,0xFF,0x40,0x20,0x18,0x07,0x00,0x00,0x03,0x0C,0x30,0x60,0x20,0x00,
0x08,0x30,0x00,0xFF,0x20,0x20,0x20,0x20,0xFF,0x20,0xE1,0x26,0x2C,0x20,0x20,0x00};
char code tai[32]={0x00,0x60,0x39,0x01,0x00,0x3C,0x40,0x42,0x4C,0x40,0x40,0x70,0x04,0x09,0x31,0x00,
0x00,0x04,0x04,0x04,0x84,0x44,0x34,0x4F,0x94,0x24,0x44,0x84,0x84,0x04,0x00,0x00};
char code xu[32]={0x80,0x60,0x1F,0x00,0x01,0x01,0x01,0x41,0x81,0x7F,0x01,0x01,0x01,0x03,0x01,0x00,
0x00,0x00,0xFC,0x04,0x04,0x14,0x14,0x35,0x56,0x94,0x54,0x34,0x14,0x04,0x04,0x00};
char code hao[32]={0x00,0x00,0x00,0x02,0x07,0x02,0x02,0x22,0x42,0x82,0x42,0x3E,0x00,0x00,0x00,0x00,
0x40,0x40,0x40,0x5F,0xD1,0x51,0x51,0x51,0x51,0x51,0x51,0x5F,0x40,0x40,0x40,0x00};
char code no[16]={0x00,0x7E,0x04,0x08,0x10,0x20,0x7E,0x00,0x00,0x7E,0x42,0x42,0x42,0x42,0x7E,0x00};
char code on[16]={0x00,0x7E,0x42,0x42,0x42,0x42,0x7E,0x00,0x00,0x7E,0x04,0x08,0x10,0x20,0x7E,0x00};
char code off[16]={0x00,0x7E,0x42,0x42,0x7E,0x00,0x7E,0x12,0x12,0x12,0x00,0x7E,0x12,0x12,0x12,0x00};
/*********************************************************************************/
/* 十个数字 */
/*********************************************************************************/
char code z[10][8]={0x00,0xFE,0x82,0x82,0x82,0xFE,0x00,0x00
,0x00,0x00,0x44,0x7E,0x40,0x00,0x00,0x00
,0x00,0xF2,0x92,0x92,0x92,0x9E,0x00,0x00
,0x00,0x92,0x92,0x92,0x92,0xFE,0x00,0x00
,0x00,0x30,0x28,0xA4,0xFE,0xA0,0x00,0x00
,0x00,0x9E,0x92,0x92,0x92,0xF2,0x00,0x00
,0x00,0xFE,0x92,0x92,0x92,0xF2,0x00,0x00
,0x00,0x00,0x02,0x02,0xF2,0x1E,0x00,0x00
,0x00,0xFE,0x92,0x92,0x92,0xFE,0x00,0x00
,0x00,0x9E,0x92,0x92,0x92,0xFE,0x00,0x00};
/****************************************************************/
/* LCD显示程序 */
/****************************************************************/
void busy(uchar cs)
{
outdat=0x00; //释放总线,以读取状态字
if(cs) //片2测忙
{
rs=0;
rw=1;
cs1=0;
cs2=1;
e=1;
while((outdat&0x80)==0x80); //buzy=1时,再读,等待至busy=0
e=0;
}
else
{ //片1测忙
rs=0;
rw=1;
cs2=0;
cs1=1;
e=1;
while((outdat&0x80)==0x80);
e=0;
}
}
void com_w(uchar com,uchar cs) //写指令
{
busy(cs);
outdat=com;
rw=0;
e=1;
e=0;
}
void data_w(uchar dat, uchar cs) //写数据
{
busy(cs);
rs=1;
rw=0;
outdat=dat;
e=1;
e=0;
}
void lcd_init()
{
unsigned int i,j;
com_w(0x3e+1,0);//显示开关
com_w(0xc0+0,0);//修改显示起始行
//com_w(0xb8+0,0);//修改页地址
//com_w(0x40+0,0);//修改列地址
com_w(0x3e+1,1);
com_w(0xc0+0,1);
//com_w(0xb8+0,1);
//com_w(0x40+0,1);
for(i=0;i<8;i++) //lcd初始设置,所有点清零
{
com_w(0xb8+i,0);
com_w(0x40+0,0);
for(j=0;j<64;j++)
data_w(0x00,0) ;
}
for(i=0;i<8;i++)
{
com_w(0xb8+i,1);
com_w(0x40+0,1);
for(j=0;j<64;j++)
data_w(0x00,1) ;
}
}
void hz16x16(uchar hang ,uchar lie,char hz[32]) //汉字显示程序
{
unsigned char i;
if(lie<4)
{
com_w(0xb8+2*hang+1,0); //汉字1hang为2页,即点16行
com_w(0x40+16*lie,0); //汉字1lie为点16列
for(i=0;i<16;i++)
data_w(hz[i],0) ;
com_w(0xb8+2*hang,0);
com_w(0x40+16*lie,0);
for(i=16;i<32;i++)
data_w(hz[i],0) ;
}
else
{
com_w(0xb8+2*hang+1,1);
com_w(0x40+16*(lie-4),1);
for(i=0;i<16;i++)
data_w(hz[i],1) ;
com_w(0xb8+2*hang,1);
com_w(0x40+16*(lie-4),1);
for(i=16;i<32;i++)
data_w(hz[i],1) ;
}
}
void sz8x8(uchar hang,uchar lie ,uchar zihu[8]) //数字显示程序
{
int i;
if(lie<8)
{
com_w(0xb8+hang,0);
com_w(0x40+8*lie,0);
for(i=0;i<8;i++)
data_w(zihu[i],0) ;
}
else
{
com_w(0xb8+hang,1);
com_w(0x40+8*(lie-8),1);
for(i=0;i<8;i++)
data_w(zihu[i],1) ;
}
}
void zf8x16(uchar hang,uchar lie ,uchar zihu[16]) //字符显示程序
{
int i;
if(lie<4)
{
com_w(0xb8+hang,0);
com_w(0x40+16*lie,0);
for(i=0;i<16;i++)
data_w(zihu[i],0) ;
}
else
{
com_w(0xb8+hang,1);
com_w(0x40+16*(lie-4),1);
for(i=0;i<16;i++)
data_w(zihu[i],1) ;
}
}
/*****************************************************************/
/* 延时程序 */
/*****************************************************************/
void delay100m()
{
uchar i,j,k;
for(i=0;i<8;i++)
{
for(j=0;j<25;j++)
{
for(k=0;k<250;k++);
}
}
}
void delay15() //delay time is 15us
{
uchar i;
for(i=0;i<5;i++);
}
void delay60() //delay time is 60us
{
uchar i;
for(i=0;i<20;i++);
}
/*****************************************************************/
/* 温度测量程序 */
/*****************************************************************/
void reset(uchar dqhao) //初始化
{
uchar i;
// DQ=1;
if(dqhao)
DQ1=1;
else
DQ0=1;
// DQ=0;
if(dqhao)
DQ1=0;
else
DQ0=0;
for(i=0;i<9;i++)
{
delay60(); //----540us----
}
//DQ=1;
if(dqhao)
DQ1=1;
else
DQ0=1;
delay15();
delay15(); //----delay 30us-----
// while(DQ);
if(dqhao)
{
while(DQ1); //无DS18B20存在时,等待
for(i=0;i<8;i++)
delay60();
}
else
{
while(DQ0);
for(i=0;i<8;i++)
delay60();
}
//DQ=1; //over
if(dqhao)
DQ1=1;
else
DQ0=1;
}
void bit_w(uchar b,uchar dqhao) //write bit data to DQ
{
// DQ=1;
if(dqhao)
DQ1=1;
else
DQ0=1;
// DQ=0;
if(dqhao)
DQ1=0;
else
DQ0=0;
_nop_ ;
_nop_ ;
_nop_ ;
_nop_ ;
_nop_ ;
// DQ=b;
if(dqhao)
DQ1=b;
else
DQ0=b;
delay60(); //delay 60us
// DQ=1; //over
if(dqhao)
DQ1=1;
else
DQ0=1;
_nop_ ;
}
void byte_w(uchar byte,uchar dqhao) //write byte data to DQ
{
uchar i;
uchar b;
for(i=0;i<8;i++)
{
b=byte&0x01;
bit_w(b,dqhao);
byte=byte>>1;
}
}
bit bit_r(uchar dqhao) //从DQ读一位数据
{
bit b;
// DQ =1;
if(dqhao)
DQ1=1;
else
DQ0=1;
// DQ=0;
if(dqhao)
DQ1=0;
else
DQ0=0;
_nop_;
_nop_;
_nop_;
// DQ=1;
if(dqhao)
DQ1=1;
else
DQ0=1;
_nop_;
_nop_;
// b=DQ;
if(dqhao)
b=DQ1;
else
b=DQ0;
delay60();
// DQ=1; //over
if(dqhao)
DQ1=1;
else
DQ0=1;
_nop_;
return b;
}
uchar byte_r(uchar dqhao) //read byte data from DQ
{
uchar i,j;
bit b;
j=0;
for(i=0;i<8;i++)
{
b=bit_r(dqhao);
if(b)
{
j+=1;
}
j=_cror_(j,1); //sycle right shift a bit
}
return j;
}
uchar gettemp(uchar dqhao)
{
uchar temp1,temp2;
reset(dqhao) ;
byte_w(0xcc,dqhao) ; //跳过ROM
byte_w(0x44,dqhao) ; //温度变换
delay100m() ;
reset(dqhao);
byte_w(0xcc,dqhao) ;
byte_w(0xBE) ; //读暂存器
temp2=byte_r(dqhao);
temp1=byte_r(dqhao);
delay100m();
temp1=temp1<<4;
temp1+=(temp2&0xf0)>>4;
return temp1;
}
/******************************************************************/
/* 文字显示、温度数据显示与发送程序 */
/******************************************************************/
void wenzi() //文字显示
{
hz16x16(0,0,xu) ;
hz16x16(0,1,hao) ;
hz16x16(0,3,wen) ;
hz16x16(0,4,du) ;
hz16x16(0,6,zhuang) ;
hz16x16(0,7,tai) ;
}
void send(uchar dat) //串口发送子程序
{
ES=0;
SBUF=dat;
while(!TI);
TI=0;
ES=1;
}
void wendu(uchar dqhao) //温度数据显示与发送程序
{
uchar bai,shi,ge,dq,wenduodata;
dq=dqhao;
wenduodata=gettemp(dqhao);
bai=wenduodata/100;
shi=wenduodata%100/10;
ge=(wenduodata%100)%10 ;
zf8x16(dq+2,0,no);
sz8x8(dq+2,2,z[dq]);
sz8x8(dq+2,6,z[bai]);
sz8x8(dq+2,7,z[shi]);
sz8x8(dq+2,8,z[ge]);
send(0x30+dq); //数字加上0x30转为相应字符ASCII码
send(0x20);
send(0x30+bai);
send(0x30+shi);
send(0x30+ge);
send(0x20);
if(wenduodata==0)
zf8x16(dq+2,6,off);
else
zf8x16(dq+2,6,on);
}
/*****************************************************************/
/* main程序 */
/*****************************************************************/
main()
{
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
TR1=1;
SM0=0;
SM1=1;
REN=1;
EA=1;
ES=1;
lcd_init();
// wenzi();
com_w(0xb8+0,1);//修改页地址
com_w(0x40+0,1);//修改列地址
data_w(0x01,1);
while(1)
{
wendu(0);
wendu(1);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -