BS18B20温度值12864波形显示Word文档格式.docx
- 文档编号:19317686
- 上传时间:2023-01-05
- 格式:DOCX
- 页数:17
- 大小:19.69KB
BS18B20温度值12864波形显示Word文档格式.docx
《BS18B20温度值12864波形显示Word文档格式.docx》由会员分享,可在线阅读,更多相关《BS18B20温度值12864波形显示Word文档格式.docx(17页珍藏版)》请在冰豆网上搜索。
j<
10;
j++);
}
//***********12864写指令函数
voidwrite_com(ucharcmd)
LCD_RS=0;
LCD_RW=0;
P0=cmd;
delay(5);
LCD_EN=1;
LCD_EN=0;
//********12864写数据函数
voidwrite_dat(uchardat)
LCD_RS=1;
P0=dat;
//****************从LCD中读数据
ucharread_dat(void)
uchartemp;
P0=0XFF;
//释放数据线
//数据
LCD_RW=1;
//读模式
//E为高电平进行读数据或指令
delay
(1);
temp=P0;
returntemp;
//********************************************************
//设置光标(地址)函数
//参数说明:
x---为行号,y为列号
voidset_cursor(unsignedcharx,unsignedchary)
unsignedchari;
switch(x)//确定行号
{
case0x00:
i=0x80;
break;
//第一行
case0x01:
i=0x90;
//第二行
case0x02:
i=0x88;
//第三行
case0x03:
i=0x98;
//第四行
default:
}
i=y+i;
//确定列号
write_com(i);
//显示字符函数
voiddisplay_char(unsignedcharAlphabet)
write_dat(Alphabet);
//写入需要显示字符的显示码
//指定位置显示字符串函数
x为行号,y为列号
voiddisplay_string(unsignedcharx,unsignedchary,unsignedchar*Alphabet)
unsignedchari=0;
set_cursor(x,y);
//设置显示的起始地址
while(Alphabet[i]!
='
\0'
)
write_dat(Alphabet[i]);
i++;
//***************************************************************************以下为GDRAM绘图部分************************************************************************//
//*********************绘图显示的清屏函数(因清屏指令在画图时不能用)------------------------------------------------------------------------------注意!
!
voidgui_clear()
uchari,j,k;
write_com(EXTEND_SET);
//扩展指令集,8位数据传输
write_com(DRAW_OFF);
//绘图显示关闭
2;
i++)//分上下两屏写
32;
j++)
{
write_com(0x80+j);
//写y坐标
delay
(1);
if(i==0)//写x坐标
{
write_com(0x80);
delay
(1);
}
else//写下半屏
write_com(0x88);
for(k=0;
k<
16;
k++)//写一整行数据
write_dat(0x00);
//写高字节
//写低字节
}
write_com(DRAW_ON);
//打开绘图显示
write_com(BASIC_SET);
//打开基本指令集
//***********(给定坐标并打点的)任意位置打点函数
voidlcd_set_dot(ucharx,uchary)
ucharx_byte,x_bit;
//确定在坐标的那一字节哪一位
uchary_ping,y_bit;
//确定在坐标的哪一屏哪一行
uchartmph,tmpl;
//定义两个临时变量,用于存放读出来的数据
//扩展指令集
x_byte=x/16;
//算出在哪一字节,注意一个地址是16位的
x_bit=x%16;
//&
0x0f;
//算出在哪一位
y_ping=y/32;
//确定在上半屏还是下半屏,0代表上半屏,1代表下半屏
y_bit=y%32;
0x1f;
//确定在第几行
write_com(0X80+y_bit);
//先写垂直地址(最高位必须)
write_com(0x80+x_byte+8*y_ping);
//水平坐标,下半屏坐标起始地址为0x88,(+8*y_ping)就是用来确定上半屏还是下半屏
read_dat();
//预读取数据
tmph=read_dat();
//读取当前显示高8位数据
tmpl=read_dat();
//读取当前显示低8位数据
write_com(0x80+y_bit);
//读操作会改变AC,所以重新设置一下
if(x_bit<
8)
write_dat(tmph|(0x01<
<
(7-x_bit)));
//写高字节,因为坐标是从左向右的,GDRAM高位在昨,低位在右
write_dat(tmpl);
//原低位数据送回
else
write_dat(tmph);
//原高位数据送回
write_dat(tmpl|(0x01<
(15-x_bit)));
//打开绘图显示
//回到基本指令集
//************画水平线函数**********************************//
//x0、x1为起始点和终点的水平坐标,y为垂直坐标***************//
//**********************************************************//
voidgui_hline(ucharx0,ucharx1,uchary)
ucharbak;
//用于对两个数互换的中间变量,使x1为大值
if(x0>
x1)
bak=x1;
x1=x0;
x0=bak;
do
lcd_set_dot(x0,y);
//从左到右逐点显示
x0++;
}while(x1>
=x0);
//***********画竖直线函数***********************************//
//x为起始点和终点的水平坐标,y0、y1为垂直坐标***************//
voidgui_rline(ucharx,uchary0,uchary1)
//用于对两个数互换的中间变量,使y1为大值
if(y0>
y1)
bak=y1;
y1=y0;
y0=bak;
lcd_set_dot(x,y0);
//从上到下逐点显示
y0++;
}while(y1>
=y0);
//*********任意两点间画直线*********************************//
//x0、y0为起始点坐标,x1、y1为终点坐标**********************//
voidgui_line(ucharx0,uchary0,ucharx1,uchary1)
chardx;
//直线x轴差值
chardy;
//直线y轴差值
chardx_sym;
//x轴增长方向,为-1时减值方向,为1时增值方向
chardy_sym;
//y轴增长方向,为-1时减值方向,为1时增值方向
chardx_x2;
//dx*2值变量,用于加快运算速度
chardy_x2;
//dy*2值变量,用于加快运算速度
chardi;
//决策变量
if(x0==x1)//判断是否为垂直线
gui_rline(x0,y0,y1);
//画垂直线
return;
if(y0==y1)//判断是否为水平线
gui_hline(x0,x1,y0);
//画水平线
dx=x1-x0;
//求取两点之间的差值
dy=y1-y0;
//****判断增长方向,或是否为水平线、垂直线、点*//
if(dx>
0)//判断x轴方向
dx_sym=1;
if(dx<
0)
dx_sym=-1;
else
gui_rline(x0,y0,y1);
return;
if(dy>
0)//判断y轴方向
dy_sym=1;
if(dy<
dy_sym=-1;
gui_hline(x0,x1,y0);
/*将dx、dy取绝对值***********/
dx=dx_sym*dx;
dy=dy_sym*dy;
/****计算2倍的dx、dy值*******/
dx_x2=dx*1;
//我改为了一倍,这样才跟真实的两点对应
dy_x2=dy*1;
/***使用bresenham法进行画直线***/
=dy)//对于dx>
=dy,使用x轴为基准
di=dy_x2-dx;
while(x0!
=x1)
lcd_set_dot(x0,y0);
x0+=dx_sym;
if(di<
di+=dy_x2;
//计算出下一步的决策值
else
di+=dy_x2-dx_x2;
y0+=dy_sym;
}
lcd_set_dot(x0,y0);
//显示最后一点
else//对于dx<
dy使用y轴为基准
di=dx_x2-dy;
while(y0!
=y1)
lcd_set_dot(x0,y0);
y0+=dy_sym;
di+=dx_x2;
di+=dx_x2-dy_x2;
x0+=dx_sym;
//***************************************************************************以上为自定义字库部分**************************************************************//
//****************12864初始化函数
voidlcd_init()
write_com(0x30);
//基本指令操作,8位并口
write_com(0x06);
//设置为游标右移,DDRAM地址加一,画面不动
write_com(0x0c);
//显示开,关光标
write_com(0x01);
//清除lcd显示内容
//5ms延时
voidDelay5Ms(void)
unsignedintTempCyc=5552;
while(TempCyc--);
//400ms延时
voidDelay400Ms(void)
unsignedcharTempCycA=5;
unsignedintTempCycB;
while(TempCycA--)
TempCycB=7269;
while(TempCycB--);
};
/*************DS18B20温度读取模块*************/
voidtmpDelay(intnum)//延时函数
while(num--);
voidInit_DS18B20()//初始化ds1820
unsignedcharx=0;
DS=1;
//DS复位
tmpDelay(8);
//稍做延时
DS=0;
//单片机将DS拉低
tmpDelay(80);
//精确延时大于480us
//拉高总线
tmpDelay(14);
x=DS;
//稍做延时后如果x=0则初始化成功x=1则初始化失败
tmpDelay(20);
unsignedcharReadOneChar()//读一个字节
unsignedchardat=0;
for(i=8;
i>
0;
i--)
DS=0;
//给脉冲信号
dat>
>
=1;
DS=1;
if(DS)
dat|=0x80;
tmpDelay(4);
return(dat);
voidWriteOneChar(unsignedchardat)//写一个字节
i>
i--)
DS=dat&
0x01;
tmpDelay(5);
unsignedintReadtemp()//读取温度
unsignedchara=0;
unsignedcharb=0;
unsignedintt=0;
floattt=0;
Init_DS18B20();
WriteOneChar(0xCC);
//跳过读序号列号的操作
WriteOneChar(0x44);
//启动温度转换
//跳过读序号列号的操作
WriteOneChar(0xBE);
//读取温度寄存器
a=ReadOneChar();
//连续读两个字节数据//读低8位
b=ReadOneChar();
//读高8位
t=b;
t<
=8;
t=t|a;
//两字节合成一个整型变量。
tt=t*0.0625;
//得到真实十进制温度值,因为DS18B20可以精确到0.0625度,所以读回数据的最低位代表的是0.0625度
t=tt*10+0.5-30;
//放大十倍,这样做的目的将小数点后第一位也转换为可显示数字,同时进行一个四舍五入操作。
return(t);
//*****************************显示函数
voiddisplay()
uintnum;
//定义的时候用uchar宏定义就会出错
uintshi,ge,xiaoshu;
//这里的num,shi,ge,xiaoshu必须用uint无符号整数来表示,用uchar字符型则显示错误
num=Readtemp();
shi=num/100;
ge=num/10%10;
xiaoshu=num%10;
if(k==10)
{++i;
k=0;
if(i>
127)
{i=0;
a=0;
b=0;
gui_clear();
//画图时清屏函数
gui_line(0,15,0,63);
gui_line(0,63,127,63);
gui_line(a,63-b,i,63-shi*10-ge);
b=shi*10+ge;
a=i;
}
write_com(0x82);
//列地址
write_dat(t1[shi]);
//读取数据写入LCD
write_dat(t1[ge]);
write_com(0x84);
write_dat(t1[xiaoshu]);
voidinit_time0()
TMOD|=0x10;
//使用模式1,16位定时器,使用"
|"
符号可以在使用多个定时器时不受影响
TH1=(65536-50000)/256;
//用12M的晶振。
设定初值。
时间约为50000微秒,50毫秒
TL1=(65536-50000)%256;
EA=1;
//总中断打开
ET1=1;
//定时器T1允许中断
TR1=1;
//定时器T1开始工作
//*****************************主函数
voidmain()
{init_time0();
lcd_init();
//12864初始化函数
delay(10);
display_string(0,0,t0);
while
(1)
display();
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- BS18B20 温度 12864 波形 显示
![提示](https://static.bdocx.com/images/bang_tan.gif)