数码管DS18B20程序

标 签:

    这教程是用stc15、4位LED数码管、DS18B20制作温度计。

    制作硬件清单:

    单片机:STC15W204S-SOP16 或者 STCW408AS-SOP16

    显示:四位LED数码管,3641AS \ 3641BH等

    温度模块:DS18B20

    些教程是基于《4位数码管显示》教程成果上制作,具体可以在本站搜索 4位数码管显示 教程,学好了那个教程,并制作也来,那这个制作出来就很容易了。

    其实就是在4位数码管显示加 DS18B20 模块,因为ds18B20是单总线。所以只需要一个IO口。这制作DS18B20的数据IO接 P31

    DS18B20硬件相关参数,我就不在这里写了,自己在网上搜索手册看看。

    下面就不多说了,上程序吧,我是用文件方式写的,把 ds18b20 硬件驱动分开写。用Keil新建项目,

    新建文件:init.h

#ifndef __INIT_H
#define __INIT_H

#include "STC15F2K.H"
#include "DS18B20.H"
#include "INTRINS.H"

#define uchar unsigned char
#define uint  unsigned int
#define u8 unsigned char
#define u16  unsigned int
#define u32  unsigned long int


#endif

    新建文件:DS18B20.H

#ifndef __DS18B20_H
#define __DS18B20_H
#include "init.h"

/*****set pin********/
sbit DS18B20_DQ = P3^1;

u16 getTemp();

#endif

    新建文件:DS18B20.C

#include "DS18B20.H"

void delay1xus(u16 t){
    while(t--){
        _nop_();
        _nop_();
        _nop_();
        _nop_();
    }
}

/***** initialization ds18b20ry *********/
bit DS18B20Init(){
    bit stat = 1;
    
    DS18B20_DQ = 0;
    delay1xus(600);
    DS18B20_DQ = 1;
      delay1xus(60);
    stat = DS18B20_DQ;
    while(!DS18B20_DQ);
    
    return stat;
}

/******* ds18b20 write cmmand *******/
void DS18B20WritCmd(u8 dat){
    u8 i=0;
    
    for(;i < 8;i++){
        DS18B20_DQ = 0;
        delay1xus(2);
        if((dat>>i)&0x01)
            DS18B20_DQ = 1;
        delay1xus(60);
        DS18B20_DQ = 1;
        delay1xus(10);
    }

}

u8 DS18B20Read(){
    u8 i=0,dat = 0x00;
    
    for(;i < 8;i++){
        DS18B20_DQ = 0;
        delay1xus(2);
        DS18B20_DQ = 1;
        delay1xus(2);
        if(DS18B20_DQ)
            dat |= 1 << i;
        delay1xus(60);
    }
    
    return dat;
}

/***** start ds18b20 temp convert *************/
void DS1B20CT(){
    DS18B20Init();
    delay1xus(5);
    DS18B20WritCmd(0xCC);
    DS18B20WritCmd(0x1F);
    DS18B20Init();
    delay1xus(5);
    DS18B20WritCmd(0xCC);
    DS18B20WritCmd(0x44);
}

/***** start ds18b20 temp Read *************/
void DS1B20ReadCmd(){
    DS18B20Init();
    delay1xus(5);
    DS18B20WritCmd(0xCC);
    DS18B20WritCmd(0xBE);
}

/******** read temp *************/
u16 getTemp(){
    u8 LSB,MSB;
    u16 temp;
    
    DS1B20CT();
    DS1B20ReadCmd();
    LSB = DS18B20Read();
    MSB = DS18B20Read();
    temp = ((int)MSB << 8) + LSB;
        
    return temp;
}

    新建文件:main.c

#include "init.h"

//共阴极数码管的0 1 2 3 4 5 6 7 8 9 A b C d E F
u8 code Dig[17]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07,
                 0x7F, 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71,
                 0x00};
//---A--
//|F   |B
//|       |
//---G---
//|E   |C
//|    |
//---D-- .H
//
//4位共阴数码管脚图

//   L1----A----F----L2----L3----B
//                 
//   ---LED1--LED2--LED3--LED4---
//                 
//   E-----D----H----C-----G----L4
                 
//数码管定义
sbit L1 = P3^2; //数码管第一位共阴脚
sbit L2 = P3^7; //数码管第二位共阴脚
sbit L3 = P1^0; //数码管第三位共阴脚
sbit L4 = P1^2; //数码管第四位共阴脚
/*------------*/
sbit LA = P3^3; //数码管A段
sbit LB = P1^1; //数码管B段
sbit LC = P1^4; //数码管C段
sbit LD = P5^4; //数码管D段
sbit LE = P5^5; //数码管E段
sbit LF = P3^6; //数码管F段
sbit LG = P1^3; //数码管G段
sbit LH = P1^5; //数码管H段,小数点
                 
