📄 yejin.c
字号:
#include <reg52.h>
#include <intrins.h>
sbit di=P2^5;
sbit rw=P2^6;
sbit e=P2^7;
sbit csa=P3^4;
sbit csb=P3^3;
sbit res=P3^2;
#define displayon 0x3f
#define start0 0xc0
#define startx0 0x40
#define starty0 0xb8
#define V_TH0 0xd8
#define V_TL0 0xf0
#define V_TMOD 0x01
#define uchar unsigned char
sbit TMDAT = P3^5; //根据实实际情况设定
uchar TMP; //读取后温度值存于TMP中,将其除以2即可得出实际温度;
unsigned char a,b; //
void dmsec (unsigned int count) ;
void tmreset (void) ;
void tmpre (void);
bit tmrbit (void);
unsigned char tmrbyte (void);
void tmwbyte (unsigned char dat);
void tmstart (void) ;
void tmrtemp (void);
unsigned char code ai16[]={
/* 点阵:16x16
提取点阵方向:纵向
字节掉转:是
字节方式:C语言 */
0x40,0xB0,0x92,0x96,0x9A,0x92,0xF2,0x9E, // 爱
0x92,0x91,0x99,0x95,0x91,0x50,0x30,0x00,
0x00,0x00,0x40,0x30,0x8C,0x83,0x46,0x2A,
0x12,0x2A,0x26,0x42,0xC0,0x40,0x00,0x00
};
unsigned char code dang16[]={
/* 点阵:16x16
提取点阵方向:纵向
字节掉转:是
字节方式:C语言 */
0x00,0x40,0x42,0x44,0x4C,0x40,0x40,0x7F, // 当
0x40,0x40,0x48,0x44,0xE6,0x40,0x00,0x00,
0x00,0x40,0x44,0x44,0x44,0x44,0x44,0x44,
0x44,0x44,0x44,0x44,0xFF,0x00,0x00,0x00
};
unsigned char code qian16[]={
/* 点阵:16x16
提取点阵方向:纵向
字节掉转:是
字节方式:C语言 */
0x08,0x08,0xE8,0x29,0x2A,0x2E,0xE8,0x08, // 前
0x08,0xCC,0x0A,0x0B,0xE8,0x0C,0x08,0x00,
0x00,0x00,0xFF,0x09,0x49,0x89,0x7F,0x00,
0x00,0x0F,0x40,0x80,0x7F,0x00,0x00,0x00
};
unsigned char code wen16[]={
/* 点阵:16x16
提取点阵方向:纵向
字节掉转:是
字节方式:C语言 */
0x10,0x22,0x64,0x0C,0x80,0x00,0xFE,0x92, // 温
0x92,0x92,0x92,0x92,0xFF,0x02,0x00,0x00,
0x04,0x04,0xFE,0x01,0x40,0x7E,0x42,0x42,
0x7E,0x42,0x7E,0x42,0x42,0x7E,0x40,0x00
};
unsigned char code du16[]={
/* 点阵:16x16
提取点阵方向:纵向
字节掉转:是
字节方式:C语言 */
0x00,0x00,0xFC,0x24,0x24,0x24,0xFC,0xA5, // 度
0xA6,0xA4,0xFC,0x24,0x34,0x26,0x04,0x00,
0x40,0x20,0x9F,0x80,0x42,0x42,0x26,0x2A,
0x12,0x2A,0x26,0x42,0x40,0xC0,0x40,0x00
};
unsigned char code zero8[]={
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
unsigned char code maohao8[]={
/*-- 文字: : --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00
};
unsigned char code num8[]={
/*-- 文字: 0 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,
/*-- 文字: 1 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,
/*-- 文字: 2 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,
/*-- 文字: 3 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,
/*-- 文字: 4 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,
/*-- 文字: 5 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,
/*-- 文字: 6 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,
/*-- 文字: 7 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,
/*-- 文字: 8 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,
/*-- 文字: 9 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00
};
unsigned char dot8[]={
/*-- 文字: . --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00
};
/*******************************************************************************************************/
void delay50ms(void)
{unsigned int TempCyc=5552;
while(TempCyc--);
}
/*******************************************************************************************************/
void wrc(unsigned char command)
{
P0=command;
di=0;
rw=0;
e=1;
e=0;
}
/*******************************************************************************************************/
void wrd(unsigned char dat)
{
P0=dat;
di=1;
rw=0;
e=1;
e=0;
}
/*******************************************************************************************************/
void cls()
{
unsigned char i,j;
for(i=0;i<8;i++)
{
wrc(startx0);
wrc(starty0+i);
for(j=0;j<64;j++)
{
wrd(0);
}
}
}
/*******************************************************************************************************/
void sys_init()
{
TMOD=V_TMOD;TH0=V_TH0;TL0=V_TL0;
TR0=1;ET0=1;EA=1;
}
/*******************************************************************************************************/
void lcd_init()
{
rw=0;
wrc(displayon);
wrc(0xc0);
csa=1;
csb=0;
cls();
csa=0;
csb=1;
cls();
}
/*******************************************************************************************************/
void lcd_show16(unsigned char x,unsigned char y,unsigned char *p,unsigned char blackin)
{
unsigned char i;
x-=1;
y-=1;
x=x<<4;
if(x<64)
{
csa=1;
csb=0;
}
else
{
csa=0;
csb=1;
x-=64;
}
y=y<<1;
wrc(startx0+x);
wrc(starty0+y);
for(i=0;i<16;i++)
{
if(blackin)
wrd(~*p);
else
wrd(*p);
p++;
}
wrc(startx0+x);
wrc(starty0+y+1);
for(i=0;i<16;i++)
{
if(blackin)
wrd(~*p);
else
wrd(*p);
p++;
}
}
/*******************************************************************************************************/
void lcd_show8(unsigned char x,unsigned char y,unsigned char *p,unsigned char blackin)
{
unsigned char i;
x-=1;
y-=1;
x=x<<3;
if(x<64)
{
csa=1;
csb=0;
}
else
{
csa=0;
csb=1;
x-=64;
}
y=y<<1;
wrc(startx0+x);
wrc(starty0+y);
for(i=0;i<8;i++)
{
if(blackin)
wrd(~*p);
else
wrd(*p);
p++;
}
wrc(startx0+x);
wrc(starty0+y+1);
for(i=0;i<8;i++)
{
if(blackin)
wrd(~*p);
else
wrd(*p);
p++;
}
}
/*******************************************************************************************************/
void show_ai(bit black)
{
unsigned char i;
cls();
lcd_show16(3,1,&ai16[0],black);
lcd_show16(6,1,&ai16[0],black);
lcd_show16(2,2,&ai16[0],black);
lcd_show16(4,2,&ai16[0],black);
lcd_show16(5,2,&ai16[0],black);
lcd_show16(7,2,&ai16[0],black);
lcd_show16(3,3,&ai16[0],black);
lcd_show16(6,3,&ai16[0],black);
lcd_show16(4,4,&ai16[0],black);
lcd_show16(5,4,&ai16[0],black);
for(i=0;i<100;i++)
delay50ms();
csa=1;csb=1;
cls();
}
/*******************************************************************************************************/
void main()
{
unsigned char temp,m,n;
unsigned int temp1;
lcd_init();
sys_init();
show_ai(0);
lcd_show16(1,1,&dang16[0],0);
lcd_show16(2,1,&qian16[0],0);
lcd_show16(3,1,&wen16[0],0);
lcd_show16(4,1,&du16[0],0);
lcd_show8(9,1,&maohao8[0],0);
while(1)
{
tmstart(); //
//dmsec(100); //如果是不断地读取的话可以不延时 //
tmrtemp();
temp=(a>>4)|(b<<4);
temp&=0x7f;
m=temp/100;
temp%=100;
n=temp/10;
temp%=10;
if(m==0)
lcd_show8(10,1,&zero8[0],0);
else
lcd_show8(10,1,&num8[m<<4],0);
lcd_show8(11,1,&num8[n<<4],0);
lcd_show8(12,1,&num8[temp<<4],0);
lcd_show8(13,1,&dot8[0],0);
temp1=a&0x0f;
temp1*=1000;
temp1/=16;
m=temp1/100;
temp1%=100;
n=temp1/10;
temp1%=10;
lcd_show8(14,1,&num8[m<<4],0);
lcd_show8(15,1,&num8[n<<4],0);
lcd_show8(16,1,&num8[temp1<<4],0);
}
}
/*********************************************************************************************************/
void timer0() interrupt 1
{
TH0=V_TH0;TL0=V_TL0;
}
/*********************************************************************************************************/
//国内网站上读取DS1820的C51源程序不多,基本上都是那几篇,我试过都不行
//后来我买了本书,按照上面照抄,连编译都通不过,后来经过多次测试,终于可以顺利读取了
//若有问题可与我联系jqdz2000@163.com
// 前面是单个DS1820温度读取程序,后面是四个DS1820温度读取程序。
//推荐用11.0592Mhz晶振,经试验用12M到24M都可以,6M就不行了。
////////////////////////////////////////延时部分//////////////////////////
void dmsec (unsigned int count) //
{ //
unsigned int i; //
while (count) //
{ //
i = 115; //
while (i>0) i--; //
count--; //
} //
} //
//////////////////////////////////////////////////////////////////////////
/////////////////////////////////////// 发送复位//////////////////////////
void tmreset (void) //
{ //
unsigned int i; //
TMDAT = 0; //
i = 103; //
while (i>0) i--; // 延时 900 uS(11.0592Mhz时) //
TMDAT = 1; //
i = 4; //
while (i>0) i--; //
} //
//////////////////////////////////////////////////////////////////////////
//判断DS1820是否存在的子程序。最好不要用,因为当器件不存在时将会进入死循环
////////////////////////////////////// 等待存在脉冲///////////////////////
void tmpre (void) //判断器件是否存在 //
{ //
unsigned int i; //
while (TMDAT); //
while (~TMDAT); //
i = 4; while (i>0) i--; //
} //
//////////////////////////////////////////////////////////////////////////
///////////////////////////////////// 读一位//////////////////////////////
bit tmrbit (void) //
{ //
unsigned int i; //
bit dat; //
TMDAT = 0; i++; //
TMDAT = 1; i++; i++; //微量延时 //
dat = TMDAT; //
i = 8; while (i>0) i--; // 延时 //
return (dat); //
} //
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////// 读一个字节///////////////////////
unsigned char tmrbyte (void) //
{ //
unsigned char i,j,dat; //
dat = 0; //
for (i=1;i<=8;i++) //
{ //
j = tmrbit (); //
dat = (j << 7) | (dat >> 1); //
} //
return (dat); //
} //
//////////////////////////////////////////////////////////////////////////
/////////////////////////////////////// 写一个字节////////////////////////
void tmwbyte (unsigned char dat) //
{ //
unsigned int i; //
unsigned char j; //
bit testb; //
for (j=1;j<=8;j++) //
{ //
testb = dat & 0x01; //
dat = dat >> 1; //
if (testb) //
{ //
TMDAT = 0; // 写0 //
i++; i++; //
TMDAT = 1; //
i = 8; while (i>0) i--; //
} //
else //
{ //
TMDAT = 0; // 写0 //
i = 8; while (i>0) i--; //
TMDAT = 1; //
i++; i++; //
} //
} //
} //
//////////////////////////////////////////////////////////////////////////
/////////////////////////////////发送ds1820 开始转换//////////////////////
void tmstart (void) //
{ //
tmreset (); //复位 //
//tmpre (); //等待存在脉冲 //
dmsec (1); //延时 //
tmwbyte (0xcc); //跳过序列号命令 //
tmwbyte (0x44); //发转换命令 44H, //
} //
//////////////////////////////////////////////////////////////////////////
/////////////////////////////////// 读取温度//////////////////////////////
void tmrtemp (void) //
{ //
tmreset (); //复位 //
//tmpre (); //等待存在脉冲 //
dmsec (1); //延时 //
tmwbyte (0xcc); //跳过序列号命令 //
tmwbyte (0xbe); //发送读取命令 //
a = tmrbyte (); //读取低位温度 //
b = tmrbyte (); //读取高位温度 //
} //
//////////////////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -