main.c
#include#include #include #include #define uchar unsigned char #define uint unsigned int uchar code Write_addr [] ={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};//写地址 uchar code Read_addr [] = {0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};//读地址 uchar Time [7] = {0x50,0x59,0x23,0x07,0x06,0x02,0x22};//初始值设置 // 秒 分 时 日 月 星期 年 //-----------------------------------变量区--------------------------------- uint Temp;//温度变量 //-----------------------------------函数区--------------------------------- void Int_DS1302() { uchar i; Write_Ds1302_Byte( 0x8e,0x00 ); for(i = 0;i < 8;i++) { Write_Ds1302_Byte( Write_addr [i],Time [i] ); } Write_Ds1302_Byte( 0x8e,0x80 ); } void Read_DS1302_Time() { uchar i; for(i = 0;i<8;i++) { Time [i] = Read_Ds1302_Byte( Read_addr [i] ); } } void Display_Time() { LCD_ShowNum(2,15,Time [0]%16,1); LCD_ShowNum(2,14,Time [0]/16,1); LCD_ShowChar(2 ,13,':'); LCD_ShowNum(2,12,Time [1]%16,1); LCD_ShowNum(2,11,Time [1]/16,1); LCD_ShowChar(2 ,10,':'); LCD_ShowNum(2,9,Time [2]%16,1); LCD_ShowNum(2,8,Time [2]/16,1); LCD_ShowChar(2 ,7,'-'); LCD_ShowNum(2,6,Time [3]%16,1); LCD_ShowNum(2,5,Time [3]/16,1); LCD_ShowChar(2 ,4,'-'); LCD_ShowNum(2,3,Time [4]%16,1); LCD_ShowNum(2,2,Time [4]/16,1); } void main() { Int_DS1302(); LCD_initial(); while(1) { Read_DS1302_Time(); Temp = Read_Temp(); string(0x82,"Temp"); LCD_ShowChar(1 ,7,':'); LCD_ShowChar(1 ,11,'C'); LCD_ShowNum(1,8,Temp,3);//第一行直接显示温度占四个单元格 //---------------------------------显示时间---------------------------------------- Display_Time(); } }
onewire.c
#include "reg52.h" #include#define uchar unsigned char #define uint unsigned int sbit DQ = P3^3; //单总线接口 //单总线延时函数 void Delay_OneWire(unsigned int t) //STC89C52RC { while(t--); } //通过单总线向DS18B20写一个字节 void Write_DS18B20(unsigned char dat) { unsigned char i; for(i=0;i<8;i++) { DQ = 0; DQ = dat&0x01; Delay_OneWire(12); DQ = 1; dat >>= 1; } Delay_OneWire(5); } //从DS18B20读取一个字节 unsigned char Read_DS18B20(void) { unsigned char i; unsigned char dat; for(i=0;i<8;i++) { DQ = 0; dat >>= 1; DQ = 1; if(DQ) { dat |= 0x80; } Delay_OneWire(5); } return dat; } //DS18B20设备初始化 bit init_ds18b20(void) { bit initflag = 0; DQ = 1; Delay_OneWire(12); DQ = 0; Delay_OneWire(80); DQ = 1; Delay_OneWire(10); initflag = DQ; Delay_OneWire(5); return initflag; } uint Read_Temp() { uint high,low,Date_T; init_ds18b20(); Write_DS18B20(0xcc); Write_DS18B20(0x44); Delay_OneWire(225); init_ds18b20(); Write_DS18B20(0xcc); Write_DS18B20(0xbe); low = Read_DS18B20(); high = Read_DS18B20(); Date_T = high<<8; Date_T = Date_T+low; Date_T = Date_T * 0.0625+0.5;// return Date_T; }
onewire.h
#ifndef __ONEWIRE_H #define __ONEWIRE_H #define uchar unsigned char #define uint unsigned int unsigned char rd_temperature(void); //; ; unsigned char Read_DS18B20(void); void Write_DS18B20(unsigned char dat); bit init_ds18b20(void); uchar Read_Temp(void); #endif
LCD.c
#include#include #define uchar unsigned char #define uint unsigned int #define out P2 sbit rs = P1^5; sbit rw = P1^4; sbit e = P1^3; void delay(uint j) { uchar i=250; for(;j>0;j--) { while(--i); i=249; while(--i); i=250; } } void check_busy(void) { uchar dt; do { dt=0xff; e=0; rs=0; rw=1; e=1; dt=out; }while(dt&0x80); e=0; } void write_command(uchar com)//写命令 { check_busy(); e=0; rs=0; rw=0; out=com; e=1; _nop_(); e=0; delay(1); } void write_data(uchar dat)//写数据 { check_busy(); e=0; rs=1; rw=0; out=dat; e=1; _nop_(); e=0; delay(1); } void LCD_initial(void)//初始化 { delay(2); write_command(0x38); delay(1); write_command(0x38); write_command(0x08); write_command(0x01); write_command(0x06); write_command(0x0c); //delay(1); } void string(uchar ad,uchar *s)//显示字符 { write_command(ad); while(*s>0) { write_data(*s++); delay(100); } } int LCD_Pow(uint x,uint y)// { unsigned char i = 0; int result = 1; for(i=0;i 0;i--) { write_data('0'+Num/LCD_Pow(10,i-1)%10); } } void LCD_ShowChar(unsigned char Line , unsigned char Columu , unsigned char Char)//写一个字符 { LCD_SetCursor(Line,Columu); write_data(Char); }
LCD.h
#ifndef __LCD_H__ #define __LCD_H__ #define uchar unsigned char #define uint unsigned int void check_busy(void); void write_command(unsigned char com); void write_data(uchar dat); void LCD_initial(void); void string(uchar ad ,uchar *s); void lcd_test(void); void delay(uint); void LCD_ShowNum(uchar Line,uchar Columu,uint Num,uint Length);//显示数字 void LCD_SetCursor(uchar Line,uchar Columu); int LCD_Pow(uchar x,uchar y); void LCD_ShowChar(unsigned char Line , unsigned char Columu , unsigned char Char);//写一个字符 #endif
ds1302.c
#include#include sbit SCK = P3^1; sbit SDA = P3^2; sbit RST = P3^0; // DS1302复位 #define uchar unsigned char #define uint unsigned int //uchar code Write_addr [] ={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};//写地址 //uchar code Read_addr [] = {0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};//读地址 //uchar Time [7] = {0x50,0x59,0x23,0x00,0x00,0x00,0x00};//初始值设置 秒 分 时 日 月 星期 年 void Write_Ds1302(unsigned char temp) { unsigned char i; for (i=0;i<8;i++) { SCK=0; SDA=temp&0x01; temp>>=1; SCK=1; } } void Write_Ds1302_Byte( unsigned char address,unsigned char dat ) { RST=0; _nop_(); SCK=0; _nop_(); RST=1; _nop_(); Write_Ds1302(address); Write_Ds1302(dat); RST=0; } unsigned char Read_Ds1302_Byte ( unsigned char address ) { unsigned char i,temp=0x00; RST=0; _nop_(); SCK=0; _nop_(); RST=1; _nop_(); Write_Ds1302(address); for (i=0;i<8;i++) { SCK=0; temp>>=1; if(SDA) temp|=0x80; SCK=1; } RST=0; _nop_(); SCK=0; _nop_(); SCK=1; _nop_(); SDA=0; _nop_(); SDA=1; _nop_(); return (temp); }
ds1302.h
#ifndef __DS1302_H #define __DS1302_H void Write_Ds1302(unsigned char temp); void Write_Ds1302_Byte( unsigned char address,unsigned char dat ); unsigned char Read_Ds1302_Byte( unsigned char address ); #endif
仿真图



