找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5225|回复: 8
收起左侧

基于单片机的笔记本电脑散热风扇智能底座仿真和源程序设计

[复制链接]
ID:311317 发表于 2018-4-19 00:02 | 显示全部楼层 |阅读模式
学期末需要一个课程设计做平时成绩用

做了一个基于51单片机的笔记本散热风扇,做了两天,虽然做的不好,但是供有需要的朋友学习,包括仿真、源程序以及功能说明!!

基于单片机的笔记本电脑的智能底座设计
1.需求分析
笔记本电脑,便于携带,而且它的功能满足大多数人的需要,随着技术的近步带来的成本下降,笔记本的价格也为大多数人所接受。随着使用笔记本人数的增加,笔记本的各种问题也暴露出来,其中散热问题至关重要,它不仅关系着能耗更关系着笔记本的使用寿命。因此散热成为最关键的因素,有时笔记本电脑会莫名奇妙的死机,一般就是系统温度过高导致。为了解决这个问题,设计散热底座,可以使笔记本产生的热量尽快的扩散到电脑外部,不影响笔记本的使用功能,保证笔记本电脑的正常工作。
2.实现功能
(1)检测实时的温度,如果高于一个阀值电压,就要启动散热设备。
(2)温度达到一定值时,进行报警。
(3)温度读取的同时发送至串口,单片机进行同步处理。
(4)显示温度,并且可对散热设备进行控制。

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0.png

