//1602液晶屏 万年历时钟源程序---加温度、背光、灰度 数字?/********************************************************************************************程序名: 1602液晶屏时钟程序 编写时间:2012年6月8日硬件支持:LCD1602液晶屏 STC12C2052外部12MHZ晶振 说明备注: 使用2402液晶屏程序,与1602液晶屏程序完全兼容2011-11-18 23:36 实现NPN13001三极管控制背光,P3^7接10K限流电阻。2011-11-19 10:10 添加调年月日时间功能键2011-11-20 08:25 添加闹铃功能2011-11-20 18:00 添加PWM调光功能2011-11-21 22:00 实现4位总线_2行显示2011-11-23 20:33 加入温度显示ds18b02 不加上拉电阻也可以2011-11-26 13:40 实验用一个按键实现长短两种开关代替两个按键2011-12-11 14:50 加入正负号判断 小数点显示温度,更精确2011-12-18 23:36 实现NPN13001三极管控制灰度,P3^5接10K限流电阻准备加入光控背光 LED测光原理应用 有光无背光,外界光线暗 有背光。/********************************************************************************************/#include //头文件#include /********************************************************************************************/typedef unsigned char uint8; // 无符号8位整型变量 //#define uchar unsigned char#define uint unsigned int/********************************************************************************************// 引脚定义 // (使用者根据实际更改)/********************************************************************************************/sbit key1=P3^0; //菜单sbit key2=P3^1; //调增unsigned char data MENU = 0; // 默认菜单 = 0 正常显示时钟/*******************************************************************************************//********************************************18b20******************************************/sbit DQ=P1^0; //温度输入端口 //uchar temp; //温度值变量8位uint temp; //温度值变量16位uchar s; //负数标志 s=1//**************延时b*******************void delay(uchar b){while (b--){_nop_(); _nop_();}}//**************初始化************************void init_ds18b20(void){uchar n;DQ=1;delay(60); // 15-60usDQ=0;delay(240);delay(240); //480-960usDQ=1;delay(60);n=DQ; //采集数据 n=1 有无器件delay(60);}//**************写1个字节数据*低位在前*********************************void write_byte(uchar dat){uchar i;for(i=0;i<8;i++){DQ=0;delay(1);DQ=dat&0x01;delay(60);DQ=1;dat>>=1;}delay(60);}//***************读1个字节数据*********************************uchar read_byte(void){uchar i,value;for(i=0;i<8;i++){DQ=0;value>>=1;DQ=1;delay(1);if(DQ)value|=0x80;delay(60);}return value;}//******************读取温度值******************************uchar readtemperature(void){uchar a,b; float tt; //浮点变量 有小数计算init_ds18b20(); //初始化write_byte(0xcc); //写指令 跳过ROMwrite_byte(0x44); //写指令 启动温度测量delay(300); //延时init_ds18b20(); //初始化write_byte(0xcc); //写指令 跳过ROMwrite_byte(0xbe); //写指令 读取温度数据a=read_byte(); //读取低8位b=read_byte(); //读取高8位//判断正负温度: 负数就取补码if(b>127) // 当高8位的第8位为1时,就是负值 1000 0000 0x80 128{a=~a+1; // 当为负值的时候,低8位的操作if(~a>=0xff) // 当低8位