#include //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include
#include
#include "18b20.h"
#include "delay.h"
#include "key.h"


sbit RS = P2^5;   //定义LCD1602端口
sbit RW = P2^6;
sbit EN = P2^7;

#define RS_CLR RS=0
#define RS_SET RS=1

#define RW_CLR RW=0
#define RW_SET RW=1

#define EN_CLR EN=0
#define EN_SET EN=1

#define DataPort P0

#define TIME     10000          //与PWM频率有关 12M晶振 10000周期为  10ms 频率100Hz

sbit PWMOUT=P3^6;

int PWM_Z;//PWM脉冲占空比
long PWM_D;//定时器赋值相关
int count=0;//进入定时中断计数

int TH=30; //温度上限
int TL=10; //温度下限

unsigned char KeyValue;        //返回按键值

int temp,temp1;
float temperature;
char displaytemp[16];//定义显示区域临时存储数组

/*------------------------------------------------
              判忙函数
------------------------------------------------*/
bit LCD_Check_Busy(void)
{
    unsigned char LCD_Status;
        RS = 0;
        RW = 1;
        EN = 1;
        DelayMs(1);
           LCD_Status = P0;
        EN = 0;
        return LCD_Status;
}
/*------------------------------------------------
              写入命令函数
------------------------------------------------*/
void LCD_Write_Com(unsigned char com)
{  
    while((LCD_Check_Busy()&0x80)==0x80);
        RS = 0;
        RW = 0;
        EN = 0;
        P0 = com;
        EN = 1;
        DelayMs(1);
        EN = 0;
}
/*------------------------------------------------
              写入数据函数
------------------------------------------------*/
void LCD_Write_Data(unsigned char Data)
{
while((LCD_Check_Busy()&0x80)==0x80);
        RS = 1;
        RW = 0;
        EN = 0;
        P0 = Data;
        EN = 1;
        DelayMs(1);
        EN = 0;
}

/*------------------------------------------------
                清屏函数
------------------------------------------------*/
void LCD_Clear(void)
{
LCD_Write_Com(0x01);
DelayMs(5);
}
/*------------------------------------------------
              写入字符串函数
------------------------------------------------*/
void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)
{     
if (y == 0)
        {     
         LCD_Write_Com(0x80 + x);     //表示第一行
        }
else
        {      
        LCD_Write_Com(0xC0 + x);      //表示第二行
        }        
while (*s)
        {     
LCD_Write_Data( *s);     
s ++;     
        }
}
/*------------------------------------------------
              写入字符函数
------------------------------------------------*/
void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data)
{     
if (y == 0)
        {     
        LCD_Write_Com(0x80 + x);     
        }   
else
        {     
        LCD_Write_Com(0xC0 + x);     
        }        
LCD_Write_Data( Data);  
}
/*------------------------------------------------
              初始化函数
------------------------------------------------*/
void LCD_Init(void)
{
   LCD_Write_Com(0x38);    /*显示模式设置*/
   DelayMs(5);
   LCD_Write_Com(0x38);
   DelayMs(5);
   LCD_Write_Com(0x38);
   DelayMs(5);
   LCD_Write_Com(0x38);
   DelayMs(5);
   //LCD_Write_Com(0x08);    /*显示关闭*/
   LCD_Write_Com(0x01);    /*显示清屏*/
   DelayMs(5);
   LCD_Write_Com(0x06);    /*显示光标移动设置*/
   DelayMs(5);
   LCD_Write_Com(0x0C);    /*显示开及光标设置*/
   DelayMs(5);
   }

/*------------------------------------------------
                    定时器初始化子程序
------------------------------------------------*/
void Init_Timer0(void)
{
TMOD |= 0x01;          //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响                     
TH0=(65536-2000)/256;                  //重新赋值 2ms
TL0=(65536-2000)%256;
EA=1;            //总中断打开
ET0=1;           //定时器中断打开
TR0=1;           //定时器开关打开
}  
/*------------------------------------------------
                    主函数
------------------------------------------------*/
void main(void)
{
LCD_Init();
Init_Timer0();
PWMOUT=0;

while (1)
{  
      KeyValue=KeyScan();
          if(KeyValue!=0)//如果有键按下
          {       
        Keyprocessing(KeyValue); //键值处理
          }

  temp1=ReadTemperature();  //读取温度值
  if(temp1>0)
  { if(temp1<2000)temp=temp1;}

  temperature=(float)temp*0.0625;
  sprintf(displaytemp,"Temp=%3.1f",temperature);//
  LCD_Write_String(0,1,displaytemp);// 显示温度值

  PWM_Z=(temperature-TL)/(TH-TL)*100;  //计算占空比
  if(PWM_Z>100)PWM_Z=100;
  if(PWM_Z<0)PWM_Z=0;
  if(PWM_Z==100)
  {
  TR0=0;
  ET0=0;
  EA=0;            //
  PWMOUT=1;
  }
  if(PWM_Z==0)
  {
  TR0=0;
  ET0=0;
  EA=0;            //
  PWMOUT=0;
  }

  if((PWM_Z>0)&&(PWM_Z<100))
  {
  EA=1;            //总中断打开
  ET0=1;           //定时器中断打开
  TR0=1;           //定时器开关打开
  }

  sprintf(displaytemp,"P=%3d",PWM_Z);//
  LCD_Write_String(10,1,displaytemp);//        显示占空比

  sprintf(displaytemp,"TH=%2d",TH);//
  LCD_Write_String(0,0,displaytemp);// 显示温度上限
  sprintf(displaytemp,"TL=%2d",TL);//
  LCD_Write_String(10,0,displaytemp);//        显示温度下限

  DelayMs(300);

}
}

