完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
连接数字温度传感器DS18B20,采集温度数据在数码管、LCD液晶上显示或通过串口将数据传递至PC。 访问时钟芯片DS1302,将年、月日、时、分、秒调整到当前时间。 设置按键,通过按键调整温度的记录间隔时间,可任意设定(1S到1h,步长1s),能按设定时间存储数据。 按照间隔时间读取温度,并记录读取温度的时间。 通过按键回放温度和读取温度时的时间参数。 将温度数据存储在EEPROM AT24C01内。 设定温度告警门限,通过蜂鸣器、发光二极管进行告警显示。 通过切换按钮可以切换华氏度和摄氏度显示。 用RS232连接电脑 PC助手显示结果 只差了个头文件了 各位求帮忙 /************************************************ 文件:main.c 用途: 注意:内部8M晶振 ************************************************/ #include "config.h" unsigned char i=0,j; unsigned char LED_table[]={0xFF,0x00,0xFF,0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F, 0xFF,0x00,0xFF,0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE, 0xFF,0x00,0xFF,0x7E,0xBD,0xDB,0xE7,0xFF,0x00,0xE7,0xDB, 0xBD,0x7E,0xFF,0x00}; void main(void) { float temp=0.0; unsigned char Key; Key_init(); HC_595_init(); init_1820(); temp=gettemp(); delay_nms(1000); while(1) { temp=gettemp(); Seg7_Led_float(temp); deal_temp((unsigned char)(temp)); led(); for(j=0;j<50;j++) //产生灯延时 { Seg7_Led_float(temp); deal_temp((unsigned char)(temp)); delay_nms(5); Seg7_Led_float(temp); deal_temp((unsigned char)(temp)); } } while(1) { Seg7_Led_float(temp); Key=get_key(); switch(Key) { case ( ((1< { ++temp; break; } case ( ((1< { --temp; break; } case ( ((1< { Seg7_Led_float(temp); break; } case ( ((1< { Seg7_Led_float(temp); break; } default: { break; } } } } void led(void) { DDRE=0xff; PORTE=0xff; if(i==36) i=0; PORTE = LED_table[i++]; /************************************************ 文件:18b20.c 用途: 注意: ************************************************/ #include "config.h" /************************************************************** ** 函数名称: void init_1820(void) ** 功能描述: 18b20初始化 ** 输 入: 无 ** 全局变量: 无 ** 调用模块: 无 ** 说明: ** 注意: **************************************************************/ void init_1820(void) { TEM_DDR &=~ (1< SET_TEM_DDR; //设置数据端口为输出 SET_TEM_SDT; CLR_TEM_SDT; delay_nus(480); //480us以上 SET_TEM_SDT; CLR_TEM_DDR; delay_nus(20); //15~60us while(CHECK_TEM_SDT); SET_TEM_DDR; SET_TEM_SDT; delay_nus(140); //60~240us } /************************************************************** ** 函数名称: void write_1820(unsigned char data) ** 功能描述: 向18b20写入1B的数据 ** 输 入: unsigned char data 要写入的数据 ** 全局变量: 无 ** 调用模块: 无 ** 说明: ** 注意: **************************************************************/ void write_1820(unsigned char data) { unsigned char i; for(i=0;i<8;i++) { CLR_TEM_SDT; //从高到低,产生写间隙 if(data&(1<写数据,先写低位 SET_TEM_SDT; else CLR_TEM_SDT; delay_nus(40); //15~60us SET_TEM_SDT; } SET_TEM_SDT; } /************************************************************** ** 函数名称: unsigned char read_1820(void) ** 功能描述: 从18b20读出1B的数据 ** 输 入: 无 ** 全局变量: 无 ** 调用模块: 无 ** 说明: ** 注意: **************************************************************/ unsigned char read_1820(void) { unsigned char temp,k,n; temp=0; for(n=0;n<8;n++) { CLR_TEM_SDT; SET_TEM_SDT; //从高到低再到高,产生读间隙 CLR_TEM_DDR; //设为输入 k=CHECK_TEM_SDT; //读数据,从低位开始 if(k) temp|=(1< else temp&=~(1< delay_nus(50); //60~120us SET_TEM_DDR; //设为输出 } return (temp); } /************************************************************** ** 函数名称: unsigned char gettemp(void) ** 功能描述: 返回温度值 ** 输 入: 无 ** 全局变量: ** 调用模块: 无 ** 说明:wmh为温度的高位,wml为温度的低位,返回值为温度值,范围0~99摄氏度,字符型 ** 注意: **************************************************************/ float gettemp(void) //读取温度值 { float t; unsigned char temh,teml,wm0,wm1,wm2,wm3,wmh,wml; int temp; init_1820(); //复位18b20 write_1820(0xCC); // 跳过ROM write_1820(0x44); // 温度变换 init_1820(); write_1820(0xCC); // 跳过ROM write_1820(0xbe); // 写暂存存储器 teml=read_1820(); //读数据 temh=read_1820(); //wm0=teml>>4; //只要高8位的低四位和低8位的高四位,温度范围0~99 // wm1=temh<<4; temp=temh; temp<<=8; //两个字节组合为1个字 temp=temp|teml; t=temp*0.0625; //温度在寄存器中是12位,分辨率是0.0625 temp=t*10+0.5; return t; /* wm2=wm1+wm0; //16进制转10进制 wm3=wm2/100; wmh=(wm2%100)/10; //wmh是显示的高位,wml是显示的低位 wml=(wm2%100)%10; temp=wmh*10+wml; return temp;*/ } void deal_temp(unsigned char tmp) //处理函数,当前温度与温度上下限比较 { DDRG|=(1<<4); //蜂鸣器端:PG4 if(tmp!=85) { if(tmp>=TEM_MAX) { PORTG|=(1<<4); delay_nus(80); PORTE=0xf0;//警告灯:PE PORTG=0;delay_nus(200); } else if(tmp<=TEM_MIN) { PORTG|=(1<<4); delay_nus(100); PORTE=0x0f;//警告灯:PE PORTG=0; delay_nus(100); } } } |
|
相关推荐 |
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
907 浏览 0 评论
1561 浏览 1 评论
ad把一个15mm*1.5mm的灯放到直径15mm的圆形pcb板上,可以实现吗
1397 浏览 1 评论
1677 浏览 1 评论
请问PCB覆铜规则改成了Direct Connect为什么还是Relief Connect连接?
1991 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-27 03:45 , Processed in 0.500275 second(s), Total 72, Slave 55 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号