段控制P0到P17(共8条线)。位控制P1.0连接P16的Q1B;P1.1连接Q2B;P1.2连接Q3BP;1.3连接Q4B。
P15的2脚18B20输出脚,连接到P3.2。
单片机源程序如下:
- /***************************************************************************
- 标题: 温感实验
- 效果: 读取温度值数码管显示
- 工作于:光汇i51开发板
- 作者: 光汇科技
- 说明: 板使用12M晶振
- ******************************************************************************/
- //头文件:
- #include "reg51.h"
- #include "ds18b20.h" //引入DS18B20头文件
- //变量定义:
- unsigned char ly_dis[4];//定义显示缓冲区
- code unsigned char table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xc6};
- unsigned int i=0;
- char ltemp; //表:共阳数码管 0-9 C
- unsigned char l_posit=0; //显示位置
- //引脚定义:
- sbit SMG_q = P1^0; //定义数码管阳级控制脚(千位)
- sbit SMG_b = P1^1; //定义数码管阳级控制脚(百位)
- sbit SMG_s = P1^2; //定义数码管阳级控制脚(十位)
- sbit SMG_g = P1^3; //定义数码管阳级控制脚(个位)
- sbit SMKG=P3^6;
- //函数声明:
- void display(void);//显示函数,显示缓冲区内容
- void delay(void);
- //主函数,C语言的入口函数:
- void main()
- {
-
- while(1){
-
- display(); //调用显示
- delay();
- }
- }
- //显示函数,参数为显示内容
- void display()
- {
- SMKG=0;
- P0=0XFF; //
- switch(l_posit){
- case 0: //选择千位数码管,关闭其它位
- SMG_q=0;
- SMG_b=1;
- SMG_s=1;
- SMG_g=1;
- P0=table[ly_dis[0]]; //输出显示内容
- break;
- case 1: //选择百位数码管,关闭其它位
- SMG_q=1;
- SMG_b=0;
- SMG_s=1;
- SMG_g=1;
- P0=table[ly_dis[1]];
- break;
- case 2: //选择十位数码管,关闭其它位
- SMG_q=1;
- SMG_b=1;
- SMG_s=0;
- SMG_g=1;
- P0=table[ly_dis[2]];
- break;
- case 3: //选择个位数码管,关闭其它位
- SMG_q=1;
- SMG_b=1;
- SMG_s=1;
- SMG_g=0;
- P0=table[ly_dis[3]];
- break;
- }
- l_posit++; //每调用一次将轮流显示一位
- if(l_posit>3)
- l_posit=0;
- if(i==0) //先发转换命令,再读数值,以减少速度慢带来的显示抖动
- tmpchange(); //温度转换
- if(i==100){
- ltemp=tmp()/16; //得到十进制温度值,因为DS18B20可以精确到0.0625度,这里取整数显示
- if(ltemp<0){ //判断第一位显示整数还是负号
- ly_dis[0]=0xbf;
- ltemp=0-ltemp;
- }
- else
- // ly_dis[0]=ltemp/100;//显示百位值
- ltemp=ltemp/100%100;
- ly_dis[0]=ltemp/10; //显示温度十位值
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
12 数码管显示18B20温度.rar
(86.34 KB, 下载次数: 60)
|