用12864显示18B20

合集下载

基于Arduino的18B20+LCD12864温度显示

基于Arduino的18B20+LCD12864温度显示

基于Arduino的18B20+LCD12864温度显示本帖最后由 greenfort 于 2012-8-13 01:49 编辑初学Arduino,制作的通过12864显示多个18B20温度的程序接线请参考本论坛中的18B20及LCD12864与Arduino接线,这里不再重复,只是强调一点,18B20的PIN1和PIN3要同时接地,否则会在返回若干值后出现一次错误值(85.00)不知道什么原因鉴于12864的显示大小,程序最多接9个18B20传感器,多了显示不了程序代码如下1. /*2. LCD Arduino3. PIN1 = GND4. PIN2 = 5V5. RS(CS) = 8;6. RW(SID)= 9;7. EN(CLK) = 3;8. PIN15 PSB = GND;9. */10. #include <OneWire.h>11. #include <DallasTemperature.h>12. #include <stdlib.h>13. #define ONE_WIRE_BUS 214. #include "LCD12864RSPI.h"15. #define AR_SIZE( a ) sizeof( a ) / sizeof( a[0] )16.17. OneWire oneWire(ONE_WIRE_BUS);18. DallasTemperature sensors(&oneWire);19.20. char str[4]; //定义温度值存储数组,4位,其中3位为数字,1位为小数点21. double temp =0; //定义中间变量,用于将获取的float型温度值转变为unsigned char数组22. unsigned char show[]={23. 0xB5,0xB1,0xC7,0xB0,0xBB,0xB7,0xBE,0xB3,0xCE,0xC2,0xB6,0xC8};//当前环境温度24. int numberOfDevices;25. void setup()26. {27. Serial.begin(9600);28. sensors.begin(); //传感器初始化29. numberOfDevices = sensors.getDeviceCount();30. LCDA.Initialise(); // 屏幕初始化31. LCDA.DisplayString(0,0,show,AR_SIZE(show));//第一行第1格开始,显示文字“当前环境温度”32. }33.34. void loop()35. {36. sensors.requestTemperatures(); //获取温度值37. for(int i=0;i<numberOfDevices; i++) //逐个获取传感器的温度38. {39. temp=sensors.getTempCByIndex(i); //使用索引序号获得摄氏度数值40. dtostrf(temp,4,2,str); //将获取的数值转换为字符型数组41. if (i<=2)42. {43. LCDA.DisplayString(1,i*3,(unsigned char *)str,sizeof(str));。

12864 18b20 时钟

12864 18b20  时钟
write_ds18b20(0xcc);//1个18b20跳过ROM搜索
write_ds18b20(0x44);//启动温度转换
for(time=0;time<200;time++);
rst_ds18b20(); //18b20再次复位
write_ds18b20(0xcc);//1个18b20再次跳过ROM搜索
en=0;
}
while(temp&0x80);
}
//12864写指令函数
uchar idata lcd2[]={"【20时59分50秒】"}; //LCD12864第二行初始化
uchar idata lcd3[]={"【星期7 25.3度】"}; //LCD12864第三行初始化
uchar idata lcd4[]={"【xx☆xxnmxx】"}; //LCD12864第四行初始化
for(time=0;time<200;time++); //延时480-960us
dq=1; //dq释放
for(time=0;time<10;time++); //等待15-60us,使dq为低电平
flag=dq; //若dq为0则复位成功
uchar code ds_18b20[]={0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9};//18b20只取一位小数部分,带4舍5入
uint time;
uchar time_dat[7]={11,7,4,10,23,59,50}; //1302年,星期,月,日,时,分,秒初始化
for(time=0;time<200;time++); //延60-240us

用DS18B20测温度并用LCD12864液晶屏显示

用DS18B20测温度并用LCD12864液晶屏显示

本程序实现的功能:用DS18B20测温度,并用LCD12864液晶屏显示#include<reg52.h>#include<intrins.h>#define uint unsigned int#define uchar unsigned charsbit rs=P1^1;sbit rw=P1^2;sbit en=P1^3;sbit psb=P1^4;sbit ds=P1^5;uchar code table0[]="Current temp:";uchar code table1[]="当前温度:";uchar code table2[]="摄氏度";uchar table[4];uint temp;float f_temp;void delay(uint tms){uint i,j;for(i=tms;i>0;i--)for(j=110;j>0;j--);}void init_ds(){uint i;ds=0;i=103;while(i>0)ds=1;i=4;while(i>0)i--;}void tempwritebyte(uchar )//由时序图知,向DS18B20写入数据时,写0和写1的时序恰好相反{ //所以如下程序用if和else分别写入0和1;而当从DS18B20读数据时,uint i,j; //读0和读1的时序根本一样,所以读0和读1的程序合二为一,不用分别写出bit bb;for(i=0;i<8;i++){bb=&0x01;//最低位开始写入DS18B20=>>1;if(bb){ds=0;j++;j++;ds=1;j=8;while(j>0)j--;}else{j=8;while(j>0)j--;ds=1;j++;j++;}}}void tempchange(){init_ds();delay(1);tempwritebyte(0xcc);tempwritebyte(0x44);}uchar tempreadbyte()//由时序图知,向DS18B20写入数据时,写0和写1的时序恰好相反{ //所以如下程序用if和else分别写入0和1;而当从DS18B20读数据时,uchar i,j,m,n; //读0和读1的时序根本一样,所以读0和读1的程序合二为一,不用分别写出bit dat;for(i=0;i<8;i++){ds=0;j++;j++;ds=1;j++;j++;dat=ds;j=8;while(j>0)j--;m=dat;//把一位数据赋给一个字节,且从最低位开始读数n=(m<<7)|(n>>1);}return n; //必须将n值返回去,以赋给a和b}void get_temp(){uchar a,b;init_ds();delay(1);tempwritebyte(0xcc);tempwritebyte(0xbe);a=tempreadbyte();b=tempreadbyte();temp=b;temp<<=8;temp=temp|a;f_temp=temp*0.0625*10+0.5;//保存一位小数,且最低位四舍五入temp=f_temp;//return temp;}void wr_data(date) {rs=1;rw=0;en=0;P0=date;delay(3);en=1;delay(3);en=0;}void wr_(uchar ) {rs=0;rw=0;en=0;P0=;delay(3);en=1;delay(3);en=0;}void lcd_init() {psb=1;wr_(0x30);delay(3);wr_(0x0c);delay(3);wr_(0x06);delay(3);// wr_(0x01);// delay(3);}void lcd_pos(uchar X,uchar Y){if(X==0)X=0x80;else if(X==1)X=0x90;else if(X==2)X=0x88;else if(X==3)X=0x98;wr_(X+Y);}void display()//显示第一行为 current temp: { //第二行为当前温度:uchar i; //第三行为 xxx摄氏度table[0]=temp/100+'0';table[1]=temp/10%10+'0';table[2]='.';table[3]=temp%10+'0';lcd_pos(2,2);for(i=0;i<4;i++)wr_data(table[i]);lcd_pos(2,4);i=0;while(table2[i]!='\0'){wr_data(table2[i]);i++;}lcd_pos(0,0);i=0;while(table0[i]!='\0'){wr_data(table0[i]);i++;}lcd_pos(1,0);i=0;while(table1[i]!='\0'){wr_data(table1[i]);i++;}}void main(){lcd_init();while(1){tempchange();get_temp();display();}}。

