基于单片机的万年历加温度显示设计(10)

2019-08-26 18:23

wr_com_12((0x90|x)+8); }

/************************************** 12864 显示字符串

***************************************/ void print_string(uchar *s) { while(*s!='\\0') { wr_dat_12(*s); s++; } }

/**************************************** 12864 清屏

****************************************/ void clear_12( ) { wr_com_12(0x01); //清楚显示 将DDRAM填满―20H‖(空格), //并设定CGRAM位址到位址计数器AC为0 }

/****************************************** 12864 液晶初始化

******************************************/ void init_12( ) { // psb_12 = 1; wr_com_12(0x06); //光标的移动方向 游标右移,DDRAM地址计数器(AC)加1 wr_com_12(0x0c); // 开显示,关游标,正常显示 wr_com_12(0x30); //功能设定:8位接口 clear_12(); }

/********************************************* 18B20程序部分

***********************************************/ uchar temp_buf[5]={1,0,'.',0,'\\0'}; uchar flag; sbit dp = P0^1;

/********************************* 延迟 大约8us

************************************/ void delay_us(uint y) { while (y--)

41

{

_nop_(); _nop_(); } }

/****************************************** DS18B20 初始化

********************************************/ void init_1820() { dp = 1; delay_us(1); //拉高一段时间 dp = 0; delay_us(260); //拉低大约480us dp = 1; while(dp); // 检测是否复位成功或DS18B20是否存在 delay_us(70); dp = 1; }

/*************************************** 写操作,每次写入一个dat

****************************************/ void wr_1820(uchar dat) { uchar i; for(i=0;i<8;i++) { dp = 0; delay_us(1); dp = dat&0x01; delay_us(70); dp = 1; dat = dat>>1; } }

/**************************************** 读操作,每次返回16位数据

******************************************/ uint re_1820() { uchar i; uint dat; for(i=0;i<16;i++) {

42

dp = 0; delay_us(1); dp = 1; if(dp) { dat = (dat>>1)|0x8000; } else dat = dat>>1; dp=1; delay_us(60); } return(dat); }

/***********************************************************

读取温度函数,返回温度的绝对值,并标注flag,flag=1表示负,flag=0表示正 **********************************************************/ uint readtemp() { uint temp; float m; init_1820(); wr_1820(0xcc); wr_1820(0x44); init_1820(); wr_1820(0xcc); wr_1820(0xbe); temp = re_1820(); if(temp > 0xfff) { flag = 1; temp = (~temp)+1; } else { flag = 0; } m = temp*0.0625; temp = m*10+0.5; return(temp); }

/******************************************* 温度读取及处理函数

******************************************/

43

void gettemp() { uint tem; tem = readtemp(); temp_buf[0] = tem/100 + '0'; temp_buf[1] = tem0/10 + '0'; temp_buf[2] = '.'; temp_buf[3] = tem + '0'; temp_buf[4] = '\\0'; }

/******************************************************************** 显示温度函数

********************************************************************/ void print_tem(uchar x,uchar y) { goto_xy_12(x,y); print_string(temp_buf); goto_xy_12(x+2,y); print_string(\℃\}

/******************************************************* DS1302 程序部分

****************************************************/ sbit ds_1302 = P1^0; // 定义数据线 sbit clk_1302 = P4^2; // 定义时钟线 sbit rst_1302 = P1^1; // 定义复位线-

uchar second,minute,hour,year,month,day,week; //定义 秒,分,时,年,月,日 ,星期

uchar date_buf[13] = {'2','0',0,0,'-',0,0,'-',0,0,'\\0' }; // 2011/10/12 为什么后面括号不能缩进呢 uchar time_buf[9] = {0,0,':',0,0,':',0,0,'\\0' }; //24:12:12 uchar week_buf[2] = {'0','\\0'}; //星期

/******************************************************************** 延时x个us

********************************************************************/ void delayus_1302( ) { _nop_(); _nop_(); }

/************************************************ 向DS1302 写数据

**********************************************/ void write_byte1302(uchar dat) { uchar i;

44

clk_1302 = 0; for(i=0;i<8;i++) { ds_1302 = dat&0x01; delayus_1302( ); clk_1302 = 1; delayus_1302( ); clk_1302 = 0; dat = dat>>1; } }

/******************************************************************** 从DS1302 读数据

********************************************************************/ uchar read_byte1302( ) { uchar i,dat; delayus_1302( ); for(i=0;i<8;i++) { dat = dat>>1; if(ds_1302==1) dat = dat|0x80; clk_1302 = 1; delayus_1302( ); clk_1302 = 0; delayus_1302( ); } return dat; }

/*************************************** 向地址DS1302中写数据

入口参数: com命令字, dat 数据

*******************************************/ void write1302(uchar com,uchar dat) { rst_1302= 0; clk_1302 = 0; rst_1302 = 1; delayus_1302( ); write_byte1302(com); write_byte1302(dat); clk_1302 = 1; rst_1302 = 0;

45


基于单片机的万年历加温度显示设计(10).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:2017-2022年中国主题地产行业市场发展现状及十三五投资价值评估

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: