内容请自己看
制作出来的实物图如下:
Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)
单片机源程序如下:
- /***********************************************
- 该程序为温度测量
- 用到DS18B20、LCD1602
-
- 备注:程序的许多地方也是理解了他人的程序才写出来的如果有理解错误、书写错误的地方望大家留言指导
- ***********************************************/
- #include <reg52.h>
- bit flag = 0;
- unsigned int Temp = 0;
- unsigned char str[6]; //用来存字符串
- unsigned char high; //定时器的高低8位
- unsigned char low;
- unsigned char L; //温度的小数部分
- unsigned char H; //整数部分
- extern bit Get_temperature(unsigned int *temp);
- extern void TemptoNum();
- extern void LCD_Start();
- extern void LCD_Sta(unsigned char x, unsigned char y, unsigned char *p);
- unsigned char NumberToString(unsigned char *str, unsigned int dat);
- void configtime0(unsigned char ms);
- /****************************************
- 主函数
- ****************************************/
- void main()
- {
- unsigned char len;
- bit flag_ack = 0;
-
- EA = 1; //开启总中断
- LCD_Start(); //LCD初始化
- configtime0(1); //配置定时器
- LCD_Sta(0,0,"Temp:"); //显示"Temp:"字符
- TemptoNum(); //温度转换
-
- while(1)
- {
- if(flag) //1秒到了 标识位为1
- {
- flag = 0; //标识位置0
- flag_ack = Get_temperature(&Temp); //获取温度值
- if(flag_ack)
- {
- flag_ack = 0;
- H = Temp >> 4; //分离出整数部分
- L = Temp & 0x0F; //分离出小数部分
- L = L * 10 / 16; //将小数部分转换成10进制数取出(这个地方我也想了好久才想明白,一开始自己写是写了%10,但是这样就存在不准确的问题,这么写我也是书上看来,先放大10倍,然后最大就是150,/16刚好为9,140/16为8,以此类推)
- len = NumberToString(str, L); //将小数部分转换成字符
- LCD_Sta(16-len,0,str); //显示在LCD的第一行的最后一位
- LCD_Sta(14,0,"."); //倒数第二位是小数点
- len +=1; //长度加1,方便取整数的位置
- len += NumberToString(str, H); //将整数部分转换成字符 返回的长度加上小数点和小数的长度
- LCD_Sta(16-len,0,str); //显示在LCD上
- }
- TemptoNum(); //再一次温度转换
- }
- }
- }
- /*******************************************
- 数字转字符串
- *******************************************/
- unsigned char NumberToString(unsigned char *str, unsigned int dat)
- {
- unsigned char buf[5];
- unsigned char i = 0;
- unsigned char len;
-
- do{ //将数字的每一位都取出来放入buf[]中
- buf[i++] = dat%10;
- dat = dat / 10;
- }while(dat>0);
- len = i; //算出长度
- while(i-->0) //将每一位都转换成字符
- {
- *str++ = buf[i] + '0';
- }
-
- return len;
- }
- /***************************************
- 定时器配置
- ***************************************/
- void configtime0(unsigned char ms)
- {
- unsigned long tmp;
-
- tmp = 12000000/12;
- tmp = tmp*ms/1000;
- tmp = 65536 - tmp;
- high = (unsigned char)(tmp>>8);
- low = (unsigned char)tmp;
- TMOD = 0x01;
- TH0 = high;
- TL0 = low;
- TR0 = 1;
- ET0 = 1;
- }
- /*************************************
- 中断函数
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
温度_LCD显示.7z
(623 KB, 下载次数: 359)
|