找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2459|回复: 5
打印 上一主题 下一主题
收起左侧

温控程序单片机IO口输出高低电平控制L298N,如何修改程序?

[复制链接]
跳转到指定楼层
楼主
ID:622126 发表于 2019-10-30 20:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
30黑币
用51单片机做恒温实验,DS18B20读取温度
低于温度下限继电器接通加热棒加热
高于温度上限IO口输出高低电平控制L298N启动风扇降温

继电器的程序有了

但是IO口输出高低电平去控制L298N的程序不知道怎么添加了
希望大神帮忙加一段输出高低电平控制的程序




现有程序如下
//头文件:
#include <reg52.h>
#include <ds18b20.h> //引入DS18B20头文件

//引脚定义:  
sbit JDQ=P1^4;  //继电器控制
sbit SMG_q = P1^0; //定义数码管阳级控制脚(千位)
sbit SMG_b = P1^1; //定义数码管阳级控制脚(百位)
sbit SMG_s = P1^2; //定义数码管阳级控制脚(十位)
sbit SMG_g = P1^3; //定义数码管阳级控制脚(个位)

//变量定义:
unsigned char ly_dis[4];//定义显示缓冲区
unsigned char DSU=30; //上线温度
unsigned char DSD=25; //下线温度
code unsigned char table[]=
   {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
     //表:共阳数码管 0-9
unsigned char l_posit=0; //显示位置

//函数声明:
void display(void);//显示函数,显示缓冲区内容
void delay(void);

//主函数,C语言的入口函数:
void main()
{
unsigned int i=0;
float tt;
int ltemp;
while(1){
  if(i==0)
   tmpchange();       //温度转换
  if(i==100){
   tt=tmp()*0.0625;   //得到真实十进制温度值,因为DS18B20
        //可以精确到0.0625度,所以读回数据的最低位代表的是0.0625度。
   if(tt<=DSD)  //低于下线温度启动继电器
    JDQ=0;  
   if(tt>=DSU)  //达到上线温度关闭继电器
    JDQ=1;

     ltemp=tt*10+0.5;    //放大十倍,这样做的目的将小数点后第一位也转换为可显示数字,同时进行一个四舍五入操作。
   if(ltemp<0){  //判断第一位显示整数还是负号
    ly_dis[0]=0xbf;
    ltemp=0-ltemp;
   }
   else
    ly_dis[0]=ltemp/1000;//显示百位值
   ltemp=ltemp%1000;
   ly_dis[1]=ltemp/100; //显示温度十位值
   ltemp=ltemp%100;
   ly_dis[2]=ltemp/10;  //显示温度个位值
   ly_dis[3]=ltemp%10;  //显示小数点后一位
  }
  i++;
  if(i==3000)
   i=0;
  display(); //调用显示
  delay();
}
}

//显示函数,参数为显示内容
void display()
{
P0=0XFF;   //
switch(l_posit){
case 0:  //选择千位数码管,关闭其它位
  SMG_q=0;
  SMG_b=1;
  SMG_s=1;  
  SMG_g=1;
  P0=table[ly_dis[0]]; //输出显示内容
  break;
case 1:  //选择百位数码管,关闭其它位
  SMG_q=1;
  SMG_b=0;
  SMG_s=1;  
  SMG_g=1;
  P0=table[ly_dis[1]];
  break;
case 2:  //选择十位数码管,关闭其它位
  SMG_q=1;
  SMG_b=1;
  SMG_s=0;  
  SMG_g=1;
  P0=table[ly_dis[2]]&0x7f;
  break;
case 3:  //选择个位数码管,关闭其它位
  SMG_q=1;
  SMG_b=1;
  SMG_s=1;  
  SMG_g=0;
  P0=table[ly_dis[3]];
  break;
}
l_posit++;  //每调用一次将轮流显示一位
if(l_posit>3)
  l_posit=0;
}

//延时子函数,短暂延时
void delay(void){  
unsigned char i=10;
while(i--);
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:496421 发表于 2019-11-2 14:38 | 只看该作者
去搜搜PWM,应该对你有帮助吧
回复

使用道具 举报

板凳
ID:584814 发表于 2019-11-6 10:55 | 只看该作者
你要的电扇只是停和转两个稳态,不需要搞那么多花花肠子。
真的精确用PWM控制电扇散热的话,电加热也应该有功率控制而不仅仅是继电器开关的。
还有不明白的就是,如果仅PWM也不需要L298N,吹风和吸风对散热的效率是怎么换算的呢 ?
感觉楼主就是和L298N干上了
回复

使用道具 举报

地板
ID:383215 发表于 2019-11-6 11:51 | 只看该作者
楼上回答正解!改继电器为可控硅,单片机通过可控硅控对加热棒调功,比如加热棒50%功率发现温度略低,加热棒60%功率发现温度略高,那就全功率加热到设定温度然后把功率降到50%,低于温度设定值把加热棒功率调整到60%,通过加热棒50%和60%的功率转换来恒温,风扇最多起一个辅助作用,甚至可以不用风扇。楼主用加热棒加温,又用风扇降温,按照我们当地的一句话,叫做:又伤马达又费电!
回复

使用道具 举报

5#
ID:121029 发表于 2019-11-6 15:21 | 只看该作者
学习下  PID 温控吧
回复

使用道具 举报

6#
ID:424408 发表于 2019-11-6 18:03 | 只看该作者
温度是有惰性的,一定是变化的值
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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