历史上的今天
今天是: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;
}
}
史海拾趣
|
有两个键↑,↓.根据按键的时间长短,分成3个等级,从0000开始置数,最大可达9999。第一个等级,按↑递增很慢,按键时间超过5秒,进入第二个等级,递增比原来快多了,继续按键5秒,进入第三等级,递增超快,只看到最高位变化,按键停止后。再次按键 ...… 查看全部问答> |
|
printf的格式控制的完整格式: % - 0 m.n l或h 格式字符 下面对组成格式说明的各项加以说明: ①%:表示格式说明的起始符号,不可缺少。 ②-:有-表示左对齐输出,如省略表示右对齐输出。 ③0:有0表示指定空位填0,如省略表示指定空位不填。 ④m.n ...… 查看全部问答> |
|
我想把ucos移植去2812,但是在烧写中遇到了一些问题,这个问题我在论坛见过,不过不清楚具体是怎样解决的~ 下面是遇到的状况: 使用ti的烧写插件烧写FLASH时出现以下提示: Code Composer could not locate: FlashAPIInterface.c Would you lik ...… 查看全部问答> |
|
有一个模数转换的芯片产生的数进入430之后处理,产生一系列的结果,大概有几百个数,float型的,ram存不下,所以要存在flash里,请教一下flash里哪些段可以擦除,应该怎么操作?… 查看全部问答> |
|
数据采集仪器原来两个通道都是加速度传感器,前段时间买了个电涡流位移传感器,想一个仪器同时采集加速度和位移传感器信号,在不改变采集电路的情况下能否实现兼容?电涡流位移传感器输出是-2V到-18V.是直流和交流的耦合输出形式,我只需要交流部分 ...… 查看全部问答> |
|
工作情况:输入24V,输出12V/5A, IC自身规格是12V/6A输出。这样算来留有17%的余量,为什么满载(12V/5A)工作一段时间后IC会挂?现象IC发烫。 有时开机瞬间IC也会挂掉,麻烦大神支招。谢谢! … 查看全部问答> |




