找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5126|回复: 1
收起左侧

简易散热风扇控制器设计STC15F104e单片机+DS18B20+ULN2003A仿真和源程序

[复制链接]
ID:159139 发表于 2017-4-30 12:39 | 显示全部楼层 |阅读模式
stc15f104e+ds18b20+ULN2003A简易散热风扇控制器,压缩包内有用C51的仿真和原程序C。新手发帖,请多指教
下面是风扇控制器的仿真原理图:
0.png
F1 40度启动   F2  50度启动
F1 小于35度停止   F2 小于 45度停止
用8051仿真15F104E,用小灯泡代替小风扇好看点,因为风扇停止太慢。
0.png

散热风扇控制器的单片机源程序:

  1. ///朱旭东2017年改 89c52rc 11.0592MHZ
  2. //+99.9~-9.9
  3. // 十位  个位  小数   小c   P0.0-P0.7 A-G点,使用3位管时不用小C
  4. //#include<reg52.h>
  5. #include <intrins.h>
  6. #include <STC15Fxxxx.H>
  7. //code unsigned char seg7code[12]={0x3f,0x06,0x5b,0x4f,0x66,
  8.                               //  0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x61}; //显示段码0,1,2,3,4,5,6,7,8,9,-.C
  9. unsigned int tem;
  10. sbit led1=P3^4;
  11. sbit led=P3^5;
  12. sbit TMDAT =P3^2; //DS18B20的数据输入/输出脚DQ,根据情况设定
  13. sbit led2=P3^3;
  14. bit  fg=0;        //温度正负标志
  15. unsigned char k;

  16. //sbit w1=P1^0;
  17. //sbit w2=P1^1;
  18. //sbit w3=P1^2;
  19. //sbit w4=P1^3;

  20. void delay_us(unsigned char n)// STC15系列单片机延时1微秒@12MHZ
  21. {
  22.     while (n--)
  23.     {
  24.         _nop_();
  25.         _nop_();
  26.                 _nop_();
  27.                 _nop_();
  28.     }
  29. }        





  30. void Delay(unsigned int tc)     //显示延时程序
  31. {while( tc != 0 )
  32.    {unsigned int i;
  33.     for(i=0; i<100; i++);
  34.     tc--;}
  35. }


  36.         
  37. void Init_DS18B20(void)        //发送复位
  38.   {                              
  39.   unsigned char i=0;
  40.   //TMDAT=0;   delay_us(240); delay_us(240);//168   for(i=0;i<103;i++); //370us
  41. // TMDAT = 1;delayus(46);//5  for(i=0;i<4;i++); // 16 us
  42. TMDAT = 1;          //DQ复位
  43. delay_us(80); //稍做延时
  44. TMDAT = 0;          //单片机将DQ拉低
  45. delay_us(240); //精确延时 大于 480us
  46. delay_us(240);
  47. TMDAT = 1;          //拉高总线
  48. delay_us(60);
  49. i=TMDAT;        
  50. delay_us(240);              //等待设备释放数据线
  51. delay_us(180);

  52.   }   

  53.       
  54. unsigned char ReadOneChar(void){//读一个字节
  55.         unsigned char i=0;
  56.         unsigned char dat = 0;
  57.         for (i=8;i>0;i--){
  58.         TMDAT  = 0; // 给脉冲信号
  59.                 dat>>=1;
  60.         TMDAT  = 1; // 给脉冲信号
  61.                 if(TMDAT ==1){
  62.                         dat|=0x80;
  63.                 }
  64.                 delay_us(60);
  65.         }
  66.         return(dat);
  67. }
  68.          
  69. void WriteOneChar(unsigned char dat)//写一个字节
  70. {        unsigned char i=0;
  71.         for (i=8; i>0; i--)
  72.         {
  73.                 TMDAT= 0;
  74.                 TMDAT = dat&0x01;
  75.                 delay_us(60);
  76.                 TMDAT = 1;
  77.                 dat>>=1;
  78.         }
  79. }


  80. unsigned int ReadTemperature(void)//读取温度
  81. {        unsigned char a=0;
  82.         unsigned char b=0;
  83.         unsigned int t=0;
  84.         float tt=0;
  85.         Init_DS18B20();
  86.         WriteOneChar(0xCC); // 跳过读序号列号的操作
  87.         WriteOneChar(0x44); // 启动温度转换
  88.         Init_DS18B20();
  89.         WriteOneChar(0xCC); //跳过读序号列号的操作
  90.         WriteOneChar(0xBE); //读取温度寄存器
  91.         a=ReadOneChar();  //读低8位
  92.         b=ReadOneChar(); //读高8位
  93.         t=b;
  94.         t<<=8;
  95.         t=t|a;

  96.    if(t<0x0fff)//前五位为0
  97.    fg=0;          //+温度时的标志
  98.     else
  99.       {fg=1;
  100.       t=~t+1*10-7;//得到真实温度*10 ,为了显示后一位小数,-7使负误差减小为0.1度
  101.            }  //-温度时的标志


  102.         tt=t*0.0625;
  103.         t= tt*10+0.5; //放大10倍输出并四舍五入
  104.         tem=t;
  105.         return(t);
  106. }

  107. /*      
  108. void Led()
  109. {
  110.    if(fg==0)   //温度为正时显示的数据
  111.    {  
  112.     w1=w2=w3=w4=1;
  113.     w1=0;
  114.     P3=seg7code[tem%1000/100];//输出十位数
  115.      Delay(15);      
  116.      w1=1;
  117.      w2=0;
  118.     P3=seg7code[tem%100/10]|0x80; //输出个位和小数点
  119.      Delay(15);
  120.     w2=1;
  121.     w3=0;
  122.     P3=seg7code[tem%10];   //输出小数点后第一位
  123.     Delay(15);
  124.     w3=1;
  125.      w4=0;
  126.     P3=seg7code[11];//输出c
  127.     Delay(15);
  128.     w1=w2=w3=w4=1;
  129.    // P0=seg7code[xiaoshu2];       //输出小数点后第二位
  130.    // Delay(4); P2=P2|0xf0;
  131.    }
  132.   

  133.   if(fg==1)  //温度为负时显示的数据
  134.    { w1=w2=w3=w4=1;
  135.    w1=0;
  136.     P3=seg7code[10];           //负号
  137.     Delay(15);  
  138.     w1=1;
  139.     w2=0;
  140.     P3=seg7code[tem%100/10]|0x80; //输出个位数和小数点
  141.     Delay(15);
  142.     w2=1;
  143.     w3=0;
  144.    
  145.     P3=seg7code[tem%10];   //输出小数第1位
  146.     Delay(15);
  147.     w3=1;
  148.     w4=0;
  149.    
  150.     P3=seg7code[11];//输出c
  151.     Delay(15);
  152.    w1=w2=w3=w4=1;
  153.     //P0=seg7code[xiaoshu];       //输出小数点后第一位
  154.    // Delay(4); P2=P2|0xf0;
  155.    }
  156. }
  157. */

  158. main()
  159. {fg=0;
  160.   led=0;
  161.   led1=0;
  162.    P3M0=0x00;
  163.    P3M1=0x00;//P3口推挽
  164.   // P1M0=0x00;
  165.   // P1M1=0x00;

  166.   while(1)
  167.    {
  168. for(k=0;k<100;k++)
  169. {Delay(15);
  170.     ReadTemperature();
  171.    // Led();
  172.     Delay(15);
  173.     if(tem>=400)//风扇1启动温度40
  174.      {led=1;
  175.         }
  176.     if(tem>=500)//风扇2启动温度50
  177.      {led1=1;
  178.         }


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

所有资料下载(含仿真与源码):
1820带温度控制104e.rar (98.84 KB, 下载次数: 94)

评分

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

查看全部评分

回复

使用道具 举报

ID:1 发表于 2017-4-30 17:43 | 显示全部楼层
好资料,51黑有你更精彩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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