找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2463|回复: 0
打印 上一主题 下一主题
收起左侧

求大神帮忙解决个问题 关于单片机温度巡检的

[复制链接]
跳转到指定楼层
楼主
ID:48555 发表于 2013-4-30 21:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include #include #define uchar unsigned char sbit RS=P3^5; //定义LCD端口 sbit RW=P3^6; sbit E=P3^7; sbit DQ=P3^4; //定义单总线端口 uchar LCD_3,LCD_2,LCD_1,LCD_0; uchar ds18b20_romA[8]={0x8e,0x00,0x00,0x00,0xb8,0xc5,0x30,0x28}; //四个DS18B20的64位ROM地址 uchar ds18b20_romB[8]={0x52,0x00,0x00,0x00,0xb8,0xc5,0x34,0x28}; uchar ds18b20_romC[8]={0x65,0x00,0x00,0x00,0xb8,0xc5,0x35,0x28}; uchar ds18b20_romD[8]={0x3c,0x00,0x00,0x00,0xb8,0xc5,0x36,0x28}; uchar code LCDData[] ="0123456789"; uchar code dot_tab[] ="0112334456678899"; uchar first_line[16]="A:000.0 B:000.0"; //LCD第一行显示缓存数组 uchar second_line[16]="C:000.0 D:000.0"; //LCD第二行显示缓存数组 //************************************ //延时程序 //************************************ void delay(unsigned int N) { unsigned int i; for(i=0;i>i; temp=temp&0x01; write_bit(temp); delay(5); } } //************************************* //64位的ROM序列号匹配 //************************************* bit match_rom(uchar *rom) { uchar i; ds18b20_init(); write_byte(0x55); for(i=8;i>0;i--) { write_byte(*(rom+i-1)); } return 1; } //************************************ //从ds18b20中读出64位序列号 //************************************ /*uchar * read_rom(void) { uchar rom[8],i; ds18b20_init(); write_byte(0x33); for(i=8;i>0;i--) { rom[i-1]=read_byte(); } return &rom[0]; }*/ //************************************* //将64位序列号显示在LCD上显示出来 //************************************* /*void print_char(uchar a) { if(a>=0&&a<=9) write_data(a+0x30); else if(a>=0x0a &&a<= 0x0f) write_data(a+0x37); }*/ //************************************* //温度转换,将从ds18b20中读出来的温度值 //转化成十进制的温度值,并存放显示缓存 //************************************* void convert_T(uchar temp_data_h,uchar temp_data_l) { uchar temp; if((temp_data_h&0xf0)==0xf0) //如果温度寄存器里的高位为1, { //则温度为负 temp_data_l=~temp_data_l; //负温度将补码转成二进制, if(temp_data_l==0xff) //取反再加1 { temp_data_l=temp_data_l+0x01; temp_data_h=~temp_data_h; temp_data_h=temp_data_h+0x01; } else { temp_data_l=temp_data_l+0x01; temp_data_h=~temp_data_h; } LCD_0=dot_tab[temp_data_l&0x0f]; //查表得小数位的值 temp=((temp_data_l&0xf0)>>4)|((temp_data_h&0x0f)<<4); LCD_3='-'; //显示"-"号 LCD_2=LCDData[(temp%100)/10]; //查表得负温度温度十位 LCD_1=LCDData[(temp%100)%10]; //查表得负温度个位 } else //温度为正 { LCD_0=dot_tab[temp_data_l&0x0f]; //查表得小数位的值 temp=((temp_data_l&0xf0)>>4)|((temp_data_h&0x0f)<<4); LCD_3=LCDData[temp/100]; //查表得温度百位 LCD_2=LCDData[(temp%100)/10]; //查表得温度十位 LCD_1=LCDData[(temp%100)%10]; //查表得温度个位 } } void display(void) { uchar i; write_command(0x80); for(i=0;i<16;i++) { write_data(first_line); } write_command(0xc0); for(i=0;i<16;i++) { write_data(second_line); } } void main(void) { uchar temp_data_l,temp_data_h; /*uchar *ds18b20_rom;*/ init_lcd1602(); /*while(1) { uchar i; ds18b20_rom=read_rom(); //读序列号 write_command(0x80); for(i=0;i<8;i++) { ds18b20_romA=*ds18b20_rom; ds18b20_rom++; } write_command(0x80); for(i=0;i<8;i++) //显示序列号 { print_char(ds18b20_romA/16); print_char(ds18b20_romA%16); } }*/ while(1) { ds18b20_init(); write_byte(0xcc); write_byte(0x44); //启动温度转换 delay(700); match_rom(ds18b20_romA); //匹配第一路 write_byte(0xbe); //读温度 temp_data_l= read_byte(); //温度低8位 temp_data_h = read_byte(); //温度高8位 convert_T(temp_data_h,temp_data_l); first_line[2]=LCD_3; //温度转换后的各位 first_line[3]=LCD_2; //分别存入显示缓存数组中 first_line[4]=LCD_1; first_line[6]=LCD_0; match_rom(ds18b20_romB); //匹配第二路 write_byte(0xbe); //读温度 temp_data_l= read_byte(); //温度低8位 temp_data_h = read_byte(); //温度高8位 convert_T(temp_data_h,temp_data_l); first_line[10]=LCD_3; //温度转换后的各位 first_line[11]=LCD_2; //分别存入显示缓存数组中 first_line[12]=LCD_1; first_line[14]=LCD_0; display(); match_rom(ds18b20_romC); //匹配第三路 write_byte(0xbe); //读温度 temp_data_l= read_byte(); //温度低8位 temp_data_h = read_byte(); //温度高8位 convert_T(temp_data_h,temp_data_l); second_line[2]=LCD_3; //温度转换后的各位 second_line[3]=LCD_2; //分别存入显示缓存数组中 second_line[4]=LCD_1; second_line[6]=LCD_0; match_rom(ds18b20_romD); //匹配第四路 write_byte(0xbe); //读温度 temp_data_l= read_byte(); //温度低8位 temp_data_h = read_byte(); //温度高8位 convert_T(temp_data_h,temp_data_l); second_line[10]=LCD_3; //温度转换后的各位 second_line[11]=LCD_2; //分别存入显示缓存数组中 second_line[12]=LCD_1; second_line[14]=LCD_0; display(); } } 这段程序想加个报警系统 初学者不知道从何下手 希望各位能指导下 报警由一个扬声器和2个LED灯组成
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表