完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
本帖最后由 兮_c03 于 2017-8-1 09:42 编辑
c51单片机一个端口连接两个ds18b20,分别读取ds18b20温度、上下限,并通过按键调节上下限,发现有错误请指出,谢谢。这是程序 main #include #define uchar unsigned char #define uint unsigned int ***it P3_0 = P3^0; code uchar seven_seg[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//数码管数字数组 uchar cp2,mode; uint cp1; uint temp_num,temp_num1,temp_dot,temp; //temp_num、temp_num1为温度整数部分,temp_dot小数部分 #include #include #include void timer0_isr(void) interrupt 1 //中断服务函数 { TH0 = (65536 - 2000) / 256; //TH0重新预设 TL0 = (65536 - 2000) % 256; //TL0重新预设 cp1++; if(cp1 >= 500) //1秒 { cp1 = 0; read_temprom(); temp_num = Read_Temperature(); //得到温度整数 temp_dot = c * 0.625; //得到温度小数 if((temp_num & 0x80) == 0x80) //如果温度为负值 { temp_dot = (0x0f - c) * 0.625; //补码转换原码,小数处理 temp_num1 = 0xff - temp_num; //补码转换原码,整数处理 } else temp_num1 = temp_num; //小数转换为十进制 } P0 = 0xff; display(); } void timer0_init(void) //初始化函数 { TMOD = 0x01; TH0 = (65536 - 2000) / 256; //TH0重新预设 TL0 = (65536 - 2000) % 256; //TL0重新预设 EA = 1; TR0 = 1; ET0 = 1; } void main(void) { timer0_init(); write_temprom(70,10); //向18B20的暂存器存入温度上下限 Write_OneChar(0x48); //向18B20的EEROM中写数据 while(1) { key(); } } display void display() { P0 = 0xff; switch(cp2) { case 0:P3_0 = 0;P0 = 0x01;P3_0 = 1;P3_0 = 0;P0 = seven_seg[temp_num1 % 10]; break; case 1:P3_0 = 0;P0 = 0x02;P3_0 = 1;P3_0 = 0;P0 = seven_seg[temp_num1 / 10]; break; case 2:P3_0 = 0;P0 = 0x04;P3_0 = 1;P3_0 = 0;P0 = 0xbf; break; case 3:P3_0 = 0;P0 = 0x08;P3_0 = 1;P3_0 = 0;P0 = seven_seg[temp_down % 10]; break; case 4:P3_0 = 0;P0 = 0x10;P3_0 = 1;P3_0 = 0;P0 = seven_seg[temp_down / 10]; break; case 5:P3_0 = 0;P0 = 0x20;P3_0 = 1;P3_0 = 0;P0 = 0xbf; break; case 6:P3_0 = 0;P0 = 0x40;P3_0 = 1;P3_0 = 0;P0 = seven_seg[temp_up % 10]; break; case 7:P3_0 = 0;P0 = 0x80;P3_0 = 1;P3_0 = 0;P0 = seven_seg[temp_up / 10]; break; } cp2++; if(cp2 >= 8)cp2 = 0; } ds18b20 #define uchar unsigned char #define uint unsigned int uchar com1[] = {0x28,0x30,0xc5,0xb8,0x00,0x00,0x00,0x8e}; uchar com2[] = {0x28,0x31,0xc5,0xb8,0x00,0x00,0x00,0xb9}; ***it DQ = P3^7; //定义单片机的P3.7与DS18B20数据端口连接在一起 /********延时函数********/ void delay(uint x) { while(x--); } /********初始化函数********/ void Init_DS18B20(void) //基本操作函数1 { unsigned char x = 255; DQ = 1; //先让DQ置1 DQ = 0; //单片机将DQ拉低 delay(80); //延时480-960us DQ = 1; //释放总线 while(DQ && x--); //等待返回的低电平响应 如果没有响应,则做适量延时自动往下执行 delay(20); } /********从DS18B20中读一个字节********/ uchar Read_OneChar(void) //基本操作函数2 { uchar i = 0; uchar dat = 0; for (i=8;i>0;i--) { DQ = 0; //发送启动信号 dat >>= 1; DQ = 1; //释放总线 if(DQ) //判断总线是否为高电平 dat |= 0x80; //如果是高电平,则把dat的最高位置1,如果不是,默认置0 delay(10); } return(dat); } /********向18B20中写一个字节********/ void Write_OneChar(uchar dat) //基本操作函数3 { uchar i=0; for (i=8; i>0; i--) { DQ = 0; DQ = dat & 0x01; //取dat的最低位 delay(10); DQ = 1; dat >>= 1; } delay(8); } void Match_XL_0(void) { uchar i; Write_OneChar(0x55); for(i = 0;i < 8;i++) { Write_OneChar(com1); } } void Match_XL_1(void) { uchar i; Write_OneChar(0x55); for(i = 0;i < 8;i++) { Write_OneChar(com2); } } /********读取温度********/ uchar a,b,c; uchar Read_Temperature(void) //应用操作函数1 { uchar i = 0,t = 0; Init_DS18B20(); // Write_OneChar(0xcc); // 跳过读序号列号的操作 if(mode == 0)Match_XL_0(); if(mode == 1)Match_XL_1(); Write_OneChar(0x44); // 启动温度转换 Init_DS18B20(); // Write_OneChar(0xcc); //跳过读序号列号的操作 if(mode == 0)Match_XL_0(); if(mode == 1)Match_XL_1(); Write_OneChar(0xbe); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度 a = Read_OneChar(); //读取温度值低位 b = Read_OneChar(); //读取温度值高位 c = 0x0f & a; //得到小数部分 a = a >> 4; //低位右移4位 b = b << 4; //高位左移4位 t = a | b; //得到8位温度的整数部分,最高1位为符号位 return(t); } /********保存温度上下限********/ void write_temprom(uchar temp_up_set,uchar temp_down_set ) //应用操作函数2 { Init_DS18B20(); // Write_OneChar(0xcc); //跳过读序号列号的操作 if(mode == 0)Match_XL_0(); if(mode == 1)Match_XL_1(); Write_OneChar(0x4e); //写准备 Write_OneChar(temp_up_set); //向18B20的暂存写上限 Write_OneChar(temp_down_set); //向18B20的暂存写下限 // Write_OneChar(0x7f); Init_DS18B20(); // Write_OneChar(0xcc); if(mode == 0)Match_XL_0(); if(mode == 1)Match_XL_1(); Write_OneChar(0x48); //向18B20的rom中写数据 Init_DS18B20(); // Write_OneChar(0xcc); if(mode == 0)Match_XL_0(); if(mode == 1)Match_XL_1(); Write_OneChar(0xb8); } /********读取温度上下限********/ uchar temp_up,temp_down; //温度上下限值 void read_temprom(void) //应用操作函数3 { uchar i; Init_DS18B20(); // Write_OneChar(0xcc); //跳过读序号列号的操作 if(mode == 0)Match_XL_0(); if(mode == 1)Match_XL_1(); Write_OneChar(0xbe); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度 i = Read_OneChar(); //读0地址寄存器,扔掉 i = Read_OneChar(); //读1地址寄存器,扔掉 temp_up = Read_OneChar(); //读2地址寄存器 temp_down = Read_OneChar(); //读3地址寄存器 } //void match_com(uchar a) //匹配rom //{ // char j; // Write_OneChar(0x55); // if(a == 1) // { // for(j = 0;j < 8;j++) // Write_OneChar(com1[j]); // } // if(a == 2) // { // for(j = 0;j < 8;j++) // Write_OneChar(com2[j]); // } //} ///********读取温度********/ //uchar a,b,c; //uchar Read_Temperature(void) //应用操作函数1 //{ // uchar i = 0,t = 0; // Init_DS18B20(); //// Write_OneChar(0xcc); // 跳过读序号列号的操作 // if(mode == 0)match_com(1); // if(mode == 1)match_com(2); // Write_OneChar(0x44); // 启动温度转换 // Init_DS18B20(); //// Write_OneChar(0xcc); //跳过读序号列号的操作 // if(mode == 0)match_com(1); // if(mode == 1)match_com(2); // Write_OneChar(0xbe); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度 // a = Read_OneChar(); //读取温度值低位 // b = Read_OneChar(); //读取温度值高位 // c = 0x0f & a; //得到小数部分 // a = a >> 4; //低位右移4位 // b = b << 4; //高位左移4位 // t = a | b; //得到8位温度的整数部分,最高1位为符号位 // return(t); //} ///********保存温度上下限********/ //void write_temprom(uchar temp_up_set,uchar temp_down_set ) //应用操作函数2 //{ // Init_DS18B20(); //// Write_OneChar(0xcc); //跳过读序号列号的操作 // if(mode == 0)match_com(1); // if(mode == 1)match_com(2); // Write_OneChar(0x4e); //写准备 // Write_OneChar(temp_up_set);; //向18B20的暂存写上限 // Write_OneChar(temp_down_set);; //向18B20的暂存写下限 //// Write_OneChar(0x7f); // Init_DS18B20(); //// Write_OneChar(0xcc); // if(mode == 0)match_com(1); // if(mode == 1)match_com(2); // Write_OneChar(0x48); //向18B20的rom中写数据 // Init_DS18B20(); //// Write_OneChar(0xcc); // if(mode == 0)match_com(1); // if(mode == 1)match_com(2); // Write_OneChar(0xb8); //} ///********读取温度上下限********/ //uchar temp_up,temp_down; //温度上下限值 //void read_temprom(void) //应用操作函数3 //{ // uchar i; // Init_DS18B20(); //// Write_OneChar(0xcc); //跳过读序号列号的操作 // if(mode == 0)match_com(1); // if(mode == 1)match_com(2); // Write_OneChar(0xbe); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度 // i = Read_OneChar(); //读0地址寄存器,扔掉 // i = Read_OneChar(); //读1地址寄存器,扔掉 // temp_up = Read_OneChar(); //读2地址寄存器 // temp_down = Read_OneChar(); //读3地址寄存器 //} key ***it key0 = P1^0; ***it key1 = P1^1; ***it key2 = P1^2; ***it key3 = P1^3; ***it key4 = P1^4; ***it key5 = P1^5; void key(void) { if(key0 == 0) { delay(300); if(key0 == 0) { while(key0 == 0); mode = 0; } } if(key1 == 0) { delay(300); if(key1 == 0) { while(key1 == 0); mode = 1; } } if(key2 == 0) { delay(300); if(key2 == 0) { while(key2 == 0); temp_up++; write_temprom(temp_up,temp_down); delay(20); } } if(key3 == 0) { delay(300); if(key3 == 0) { while(key3 == 0); temp_up--; write_temprom(temp_up,temp_down); delay(20); } } if(key4 == 0) { delay(300); if(key4 == 0) { while(key4 == 0); temp_down++; write_temprom(temp_up,temp_down); delay(20); } } if(key5 == 0) { delay(300); if(key5 == 0) { while(key5 == 0); temp_down--; write_temprom(temp_up,temp_down); delay(20); } } } |
|
相关推荐
1 个讨论
|
|
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-运动追踪之编写程序
424 浏览 0 评论
855 浏览 0 评论
使用Keil建立完整的工程,并使用外部中断0触发数码管显示903
1662 浏览 0 评论
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-使用AHT20进行环境监测之AHT20传感器介绍
1260 浏览 0 评论
904 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11871 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-5 11:26 , Processed in 0.406333 second(s), Total 36, Slave 28 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号