很遗憾,现成的只有1602,也发给你凑数吧
P3是数据,P2.012分别是RS RW E
附张仿真给你
/*************** writer:shopping.w ******************/
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define delayNOP() {_nop_();_nop_();_nop_();_nop_();}
sbit DQ = P3^3;
sbit LCD_RS = P2^0;
sbit LCD_RW = P2^1;
sbit LCD_EN = P2^2;
uchar code Temp_Disp_Title[]={"Current Temp : "};
uchar Current_Temp_Display_Buffer[]={" TEMP: "};
uchar code Temperature_Char[8] =
{
0x0c,0x12,0x12,0x0c,0x00,0x00,0x00,0x00
};
uchar code df_Table[]=
{
0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9
};
uchar CurrentT = 0;
uchar Temp_Value[]={0x00,0x00};
uchar Display_Digit[]={0,0,0,0};
bit DS18B20_IS_OK = 1;
void DelayXus(uint x)
{
uchar i;
while(x--)
{
for(i=0;i<200;i++);
}
}
bit LCD_Busy_Check()
{
bit result;
LCD_RS = 0;
LCD_RW = 1;
LCD_EN = 1;
delayNOP();
result = (bit)(P0&0x80);
LCD_EN=0;
return result;
}
void Write_LCD_Command(uchar cmd)
{
while(LCD_Busy_Check());
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
_nop_();
_nop_();
P0 = cmd;
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}
void Write_LCD_Data(uchar dat)
{
while(LCD_Busy_Check());
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 0;
P0 = dat;
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}
void LCD_Initialise()
{
Write_LCD_Command(0x01);
DelayXus(5);
Write_LCD_Command(0x38);
DelayXus(5);
Write_LCD_Command(0x0c);
DelayXus(5);
Write_LCD_Command(0x06);
DelayXus(5);
}
void Set_LCD_POS(uchar pos)
{
Write_LCD_Command(pos|0x80);
}
void Delay(uint x)
{
while(--x);
}
uchar Init_DS18B20()
{
uchar status;
DQ = 1;
Delay(8);
DQ = 0;
Delay(90);
DQ = 1;
Delay(8);
DQ = 1;
return status;
}
uchar ReadOneByte()
{
uchar i,dat=0;
DQ = 1;
_nop_();
for(i=0;i<8;i++)
{
DQ = 0;
dat >>= 1;
DQ = 1;
_nop_();
_nop_();
if(DQ)
dat |= 0X80;
Delay(30);
DQ = 1;
}
return dat;
}
void WriteOneByte(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
DQ = 0;
DQ = dat& 0x01;
Delay(5);
DQ = 1;
dat >>= 1;
}
}
void Read_Temperature()
{
if(Init_DS18B20()==1)
DS18B20_IS_OK=0;
else
{
WriteOneByte(0xcc);
WriteOneByte(0x44);
Init_DS18B20();
WriteOneByte(0xcc);
WriteOneByte(0xbe);
Temp_Value[0] = ReadOneByte();
Temp_Value[1] = ReadOneByte();
DS18B20_IS_OK=1;
}
}
void Display_Temperature()
{
uchar i;
uchar t = 150, ng = 0;
if((Temp_Value[1]&0xf8)==0xf8)
{
Temp_Value[1] = ~Temp_Value[1];
Temp_Value[0] = ~Temp_Value[0]+1;
if(Temp_Value[0]==0x00)
Temp_Value[1]++;
ng = 1;
}
Display_Digit[0] = df_Table[Temp_Value[0]&0x0f];
CurrentT = ((Temp_Value[0]&0xf0)>>4) | ((Temp_Value[1]&0x07)<<4);
Display_Digit[3] = CurrentT/100;
Display_Digit[2] = CurrentT%100/10;
Display_Digit[1] = CurrentT%10;
Current_Temp_Display_Buffer[11] = Display_Digit[0] + '0';
Current_Temp_Display_Buffer[10] = '.';
Current_Temp_Display_Buffer[9] = Display_Digit[1] + '0';
Current_Temp_Display_Buffer[8] = Display_Digit[2] + '0';
Current_Temp_Display_Buffer[7] = Display_Digit[3] + '0';
if(Display_Digit[3] == 0)
Current_Temp_Display_Buffer[7] = ' ';
if(Display_Digit[2] == 0&&Display_Digit[3]==0)
Current_Temp_Display_Buffer[8] = ' ';
if(ng)
{
if(Current_Temp_Display_Buffer[8] == ' ')
Current_Temp_Display_Buffer[8] = '-';
else if(Current_Temp_Display_Buffer[7] == ' ')
Current_Temp_Display_Buffer[7] = '-';
else
Current_Temp_Display_Buffer[6] = '-';
}
Set_LCD_POS(0x00);
for(i=0;i<16;i++)
{
Write_LCD_Data(Temp_Disp_Title[i]);
}
Set_LCD_POS(0x40);
for(i=0;i<16;i++)
{
Write_LCD_Data(Current_Temp_Display_Buffer[i]);
}
Set_LCD_POS(0x4d);
Write_LCD_Data(0x00);
Set_LCD_POS(0x4e);
Write_LCD_Data('C');
}
void main()
{
LCD_Initialise();
Read_Temperature();
Delay(50000);
Delay(50000);
while(1)
{
Read_Temperature();
if(DS18B20_IS_OK)
Display_Temperature();
DelayXus(100);
}
}
本回答被提问者采纳用51单片机和18b20做一个温度计,求一个完整程序,要求用12864显示。
这个是用数码显示的 你自己改改显示就ok了 12864 有带字库的那种,只要输入ASCII码就行了 程序有点乱,你注意换行就行 1.DS18B20基本知识 DS18B20数字温度计是DALLAS公司生产的1-Wire,即单总线器件,具有线路简单,体积小的特点。因此用它来组成一个测温系统,具有线路简单,在一根通信线,可以挂很...
51单片机上18B20如何在12864上显示两个小数点
temp = f_temp * 10 + 0.5;\/\/乘以10表示小数点后面只取1位,加0.5是四舍五入 再乘以100,得出的也不是原来的、真正的小数。
求高手教怎样用18b20测温并且显示在12864中,最好带电路图...
只用18B20和128X64是不能实现的,还需要单片机加程序
用液晶12864和DS18B20传感器做的温度传感器为什么不会变化,老是显示85...
delay_18B20(8); \/\/稍做延时 DQ = 0; \/\/单片机将DQ拉低 delay_18B20(80); \/\/精确延时 大于 480us DQ = 1; \/\/拉高总线 delay_18B20(14); x=DQ; \/\/稍做延时后 如果x=0则初始化成功 x=1则初始化失败 delay_18B20(20); } \/***ds18b20读一个字节***\/ unsigned char ReadOneChar(void) {...
各位帮我看下这个18B20显示温度程序有什么问题~~多谢了
本制作芯片采用数字温度传感器18b20,利用51单片机控制。DS18B20基本知识 DS18B20数字温度计是DALLAS公司生产的1-Wire,即单总线器件,具有线路简单,体积小的特点。因此用它来组成一个测温系统,具有线路简单,在一根通信线,可以挂很多这样的数字温度计,十分方便。 1、DS18B20产品的特点 (1)、只要求一个端口即可实现通信。
温度传感器与单片机结合 设计一个电路 不要太复杂 要电路图 和 具体数 ...
也就是做一个数字温度计(体温计)是吧,18B20数字温度计,显示可以用数码管或者LCD1602显示,或者12864都可以的。电路为PROTEL绘制。,程序都有的论文也有的 需要QQ我
18b20与lm35dz 程序区别以及lm35dz+12864如何编程 用单片机C语言
端输出为5V,但是由LM358 的数据手册可知:OUT 输出最大值为Vcc-1.5V=3.5V,所示实际测量温度最大值为70℃。当温度大于70℃后LM358 输出为恒定的3.5V,所以不可做大于70℃的恒温控制实训(除非358电源大于7V)。采用5 倍放大的计算公式如下:T=20*ADC\/51,精度为20\/51=0.39216度 ...
为什么单片机控制18B20测温初始总是显示85度然后显示测量值
其他回答 ROM上电的默认值,有的也不是85,只要在上电后先初始化18B20,等一段时间再显示和其他操作就可以了。 changdacekong | 发布于2012-05-13 举报| 评论 0 1 为您推荐: 51单片机原理及应用 单片机测温报告 单片机头 51单片机流水灯电路图 单片机t12测温 51单片机教程 单片机测温显示电路 ...
求STC12C5204单片机AD功能如何使用,例如,用其中一个I\/O做为AD采样一个...
\/\/本程序主要演示了 \/\/1、12864液晶的编程与使用,包括显示定位、4位整数、显示浮点数等 \/\/2、STC12C5A32S2单片机的ADC 采样功能(以第0、1通道为例)\/\/ \/\/注:本示例仅仅演示如何进行ADC 和显示,每ADC 一次就显示一次,实际应用时,\/\/应多次ADC 并进行相应处理,比如取平均值后,才能得到比较...
如何在液晶上显示汉字,单片机用的ATmega16,液晶是1602,求详细代码
1、此款采用并口ISP下载线,配AT89S52单片机,可以很方便的下载程序到单片机。下载后不用插拔线缆, 下载好后自动直接运行程序。2、USB供电系统,直接插接到电脑USB口即可提供电源,不需另接直流电源。 3、8位数码管(可做数码管的静态扫描以及动态扫描显示实验 不如 0-999 计数器实验 18B20温度检测实验 遥控解码实验等...