12864_ds18b20

12864_ds18b20
{
Init_DS18B20();
WriteOneChar(0xcc);//发跳过ROM命令
WriteOneChar(0x44);//发读开始转换命令
Init_DS18B20();
WriteOneChar(0xcc);//发跳过ROM命令
WriteOneChar(0xbe);//读寄存器,共九字节,前两字节为转换值
0x04,0x04,0x7E,0x01,0x40,0x7E,0x42,0x42,0x7E,0x42,0x7E,0x42,0x42,0x7E,0x40,0x00,
/*-- 文字: 度 --*/
/*-- 新宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x00,0xFC,0x24,0x24,0x24,0xFC,0x25,0x26,0x24,0xFC,0x24,0x24,0x24,0x04,0x00,
/*-- 文字: . --*/
(2)延时2微秒。
(3)将数据线拉低“0”。
(4)延时3微秒。
(5)将数据线拉高“1”。
(6)延时5微秒。
(7)读数据线的状态得到1个状态位,并进行数据处理。
(8)延时60微秒。
*/
uchar ReadOneChar(void)
{
uchar i;
uchar dat=0;
x3=temp%100/10; //个位
x4=temp%10; //小数
/* P2 = 0xf1; P0 = table[x1]; delay(x);//百
P2 = 0xf2; P0 = table[x2]; delay(x);//十
P2 = 0xf4; P0 = table1[x3]; delay(x);//个

12864串行显示DS18B20测得的温度

12864串行显示DS18B20测得的温度
{
uchar start_data,Hdata,Ldata;
if(start==0)
start_data=0xf8; //写指令
else
start_data=0xfa; //写数据
Hdata=onedata&0xf0; //取高四位
{
uchar i=0;
uchar dat = 0;
for (i=8;i>0;i--)
{
DS1820_DQ = 0; //将总线拉低,要在1us之后释放总线
dat>>=1; //让从总线上读到的位数据,依次从高位移动到低位。
DS1820_DQ = 1; //释放总线,此后DS18B20会控制总线,把数据传输到总线上
temp1=DS1820_ReadByte(); //读取温度值低位
temp2=DS1820_ReadByte(); //读取温度值高位
DS1820_Reset(); //DS1302 复位,表示读取结束
tt=((temp2<<8)|temp1)*6.25; //得到真实十进制温度值 //0.0625=xx, 0.625=xx.x, 6.25=xx.xx
delay(10); //延时是必须的
}
void initinal() //LCD字库初始化程序
{
write(0,0x30); //8 位介面,基本指令集
write(0,0x0c); //显示打开,光标关,反白关
write(0,0x01); //清屏,将DDRAM的地址计数器归零
Ldata=(onedata<<4)&0xf0; //取低四位

基于12864及18B20的温度液晶显示

基于12864及18B20的温度液晶显示

基于12864及18B20的温度液晶显示#include <reg52.h>#include <string.h>#include <stdlib.h>#include <stdio.h>#include <math.h>/*-------------------Define the register commandcode----------------------*/#define Disp_On 0x3f#define Disp_Off 0x3e#define Col_Add 0x40#define Page_Add 0xb8#define Start_Line 0xc0#define Lcd_Bus P0#define uchar unsigned char#define uint unsigned intuchar t1,t2,t3,ser;sbit DS=P2^2; /*----------与单片机的单总线接口--------*/uint temp; /*----------可变温度值------------------*/uchar flag1; /*----------温度正负标志----------------*/sbit Mcs=P3^7;sbit Scs=P2^4;sbit Enable=P3^4;sbit Di=P3^5;sbit RW=P3^6;sbit Lcd_Rst=P2^1;sbit DIO=P2^5;sbit DU=P2^6;sbit WE=P2^7;char code ezk[]={0xF8,0xFC,0x04,0xC4,0x24,0xFC,0xF8,0x00, // -0-0x07,0x0F,0x09,0x08,0x08,0x0F,0x07,0x00,0x00,0x10,0x18,0xFC,0xFC,0x00,0x00,0x00, // -1-0x00,0x08,0x08,0x0F,0x0F,0x08,0x08,0x00,0x08,0x0C,0x84,0xC4,0x64,0x3C,0x18,0x00, // -2-0x0E,0x0F,0x09,0x08,0x08,0x0C,0x0C,0x00,0x08,0x0C,0x44,0x44,0x44,0xFC,0xB8,0x00, // -3-0x04,0x0C,0x08,0x08,0x08,0x0F,0x07,0x00,0xC0,0xE0,0xB0,0x98,0xFC,0xFC,0x80,0x00, // -4-0x00,0x00,0x00,0x08,0x0F,0x0F,0x08,0x00,0x7C,0x7C,0x44,0x44,0xC4,0xC4,0x84,0x00, // -5-0x04,0x0C,0x08,0x08,0x08,0x0F,0x07,0x00,0xF0,0xF8,0x4C,0x44,0x44,0xC0,0x80,0x00, // -6-0x07,0x0F,0x08,0x08,0x08,0x0F,0x07,0x00,0x0C,0x0C,0x04,0x84,0xC4,0x7C,0x3C,0x00, // -7-0x00,0x00,0x0F,0x0F,0x00,0x00,0x00,0x00,0xB8,0xFC,0x44,0x44,0x44,0xFC,0xB8,0x00, // -8-0x07,0x0F,0x08,0x08,0x08,0x0F,0x07,0x00,0x38,0x7C,0x44,0x44,0x44,0xFC,0xF8,0x00, // -9-0x00,0x08,0x08,0x08,0x0C,0x07,0x03,0x00,/*------- ----0x30,0x30-----':'已改为'.'-----*/0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x06,0x00,0x00,0x00,};uchar code FirstPage[] ={0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x80,0x30,0x10,0x80,0x30,0x10,0x80 ,0xC8,0xB0,0xB0,0x76,0xC8,0xE8,0x76,0x99,0x7C,0x7E,0x9F,0x79,0x7C,0x7E,0x79,0x3E ,0x1C,0x09,0x37,0x13,0x09,0x0E,0x01,0x01,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x20,0x20,0x00,0x23,0x32,0x98,0x44,0x63,0x33,0x9C,0x23,0x75,0xCC ,0x03,0x25,0x34,0x1B,0x04,0x26,0x33,0x04,0x82,0x03,0x30,0x03,0x80,0x80,0x40,0x08 ,0x98,0x80,0x40,0x40,0x00,0x80,0x40,0xC0,0x00,0x00,0x00,0x80,0x80,0xC0,0xC0,0x00 ,0x00,0x80,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x20,0x60,0xC0,0x02,0x12,0x98,0xC0,0xCC,0x85,0x20,0xEC,0xF0,0xF9,0xE4,0xFC ,0xFC,0xFD,0xFE,0xFC,0xFC,0xFF,0xFE,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF ,0xFE,0xFF,0xFF,0xFE,0xFF,0xFF,0xFE,0xFC,0xFE,0xFE,0xF0,0xF8,0xF0,0xF0,0x20,0x00 ,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x0C,0x06,0x06,0x60,0x08,0x4D,0xED,0xF8,0xFE,0xFF,0xFF,0x1F,0x9F,0x9F,0x0F,0x67 ,0x63,0x01,0x00,0x48,0x6D,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xE7,0xF3 ,0x81,0xC9,0xED,0xE7,0xF3,0xE2,0xE0,0x31,0x69,0x2D,0xDF,0x8F,0xD7,0x93,0x03,0x0F ,0x0F,0x6E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x03,0x08,0x08,0x60,0xFF,0xFF,0xFF,0x7F,0xFF,0xFF,0x79,0xB6,0xB8,0x78,0x96,0x78 ,0x78,0x33,0x78,0x38,0x18,0x68,0x99,0xBB,0x1F,0x3F,0x1F,0x0F,0x3F,0x1F,0x0F,0x0F ,0x07,0x07,0x03,0x01,0x06,0x05,0x01,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x03,0x01,0x00,0x1B,0x01,0x00,0x06,0x00,0x00,0x06,0x00,0x04,0x04,0x01,0x00 ,0x02,0x03,0x00,0x04,0x04,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00};uchar code SecondPage[] = // 数据表64*64{0xFF,0x03,0x01,0x03,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF ,0xFF,0x01,0x01,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x01,0x01 ,0xFF,0xFF,0xFF,0x0F,0x03,0x01,0x39,0x19,0x39,0x39,0x39,0x19,0x19,0x09,0x1B,0xFF ,0xC1,0x81,0x8F,0x9F,0x9F,0x9F,0x9F,0x01,0x01,0x1F,0x9F,0x9F,0x9F,0x9F,0x81,0xC1 ,0xF3,0xFF,0xFF,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF ,0xFF,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00 ,0xFF,0xFF,0xFF,0x00,0x00,0x00,0xCF,0xCF,0xCF,0xCF,0xCF,0xCF,0xC0,0x60,0xF8,0xFF ,0x03,0x01,0x48,0xCC,0xCC,0xCC,0xCC,0x00,0x00,0x48,0xCC,0xCC,0xCC,0x48,0x01,0x01 ,0xCF,0xFF,0xFF,0xC0,0x80,0x80,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F ,0x9F,0x00,0x00,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xFC,0xFC ,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x78,0x78,0x78,0x78,0x78,0x78,0x00,0x00,0xC0,0xFF ,0x0F,0x06,0x44,0xE4,0xE4,0xE4,0xE4,0x00,0x00,0xE4,0xE4,0xE4,0xE4,0xE4,0x06,0x0E ,0xFF,0xFF,0xFF,0xCF,0xCF,0xCF,0xCF,0xCF,0xCF,0xCF,0xCF,0xCF,0xCF,0xCF,0xCF,0xCF ,0xCF,0xC0,0xC0,0xCF,0xCF,0xCF,0xCF,0xCF,0xCF,0xCF,0xCF,0xCF,0xCF,0xCF,0xCF,0xCF ,0xFF,0xFF,0xFF,0xC0,0xC0,0xE0,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,0xFF,0xFF ,0xC6,0xC0,0xE0,0xFF,0xFF,0xFF,0xFF,0xC0,0xC0,0xFF,0xFF,0xFF,0xFF,0xF0,0xC0,0xC4 ,0xFF,0xFF,0xFF,0xFF,0xE0,0x00,0x01,0x1F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F ,0x3F,0x7D,0x78,0x78,0x38,0x38,0x28,0x00,0x00,0x20,0x38,0x38,0x38,0x19,0x01,0x83 ,0xE7,0xFF,,0xF9,0x09,0x09,0xF9,0xFF,0xDB,0x89,0x89,0x89,0x89,0x89,0x89,0x89,0x89,0x19,0x39 ,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0xFE,0xFE,0xFE,0xFE,0xFF,0xFE,0xFE,0xFE ,0xFF,0xF1,0xE0,0xC0,0x8E,0x8E,0x8E,0x8E,0x8E,0x8E,0x8E,0x8E,0x8E,0x8F,0x1F,0x3F ,0x7F,0xFF,0xFF,0xDC,0x08,0x88,0x83,0x83,0x83,0x83,0x83,0x81,0x89,0x88,0x0C,0x8F ,0x8F,0x40,0x40,0xCF,0xFF,0x7B,0x33,0x13,0x93,0x93,0x81,0x81,0x91,0x91,0x18,0x3C ,0xFF,0xFF,0xFF,0xFF,0x3F,0x00,0x00,0xC0,0xC7,0xC7,0xC7,0xC7,0xC7,0xC7,0xC7,0xC7 ,0xC7,0xC7,0xE7,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x03,0x00,0xC0 ,0xFC,0xFF,0xFF,0xC0,0x80,0x18,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x00,0x80,0xFF ,0xFF,0x00,0x00,0xFF,0xFF,0xFC,0x80,0x01,0x1F,0x8F,0x07,0x23,0xF3,0xF3,0xF8,0xF8 ,0xFF,0xFF,0xFF,0xFF,0xF0,0xE0,0xC0,0xCF,0xCF,0xCF,0xCF,0xCF,0xCF,0xCF,0xCF,0xCF ,0x8F,0xCF,0xCF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF0,0xC0,0xC0 ,0xDF,0xFF,0xFF,0xDF,0xCF,0xC7,0xE7,0xE7,0xE7,0xE3,0xE3,0xE7,0xE7,0xC7,0xC7,0xCF ,0xC7,0xE0,0xF0,0xFF,0xFF,0xEF,0xC0,0xE0,0xFE,0xFF,0xFE,0xFC,0xF8,0xF1,0xE3,0xC7 ,0xFF,0xFF};/*------------------延时子程序-----------------------------*/void delay(uint t){uint i,j;for(i=0;i<t;i++)for(j=0;j<10;j++);}/*------------------写命令到LCD------------------------------*/void write_com(uchar cmdcode){Di=0;RW=0;Lcd_Bus=cmdcode;delay(0);Enable=1;delay(0);Enable=0;}/*-------------------写数据到LCD----------------------------*/void write_data(uchar Dispdata){Di=1;RW=0;Lcd_Bus=Dispdata;delay(0);Enable=1;delay(0);Enable=0;}/*------------------清除内存---------------*/void Clr_Scr(){uchar j,k;Mcs=1;Scs=1;write_com(Page_Add+0);write_com(Col_Add+0);for(k=0;k<8;k++){write_com(Page_Add+k);for(j=0;j<64;j++)write_data(0x00);}}/*---------------------指定位置显示8*16数字-----------------------*/ /* 使用全部ASCII字符x=(order-0x20)*16 *//*------------同时main中数字abcdef应分别加0x30--------------------*/void ez_disp(uchar pag,uchar col,uchar order){uchar i=0;uchar j=0;uint x;x=(order-0x30)*16;for(j=0;j<2;j++){write_com (Page_Add+pag+j);write_com (Col_Add+col);for(i=0;i<8;i++){write_data(ezk[x]);x++;}}}/*-----------------指定位置显示x*y的点阵图片-------------------*/ void Disp_Img(uchar pag,uchar col, uchar code *zk){uchar j=0,i=0;uchar k=0;for(j=0;j<8;j++){write_com (Page_Add+pag+j);write_com (Col_Add+col);for(i=0;i<64;i++)write_data(zk[64*j+i]);}}void dadian(uchar pag,uchar col,uchar x){uchar j=0,i=0;for(j=0;j<1;j++){write_com (Page_Add+pag+j);write_com (Col_Add+col);write_data(x);}}/*------------------初始化LCD屏--------------------------*/void init_lcd(){Lcd_Rst=0;delay(100);Lcd_Rst=1;delay(100);Mcs=1;Scs=1;delay(100);write_com(Disp_Off);write_com(Page_Add+0);write_com(Start_Line+0);write_com(Col_Add+0);write_com(Disp_On);}void Init_Com(void){TMOD = 0x20;PCON = 0x00;SCON = 0x50;TH1 = 0xFd;TL1 = 0xFd;TR1 = 1;}void dsreset(void) //send reset and initialization command {uint i;DS=0;i=103;while(i>0)i--;DS=1;i=4;while(i>0)i--;}bit tmpreadbit(void) //read a bit{uint i;bit dat;DS=0;i++; //i++ for delayDS=1;i++;i++;dat=DS;i=8;while(i>0)i--;return (dat);}uchar tmpread(void) //read a byte date{uchar i,j,dat;dat=0;for(i=1;i<=8;i++){j=tmpreadbit();dat=(j<<7)|(dat>>1); //读出的数据最低位在最前面,这样刚好一个字节在DAT里}return(dat);}void tmpwritebyte(uchar dat) //write a byte to ds18b20{uint i;uchar j;bit testb;for(j=1;j<=8;j++){testb=dat&0x01;dat=dat>>1;if(testb) //write 1{DS=0;i++;i++;DS=1;i=8;while(i>0)i--;}else{DS=0; //write 0i=8;while(i>0)i--;DS=1;i++;i++;}}}void readrom() //read the serial{uchar sn1,sn2;dsreset();delay(1);tmpwritebyte(0x33);sn1=tmpread();sn2=tmpread();}void tmpchange(void) //DS18B20 begin change{dsreset();delay(1);tmpwritebyte(0xcc); // address all drivers on bustmpwritebyte(0x44); // initiates a single temperature conversion}uint tmp() //get the temperature{float tt;uchar a,b;dsreset();delay(1);tmpwritebyte(0xcc);tmpwritebyte(0xbe);a=tmpread();b=tmpread();temp=b;temp<<=8; //two byte compose a int variable temp=temp|a;tt=temp*0.0625;temp=tt*10+0.5;return temp;}/******************************************************************** ***************//*-----------------------主程序--------------------------------*/main(){uchar a=0;uchar b=0;DU=0;WE=0;Clr_Scr();init_lcd();Init_Com();dsreset();readrom();while(1){tmp();ser=temp/10;SBUF=ser;tmpchange();delay(200);DIO=0;t1=temp/100;t2=temp%100/10;t3=temp%10;Mcs=1,Scs=0;#include <reg52.h>#include <string.h>#include <stdlib.h>#include <stdio.h>#include <math.h>/*-------------------Define the register commandcode----------------------*/#define Disp_On 0x3f#define Disp_Off 0x3e#define Col_Add 0x40#define Page_Add 0xb8#define Start_Line 0xc0#define Lcd_Bus P0#define uchar unsigned char#define uint unsigned intuchar t1,t2,t3,ser;sbit DS=P2^2; /*----------与单片机的单总线接口--------*/uint temp; /*----------可变温度值------------------*/uchar flag1; /*----------温度正负标志----------------*/sbit Mcs=P3^7;sbit Scs=P2^4;sbit Enable=P3^4;sbit Di=P3^5;sbit RW=P3^6;sbit Lcd_Rst=P2^1;sbit DIO=P2^5;sbit DU=P2^6;sbit WE=P2^7;char code ezk[]={0xF8,0xFC,0x04,0xC4,0x24,0xFC,0xF8,0x00, // -0-0x07,0x0F,0x09,0x08,0x08,0x0F,0x07,0x00,0x00,0x10,0x18,0xFC,0xFC,0x00,0x00,0x00, // -1-0x00,0x08,0x08,0x0F,0x0F,0x08,0x08,0x00,0x08,0x0C,0x84,0xC4,0x64,0x3C,0x18,0x00, // -2-0x0E,0x0F,0x09,0x08,0x08,0x0C,0x0C,0x00,0x08,0x0C,0x44,0x44,0x44,0xFC,0xB8,0x00, // -3-0x04,0x0C,0x08,0x08,0x08,0x0F,0x07,0x00,0xC0,0xE0,0xB0,0x98,0xFC,0xFC,0x80,0x00, // -4-0x00,0x00,0x00,0x08,0x0F,0x0F,0x08,0x00,0x7C,0x7C,0x44,0x44,0xC4,0xC4,0x84,0x00, // -5-0x04,0x0C,0x08,0x08,0x08,0x0F,0x07,0x00,0xF0,0xF8,0x4C,0x44,0x44,0xC0,0x80,0x00, // -6-0x07,0x0F,0x08,0x08,0x08,0x0F,0x07,0x00,0x0C,0x0C,0x04,0x84,0xC4,0x7C,0x3C,0x00, // -7-0x00,0x00,0x0F,0x0F,0x00,0x00,0x00,0x00,0xB8,0xFC,0x44,0x44,0x44,0xFC,0xB8,0x00, // -8-0x07,0x0F,0x08,0x08,0x08,0x0F,0x07,0x00,0x38,0x7C,0x44,0x44,0x44,0xFC,0xF8,0x00, // -9-0x00,0x08,0x08,0x08,0x0C,0x07,0x03,0x00,/*------- ----0x30,0x30-----':'已改为'.'-----*/0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x06,0x00,0x00,0x00,};uchar code FirstPage[] ={0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x80,0x30,0x10,0x80,0x30,0x10,0x80 ,0xC8,0xB0,0xB0,0x76,0xC8,0xE8,0x76,0x99,0x7C,0x7E,0x9F,0x79,0x7C,0x7E,0x79,0x3E ,0x1C,0x09,0x37,0x13,0x09,0x0E,0x01,0x01,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x20,0x20,0x00,0x23,0x32,0x98,0x44,0x63,0x33,0x9C,0x23,0x75,0xCC ,0x03,0x25,0x34,0x1B,0x04,0x26,0x33,0x04,0x82,0x03,0x30,0x03,0x80,0x80,0x40,0x08 ,0x98,0x80,0x40,0x40,0x00,0x80,0x40,0xC0,0x00,0x00,0x00,0x80,0x80,0xC0,0xC0,0x00 ,0x00,0x80,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00 ,0x00,0x20,0x60,0xC0,0x02,0x12,0x98,0xC0,0xCC,0x85,0x20,0xEC,0xF0,0xF9,0xE4,0xFC ,0xFC,0xFD,0xFE,0xFC,0xFC,0xFF,0xFE,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF ,0xFE,0xFF,0xFF,0xFE,0xFF,0xFF,0xFE,0xFC,0xFE,0xFE,0xF0,0xF8,0xF0,0xF0,0x20,0x00 ,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x0C,0x06,0x06,0x60,0x08,0x4D,0xED,0xF8,0xFE,0xFF,0xFF,0x1F,0x9F,0x9F,0x0F,0x67 ,0x63,0x01,0x00,0x48,0x6D,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xE7,0xF3 ,0x81,0xC9,0xED,0xE7,0xF3,0xE2,0xE0,0x31,0x69,0x2D,0xDF,0x8F,0xD7,0x93,0x03,0x0F ,0x0F,0x6E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x03,0x08,0x08,0x60,0xFF,0xFF,0xFF,0x7F,0xFF,0xFF,0x79,0xB6,0xB8,0x78,0x96,0x78 ,0x78,0x33,0x78,0x38,0x18,0x68,0x99,0xBB,0x1F,0x3F,0x1F,0x0F,0x3F,0x1F,0x0F,0x0F0x03,0x01,0x06,0x05,0x01,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x03,0x01,0x00,0x1B,0x01,0x00,0x06,0x00,0x00,0x06,0x00,0x04,0x04,0x01,0x00 ,0x02,0x03,0x00,0x04,0x04,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00};uchar code SecondPage[] = // 数据表64*64{0xFF,0x03,0x01,0x03,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF ,0xFF,0x01,0x01,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x01,0x01 ,0xFF,0xFF,0xFF,0x0F,0x03,0x01,0x39,0x19,0x39,0x39,0x39,0x19,0x19,0x09,0x1B,0xFF ,0xC1,0x81,0x8F,0x9F,0x9F,0x9F,0x9F,0x01,0x01,0x1F,0x9F,0x9F,0x9F,0x9F,0x81,0xC1 ,0xF3,0xFF,0xFF,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF ,0xFF,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00 ,0xFF,0xFF,0xFF,0x00,0x00,0x00,0xCF,0xCF,0xCF,0xCF,0xCF,0xCF,0xC0,0x60,0xF8,0xFF0x48,0xCC,0xCC,0xCC,0xCC,0x00,0x00,0x48,0xCC,0xCC,0xCC,0x48,0x01,0x01 ,0xCF,0xFF,0xFF,0xC0,0x80,0x80,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F,0x9F ,0x9F,0x00,0x00,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xFC,0xFC ,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x78,0x78,0x78,0x78,0x78,0x78,0x00,0x00,0xC0,0xFF ,0x0F,0x06,0x44,0xE4,0xE4,0xE4,0xE4,0x00,0x00,0xE4,0xE4,0xE4,0xE4,0xE4,0x06,0x0E ,0xFF,0xFF,0xFF,0xCF,0xCF,0xCF,0xCF,0xCF,0xCF,0xCF,0xCF,0xCF,0xCF,0xCF,0xCF,0xCF ,0xCF,0xC0,0xC0,0xCF,0xCF,0xCF,0xCF,0xCF,0xCF,0xCF,0xCF,0xCF,0xCF,0xCF,0xCF,0xCF ,0xFF,0xFF,0xFF,0xC0,0xC0,0xE0,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,0xFF,0xFF ,0xC6,0xC0,0xE0,0xFF,0xFF,0xFF,0xFF,0xC0,0xC0,0xFF,0xFF,0xFF,0xFF,0xF0,0xC0,0xC4 ,0xFF,0xFF,0xFF,0xFF,0xE0,0x00,0x01,0x1F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F ,0x3F,0x7D,0x78,0x78,0x38,0x38,0x28,0x00,0x00,0x20,0x38,0x38,0x38,0x19,0x01,0x83 ,0xE7,0xFF,0xFF,0x0B,0x09,0x19,0x99,0x99,0x99,0x99,0x99,0x99,0x19,0x09,0x09,0xF9 ,0xF9,0x09,0x09,0xF9,0xFF,0xDB,0x89,0x89,0x89,0x89,0x89,0x89,0x89,0x89,0x19,0x39 ,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0xFE,0xFE,0xFE,0xFE,0xFF,0xFE,0xFE,0xFE ,0xFF,0xF1,0xE0,0xC0,0x8E,0x8E,0x8E,0x8E,0x8E,0x8E,0x8E,0x8E,0x8E,0x8F,0x1F,0x3F ,0x7F,0xFF,0xFF,0xDC,0x08,0x88,0x83,0x83,0x83,0x83,0x83,0x81,0x89,0x88,0x0C,0x8F ,0x8F,0x40,0x40,0xCF,0xFF,0x7B,0x33,0x13,0x93,0x93,0x81,0x81,0x91,0x91,0x18,0x3C ,0xFF,0xFF,0xFF,0xFF,0x3F,0x00,0x00,0xC0,0xC7,0xC7,0xC7,0xC7,0xC7,0xC7,0xC7,0xC7 ,0xC7,0xC7,0xE7,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x03,0x00,0xC0 ,0xFC,0xFF,0xFF,0xC0,0x80,0x18,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x00,0x80,0xFF ,0xFF,0x00,0x00,0xFF,0xFF,0xFC,0x80,0x01,0x1F,0x8F,0x07,0x23,0xF3,0xF3,0xF8,0xF8 ,0xFF,0xFF,0xFF,0xFF,0xF0,0xE0,0xC0,0xCF,0xCF,0xCF,0xCF,0xCF,0xCF,0xCF,0xCF,0xCF0xCF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF0,0xC0,0xC0 ,0xDF,0xFF,0xFF,0xDF,0xCF,0xC7,0xE7,0xE7,0xE7,0xE3,0xE3,0xE7,0xE7,0xC7,0xC7,0xCF ,0xC7,0xE0,0xF0,0xFF,0xFF,0xEF,0xC0,0xE0,0xFE,0xFF,0xFE,0xFC,0xF8,0xF1,0xE3,0xC7 ,0xFF,0xFF};/*------------------延时子程序-----------------------------*/void delay(uint t){uint i,j;for(i=0;i<t;i++)for(j=0;j<10;j++);}/*------------------写命令到LCD------------------------------*/void write_com(uchar cmdcode){Di=0;RW=0;Lcd_Bus=cmdcode;delay(0);Enable=1;delay(0);Enable=0;}/*-------------------写数据到LCD----------------------------*/void write_data(uchar Dispdata){Di=1;RW=0;Lcd_Bus=Dispdata;delay(0);Enable=1;delay(0);Enable=0;}/*------------------清除内存---------------*/void Clr_Scr(){uchar j,k;Mcs=1;Scs=1;write_com(Page_Add+0);write_com(Col_Add+0);for(k=0;k<8;k++){write_com(Page_Add+k);for(j=0;j<64;j++)write_data(0x00);}}/*---------------------指定位置显示8*16数字-----------------------*/ /* 使用全部ASCII字符x=(order-0x20)*16 *//*------------同时main中数字abcdef应分别加0x30--------------------*/void ez_disp(uchar pag,uchar col,uchar order){uchar i=0;uchar j=0;uint x;x=(order-0x30)*16;for(j=0;j<2;j++){write_com (Page_Add+pag+j);write_com (Col_Add+col);for(i=0;i<8;i++){write_data(ezk[x]);x++;}}}/*-----------------指定位置显示x*y的点阵图片-------------------*/ void Disp_Img(uchar pag,uchar col, uchar code *zk){uchar j=0,i=0;uchar k=0;for(j=0;j<8;j++){write_com (Page_Add+pag+j);write_com (Col_Add+col);for(i=0;i<64;i++)write_data(zk[64*j+i]);}}void dadian(uchar pag,uchar col,uchar x){uchar j=0,i=0;for(j=0;j<1;j++){write_com (Page_Add+pag+j);write_com (Col_Add+col);write_data(x);}}/*------------------初始化LCD屏--------------------------*/ void init_lcd(){Lcd_Rst=0;delay(100);Lcd_Rst=1;delay(100);Mcs=1;Scs=1;delay(100);write_com(Disp_Off);write_com(Page_Add+0);write_com(Start_Line+0);write_com(Col_Add+0);write_com(Disp_On);}void Init_Com(void){TMOD = 0x20;PCON = 0x00;SCON = 0x50;TH1 = 0xFd;TL1 = 0xFd;TR1 = 1;}void dsreset(void) //send reset and initialization command {uint i;DS=0;i=103;while(i>0)i--;DS=1;i=4;while(i>0)i--;}bit tmpreadbit(void) //read a bit{uint i;bit dat;DS=0;i++; //i++ for delayDS=1;i++;i++;dat=DS;i=8;while(i>0)i--;return (dat);}uchar tmpread(void) //read a byte date{uchar i,j,dat;dat=0;for(i=1;i<=8;i++){j=tmpreadbit();dat=(j<<7)|(dat>>1); //读出的数据最低位在最前面,这样刚好一个字节在DAT里}return(dat);}void tmpwritebyte(uchar dat) //write a byte to ds18b20 {uint i;uchar j;bit testb;for(j=1;j<=8;j++){testb=dat&0x01;dat=dat>>1;if(testb) //write 1{DS=0;i++;i++;DS=1;i=8;while(i>0)i--;}else{DS=0; //write 0i=8;while(i>0)i--;DS=1;i++;i++;}}}void readrom() //read the serial{uchar sn1,sn2;dsreset();delay(1);tmpwritebyte(0x33);sn1=tmpread();sn2=tmpread();}void tmpchange(void) //DS18B20 begin change{dsreset();delay(1);tmpwritebyte(0xcc); // address all drivers on bustmpwritebyte(0x44); // initiates a single temperature conversion}uint tmp() //get the temperature{float tt;uchar a,b;dsreset();delay(1);tmpwritebyte(0xcc);tmpwritebyte(0xbe);a=tmpread();b=tmpread();temp=b;temp<<=8; //two byte compose a int variable temp=temp|a;tt=temp*0.0625;temp=tt*10+0.5;return temp;}/******************************************************************** ***************//*-----------------------主程序--------------------------------*/main(){uchar a=0;uchar b=0;DU=0;WE=0;Clr_Scr();init_lcd();Init_Com();dsreset();readrom();while(1){tmp();ser=temp/10;SBUF=ser;tmpchange();delay(200);DIO=0;t1=temp/100;t2=temp%100/10;t3=temp%10;Mcs=1,Scs=0;Disp_Img(0,a,SecondPage);a++;if(a==64)a=0;delay(50);Mcs=0;Scs=1;Disp_Img(0,b,FirstPage); // b++;// if(b==64)// b=0;// delay(50);ez_disp(6,12,t1);ez_disp(6,20,t2);ez_disp(6,28,':');ez_disp(6,36,t3);dadian(6,44,0x04);dadian(6,45,0x0a);dadian(6,46,0x04);}}。

多个18B20读取和12864显示 2

多个18B20读取和12864显示 2

自己用51单片机写的读取多个18B20温度并显示在12864上的实验程序,测试通过#include<reg51.h>#define u8 unsigned char#define u16 unsigned intsbit dq=P3^3;u16 sbuf;float t;bit n;void send_string(u8 *p);float t1,t2;//存放2个18b20 的温度//18b20u8 code id1[]={0x28,0x05,0x9d,0x06,0x03,0x00,0x00,0x43};//第一18b20的序列号u8 code id2[]={11111111};//第二18b20的序列号void delay_18b20(u8 x){for(;x>0;x--);}void delay(u16 x){while(x--);}void send_0(){dq=0;delay_18b20(12);dq=1;delay_18b20(0);}void send_1(){dq=0;delay_18b20(0);dq=1;delay_18b20(8);}void send_cmd(u8 cmd){u8 i;for(i=0;i<8;i++){if(cmd&0x01==0x01){send_1();}else{send_0();}cmd>>=1;}}u8 receive_8bit(){u8 d;u8 i;for(i=0;i<8;i++){dq=0;dq=0;dq=0;dq=1;d>>=1;if(dq==1){d|=0x80;}delay_18b20(10);}return d;}u8 start(){u16 k;k=0;dq=0;delay_18b20(120);dq=1;while(dq==1){k++;if(k>=6000){return 1;}}k=0;while(dq==0){k++;if(k>=6000){return 2;}}return 0;}void send_id(u8 *id) //向DS18B20发送序列号{u8 i;for(i=0;i<8;i++){send_cmd(*id++);}}//读温度float read_ds18b20(u8 *id){u8 k;u8 tH,tL;u16 d;k=start();if(k!=0){send_string("错误");return 0;}send_cmd(0x55);//("匹配序列号");send_id(id);send_cmd(0x44);delay(5000);start();send_cmd(0x55);send_id(id);send_cmd(0xbe);tL=receive_8bit();tH=receive_8bit();d=tH;d<<=8;d|=tL;t=d*0.0625;return t;}//18b20void serial_int(){TMOD|=0x20;TH1=250;TL1=250;TR1=1;SM0=0;SM1=1;SM2=0;REN=1;}void end(){EA=1;ES=1;}void send_end() interrupt 4{if(RI==1){RI=0;sbuf=SBUF;if((sbuf=='1')|(sbuf=='2')){n=1;}}}void send_byte(u8 x) //底层驱动{SBUF=x;//启动发送while(TI==0);//等待数据发送完成TI=0;}void send_string(u8 *p){while(*p)send_byte(*p++);}void send_temp(float t){u16 tt;tt=(u16)(t*10);send_byte(tt/1000+48);send_byte(tt%1000/100+48);send_byte(tt%100/10+48);send_byte(tt%10+48);}//18b20void main(){serial_int();send_byte(12);send_string("串口初始化完成...\r\n");send_string("单总线访问两只DS18B20...\r\n");send_string("请按键盘 1 或2 分别读取两只DS18B20的温度...\r\n"); end();while(1){t1=read_ds18b20(id1);delay(5000);t2=read_ds18b20(id2);delay(5000);if(n==1){n=0;if(sbuf=='1'){send_string("\r\nt1=");send_temp(t1);send_string("度");}if(sbuf=='2'){send_string("\r\nt2=");send_temp(t2);send_string("度");}}}}。

单片机12864LCD、DS1302、DS18B20

单片机12864LCD、DS1302、DS18B20

用汇编写了那么多程序,马上就要用C了,所以做一个我近期在单片机上用汇编写代码的心得和一些自认为有用的程序。

主要是近期自学过的模块,比如protues中的AMPIRE128X64—LCD,DS18B20—温度测量模块,DS1302—时钟芯片。

好啦,废话也不多说了,注意我是按照我写程序的规范来写的,不过很容易理解,我也希望能帮助更多的单片机爱好者。

AMPIRE128X64一、Protues上LCD与单片机相连如图:二、打开keil新建一个AT89C51单片机的工程。

建立如下工程12864.A51用于存放驱动程序,方便调用。

main.a51用于存放主程序。

如果想知道这款LCD的详细信息可去百度文库搜索。

三、以下是12864.A51内的驱动程序,有详细解说。

PUBLICDISPLAY_BMP,DISPLAY_LCD,CLEAR_SCREEN,CHEC_BUSY,WRITE_IR,WRITE_DR,INIT_LCD,SELECT_SCREEN,SET_LINE;以上是声明外部调用语句,后面的子程序可被本工程的其它文件调用CODE_12864 SEGMENT CODE ;声明代码段LCD_RS BIT P2.2LCD_RW BIT P2.1LCD_E BIT P2.0LCD_CS1 BIT P2.4 ;低电平有效,左半屏LCD_CS2 BIT P2.3 ;低电平有效,右半屏ZIMO_NUM EQU 37H ;取字模的大小数;;;;;;;;;;;;;;;;;;;;;;;;;RSEG CODE_12864 ;;;;;;;;;;;;;;;;;;;;;;;;;检查忙等待CHEC_BUSY: MOV P0,#00H;;;;;;;;;;;;;;;;CLR LCD_RSSETB LCD_RWSETB LCD_E;详细资料里有这种命令;;;;;;;;;;;;;;;后面的就不细说了JB P0.7,$CLR LCD_ERET;;;;;;;;;;;;;;;;;;;;;;;;;向指令寄存器传送指令,传送参数为AWRITE_IR: LCALL CHEC_BUSYCLR LCD_RSCLR LCD_RWMOV P0,A ;P0作为数据口SETB LCD_ENOPNOPCLR LCD_ERET;;;;;;;;;;;;;;;;;;;;;;;;;向数据寄存器传送指令,传送参数为AWRITE_DR: LCALL CHEC_BUSYSETB LCD_RSCLR LCD_RWMOV P0,ASETB LCD_ENOPNOPCLR LCD_ERET;;;;;;;;;;;;;;;;;;;;;;;;;设置"页"LCD12864共8页,一页是8行点阵点SET_PAGE: ORL A,#0B8H ;页的首地址为0xB8LCALL WRITE_IRRET;;;;;;;;;;;;;;;;;;;;;;;;;设置显示的起始行SET_LINE: ORL A,#0C0H ;起始行地址为0xC0LCALL WRITE_IR;设置从哪行开始:共0--63;一般从0 行开始显示RET;;;;;;;;;;;;;;;;;;;;;;;;;设置显示的列SET_COLUMN: ANL A,#3FH ;列的最大值为64ORL A,#40H ;列的首地址为0x40LCALL WRITE_IR;规定显示的列的位置RET;;;;;;;;;;;;;;;;;;;;;;;;;显示开关函数:0x3E是关显示,0x3F是开显示SET_ON_OFF: ORL A,#3EH ;0011 111x,onoff只能为0或者1LCALL WRITE_IRRET;;;;;;;;;;;;;;;;;;;;;;;;;选择屏幕SELECT_SCREEN: CJNE A,#0,SELECTN0;0全屏CLR LCD_CS1CLR LCD_CS2LJMP SELECT_ENDSELECTN0: CJNE A,#1,SELECTN1;1左半屏CLR LCD_CS1SETB LCD_CS2LJMP SELECT_ENDSELECTN1: CJNE A,#2,SELECT_END;2右半屏CLR LCD_CS2SETB LCD_CS1SELECT_END: RET;;;;;;;;;;;;;;;;;;;;;;;;;清屏函数CLEAR_SCREEN: LCALL SELECT_SCREEN;0--全屏;1---左半屏;2---右半屏MOV R7,#0 ;控制页数0-7,共8页CLR_K1: MOV A,R7LCALL SET_PAGEMOV A,#0LCALL SET_COLUMNMOV R6,#0 ;控制列数0-63,共64列CLR A ;0CLR_K0: LCALL WRITE_DR;写入0,地址指针自加1INC R6CJNE R6,#64,CLR_K0INC R7CJNE R7,#8,CLR_K1RET;;;;;;;;;;;;;;;;;;;;;;;;;LCD的初始化INIT_LCD: LCALL CHEC_BUSYCLR A;选择全屏LCALL SELECT_SCREENCLR A;关闭显示LCALL SET_ON_OFFCLR A;选择全屏LCALL SELECT_SCREENMOV A,#01H;开启显示LCALL SET_ON_OFFCLR A;选择全屏LCALL SELECT_SCREENCLR A;清屏LCALL CLEAR_SCREENCLR A;开始行0LCALL SET_LINERET ;;;;;;;;;;;;;;;;;;;;;;;;;显示汉字子程序DISPLAY_LCD:;R5传入那半屏显示,R6传入页,R7传入列,DPTR传入字模表MOV A,R5LCALL SELECT_SCREEN;选择屏幕MOV A,R6LCALL SET_PAGE;选上半页MOV A,R7LCALL SET_COLUMN;控制列MOV R5,#0 ;控制16列的数据输出DISP_K0: MOV A,R5MOVC A,@A+DPTRLCALL WRITE_DR;选择查出的字模INC R5CLR CMOV A,R5SUBB A,ZIMO_NUMJNZ DISP_K0MOV A,R6INC ALCALL SET_PAGE;选下半页MOV A,R7LCALL SET_COLUMN;控制列MOV R5,#0 ;控制16列的数据输出DISP_K1: MOV A,R5ADD A,ZIMO_NUMMOVC A,@A+DPTRLCALL WRITE_DR;选择查出的字模INC R5CLR CMOV A,R5SUBB A,ZIMO_NUMJNZ DISP_K1RET ;;;;;;;;;;;;;;;;;;;;;;;;;显示BMP图片DISPLAY_BMP:;DPTR为图片取模表首址MOV R7,#0DISP_BMP_K2: MOV A,#1LCALL SELECT_SCREEN;选择左半屏MOV A,R7LCALL SET_PAGE;选择页CLR ALCALL SET_COLUMN;选择第0列MOV R6,#0DISP_BMP_K0: CLR A;MOVC A,@A+DPTRLCALL WRITE_DR;每隔一行取一次数组中的数据INC R6INC DPTRCJNE R6,#64,DISP_BMP_K0MOV A,#2LCALL SELECT_SCREEN;选择右半屏MOV A,R7LCALL SET_PAGE;选择页CLR ALCALL SET_COLUMN;选择第0列MOV R6,#0DISP_BMP_K1: CLR A;MOVC A,@A+DPTRLCALL WRITE_DR;每隔一行取一次数组中的数据INC R6INC DPTRCJNE R6,#64,DISP_BMP_K1INC R7CJNE R7,#8,DISP_BMP_K2RET ;;;;;;;;;;;;;;;;;;;;;;;;;END四、下面介绍一款LCD取模软件。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit RS=P2^2;
sbit RW=P2^3;
sbit E=P2^4;
sbit DQ=P1^7; //ds18b20与单片机连接口uint tvalue; //温度值
uchar tflag; //温度正负标志
bit ReadTempFlag;
void Init_Timer0();
uchar code tabwendu[]="温度: . C"; void init();
void display();
void ds1820disp();
void tabwendu(uchar add,uchar date);
void delay(unsigned int ms) //延时1毫秒{
unsigned int i,j;
for(i=0;i<ms;i++)
for(j=0;j<100;j++);
}
void delay_18B20(unsigned int i)//延时1微秒{
while(i--);
}
void write_com(uchar con)
{
RS=0;
RW=0;
P0=con;
delay(50);
E=1;
delay(50);
E=0;
}
void write_date(uchar date)
{
RS=1;
RW=0;
P0=date;
delay(5);
E=1;
delay(5);
E=0;
}
void init()
{
uchar i;
write_com(0x30);
delay(5);
write_com(0x0c);
delay(5);
write_com(0x01);
delay(5);
write_com(0x98);
for(i=0;i<16;i++)
{
write_date(tabwendu[i]);
delay(1);
}
}
/*****ds1820复位******/
void ds1820rst()
{
unsigned char x=0;
DQ = 1; //DQ复位
delay_18B20(4); //延时
DQ = 0; //DQ拉低
delay_18B20(100); //精确延时大于480us
DQ = 1; //拉高
delay_18B20(40);
}
uchar ds1820rd()/*读数据*/
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; //给脉冲信号
dat>>=1;
DQ = 1; //给脉冲信号
if(DQ)
dat|=0x80;
delay_18B20(10);
}
return(dat);
}
/***********写数据**********/
void ds1820wr(uchar wdata)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = wdata&0x01;
delay_18B20(10);
DQ = 1;
wdata>>=1;
}
}
/***读取温度值并转换***/
read_temp()
{
uchar a,b;
ds1820rst();
ds1820wr(0xcc); //*跳过读序列号*/
ds1820wr(0x44); //*启动温度转换*/
ds1820rst();
ds1820wr(0xcc); //*跳过读序列号*/
ds1820wr(0xbe); //*读取温度*/
a=ds1820rd();
b=ds1820rd();
tvalue=b;
tvalue<<=8;
tvalue=tvalue|a;
tvalue=tvalue*0.0625*10; //温度值扩大10倍,精确到1位小数return(tvalue);
}
/*******************************************************************/ void ds1820disp() //温度值显示
{
uchar shi;
uchar ge;
uchar flagdat;
bai=tvalue/100; //百位数
shi=(tvalue%100)/10; //十位数
ge=(tvalue%100)%10; //个位数
if(tflag==0)
flagdat=0x20; //正温度不显示符号
else
flagdat=0x2d; //负温度显示负号:-
}
/*------------------------------------------------
定时器初始化子程序
------------------------------------------------*/
void Init_Timer0(void)
{
TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
//TH0=0x00; //给定初值
//TL0=0x00;
EA=1; //总中断打开
ET0=1; //定时器中断打开
TR0=1; //定时器开关打开
}
/*------------------------------------------------
定时器中断子程序
------------------------------------------------*/
void Timer0_isr(void) interrupt 1
{
static unsigned int num;
TH0=(65536-2000)/256; //重新赋值2ms
TL0=(65536-2000)%256;
num++;
if(num==300) //
{
num=0;
ReadTempFlag=1; //读标志位置1
}
}
void display()
{
uchar bai;
uchar ge;
bai=tvalue/100; //百位数shi=(tvalue%100)/10; //十位数
ge=(tvalue%100)%10; //个位数write_com(0x9b);
write_date(0x30+bai);
delay(1);
write_com(0x9c);
write_date(0x30+shi);
delay(1);
write_com(0x9e);
write_date(0x30+ge);
delay(1);
// write_com(0x80);
//write_date(0x2e);
}
void main()
{
// uchar i;
init(); //初始化液晶
Init_Timer0();
// ds1820rst();
while (1) //主循环
{
if(ReadTempFlag==1)
{
ReadTempFlag=0;
read_temp() ;
display();
ReadTempFlag=0;
}
}
}。

相关文档
最新文档