单片机源程序如下:
  1. #include<reg51.h>
  2. #include<intrins.h>                         //包含头文件
  3. #define uchar unsigned char
  4. #define uint unsigned int                 //宏定义
  5. ////////////////////
  6. sbit dj=P1^0;//电机控制端接口
  7. sbit Ds=P1^6;//温度传感器接口
  8. sbit buzz=P1^7;//蜂鸣器接口
  9. //////////按键接口/////////////////////////////////
  10. sbit key1=P3^5;//设置温度
  11. sbit key2=P3^6;//温度加
  12. sbit key3=P3^7;//温度减
  13. //////////////////////////////////////////////////////
  14. sbit w1=P2^4;
  15. sbit w2=P2^5;
  16. sbit w3=P2^6;
  17. sbit w4=P2^7;                          //数码管的四个位
  18. /////共阴数码管段选//////////////////////////////////////////////
  19. uchar table[22]=
  20. {0x3F,0x06,0x5B,0x4F,0x66,
  21. 0x6D,0x7D,0x07,0x7F,0x6F,
  22. 0x77,0x7C,0x39,0x5E,0x79,0x71,
  23. 0x40,0x38,0x76,0x00,0xff,0x37};//'-',L,H,灭,全亮,n         16-21
  24. uint wd;                                                //温度变量  
  25. uint shang,xia; //对比温度暂存变量
  26. uchar s;//开关显示
  27. uchar flag;
  28. uchar d1,d2,d3;//显示数据暂存变量
  29. void delay(uint ms)                //延时函数,大约延时25us
  30. {
  31.         uchar x;
  32.         for(ms;ms>0;ms--)
  33.                 for(x=10;x>0;x--);
  34. }
  35. /***********ds18b20延迟子函数(晶振12MHz )*******/
  36. void delay_18B20(uint i)
  37. {
  38.         while(i--);
  39. }
  40. /**********ds18b20初始化函数**********************/
  41. void Init_DS18B20()
  42. {
  43.          uchar x=0;
  44.          Ds=1;          //DQ复位
  45.          delay_18B20(8);  //稍做延时
  46.          Ds=0;          //单片机将DQ拉低
  47.          delay_18B20(80); //精确延时 大于 480us
  48.          Ds=1;          //拉高总线
  49.          delay_18B20(14);
  50.          x=Ds;            //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
  51.          delay_18B20(20);
  52. }
  53. /***********ds18b20读一个字节**************/  
  54. uchar ReadOneChar()
  55. {
  56.         uchar i=0;
  57.         uchar dat=0;
  58.         for (i=8;i>0;i--)
  59.          {
  60.                   Ds=0; // 给脉冲信号
  61.                   dat>>=1;
  62.                   Ds=1; // 给脉冲信号
  63.                   if(Ds)
  64.                   dat|=0x80;
  65.                   delay_18B20(4);
  66.          }
  67.         return(dat);
  68. }
  69. /*************ds18b20写一个字节****************/  
  70. void WriteOneChar(uchar dat)
  71. {
  72.         uchar i=0;
  73.         for (i=8;i>0;i--)
  74.         {
  75.                   Ds=0;
  76.                 Ds=dat&0x01;
  77.             delay_18B20(5);
  78.                 Ds=1;
  79.             dat>>=1;
  80.         }
  81. }
  82. /**************读取ds18b20当前温度************/
  83. void ReadTemperature()
  84. {
  85.         uchar a=0;
  86.         uchar b=0;
  87.         uchar t=0;
  88.         Init_DS18B20();
  89.         WriteOneChar(0xCC);            // 跳过读序号列号的操作
  90.         WriteOneChar(0x44);         // 启动温度转换
  91.         delay_18B20(100);       // this message is wery important
  92.         Init_DS18B20();
  93.         WriteOneChar(0xCC);         //跳过读序号列号的操作
  94.         WriteOneChar(0xBE);         //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
  95.         delay_18B20(100);
  96.         a=ReadOneChar();            //读取温度值低位
  97.         b=ReadOneChar();                   //读取温度值高位
  98.         wd=((b*256+a)>>4);    //当前采集温度值除16得实际温度值
  99. }
  100. void display()//显示温度
  101. {
  102.         w1=0;P0=table[d1];delay(10); //第1位
  103.         P0=0x00;w1=1;delay(1);
  104.          
  105.         w2=0;P0=table[16];delay(10);//第2位
  106.         P0=0x00;w2=1;delay(1);

  107.         w3=0;P0=table[d2]; delay(10);//第3位
  108.         P0=0x00;w3=1;delay(1);

  109.         w4=0;P0=table[d3];delay(10);//第4位
  110.         P0=0x00;w4=1;delay(1);
  111. }
  112. void zi_keyscan()//自动模式按键扫描函数
  113. {
  114.         if(key1==0)                                                          //设置键按下
  115.         {
  116.                 delay(30);                                                  //延时去抖
  117.                 if(key1==0)flag=1;                                  //再次判断按键,按下的话进入设置状态
  118.                 while(key1==0);//松手检测                  //按键释放
  119.         }
  120.         while(flag==1)                                                  //进入设置上限状态
  121.         {
  122.                 d1=18;d2=shang/10;d3=shang%10;          //显示字母H 和上限温度值
  123.                 display();                                                  //调用显示函数
  124.                 if(key1==0)                                                  //判断设置键是否按下
  125.                 {
  126.                         delay(30);                                          //延时去抖
  127.                         if(key1==0)flag=2;                          //按键按下,进入设置下限模式
  128.                         while(key1==0);//松手检测
  129.                 }
  130.                 if(key2==0)                                                  //加键按下
  131.                 {
  132.                         delay(30);                                          //延时去抖
  133.                         if(key2==0)                                          //加键按下
  134.                         {
  135.                                 shang+=5;                                  //上限加5
  136.                                 if(shang>=100)shang=100;  //上限最大加到100
  137.                         }while(key2==0);//松手检测
  138.                 }
  139.                 if(key3==0)                                                  //减键按下
  140.                 {
  141.                         delay(30);                                          //延时去抖
  142.                         if(key3==0)                                          //减键按下
  143.                         {
  144.                                 shang-=1;                                  //上限减1
  145.                                 if(shang<=10)shang=10;          //上限最小减到10
  146.                         }while(key3==0);//松手检测
  147.                 }               
  148.         }
  149.         while(flag==2)                                                  //设置下限
  150.         {
  151.                 d1=17;d2=xia/10;d3=xia%10;                  //显示字母L 显示下限温度值
  152.                 display();                                                  //以下注释同上
  153.                 if(key1==0)
  154.                 {
  155.                         delay(30);
  156.                         if(key1==0)flag=0;
  157.                         while(key1==0);//松手检测
  158.                 }
  159.                 if(key2==0)
  160.                 {
  161.                         delay(30);
  162.                         if(key2==0)
  163.                         {
  164.                                 xia+=5;
  165.                                 if(xia>=95)xia=95;       
  166.                         }while(key2==0);//松手检测
  167.                 }
  168.                 if(key3==0)
  169.                 {
  170.                         delay(30);
  171.                         if(key3==0)
  172.                         {
  173.                                 xia-=1;
  174.                                 if(xia<=0)xia=0;       
  175.                         }while(key3==0);//松手检测
  176.                 }               
  177.         }
  178. }
  179. void zi_dong()//自动温控模式
  180. {
  181.         uchar i;
  182.         d1=s;d2=wd/10;d3=wd%10;                //显示档位,显示当前温度值
  183.         zi_keyscan();//按键扫描函数
  184.         display();         //调用显示函数
  185.         if(wd<xia){dj=0;s=0;buzz=1;}//低于下限  档位为0 电机停止
  186.         if((wd>=xia)&&(wd<=shang))//温度大于下限,小于上限  1挡
  187.         {
  188.                 s=1;
  189.                 buzz=1;                                                                                        //档位置1
  190.                 for(i=0;i<3;i++){dj=0;display();zi_keyscan();}        //PWM通过延时得到
  191.                 for(i=0;i<6;i++){dj=1;display();zi_keyscan();}               
  192.         }
  193.         if(wd>shang){dj=1;s=2;buzz=1;}//高温全速
  194.         if(wd>50){buzz=0;dj=1;s=2;}
  195. }
  196. void main()                  //主函数
  197. {
  198.         uchar j;
  199.         dj=0;                  //电机开
  200.         shang=40;
  201.         xia=20;                  //初始上下限值
  202.         for(j=0;j<150;j++)          //先读取温度值,防止开机显示85
  203.         ReadTemperature();
  204.         while(1)                          //进入while循环
  205.         {       
  206.                 ReadTemperature();        //读取温度值
  207.                 for(j=0;j<100;j++)zi_dong();//自动温控模式
  208. ……………………

  209. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
0.png

所有资料51hei提供下载:
基于单片机的笔记本电脑的智能底座设计.rar (103.72 KB, 下载次数: 106)

评分

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

查看全部评分

回复

使用道具 举报

ID:306530 发表于 2018-4-19 08:41 | 显示全部楼层
赞  赞
回复

使用道具 举报

ID:407374 发表于 2018-10-10 14:29 | 显示全部楼层
楼主大大,这个程序中,哪里是说温度过高的报警功能,我没有看到啊
回复

使用道具 举报

ID:407374 发表于 2018-10-10 14:45 | 显示全部楼层
看到了,没问题
回复

使用道具 举报

ID:428178 发表于 2018-12-3 22:18 | 显示全部楼层
这个实物做出来会不会电压不够导致数码管不亮?电压只有2v,楼主有实物图吗?要不要用三极管放大
回复

使用道具 举报

ID:458437 发表于 2018-12-30 10:23 | 显示全部楼层
好东西
回复

使用道具 举报

ID:356006 发表于 2019-1-10 17:07 来自手机 | 显示全部楼层
电机直接插在芯片的1.0和地上,运行程序后电机并不会转,可是直接插在5v和地就转,是什么问题呢?
回复

使用道具 举报

ID:311317 发表于 2019-1-28 14:17 | 显示全部楼层
a244504436 发表于 2018-12-3 22:18
这个实物做出来会不会电压不够导致数码管不亮?电压只有2v,楼主有实物图吗?要不要用三极管放大

之前也做了实物,不用放大的
回复

使用道具 举报

ID:311317 发表于 2019-1-28 14:24 | 显示全部楼层
嘟嘟的小迷妹 发表于 2019-1-10 17:07
电机直接插在芯片的1.0和地上,运行程序后电机并不会转,可是直接插在5v和地就转,是什么问题呢?

如果你是实物的话,直接连1口是不行的,需要图上的驱动电路;如果有驱动电路, 温度要达到你的设定温度,读取那里看是不是有问题。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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