51单片机PWM温控风扇源代码

发布者:ArtisticSoul最新更新时间:2020-02-09 来源: 51hei关键字:51单片机  PWM  温控风扇 手机看文章 扫描二维码
随时随地手机看文章

51系列单片机代码如下:

#include                  //调用单片机头文件

#define uchar unsigned char  //无符号字符型 宏定义        变量范围0~255

#define uint  unsigned int         //无符号整型 宏定义        变量范围0~65535


//数码管段选定义      0     1    2    3    4    5        6         7          8           9        

uchar code smg_du[]={0x28,0xee,0x42,0x72,0xe5,0xa8,0x41,0x77,0x20,0xa0,

                                           0x60,0x25,0x39,0x26,0x31,0x71,0xff};         //断码

//数码管位选定义

uchar code smg_we[]={0xef,0xdf,0xbf,0x7f};

uchar dis_smg[4] = {0};        

uchar smg_i = 3;    //显示数码管的个位数

sbit dq   = P2^4;        //18b20 IO口的定义


bit flag_lj_en;                 //按键连加使能

bit flag_lj_3_en;         //按键连3次连加后使能  加的数就越大了 

uchar key_time,key_value;      //用做连加的中间变量

bit key_500ms  ;

sbit pwm = P2^3;  

uchar f_pwm_l ;          //


uint temperature ;  //

bit flag_300ms ;

uchar menu_1;       //菜单设计的变量

uint t_high = 300,t_low = 100;           //温度上下限值 


/***********************1ms延时函数*****************************/

void delay_1ms(uint q)