//变量定义
u16 cnt = 0,second = 0; //时间
u8 LedNum = 3; //当前显示数码管序号
u8 TempVal[5] = {1,2,3,4};
u8 dp = 0;


//声明函数
void Timer0Init();
void UartInit();
void SendData(u8 data_buf);
void showNum(u8 dat,u8 num);


void main(){
    u16 temp = 0;
    EA = 1;
    
//    P1M0 = 0x20;
//    P3M0 = 0x80;
//    P1M0 = 0x3F;
//    P3M0 = 0xCE;
//    P5M0 = 0x10;
    
    //串口初始化
    UartInit();
    //初始化定时器0
    Timer0Init();
    //初始化ds18b20
    
    
    while(1){
        if(second > 1000){
            second = 0;
            
            temp = getTemp();
            temp = temp * 0.0625 * 100 + 0.5;
            TempVal[0] = (temp % 10000 / 1000);
            TempVal[1] = (temp % 1000 / 100);
            TempVal[2] = (temp % 100 / 10);
            TempVal[3] = (temp % 10);
        }
    }
}

//显示数据
void showNum(u8 dat,u8 num){
    L1 = L2 = L3 = L4 = 1; //消抖

    //数据段位赋值
    dat >>= 1;
    LA = CY;
    dat >>= 1;
    LB = CY;
    dat >>= 1;
    LC = CY;
    dat >>= 1;
    LD = CY;
    dat >>= 1;
    LE = CY;
    dat >>= 1;
    LF = CY;
    dat >>= 1;
    LG = CY;
    dat >>= 1;
    LH = CY;
//    LH=dat&0x80;
//    dat=(dat<<1);
//    LG=dat&0x80;
//    dat=(dat<<1);
//    LF=dat&0x80;
//    dat=(dat<<1);
//    LE=dat&0x80;
//    dat=(dat<<1);
//    LD=dat&0x80;
//    dat=(dat<<1);
//    LC=dat&0x80;
//    dat=(dat<<1);
//    LB=dat&0x80;
//    dat=(dat<<1);
//    LA=dat&0x80;
    
    //显示数码管第几位
    switch(num){
        case 0:
            L1 = 0;
            break;
        case 1:
            L2 = 0;
            break;
        case 2:
            L3 = 0;
            break;
        case 3:
            L4 = 0;
            break;
        default:
            L1 = L2 = L3 = L4 = 1;
    }
}

void UartInit(void)        //4800bps@12.000MHz
{
    SCON = 0x50;        //8位数据,可变波特率
    AUXR |= 0x01;        //串口1选择定时器2为波特率发生器
    AUXR |= 0x04;        //定时器2时钟为Fosc,即1T
    T2L = 0x8F;        //设定定时初值
    T2H = 0xFD;        //设定定时初值
    AUXR |= 0x10;        //启动定时器2
}

void SendData(u8 data_buf) //发送一个字符
{
    SBUF = data_buf;
    while(!TI);//TI是发送成功标志
    TI = 0;
}

void Timer0Init(void)        //1毫秒@12.000MHz
{
    AUXR |= 0x80;        //定时器时钟1T模式
    TMOD &= 0xF0;        //设置定时器模式
    TL0 = 0x20;        //设置定时初值
    TH0 = 0xD1;        //设置定时初值
    TF0 = 0;        //清除TF0标志
    TR0 = 1;        //定时器0开始计时
    ET0 = 1;
}

void T0() interrupt 1{
    second ++;
    cnt ++;
    
    if(cnt > 3){
        cnt = 0;
        dp = Dig[TempVal[LedNum]];
        if(LedNum == 1) dp |= 0x80;
        showNum(dp,LedNum);
        LedNum ++ ;
        LedNum &= 0x03;
    }
}


51-STC / 评 论 (0) / 热度 (519℃) / 2017-03-19 / 阅读全文  / MaWei

NE555振荡电路原理

标 签:

555振荡电路原理图一:

2017031120233016697.png

这已经是第三篇教程了。555的基本原理就不再说了,那直接说这张振荡电路的原理了。其实这个图还是跟上面那个闪光电路是一样的,也是2、6脚的高低电平控制3脚的输出高低电平。

