使用LCD1602、DS1302时钟芯片、DS18B20温度传感器完成该日历
/***********************************************************************************/ /************使用LCD1602、DS1302时钟芯片、DS18B20温度传感器完成该日历**************/ #include
void write_com(uchar com); //LCD写命令 void write_date(uchar date); //LCD写数据 uint get_temp(); //获得温度 void tempchange(void); //转换温度 void dsreset(void); //DS18B20复位 bit tempreadbit(void); //读DS118B20一位
uchar tempreadbyte(void); //读DS18B20一个字节 void tempwritebyte(uchar dat); void deal(); //温度处理函数
void Write_Ds1302_Byte(uchar temp);//写入一个字节 void Write_Ds1302(uchar address,uchar dat);//写入 uchar Read_Ds1302 ( uchar address ); //读取时间 void Read_RTC(void); //读取 日历
void Set_RTC(void); //设定 日历 void time_date(); //时间数据处理
void display(uchar *lp,uchar lc); //显示时间 void Temp_Display(); //温度显示 uchar table[]=%uchar table0[]=\
uchar table1[]=%uchar table2[]=\
uchar l_tmpdate[7]={21,59,23,28,10,2,8};
/*初始化时钟芯片,依次是秒分时日月星期年,用十六进制表示十进制,如0x1c表示
1*16+12即28,所以显示出来的就是28*/ uchar l_tmpdisplay[18];
code uchar write_rtc_address[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c}; //以上是写入时钟芯片的地址,顺序同上
code uchar read_rtc_address[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d}; //读出数据的地址
/******************************日历主函数************************************/ void main() {
init(); //初始化LCD Set_RTC();//初始化时钟芯片 while(1) {
tempchange();//温度转换命令 time_date();//显示时间 Temp_Display(); //显示温度 deal(); //温度处理 P1=0xf0;
IT0=1; // 选择外部中断0为电平触发方式(1为跳变沿触发方式) EX0=1; EA=\
} }
void inter0() interrupt 0 //外部中断0 { P1=0xfe; if(P1!=0xfe)
delay(10); if(P1==0xee) { led=~led; write_com(0x1c); }
if(P1==0xde) { led=~led; write_com(0x18); } }
/***************************以下为温度传感器相关程序************************/ void dsreset(void) //DS18B20复位,初始化函数 { uint i; ds=0; i=103; while(i>0)i--; ds=1; i=4;
while(i>0)i--; }
bit tempreadbit(void) //读一位数据函数 { uint i; bit dat;
ds=0;i++; //i++起延时的作用 ds=1;i++;i++; dat=ds; i=8;while(i>0)i--; return(dat); }
uchar tempreadbyte(void) //读一个字节数据函数 {
uchar i,j,dat; dat=0;
for(i=1;i<=8;i++) {
j=tempreadbit();
dat=(j<<7)|(dat>>1); //读出的数据最低位在最前面 }
return(dat); }
void tempwritebyte(uchar dat) { //写一个字节数据函数 uint i; char j; bit testb; for(j=1;j<=8;j++) {
testb=dat&0x01; dat=dat>>1; if(testb) //写1 { ds=0; i++;i++; ds=1;
i=8;while(i>0)i--; }
else //写0
{ ds=0;
i=8;while(i>0)i--; ds=1; i++;i++; } } }
void tempchange(void) //DS18B20开始获取温度并转换 {
dsreset(); delay(1);
tempwritebyte(0xcc); //写跳过读ROM指令 tempwritebyte(0x44); //写温度转换指令 }
uint get_temp() //读取寄存器中存储的温度数据 {
uchar a,b; dsreset(); delay(1);
tempwritebyte(0xcc);
tempwritebyte(0xbe); //读RAM内部9字节的温度数据 a=tempreadbyte(); //读低8位 b=tempreadbyte(); //读高8位 temp=b; temp<<=8;
temp=temp|a; //两个字节组合为一个字节
f_temp=temp*0.0625; // 温度在寄存器中为12位,分辨率为0.0625 temp=f_temp*10+0.5; //乘以10表示小数点后面只取1位,加0.5时四舍五入
f_temp=f_temp+0.05; return temp; }