/*------------------------------------------------
                 定时器中断子程序
------------------------------------------------*/
void Timer0_isr(void) interrupt 1 using 1
{
   if(PWMOUT==0)                 //如果正输出低电平 设置高电平延时时间
   {
   
        PWM_D=TIME/100*PWM_Z;
    TH0=(65536-PWM_D)/256;                  //
    TL0=(65536-PWM_D)%256;
         PWMOUT=1;
   }
   else                                   //如果正输出高电平 设置低电平延时时间
   {
   
        PWM_D=TIME/100*PWM_Z;
        //PWM_D=20000-PWM_D;
    TH0=(65536-(TIME-PWM_D))/256;                  //
    TL0=(65536-(TIME-PWM_D))%256;
        PWMOUT=0;
   }

}

关键字:51单片机  PWM  温控风扇 引用地址:基于51单片机的PWM温控风扇

上一篇:基于单片机+pt100热敏电阻的体温计
下一篇:基于单片机的直流电机PWM调速设计

推荐阅读

前言关于STM32的学习,初学者很容易被晶振这个东西给坑了。要在一个新平台上开发,先要把晶振搞定。举例说明查看介绍SensorNode例程的晶振是12MHz, SK和另一个都是16MHz。下面实例讲解下如何调整到16MHz,看下晶振如何设置。\src\boards\SensorNode\cmsis\stm32l1xx_hal_conf.h#if !defined (HSE_VALUE)//#define HSE_VALUE ((uint32_t)12000000) /*...
传感器是汽车感知周围的环境的硬件基础,在实现自动驾驶的各个阶段都必不可少。自动驾驶离不开感知层、控制层和执行层的相互配合。摄像头、雷达等传感器获取图像、距离、速度等信息,扮演眼睛、耳朵的角色。目前自动驾驶的安全事故原因绝大多数出现在传感器这个重要环节,将各类传感器融合在一起,能否就能起到1+1>2的效果呢?多传感器融合是必然趋势通过...
基本概念(CMSIS): Cortex Micro-controller Software Interface Standard,微控制器软件接口标准。2. CMSIS标准的文件结构:a) core_cm.c (stdint.h)b) system_.c (core_cm, system_)c) startup_.s其中core_cm.c以及core_cm中为内核设访问层,其中定义了定义了内核中得外设几丁质以及一些内核的访问及控制函数。startup_.s文件是系统的启...
随着科技的发展,市场对于汽车的安全性、舒适性等都提出了更高的要求,性能提升也意味着车体内的线束线材的布置数量与复杂程度都有上升,从而使大量线束在有限的汽车空间中如何更有效合理布置已成为汽车制造业面临的问题。那么在汽车线束布置中需要注意哪些问题呢?  一、线束固定点布置合理,固定可靠  (1)根据线束在整车上的实际安装位置,为了避...

史海拾趣

问答坊 | AI 解惑

IC设计领域介绍及工程师未来出路规划

一、 IC 设计领域简介 (一)模拟与混号讯号电路设计 IC 电路可分为为模拟 IC 与数字 IC 两大类,以及两者兼具的混合讯号等三种。模拟与数字的差异在于数字的讯号是以 0 、 1 的非连续方式传递、运算及储存。而模拟讯号则是以连续性的型式来传递, ...…

查看全部问答∨

如何给.Net软件加密

.Net是架构于操作系统上的平台,它是一套虚拟机,其核心功能由一系列运行在用户层的Dll文件实现。它的出现,大大减少了软件开发的工作量,但是也同时带来了版权保护难的新问题。不过,.Net最突出的跨平台优势使得它不能被编译成本地代码,而要以中 ...…

查看全部问答∨

STM32f10x。。数组初始化有错误。。只能初始化前64个字节

STM32f10x。。数组初始化有错误。。只能初始化前64个字节…

查看全部问答∨

傻瓜式无线传输模块PT2262/2294

今年电赛做智能小车 要求两辆小车需要无线通信 想用PT2262发送4位同步数据 但是PT2294接收不回数据 2262我用了4位发送位 1个VCC    1个GND 2294我也用上述6个引脚 空着1个VT 求解!  …

查看全部问答∨

安装了aStudio4.13却无法启动,谁能帮帮我?

安装了aStudio4.13却无法启动,谁能帮帮我? 提示“应用程序配置错误,不能启动” 我没有配置过什么啊?都是按默认的路径和状态来装的,一直“下一步”到最后的。…

查看全部问答∨

EPM240 奇怪现象求助

module test2(  input [15:0] xinput,  output reg [15:0] xoutput); reg  [15:0] routput ; always @ (xinput) begin case (xinput)  16\'b???????????????0 :  routput <=  16\'b111111111 ...…

查看全部问答∨

MSP430

各位大侠,正弦信号通过AD637的峰值检验电路后输出直流电压(例如6V),怎样用MSP430G2553显示到LCD12864显示屏上?急啊!!…

查看全部问答∨

做一个简单的ASK解调

新手上路,想做一个ASK的解调电路,感觉分立元件搭建检波电路性能不会很好,,听说用MC3361可以实现,但没看懂怎么用,MC3361引脚的10到14引脚用得上吗?是不是直接第9脚就可以输出了?  请问还有什么其他的推荐芯片?(最好外围器件少一 ...…

查看全部问答∨

TMS320VC5502调试SDRAM时, 出问题

\' TMS320VC5502调试SDRAM时, , 两个问题, 求解 1,写一个字节,结果所以内存全部变掉; 2,0x1e0000到0x200000之间的内存变成----了 …

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

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

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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