其实上篇的闪光也是一个振荡器,只不过是频率特别低。我们所说的振荡器,一般都是频率比较高的,比例在1KHz以上的。

如果上篇学的很透的话,这个电路也就明白了,就是C1充放电的时间非常短,短到一秒钟充、放电几千,几万,几十万次,就是一个高频振荡器。

当然了,R1的电阻不要太小了,因为太小了,电流会很大,555芯片会烧掉。

知道是什么原理不,因为3脚和7脚的电平状态是一样的。当3脚为低的时候,7脚也为低,所以电流会经过R1从7脚进入555芯片,所以555会因为进入7脚大电流烧掉。

所以一般还是调节R2、C的大小,来控制555芯片。

如果是这个图,可以用下面的公式计算: T=0.7 x (R1 + 2 x R2) x C

由于频率 F 等于周期的倒数,所以又等于 F=1/T=1.43/[(R1+2R2)C],注意的是 C 的单位是 F(法拉),1F = 1 x 10^6uF = 1 x 10^9nF = 1 x 10^12pF

为了振荡器的稳定,一般在脚接一个0.0uF的电容到地。

以上内容参考@浅雪的《学会使用NE555》

电子基础 / 评 论 (0) / 热度 (745℃) / 2017-03-12 / 阅读全文  / MaWei

555闪光电路原理

标 签:

1.555闪光电路原理:

       

2017031015081979636.gif

555闪光电路典型电路图,本文将以此图讲解555应用原理。

这个原理主要是电容 C1 充放电,让 2、6 的电压高低变化,控制 3 脚的高低电压输出。


具体为析如下:

    首先整个电路的电压在5v~10v之前,其实只要在555工作电压范围都行,这里我们假设Vcc的电压为6V。

    在电路启动的时候,首先是 LED-D1亮,因为 C1 充电是需要时间,这个时间取绝于 R2、R3 和 C1 大小决定的。所以2脚的电压都还低于Vcc的三分之一,那么3脚输出的是高电平,也就是电压为Vcc-1V左右。LED-D2点亮。

    随着C1的充电,电压升高,当2、6脚电压升到Vcc的三分之二以上的时候。3脚输出低电压。所以LED-D2关闭,LED-D1导通点亮。

C1充、放电就是LED交替点亮。就是闪烁电路的基本原理了。

    闪烁的时间间隔为C1电容充电、放电时间。

    如果不懂NE555的基本原理可以看上一篇教程是。



电子基础 / 评 论 (0) / 热度 (226℃) / 2017-03-12 / 阅读全文  / MaWei

555芯片认识介绍

标 签:

1. 555认识:

        1.0 555芯片由于内部电路串联了3个5K的电阻作为电压取样,所以叫555。      

        1.1 555就是一种模拟和数字功能相结合在一起的集成电路IC芯片。

        1.2 工作电压范围宽:4.5v~16V都可以工作。驱动电流大概在200mA。

        1.3 555常被用来做:延时开关、 振荡器、触发器等。

        1.4 555引脚图:(找张实物图好难啊,找了很久才找到一个张贴片的,没有水印的,有水印的不敢用)

                                      2017030911253447488.png       2017030911302242846.png

        引脚说明:    

                        Pin 1: 电源负极。

                        Pin 2: 触发入端,算是555时基电路中的开关。只要这个脚在电压低于电源电压的三分之一时,3脚就输出一个高电压,电压约等于Vcc - 1V左右。(Vcc为电源电压),如果高出于三分之一时,3脚输出不变,保持之前的状态,也就说之前是高还是高,是低还是低。

                        Pin3: 输出端,这脚输出高低电压,高电压为 Vcc - 1V左右,低电压当然就为0V了。控制些脚高低电压是2脚和6脚决定。输出最大电流为芯片能输出最大电流,约为200mA,带几个发光LED,或者小电流外设还是可以,那如果驱动大电流外设,当配合驱动电路了啊。

                        Pin4: 复位重置,简单的说,就是他接到低电平时,不管2脚和6脚是什么情况,3脚都输出低电压。基本上很少用到,不接就可以了。

                        Pin5: 电压控制,基本也很少用,它的作用是能控制3脚输出高低电平的频率。这个脚用的很少,基本悬空,就是什么都不接。5脚在555芯片内部的电压为2/3 VCC,有时候会用这个脚来影响6脚。当该端不用时,应将该端串入一只0.01μF电容接地,以防引入干扰。

                        Pin6: 重置锁定, 此脚就是控制3脚输出低电平,就是0V。想要3脚输出低电平要满足两个条件:

                                    a) 6脚电压从1/3Vcc 升到 2/3Vcc以上。

                                    b) 2脚的电压要在1/3以上。

                        Pin7: 放电端。该端与放电管集电极相连,用做定时器时电容的放电。此脚的电压和3脚电压保持一致。当3脚高电压,7脚也是高电压。当3脚为低电压,7脚也是低电压。但是7脚无电流输出能力。也就是当7脚高电压的时候,他不能输出电流,也就是电流非常非常小。但是当7脚低电压的时候,他相当于负极,能给电容放电。

                        Pin8: 电源正极,这个没有什么可说的了。

         总结一下:1负8正,接电源。2、6控制3输出。4脚重置7放电。

                            当2脚电压低于1/3 VCC,3脚输出高电平。当2脚接地的时候,3脚一定高电平输出,除非4脚也接地。这个时候,只要2脚电压升高到1/3 VCC以上,6脚的电压升高到2/3 VCC以上,那么3脚电压变成低电平,也就是0V。感觉这里有点复杂,实际应用的时候,2脚和6脚一般都是焊到一起,一起作为触发点。所以我们只要处理一种情况,触发点电压为低,输出为高;触发点电压为高,输出为低。


        本文章是参考网友@浅雪的《学会使用NE555》,非常感谢 浅雪大神无么奉献

电子基础 / 评 论 (0) / 热度 (211℃) / 2017-03-10 / 阅读全文  / MaWei

三极管基础认识

标 签:

1.认识三极管    

        三极管做为一个常用,也是很重要元件,在电路上不可缺少的。常用的三极管根据材料分有硅管和锗管两种,原理都相同,只是压降略不同,而这两种硅管用的比较多,而三极管按类型分,也分为两种:PNP 和 NPN型,如下图:

2017030811265624551.png

 三极管之所以叫三极管,是因为他有三个极,分别是左侧横向基极(base)标识号: b,有箭头端的发射极(emitter)标识号:e,剩下另一端为集电机c(collector)标识号:c。

2.三极管原理

    三极管的工作原理其它就是他的三种工作状态:截止、放大、饱和。截止和饱和一般来用做开关,现在基本都是用这个特性。至于放大的特型现在很少人用了,在以前模拟电路中常用三极管做放大用,例如:功放板之类的。

      三极管的类型和用法总结如下口诀:箭头朝内 PNP ,导通电压顺箭头过,电压导通,电流控制。

     其实现在基本上只要会用三极管开关控制特性就够了,至于放大特性还是去好好专业学习三极管,还涉及到各种计算,对于像我这种初级电子水平的人真搞不定。

3.三极管用法

    三极管的作用:控制、驱动。在以前模拟电路中,大部份的作用是放大,特别早期的音箱中用的很多。还有就是用他的截止、饱和的特性,做为开关控制。所以使用的时候只要注意箭头,只要箭头尾部端比箭头头端高0.7V以上就导通了。

    比如PNP型的,发射极 e 比基极 b 的电压高0.7v以上那这个三极管就导通了,电流的方向了就是发射极流向集电极。基极就是控制开关。

以上就是我对三极管的一些基础认识,以上也是我从网上学习来的,口诀也是我从《手把手教你学单片机》里摘录下来的。

电子基础 / 评 论 (0) / 热度 (132℃) / 2017-03-08 / 阅读全文  / MaWei

php安装rar模块

标 签: debianphp

    最近项目需要用到php解压rar,不知道怎么搞,这几天一直在折腾php解压rar,搞的我都没有脾气了,在网上找各种资料,发现真的没有什么这方面的资料,http://www.phpyrb.com/Admin-Article-edit.html

可能这个需求比较少吧,搞了好久,今天终于搞定了,下面说一下方法:

    1.下载php扩展rar包,网址为 http://pecl.php.net/package/rar;

    2.首先还是来说一下window版本的,这个容易,直接下载一个dll动态链接库包都放在php扩展包目录里面的,然后改一下配置文件重启就可以了.具体如下:

网址:http://pecl.php.net/package/rar/3.0.2/windows,已经在上面的网址中选择最新版本的rar扩展包,后面有个window DLL的图标点击进去下载,下载后把

里面的php_rar.dll这个文件放在你的php安装目录/php/ext/文件夹里面,然后再修改 php.ini ,在里面加上:

extension=php_rar.dll
然后重启你的服务器就可以,这个很简单,主要是linux服务器难搞,下面来说说liunx的安装方法:


    3.我用的是debian的系统,装的是 nginx 也就是lnmp包,

    4.第一步还是先下载并解压,命令如下:

