好文档 - 专业文书写作范文服务资料分享网站

使用LCD1602、DS1302时钟芯片、DS18B20温度传感器完成该日历

天下 分享 时间: 加入收藏 我要投稿 点赞

使用LCD1602、DS1302时钟芯片、DS18B20温度传感器完成该日历

/***********************************************************************************/ /************使用LCD1602、DS1302时钟芯片、DS18B20温度传感器完成该日历**************/ #include #define uint unsigned int #define uchar unsigned char sbit rs=\数据/命令选择端 sbit rw=\读写选择端 sbit e=\使能信号 sbit rst=\时钟芯片复位端 sbit sck=\时钟信号 sbit io=\输入/输出端 sbit ds=\//温度传感器信号线 sbit led=\ //小灯位定义 uint temp; // 整型温度值 float f_temp; //浮点型温度值 void init(); // 初始化函数 void delay(uchar z); //延时函数

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; }

使用LCD1602、DS1302时钟芯片、DS18B20温度传感器完成该日历

使用LCD1602、DS1302时钟芯片、DS18B20温度传感器完成该日历/***********************************************************************************//************使用LCD1602、DS1302时钟芯片、DS18B20温度传感器完成该日历**************
推荐度:
点击下载文档文档为doc格式
8e2aw4dc3a5kaxd90s98
领取福利

微信扫码领取福利

微信扫码分享