{

        uint i,j;

        for(i=0;i                for(j=0;j<120;j++);

}


/***********************小延时函数*****************************/

void delay_uint(uint q)

{

        while(q--);

}



/***********************数码显示函数*****************************/

void display()

{

        static uchar i;   

        i++;

        if(i >= smg_i)

                i = 0;        

        P1 = 0xff;                         //消隐 

        P3 = smg_we[i];                          //位选

        P1 = dis_smg[i];                 //段选                


}


/***********************18b20初始化函数*****************************/

void init_18b20()

{

        bit q;

        dq = 1;                                //把总线拿高

        delay_uint(1);            //15us

        dq = 0;                                //给复位脉冲

        delay_uint(80);                //750us

        dq = 1;                                //把总线拿高 等待

        delay_uint(10);                //110us

        q = dq;                                //读取18b20初始化信号

        delay_uint(20);                //200us

        dq = 1;                                //把总线拿高 释放总线

}


/*************写18b20内的数据***************/

void write_18b20(uchar dat)

{

        uchar i;

        for(i=0;i<8;i++)

        {                                         //写数据是低位开始

                dq = 0;                         //把总线拿低写时间隙开始 

                dq = dat & 0x01; //向18b20总线写数据了

                delay_uint(5);         // 60us

                dq = 1;                         //释放总线

                dat >>= 1;

        }        

}


/*************读取18b20内的数据***************/

uchar read_18b20()

{

        uchar i,value;

        for(i=0;i<8;i++)

        {

                dq = 0;                         //把总线拿低读时间隙开始 

                value >>= 1;         //读数据是低位开始

                dq = 1;                         //释放总线

                if(dq == 1)                 //开始读写数据 

                        value |= 0x80;

                delay_uint(5);         //60us        读一个时间隙最少要保持60us的时间

        }

        return value;                 //返回数据

}


/*************读取温度的值 读出来的是小数***************/

uint read_temp()

{

        uint value;

        uchar low;                           //在读取温度的时候如果中断的太频繁了,就应该把中断给关了,否则会影响到18b20的时序

        init_18b20();                   //初始化18b20

        write_18b20(0xcc);           //跳过64位ROM

        write_18b20(0x44);           //启动一次温度转换命令

        delay_uint(50);                   //500us


        init_18b20();                   //初始化18b20

        

        write_18b20(0xcc);           //跳过64位ROM

        write_18b20(0xbe);           //发出读取暂存器命令

        

        low = read_18b20();           //读温度低字节

        value = read_18b20();  //读温度高字节

        value <<= 8;                   //把温度的高位左移8位

        value |= low;                   //把读出的温度低位放到value的低八位中

        value *= 0.625;               //转换到温度值 小数

        return value;                   //返回读出的温度 带小数

}


/*************定时器0初始化程序***************/

void time_init()          

{

        EA   = 1;                   //开总中断

        TMOD = 0X21;          //定时器0、定时器1工作方式1

        ET0  = 1;                  //开定时器0中断 

        TR0  = 1;                  //允许定时器0定时


        ET1  = 1;                  //开定时器0中断 

        TR1  = 1;                  //允许定时器0定时

}


/********************独立按键程序*****************/

uchar key_can;         //按键值


void key()         //独立按键程序

{

        static uchar key_new;

        key_can = 20;                   //按键值还原

        P2 |= 0x07;

        if((P2 & 0x07) != 0x07)                //按键按下

        {

                if(key_500ms == 1)        //连加

                {

                        key_500ms = 0;

                        key_new = 1;

                }

                delay_1ms(1);                     //按键消抖动

                if(((P2 & 0x07) != 0x07) && (key_new == 1))

                {                                                //确认是按键按下

[1] [2] [3]
关键字:51单片机  PWM  温控风扇 引用地址:51单片机PWM温控风扇源代码

上一篇:基于51单片机实钟、土壤湿度检测、空气温度检测程序
下一篇:DS18B20多点测温源程序+proteus仿真工程

推荐阅读最新更新时间:2024-11-03 15:18

51单片机指令表 —— 30 附录 51单片机指令表大全
51单片机指令集列表大全 此表主要是为了方便大家查阅每条指令的作用,写法以及字节数和周期数,建议大家保存为书签。 助记符 指令说明 字节数 周期数 (数据传递类指令) MOV A,Rn 寄存器传送到累加器 1 1 MOV A,direct 直接地址传送到累加器 2 1 MOV A,@Ri 累加器传送到外部RAM(8 地址) 1 1 MOV A,#data 立即数传送到累加器 2 1 MOV Rn,A 累加器传送到寄存器 1 1 MOV Rn,direct 直接地址
[单片机]
基于51单片机的数控直流稳压电源的设计与实现
1 引言 直流稳压电源是电子技术常用的设备之一,广泛的应用于教学、科研等领域。传统的多 功能直流稳压电源功能简单、难控制、可靠性低、干扰大、精度低且体积大、复杂度高。普 通直流稳压电源品种很多.但均存在以下问题:输出电压是通过粗调(波段开关)及细调(电 位器)来调节。这样,当输出电压需要精确输出,或需要在一个小范围内改变时(如 1.02~1.03V),困难就较大。另外,随着使用时间的增加,波段开关及电位器难免接触不良, 对输出会有影响。常常通过硬件对过载进行限流或截流型保护,电路构成复杂,稳压精度也 不高。本文设计了一种以单片机为核心的智能化高精度简易直流电源,克服了传统直流电压 源的缺点,具有很高的应用价值。 2 系统硬件设
[单片机]
基于<font color='red'>51单片机</font>的数控直流稳压电源的设计与实现
51单片机系列连载1——单片机概述
从今天开始,我会简单地对51单片机相关知识及一些模块进行总结,主要是从市场应用导入,然后分析一下用到的技术编程,最后说一下自己的想法,基本都是这个流程。这仅仅是一个开始,之后还会有STM32、安卓系统等系列,先从最简单的单片机开始。 我们先看看市场上有哪些产品会用到单片机,想想看,基本上周围所有的电子产品都会用到,确切的说,最基本的嵌入芯片都会有单片机的影子,它涉及到各个领域,所以单片机的应用非常广泛。先看看单片机的实物图: 实际上就是一个芯片,焊接嵌套到一些仪器里,通过c语言编程,通过stc-isp等仿真器的仿真,进而操作芯片实现
[单片机]
AT89S51单片机串行口的内部结构及功能介绍
AT89S51单片机串行口的内部结构如下图所示。它有两个物理上独立的接收、发送缓冲器SBUF(属于特殊功能寄存器),可同时发送、接收数据。发送缓冲器只能写入不能读出,接收缓冲器只能读出不能写入,两个缓冲器共用一个特殊功能寄存器字节地址(99H)。 串行口的控制寄存器共有两个:特殊功能寄存器SCON和PCON。下面介绍这两个特殊功能寄存器各位的功能。 1、串行口控制寄存器SCON 串行口控制寄存器SCON,字节地址988H,可位寻址,位地址为98H~9FH。SCON的格式如下图所示。 下面介绍SCON中各位的功能。 (1) SM0、SMl:串行口4种工作方式选择位。 SM0、SM1两位的编码所对应的4种工作方式见下表。 表
[单片机]
AT89S<font color='red'>51单片机</font>串行口的内部结构及功能介绍
51单片机是如何存储程序和数据的
简介:(单片机基础知识之单片机存储器)在学校很少用到外扩ROM/RAM的情况,都是用C语言编程,不差空间,代码太大了,买个大ROM的芯片就行了。现在工作了,单位是做SoC的,采用了51的IP核,才算对51的代码/数据空间有了清晰的认识。 在学校很少用到外扩ROM/RAM的情况,都是用C语言编程,不差空间,代码太大了,买个大ROM的芯片就行了。现在工作了,单位是做SoC的,采用了51的IP核,才算对51的代码/数据空间有了清晰的认识。 MCS-51使用哈弗结构,它的程序空间和数据空间是分开编址的,即各自有各自的地址空间,互不重叠。所以即使地址一样,但因为分开编址,所以依然要说哪一个空间内的某地址。而ARM(甚至是x86)这种
[单片机]
基于51单片机的DS18B20测量温度实验
实验任务 用一片DS18B20构成测温系统,测量的温度精度达到0.1度,测量的温度的范围在-20度到+50度之间,用4位数码管显示出来。 DPY-1实验板连接 用排线把JP-CODE连到JP8是,注意:a接P0.0;b接P0.1;c接P0.3…… 把JP-CS连到JP14上,注意:4H接P2.4;3H接P2.5;2H接P2.6;1H接P2.7; 连接好DS18B20注意极性不要弄反,否则可能烧坏。DS18B20的外型与常用的三极管一模一样,上图是它的管脚分布。用导线将JK—DS的DA端连到P3.1上。 硬件电路图 实验原理 DS18B20数字温度计是DALLAS公司生产的1-Wire,即单总线器件,具有线路简单,体
[单片机]
基于<font color='red'>51单片机</font>的DS18B20测量温度实验
基于51单片机的温度报警器设计
摘 要:单片机技术已经普及到我们生活,工作,科研,各个领域,已经成为一种比较成熟的技术,本文将介绍一种基于单片机控制的数字温度器,本温度计属于多功能温度计,可以设置上下报警温度,当温度不在设置范围内时,可以报警。 随着现代工农业技术的发展及人们对生活环境要求的提高,人们也迫切需要检测与控制温度。本文通过采用蜂鸣器作为电声元件的温度报警器的设计,阐明了该装置进行设计与制作的具体过程及方法。这种温度报警器结构简单,可操作性强,应用广泛。工作时,温度测量范围为5—38ºC。当前环境温度若超过设定的高温临界温度,由单片机发出报警信号,从而防止带来的不必要的损失。 造成高温火灾有:电气线路短路、过载、接触电阻过大等引发高温或火灾;静电产生高
[单片机]
基于<font color='red'>51单片机</font>的温度报警器设计
51单片机软件抗干扰的技术误区
单片机 中存在这样一种广泛流传的误解:在MCS-51系列单片机中,只要用指令使程序从起始地址开始执行,就可以复位单片机,摆脱干扰。通过一个简单的实验,揭示了软件复位的可靠方法。   有的单片机(如8098)有专门的复位指令,某些增强型MCS-51系统单片机虽然没有复位指令,但片内集成了WATCHDOG电路,故抗干扰也不成问题。而普及型MCS-51系列单片机(如8031和8032)既然无复位指令,又不带硬件WATCHDOS,如果没有外接硬件WATCHDOG电路,就必须采用软件抗干扰技术。常用的软件抗干扰技术有:软件陷阱、指令冗余、软件WATCHDOG等,它们的作用是在系统受干扰时能及时发现,再用软件的方法使系统复位。所谓软件复位
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved