📄 ledls.c
字号:
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char //8位
typedef unsigned char BYTE;
typedef unsigned int WORD;
typedef bit BOOL ;
sbit rs = P2^0; //寄存器选择
sbit rw = P2^1; //读写控制
sbit ep = P2^2; //使能端,由高电平跳变到低电平时,液晶执行命令
sbit right = P2^6;
BYTE dis1[]; //unsigned char code 放一些固定的数据,一般查表用,这样可以少占用ram
BYTE code dis2[] = {"0x0179"};
BYTE k,n;
sbit TMDAT = P3^3; //根据实实际情况设定,对应1820的DQ引脚
uchar TMP; //读取后温度值存于TMP中,将其除以2即可得出实际温度;
uchar f; //结果是否为负温,“0”为正温,“1”为负温。
////////////////////////////////////////延时部分//////////////////////////
void dmsec (unsigned int count) //
{ //
unsigned int i; //
while (count) //
{ //
i = 115; //
while (i>0) i--; //
count--; //
} //
} //
//////////////////////////////////////////////////////////////////////////
/////////////////////////////////////// 发送复位//////////////////////////
void tmreset (void) // 初始化1820
{ //
unsigned int i; //
TMDAT = 0; //
i = 103; //
while (i>0) i--; // 将信号线置为低电平,延时 900 uS(11.0592Mhz时) //
TMDAT = 1; //
i = 4; // 将信号线置为高电平,延时 35 uS
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; // 检测最低位是1还是0
dat = dat >> 1; // 并转串,共8位
if (testb) // 如果是1
{ //
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) //
{ //
unsigned char a,b; //
tmreset (); //复位 //
//tmpre (); //等待存在脉冲 //
dmsec (1); //延时 //
tmwbyte (0xcc); //跳过序列号命令 //
tmwbyte (0xbe); //发送读取命令 //
a = tmrbyte (); //读取低位温度 //
b = tmrbyte (); //读取高位温度 //
f=b; //若b为1则为负温 //
if(f) //
{ //
TMP=~a+1; //如果为负温则去除其补码 //
} //
else //
{ //
TMP=a; //
} //
} //
//////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
delay(BYTE ms)
{ // 延时子程序
BYTE k;
while(ms--)
{
for(k = 0; k< 250; k++)
{
_nop_(); //NOP不执行任何操作,但占用一个字节存储单元,空耗一个指令执行周期
_nop_();
_nop_();
_nop_();
}
}
}
BOOL lcd_bz()
{ // 测试LCD忙碌状态
BOOL result;
rs = 0;
rw = 1;
ep = 1; //读数据口状态字
_nop_();
_nop_();
_nop_();
_nop_();
result = (BOOL)(P0 & 0x80); //D7为0才能进行读写操作
ep = 0;
return result;
}
lcd_wcmd(BYTE cmd)
{ // 写入指令数据到LCD
while(lcd_bz());
rs = 0;
rw = 0;
ep = 0;
_nop_();
_nop_();
P0 = cmd;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 1; //////
_nop_();
_nop_();
_nop_(); //高变低,液晶模块执行命令
_nop_();
ep = 0; //////
}
lcd_pos(BYTE pos)
{ //设定显示位置
lcd_wcmd(pos | 0x80);
}
lcd_wdat(BYTE dat)
{ //写入字符显示数据到LCD
while(lcd_bz());
rs = 1;
rw = 0;
ep = 0;
P0 = dat;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 1;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 0;
}
lcd_init()
{ //LCD初始化设定
lcd_wcmd(0x38); //显示模式设定 00111000(0x38),设置16*2显示,5*7点阵,8位数据接口
delay(1);
lcd_wcmd(0x0c); //显示开关及光标位置 0000 1100(0x0c),开显示,不显示光标
delay(1);
lcd_wcmd(0x06); // 0000 0110(0x06),当读写一个字符后,地址指针加1,且光标加1
delay(1);
lcd_wcmd(0x01); //清除LCD的显示内容
delay(1);
}
//////////////////////////////////////////////////////////////////////////
main() //
{ //
do{ //
tmstart(); //
dmsec(1000); //如果是不断地读取的话可以不延时 //
tmrtemp(); //读取温度,执行完毕温度将存于TMP中 //
//P0=TMP;
//right=0;
lcd_init(); // 初始化LCD
delay(10);
// dis1=TMP;
for (n=1;n<=8;n++) //
{ //
dis1[n] = TMP & 0x01; //
TMP = TMP >> 1;
}
lcd_pos(4); // 设置显示位置为第一行的第5个字符
k = 0;
// while(dis1[k] != '\0') // 显示第一句话 "hificat.com"
for (k=1;k<=8;k++)
{ // 显示字符
lcd_wdat(dis1[k]);
k++;
}
lcd_pos(0x41); // 设置显示位置为第二行第二个字符
k = 0;
while(dis2[k] != '\0') // 显示第二句话 "0571-85956028"
{
lcd_wdat(dis2[k]); // 显示字符
k++;
}
}while(1); //
} //
//////////////////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -