久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 10127|回復: 4
打印 上一主題 下一主題
收起左側(cè)

基于單片機的可控硅智能調(diào)速風扇控制系統(tǒng)

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:297879 發(fā)表于 2018-3-27 19:29 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
設計內(nèi)容:

1、單片機分析采集到的數(shù)字溫度信號,再通過可控硅對風扇電機進行調(diào)速。
2、用戶可以在一定范圍內(nèi)設置電風扇的最低工作溫度和最高工作溫度。當溫度低于所設置溫度時,電風扇將自動關閉,當高于此溫度時電風扇又將重新啟動。
3、溫度顯示在LED數(shù)碼管上
4、設計硬件電路,并制作實物。



全部資料:


主要程序代碼
主要程序代碼及說明(見注釋語句)如下:
數(shù)字溫度傳感器模塊和顯示子模塊程序:
  1. #include <reg52.h>        //調(diào)用單片機頭文件
  2. #define uchar unsigned char //無符號字符型 宏定義  變量范圍0~255
  3. #define uint unsigned int //無符號整型 宏定義    變量范圍0~65535
  4. #include "eeprom52.h"
  5. //數(shù)碼管段選定義   0    1   2 3   4   5 6   7   8  9   
  6. Ucharcodesmg_du[]={0x28,0xee,0x42,0x52,0xe5,0xa8,0x41,0xe7,0x20,0xa0,
  7. 0x60,0x25,0x39,0x26,0x31,0x71,0xff};   //斷碼
  8. //數(shù)碼管位選定義
  9. uchar code smg_we[]={0xef,0xdf,0xbf,0x7f};
  10. uchar dis_smg[8] = {0x28,0xee,0x32,0xa2,0xe4,0x92,0x82,0xf8};  
  11. uchar smg_i = 3;    //顯示數(shù)碼管的個位數(shù)
  12. sbit dq   = P2^4;    //18b20 IO口的定義
  13. bit flag_lj_en;       //按鍵連加使能
  14. bit flag_lj_3_en;     //按鍵連3次連加后使能  加的數(shù)就越大了
  15. uchar key_time,key_value;     //用做連加的中間變量
  16. bit key_500ms  ;
  17. sbit pwm = P2^3;  
  18. uchar f_pwm_l ;    //越小越暗
  19. uint temperature ;  //
  20. bit flag_300ms ;
  21. uchar menu_1;       //菜單設計的變量
  22. uint t_high = 300,t_low = 100;    //溫度上下限報警值
  23. /********************1ms延時函數(shù)*************************/
  24. void delay_1ms(uint q)
  25. {
  26.    uint i,j;
  27.    for(i=0;i<q;i++)
  28.        for(j=0;j<120;j++);
  29. }
  30. /***********************小延時函數(shù)*************************/
  31. void delay_uint(uint q)
  32. {
  33.    while(q--);
  34. }
  35. /***********************數(shù)碼顯示函數(shù)**********************/
  36. void display()
  37. {
  38.    static uchar i;   
  39.    i++;
  40.    if(i >= smg_i)
  41.        i = 0;
  42.    P1 = 0xff;          //消隱
  43.    P3 = smg_we;            //位選
  44.    P1 = dis_smg;       //段選           
  45. }
  46. /***************把數(shù)據(jù)保存到單片機內(nèi)部eepom中***************/
  47. void write_eeprom()
  48. {
  49.    SectorErase(0x2000);
  50.    byte_write(0x2000,t_high % 256);
  51.    byte_write(0x2001,t_high / 256);
  52.    byte_write(0x2002,t_low % 256);
  53.    byte_write(0x2003,t_low / 256);
  54.    byte_write(0x2055,a_a);
  55. }
  56. /*************把數(shù)據(jù)從單片機內(nèi)部eeprom中讀出來**************/
  57. void read_eeprom()
  58. {
  59.    t_high  = byte_read(0x2001);
  60.    t_high <<= 8;
  61.    t_high  |= byte_read(0x2000);
  62.    t_low   = byte_read(0x2003);
  63.    t_low <<= 8;
  64.    t_low   |= byte_read(0x2002);
  65.    a_a      = byte_read(0x2055);
  66. }
  67. /**************開機初始化保存的數(shù)據(jù)*****************/
  68. void init_eeprom()
  69. {
  70.    read_eeprom();        //先讀
  71.    if(a_a != 22)     //新的單片機初始單片機內(nèi)問eeprom
  72.    {
  73.        t_high = 320;
  74.        t_low  = 280;
  75.        a_a = 22;
  76.        write_eeprom();      //保存數(shù)據(jù)
  77.    }   
  78. }
  79. /*******************18b20初始化函數(shù)*************************/
  80. void init_18b20()
  81. {
  82.    bit q;
  83.    dq = 1;                //把總線拿高
  84.    delay_uint(1);       //15us
  85.    dq = 0;                //給復位脈沖
  86.    delay_uint(80);       //750us
  87.    dq = 1;                //把總線拿高 等待
  88.    delay_uint(10);       //110us
  89.    q = dq;                //讀取18b20初始化信號
  90.    delay_uint(20);       //200us
  91.    dq = 1;                //把總線拿高 釋放總線
  92. }
  93. /*************寫18b20內(nèi)的數(shù)據(jù)***************/
  94. void write_18b20(uchar dat)
  95. {
  96.    uchar i;
  97.    for(i=0;i<8;i++)
  98.    {                    //寫數(shù)據(jù)是低位開始
  99.        dq = 0;             //把總線拿低寫時間隙開始
  100.        dq = dat & 0x01; //向18b20總線寫數(shù)據(jù)了
  101.        delay_uint(5);     // 60us
  102.        dq = 1;             //釋放總線
  103.        dat >>= 1;
  104.    }   
  105. }
  106. /*************讀取18b20內(nèi)的數(shù)據(jù)***************/
  107. uchar read_18b20()
  108. {
  109.    uchar i,value;
  110.    for(i=0;i<8;i++)
  111.    {
  112.        dq = 0;             //把總線拿低讀時間隙開始
  113.        value >>= 1;   //讀數(shù)據(jù)是低位開始
  114.        dq = 1;             //釋放總線
  115.        if(dq == 1)        //開始讀寫數(shù)據(jù)
  116.            value |= 0x80;
  117.        delay_uint(5);     //60us    讀一個時間隙最少要保持60us的時間
  118.    }
  119.    return value;      //返回數(shù)據(jù)
  120. }
  121. /*************讀取溫度的值 讀出來的是小數(shù)***************/
  122. uint read_temp()
  123. {
  124.    uint value;
  125.    uchar low;            //在讀取溫度的時候如果中斷的太頻繁了,就應該把中斷給關了,否則會影響到18b20的時序
  126.    init_18b20();        //初始化18b20
  127.    EA = 0;
  128.    write_18b20(0xcc);      //跳過64位ROM
  129.    write_18b20(0x44);      //啟動一次溫度轉(zhuǎn)換命令
  130.    EA = 1;
  131.    delay_uint(50);          //500us
  132.    init_18b20();        //初始化18b20
  133.    
  134.    EA = 0;
  135.    write_18b20(0xcc);      //跳過64位ROM
  136.    write_18b20(0xbe);      //發(fā)出讀取暫存器命令
  137.    
  138.    low = read_18b20();     //讀溫度低字節(jié)
  139.    value =read_18b20();  //讀溫度高字節(jié)
  140.    EA = 1;
  141.    value <<= 8;         //把溫度的高位左移8位
  142.    value |= low;        //把讀出的溫度低位放到value的低八位中
  143.    value *= 0.625;          //轉(zhuǎn)換到溫度值 小數(shù)
  144.    return value;        //返回讀出的溫度 帶小數(shù)
  145. }
  146. /*************定時器0初始化程序***************/
  147. void time_init()   
  148. {
  149.    EA   = 1;        //開總中斷
  150.    TMOD = 0X11;    //定時器0、定時器1工作方式1
  151.    ET0  = 1;        //開定時器0中斷
  152.    TR0  = 1;        //允許定時器0定時
  153.    ET1  = 1;        //開定時器0中斷
  154.    TR1  = 0;        //允許定時器0定時
  155. }
  156. /********************獨立按鍵程序*****************/
  157. uchar key_can;    //按鍵值
  158. void key()     //獨立按鍵程序
  159. {
  160.    static uchar key_new;
  161.    key_can = 20;                   //按鍵值還原
  162.    P2 |= 0x07;
  163.    if((P2 & 0x07) !=0x07)      //按鍵按下
  164.    {
  165.        if(key_500ms == 1)   //連加
  166.        {
  167.            key_500ms = 0;
  168.            key_new = 1;
  169.        }
  170.        delay_1ms(1);        //按鍵消抖動
  171.        if(((P2 & 0x07) != 0x07) && (key_new == 1))
  172.        {                       //確認是按鍵按下
  173.            key_new = 0;
  174.            switch(P2 & 0x07)
  175.            {
  176.                case 0x06: key_can = 3; break;     //得到k2鍵值
  177.                case 0x05: key_can = 2; break;     //得到k3鍵值
  178.                case 0x03: key_can = 1; break;     //得到k4鍵值
  179.            }
  180.            flag_lj_en = 1;    //連加使能
  181.        }           
  182.    }
  183.    else
  184.    {
  185.        if(key_new == 0)
  186.        {
  187.            key_new = 1;
  188.            write_eeprom();       //保存數(shù)據(jù)
  189.            flag_lj_en = 0;       //關閉連加使能
  190.            flag_lj_3_en = 0; //關閉3秒后使能
  191.            key_value = 0;        //清零
  192.            key_time = 0;
  193.            key_500ms = 0;
  194.        }
  195.    }   
  196. }
  197. /****************按鍵處理數(shù)碼管顯示函數(shù)***************/
  198. void key_with()
  199. {
  200.    if(key_can == 1)    //設置鍵
  201.    {
  202.        f_pwm_l = 30;
  203.        menu_1 ++;
  204.        if(menu_1 >= 3)
  205.        {
  206.            menu_1 = 0;
  207.            smg_i = 3;       //數(shù)碼管顯示3位
  208.        }
  209.    }
  210.    if(menu_1 == 1)           //設置高溫報警
  211.    {
  212.        smg_i = 4;       //數(shù)碼管顯示4位
  213.        if(key_can == 2)
  214.        {
  215.            if(flag_lj_3_en == 0)
  216.                t_high ++ ;       //按鍵按下未松開自動加三次  
  217.            else
  218.                t_high += 10; //按鍵按下未松開自動加三次之后每次自動加10
  219.            if(t_high > 990)
  220.                t_high = 990;
  221.        }
  222.        if(key_can == 3)
  223.        {
  224.            if(flag_lj_3_en == 0)
  225.                t_high -- ;       //按鍵按下未松開自動減三次  
  226.            else
  227.                t_high -= 10; //按鍵按下未松開自動減三次之后每次自動減10
  228.            if(t_high <= t_low)
  229.                t_high = t_low + 1;
  230.        }
  231.        dis_smg[0] = smg_du[t_high % 10];             //取小數(shù)顯示
  232.        dis_smg[1] = smg_du[t_high / 10 % 10] & 0xdf;  //取個位顯示
  233.        dis_smg[2] = smg_du[t_high / 100 % 10] ;     //取十位顯示
  234.        dis_smg[3] = 0x64;    //H
  235.    }   
  236.    if(menu_1 == 2)           //設置低溫報警
  237.    {
  238.        smg_i = 4;       //數(shù)碼管顯示4位
  239.        if(key_can == 2)
  240.        {
  241.            if(flag_lj_3_en == 0)
  242.                t_low ++ ;         //按鍵按下未松開自動加三次  
  243.            else
  244.                t_low += 10;      //按鍵按下未松開自動加三次之后每次自動加10
  245.            if(t_low >= t_high)
  246.                t_low = t_high - 1;
  247.        }
  248.        if(key_can == 3)
  249.        {
  250.            if(flag_lj_3_en == 0)
  251.                t_low -- ;         //按鍵按下未松開自動減三次  
  252.            else
  253.                t_low -= 10;      //按鍵按下未松開自動加三次之后每次自動加10
  254.            if(t_low <= 10)
  255.                t_low = 10;
  256.        }
  257.        dis_smg[0] = smg_du[t_low % 10];              //取小數(shù)顯示
  258.        dis_smg[1] = smg_du[t_low / 10 % 10] & 0xdf;   //取個位顯示
  259.        dis_smg[2] = smg_du[t_low / 100 % 10] ;          //取十位顯示
  260.        dis_smg[3] = 0x3D;     //L
  261.    }   
  262. }  
  263. /****************風扇控制函數(shù)***************/
  264. void fengshan_kz()
  265. {
  266. // static uchar value;
  267.    if(temperature >=t_high)    //風扇全開
  268.    {   
  269.        TR1 = 1;
  270.        pwm = 0;
  271.    }
  272.    else if((temperature< t_high)  && (temperature>= t_low))         //風扇緩慢
  273.    {
  274.        f_pwm_l = 60;     
  275.        TR1 = 1;
  276.    }
  277.    else if(temperature< t_low)     //關閉風扇
  278.    {
  279.        TR1 = 0;
  280.        pwm = 1;
  281.    }           
  282. }
  283. /****************主函數(shù)***************/
  284. void main()
  285. {
  286.    time_init();                    //初始化定時器
  287.    temperature =read_temp();      //先讀出溫度的值  
  288.    init_eeprom();  //開始初始化保存的數(shù)據(jù)
  289.    delay_1ms(650);               
  290.    temperature =read_temp();               //先讀出溫度的值
  291.    dis_smg[0] =smg_du[temperature % 10];  //取溫度的小數(shù)顯示
  292.    dis_smg[1] =smg_du[temperature / 10 % 10] & 0xdf; //取溫度的個位顯示
  293.    dis_smg[2] =smg_du[temperature / 100 % 10] ;    //取溫度的十位顯示
  294.    f_pwm_l = 50;
  295.    while(1)
  296.    {      
  297.        key();                 //按鍵程序
  298.        if(key_can < 10)
  299.        {
  300.            key_with();           //設置報警溫度   
  301.        }
  302.        if(flag_300ms == 1)      //300ms 處理一次溫度程序
  303.        {      
  304.            flag_300ms = 0;   
  305.            temperature =read_temp();  //先讀出溫度的值
  306.            if(menu_1 == 0)
  307.            {   
  308.                smg_i = 3;
  309.        dis_smg[0] = smg_du[temperature % 10];  //取溫度的小數(shù)顯示
  310.            dis_smg[1] =smg_du[temperature / 10 % 10] & 0xdf; //取溫度的個位顯示
  311.    dis_smg[2] =smg_du[temperature / 100 % 10] ;    //取溫度的十位顯示
  312.            }
  313.        }
  314.        fengshan_kz();        //風扇控制函數(shù)
  315.    }
  316. }
  317. /*************定時器0中斷服務程序***************/
  318. void time0_int() interrupt 1
  319. {  
  320.    static uchar value;           //定時2ms中斷一次
  321.    TH0 = 0xf8;
  322.    TL0 = 0x30;     //2ms
  323.    display();     //數(shù)碼管顯示函數(shù)
  324.    value++;     
  325.    if(value >= 150)
  326.    {
  327.        value = 0;   
  328.        flag_300ms = 1;
  329.    }
  330.    if(flag_lj_en == 1)     //按下按鍵使能
  331.    {
  332.        key_time ++;
  333.        if(key_time >= 250) //500ms
  334.        {
  335.            key_time = 0;
  336.            key_500ms = 1; //500ms
  337.            key_value ++;
  338.            if(key_value > 3)
  339.            {
  340.                key_value = 10;
  341.                flag_lj_3_en = 1; //3次后1.5秒連加大些
  342.            }   
  343.        }
  344.    }
  345. }
  346. /************定時器1用做單片機模擬PWM 調(diào)節(jié)***********************/
  347. void Timer1() interrupt 3 //調(diào)用定時器1
  348. {
  349.    static uchar value_l;
  350.    TH1=0xfe;    //   定時10ms中斷一次
  351.    TL1=0x0c;   //500us
  352.    if(pwm==1)
  353.    {
  354.        value_l+=3;
  355.        if(value_l > f_pwm_l)  //高電平
  356.        {
  357.            value_l=0;
  358.            if(f_pwm_l != 0)   
  359.                pwm=0;
  360.        }
  361.    }
  362.    else               
  363.    {
  364.        value_l+=3;
  365.        if(value_l  > 100 -f_pwm_l)          //低電平
  366.        {
  367.            value_l=0;
  368.            pwm=1;
  369.        }
  370.     }
  371. }
