找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8701|回复: 7
收起左侧

基于51单片机的PWM温控风扇的proteus仿真与源码

  [复制链接]
ID:170270 发表于 2017-11-15 17:22 | 显示全部楼层 |阅读模式
单片机pwm仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
仿真图.png 3D效果图.png
0.png

温控风扇.rar

238.8 KB, 下载次数: 252, 下载积分: 黑币 -5

多人回帖说代码不全 缺少头文件 大家不要下载

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:170270 发表于 2017-11-15 17:23 | 显示全部楼层
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include<intrins.h>
#include<stdio.h>
#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;
   }

}
回复

使用道具 举报

ID:249854 发表于 2017-11-15 20:54 | 显示全部楼层
感谢分享啊
回复

使用道具 举报

ID:297400 发表于 2019-3-18 17:37 来自手机 | 显示全部楼层
curiousRay 发表于 2017-11-15 20:54
**** 作者被禁止或删除 内容自动屏蔽 ****

有.h文件吗
回复

使用道具 举报

ID:492852 发表于 2019-3-20 21:08 | 显示全部楼层
????
不全?
回复

使用道具 举报

ID:470857 发表于 2019-3-20 22:07 | 显示全部楼层
感谢楼主分享
回复

使用道具 举报

ID:308951 发表于 2019-3-21 08:32 | 显示全部楼层
代码很好,内容十分详细
回复

使用道具 举报

ID:165363 发表于 2019-6-20 17:36 | 显示全部楼层
还差几个头文件呢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表