ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

用STC15系列单片机搞个简陋的温度传感器

2022-01-12 23:32:30  阅读:199  来源: 互联网

标签:P2 P3 P0 温度传感器 temp STC15 uchar 单片机 0X0F


学习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);
    }
}

最后的结果:

 由于家里有暖气,所以温度高一些。

标签:P2,P3,P0,温度传感器,temp,STC15,uchar,单片机,0X0F
来源: https://blog.csdn.net/qq_63490595/article/details/122464387

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有