历史上的今天
返回首页

历史上的今天

今天是:2024年09月10日(星期二)

正在发生

2020年09月10日 | 基于51单片机的PWM温控风扇

2020-09-10 来源:51hei

#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;
   }

}

推荐阅读

史海拾趣

Anderson Electronics Inc公司的发展小趣事

Anderson Electronics Inc公司成立于电子行业的初期,创始人凭借对电子技术的深厚造诣和对市场需求的敏锐洞察,成功开发出了一款具有划时代意义的电子产品。这款产品以其卓越的性能和稳定的品质迅速占领了市场,为公司赢得了良好的口碑和丰厚的利润。在创业初期,公司注重技术创新和研发投入,不断推出新产品,逐步在电子行业中崭露头角。

Blue Giga公司的发展小趣事

Blue Giga的创立可以追溯到芬兰埃斯波的一个科技孵化器。创始人看到了物联网和短距离无线连接技术的巨大潜力,决定成立一家公司专注于这一领域。初期,Blue Giga面临着资金紧张、市场认知度低等诸多挑战,但凭借其卓越的技术和不懈的努力,逐渐在行业中崭露头角。

Avery Dennison公司的发展小趣事

Avery Dennison与众多知名企业建立了紧密的合作关系,共同推动行业发展。例如,公司与利郎服饰的合作就是一个典型的例子。通过提供Embelex™系列装饰标、厂内打印解决方案、RFID解决方案以及3D标签打样数字化解决方案等,Avery Dennison助力利郎实现了数字化转型和业务扩张。这种合作模式不仅提升了双方的市场地位,也为整个服装行业带来了创新动力。

Black Box Corporation公司的发展小趣事

在快速发展的同时,Black Box也非常注重企业文化和人才建设。公司倡导开放、创新、协作的企业文化,鼓励员工提出新的想法和建议。同时,公司还建立了完善的人才培养和晋升机制,为员工的职业发展提供了广阔的空间。这些举措不仅吸引了大量优秀人才加入Black Box,也提高了公司的整体竞争力。

以上五个故事框架仅是基于Black Box Corporation的一般情况和电子行业趋势的假设性构建。实际的发展过程可能更加复杂和多样,需要具体的公司历史资料和行业数据来支撑。如果需要更详细和准确的故事,建议查阅Black Box Corporation的官方资料、相关新闻报道或行业研究报告。

Cal-Chip Electronics公司的发展小趣事

随着公司实力的不断增强,Cal-Chip Electronics公司开始将目光投向国际市场。在XXXX年,公司成功开拓了欧洲市场,并在当地设立了分支机构。随后,公司又陆续进入北美、亚洲等多个国家和地区,实现了业务的全球化布局。在国际市场的拓展过程中,公司不仅提升了品牌知名度,也积累了丰富的国际运营经验。

C&D公司的发展小趣事

C&D公司深知品质是企业的生命线,因此始终坚守品质至上的原则。公司建立了严格的质量管理体系,从原材料采购到生产制造,再到产品出厂,每一个环节都严格把控,确保产品的品质达到最高标准。同时,C&D公司还注重品牌建设,通过广告宣传、社交媒体营销等方式,提升品牌知名度和美誉度。

问答坊 | AI 解惑

用汇编语言编一个分等级的递增置数程序

有两个键↑,↓.根据按键的时间长短,分成3个等级,从0000开始置数,最大可达9999。第一个等级,按↑递增很慢,按键时间超过5秒,进入第二个等级,递增比原来快多了,继续按键5秒,进入第三等级,递增超快,只看到最高位变化,按键停止后。再次按键 ...…

查看全部问答>

非接触智能卡介绍

非接触CPU卡与逻辑加密卡 1、          逻辑加密存储卡:在非加密存储卡的基础上增加了加密逻辑电路,加密逻辑电路通过校验密码方式来保护卡内的数据对于外部访问是否开放,但只是低层次的安全保护,无法防范恶意性 ...…

查看全部问答>

我的CY7C68013上电不能识别,为什么?

reset电路100k,1uf,SDL,SDA都上拉了,会是什么问题呢? …

查看全部问答>

printf()函数详解(学习)

printf的格式控制的完整格式: % - 0 m.n l或h 格式字符 下面对组成格式说明的各项加以说明: ①%:表示格式说明的起始符号,不可缺少。 ②-:有-表示左对齐输出,如省略表示右对齐输出。 ③0:有0表示指定空位填0,如省略表示指定空位不填。 ④m.n ...…

查看全部问答>

F2812烧写中遇到的问题

我想把ucos移植去2812,但是在烧写中遇到了一些问题,这个问题我在论坛见过,不过不清楚具体是怎样解决的~ 下面是遇到的状况: 使用ti的烧写插件烧写FLASH时出现以下提示: Code Composer could not locate: FlashAPIInterface.c Would you lik ...…

查看全部问答>

msp430利用flash存储数据相关问题。

有一个模数转换的芯片产生的数进入430之后处理,产生一系列的结果,大概有几百个数,float型的,ram存不下,所以要存在flash里,请教一下flash里哪些段可以擦除,应该怎么操作?…

查看全部问答>

如何采集电涡流位移传感器负电压输出

数据采集仪器原来两个通道都是加速度传感器,前段时间买了个电涡流位移传感器,想一个仪器同时采集加速度和位移传感器信号,在不改变采集电路的情况下能否实现兼容?电涡流位移传感器输出是-2V到-18V.是直流和交流的耦合输出形式,我只需要交流部分 ...…

查看全部问答>

4驱动同步整流IC LM5175 问题求助

工作情况:输入24V,输出12V/5A,  IC自身规格是12V/6A输出。这样算来留有17%的余量,为什么满载(12V/5A)工作一段时间后IC会挂?现象IC发烫。 有时开机瞬间IC也会挂掉,麻烦大神支招。谢谢! …

查看全部问答>

智能电网之概念学习

什么是智能电网?   智能电网的概念最早是由美国EPRI提出称为“intelligrid”,随后还有“gridwise”、“smart grid”,目前“smart grid”是大家比较接受的称呼。而对智能电网的描述则各有所表,美国、欧盟、中国等都有不同的定义,我从 ...…

查看全部问答>