wget http://pecl.php.net/get/rar-3.0.2.tgz
tar -xvf rar-3.0.2.tgz
cd rar-3.0.2
     5.然后是编译,首页你要安装一个编译插件:
#Debianhttp://www.phpyrb.com/Admin-Article-edit.html
apt-get install libc-client-dev
#CentOS
yum install libc-client-devel

    6.下面两步很关键,我就是这步没有搞好,所以一直不行,在官方文档里面,安装是直接运行 phpize,这是他包里面默认就有的,我照着他里面做就是不行,这个应该用你安装的php里面的phpize再编译,如果没有你修改

nginx安装路径,那么命令应该如下,反正就是用你安装好的php里面的phpize来编辑,不要用包里面自带这的.命令如下:

/usr/local/php/bin/phpize


可能这步会出现一些警告,如下的一样

Configuring for:
PHP Api Version:         20090626
Zend Module Api No:      20090626
Zend Extension Api No:   220090626
configure.in:3: warning: prefer named diversions
configure.in:3: warning: prefer named diversions
这个没有关系 ,不要影响后面的.


     7.这步是最关键的,就是告诉编译环境你的php路径,这步非常重要,我就是被这步给搞死的,命令如下,如果你没有修改默认路径的话:

./configure --with-php-config=/usr/local/php/bin/php-config
     8.最后一步就是添加配置,然后重启,修改php.ini配置:
vi /usr/local/php/etc/php.ini
然后在里面的添加:
extension=rar.so
然后保存,退出,重启nginx:
~/lnmp restart
如果没有报错,那就OK了.如果有问题,重新来一遍.嘿嘿^


PHP / 评 论 (0) / 热度 (401℃) / 2017-03-06 / 阅读全文  / MaWei

linux计划任务

标 签: debianLinux

    最近项目要用到计划任务,学习了一下linux计划任务命令:crontab,这个命令是linux定时任务服务命令,下面我总结了一下,共大家一起共同学习一下:

    1.安装crontab命令服务:

#debian安装
apt-get install cron
#centos安装
yum install crontabs
     2.开启crontab服务:
/etc/init.d/cron restart|reload|start|stop #重启|重载配置|开启|停止
     3.查看crontab服务状态
service cron status
     4.crontab命令格式:


        crontab user command #crontab 执行程序的用户名 执行的命令,

    5.crontab命令完整格式:

* * * * * user command  #前面五个星号为时期,依次表示,分 时 天 周 月,user为执行的用户名,command为执行命令

     6.Crontab执行时间说明:

       * 星号表示全部,为任意时间

       ,  逗号表示范围,例:1,2,3  如果写的周上,表示 星期一到星期三

       -  中横杠表示一个连续的整数范围 例:1-3 如果写的周上,表示 星期一到星期三

       /  正斜线表示时间间隔频率 例:0-23/4写在时上,表示一天24小时每四小时执行一次

    7.crontab编辑:

crontab -e
     用上面的命令,会打开crontab计划任务的编辑文件,在里面输入你执行的计划任务,详细请看第六步,例:
* */2 * * * www curl http://www.phpyrb.com #意思为每二分钟访问一个这个网站


    以上我个人理解,整理。

Linux / 评 论 (0) / 热度 (152℃) / 2017-03-06 / 阅读全文  / MaWei

修改crontab修改默认编辑器方法

标 签: debianLinux


    今天做项目的时候,需要用到计划任务,执行PHP任务。用crontab -e,打开,一下子傻眼了,一看用的nano编辑器,

这个编辑我只听过,不会用啊,跟VIM命令完全不一样,我想要换编辑器,在网上查了一下,我自己又总结了一下,方法如下,

下面的是把默认的nano修改为vim;

    方法1:(此方法只是临时生效)

export EDITOR=/usr/bin/vim;

    方法2:(此方法相对上面要好一点,但要重启服务器)

echo export EDITOR=/usr/bin/vim >> ~/.bashrc
   方法3: (此方法也要重启)
#查看当前系统有那些编辑器可用 
update-alternatives --list editor
#修改系统默认编辑器,输入如下的命令后,然后会提示你选择那个,直接输入数字
update-alternatives --config editor

    方法4:(这种方法更直接,而且不用重启)

apt-get remove nano

    直接卸载nano编辑器,我个人推荐这种,不用这个编辑器,直接卸载更好

Linux / 评 论 (0) / 热度 (193℃) / 2017-03-06 / 阅读全文  / MaWei