学习STC15单片机有一段时间了,整个温度传感器玩玩。
在家里我想知道温度,但我不看温度计,就是用单片机来测,哈哈。(我太闲了一天天)
这里附上keil5源码:
#include<STC15F2K60S2.H>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0X40,0X79,0X1A,0X30,0X19,0X12,0X02,0X78,0X00,0X10,0XBF,0XFF};
uchar yi,er,san,si,wu,liu,qi,ba;
bit s4,s5,s6,s7;
uchar num=0;
sbit DQ=P1^4;
long wendu;
void Allinit(void)
{
P2=0XA0;//打开控制蜂鸣器的573
P0=0X00;//关闭蜂鸣器继电器
P2=0XC0;//打开控制数码管位选的573
P0=0XFF;//选中所有数码管
P2=0XE0;//打开控制数码管段选的573
P0=0XFF;//关闭所有的数码管
P2=0X80;//打开控制LED的573
P0=0XFF;//关闭所有LED
}
void delayms(int ms)
{
int i,j;
for(i=0;i<ms;i++)
for(j=845;j>0;j--);
}
void display1(uchar yi,uchar er)//控制前两个数码管
{
P2=0XC0;
P0=0X01;
P2=0XE0;
P0=tab[yi];
delayms(1);
P2=0XC0;
P0=0X02;
P2=0XE0;
P0=tab[er];
delayms(1);
}
void display2(uchar san,uchar si)//控制3,4数码管
{
P2=0XC0;
P0=0X04;
P2=0XE0;
P0=tab[san];
delayms(1);
P2=0XC0;
P0=0X08;
P2=0XE0;
P0=tab[si];
delayms(1);
}
void display3(uchar wu,uchar liu)//控制5,6数码管
{
P2=0XC0;
P0=0X10;
P2=0XE0;
P0=tab[wu];
delayms(1);
P2=0XC0;
P0=0X20;
P2=0XE0;
P0=tab[liu];
delayms(1);
}
void display4(uchar qi,uchar ba)//控制7,8数码管
{
P2=0XC0;
P0=0X40;
P2=0XE0;
P0=tab[qi];
delayms(1);
P2=0XC0;
P0=0X80;
P2=0XE0;
P0=tab[ba];
delayms(1);
}
void key16(void) //矩阵键盘
{
uchar temp;
P44=0;P42=1;P3=0X7F;
temp=P3;
temp=temp&0X0F;
if(temp!=0X0F)
{
delayms(5);
temp=P3;
temp=temp&0X0F;
if(temp!=0X0F)
{
temp=P3;
switch(temp)
{
case 0X7E:num=0;break;
case 0X7D:num=1;break;
case 0X7B:num=2;break;
case 0X77:num=3;break;
}
while(temp!=0X0F)
{
temp=P3;
temp=temp&0X0F;
}
}
}
P44=1;P42=0;P3=0XBF;
temp=P3;
temp=temp&0X0F;
if(temp!=0X0F)
{
delayms(5);
temp=P3;
temp=temp&0X0F;
if(temp!=0X0F)
{
temp=P3;
switch(temp)
{
case 0XBE:num=4;break;
case 0XBD:num=5;break;
case 0XBB:num=6;break;
case 0XB7:num=7;break;
}
while(temp!=0X0F)
{
temp=P3;
temp=temp&0X0F;
}
}
}
P44=1;P42=1;P3=0XDF;
temp=P3;
temp=temp&0X0F;
if(temp!=0X0F)
{
delayms(5);
temp=P3;
temp=temp&0X0F;
if(temp!=0X0F)
{
temp=P3;
switch(temp)
{
case 0XDE:num=8;break;
case 0XDD:num=9;break;
case 0XDB:num=0;break;
case 0XD7:num=1;break;
}
while(temp!=0X0F)
{
temp=P3;
temp=temp&0X0F;
}
}
}
P44=1;P42=1;P3=0XEF;
temp=P3;
temp=temp&0X0F;
if(temp!=0X0F)
{
delayms(5);
temp=P3;
temp=temp&0X0F;
if(temp!=0X0F)
{
temp=P3;
switch(temp)
{
case 0XEE:num=2;break;
case 0XED:num=3;break;
case 0XEB:num=4;break;
case 0XE7:num=5;break;
}
while(temp!=0X0F)
{
temp=P3;
temp=temp&0X0F;
}
}
}
}
void Delay80us() //@11.0592MHz
{
unsigned char i;
_nop_();
_nop_();
_nop_();
i = 218;
while (--i);
}
void Delay100us() //@11.0592MHz,延时100us
{
unsigned char i, j;
_nop_();
_nop_();
i = 2;
j = 15;
do
{
while (--j);
} while (--i);
}
void Delay500us() //@11.0592MHz,延迟500us
{
unsigned char i, j;
_nop_();
_nop_();
i = 6;
j = 93;
do
{
while (--j);
} while (--i);
}
void Init_Ds18b20(void)
{
DQ=0;
Delay500us();
DQ=1;
Delay500us();
}
uchar Ds18b20_ReadByte(void)
{
uchar i;
uchar dat;
for(i=0;i<8;i++)
{
DQ=0;
dat>>=1;
DQ=1;
if(DQ==1)
{
dat=dat | 0X80;
}
Delay80us();
}
return dat;
}
void Ds18b20_WiteByte(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
DQ=0;
DQ=dat&0X01;
Delay80us();
DQ=1;
dat>>=1;
}
}
long temperget(void)
{
uchar low,high;
long temp;
Init_Ds18b20();
Ds18b20_WiteByte(0XCC);
Ds18b20_WiteByte(0X44);
Delay500us();
Init_Ds18b20();
Ds18b20_WiteByte(0XCC);
Ds18b20_WiteByte(0XBE);
low=Ds18b20_ReadByte();
high=Ds18b20_ReadByte();
temp=(high&0X0F);
temp<<=8;
temp|=low;
temp*=625;
return temp;
}
void main(void)
{
Allinit();
yi=21;er=21;san=21;si=21;wu=21;liu=21;qi=21;ba=21;//总共是22个数,但实际上是0-21哦
while(1)
{
wendu=temperget();
yi=wendu/100000;
er=wendu%100000/10000+10;
san=wendu%10000/1000;
si=wendu%1000/100;
wu=wendu%100/10;
liu=wendu%10;
qi=wendu%10;
ba=wendu%10;
display1(yi,er);
display2(san,si);
display3(wu,liu);
display4(qi,ba);
}
}
最后的结果:
由于家里有暖气,所以温度高一些。