復制代碼

QQ截圖20180327192726.png (18.36 KB, 下載次數(shù): 63)

QQ截圖20180327192726.png

基于單片機的智能調(diào)速風扇控制系統(tǒng).rar

3.28 MB, 下載次數(shù): 205, 下載積分: 黑幣 -5

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂1 踩
回復

使用道具 舉報

沙發(fā)
ID:346921 發(fā)表于 2018-7-11 16:11 | 只看該作者
看了半天就是沒見可控硅在哪,能指點下嗎?
回復

使用道具 舉報

板凳
ID:226801 發(fā)表于 2018-8-18 20:35 | 只看該作者
對啊,樓主,沒見可控硅在哪?實物板上沒有啊,只有7805穩(wěn)壓塊。
回復

使用道具 舉報

地板
ID:95703 發(fā)表于 2019-1-9 21:24 | 只看該作者
用可控硅來控制220V 來調(diào)速??
回復

使用道具 舉報

5#
ID:376283 發(fā)表于 2020-5-24 22:20 | 只看該作者
電路沒可控硅部分,沒啥用呀
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久草综合在线视频 | 人操人人 | 日韩中文在线观看 | 中文字幕一区二区三区四区五区 | 国产精品久久久久久久岛一牛影视 | 日韩av一二三区 | 亚洲国产视频一区 | 精品中文字幕一区二区 | 亚洲91 | www.成人在线视频 | 精品免费看 | 中文精品视频 | 国产精品久久片 | 天堂网色 | 久久国产精品无码网站 | 国产精品久久国产精品 | 日韩欧美国产不卡 | 久久久精品一区二区三区 | 国产欧美在线播放 | 久久精品视频免费观看 | 99精品免费视频 | 欧美色偷拍 | 91在线精品视频 | 成人在线观看亚洲 | 精品欧美一区二区精品久久久 | 国产欧美日韩一区二区三区 | 又爽又黄axxx片免费观看 | 99爱在线免费观看 | 国产一区二区视频在线 | 国产精品成人在线播放 | 久久精品久久久久久 | 亚洲成人免费av | 日本不卡一区 | 波多野结衣一区二区 | 国内精品免费久久久久软件老师 | 日韩激情免费 | 日本不卡一二三 | 在线欧美激情 | 亚洲视频免费在线观看 | 久久久婷 | 成人精品 |