找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2130|回復: 3
收起左側

基于單片機魚缸定時喂食彩燈控制系統(tǒng)

[復制鏈接]
ID:190577 發(fā)表于 2023-7-19 16:59 | 顯示全部樓層 |閱讀模式
一、系統(tǒng)方案
本設計采用AT89C52單片機主控器,液晶顯示1602顯示,按鍵設置定時時間,溫度DS18B20傳感器采集溫度值,按鍵設置溫度上下限,測量溫度值低于下限,啟動加熱設備,溫度值大于上限,啟動降溫設備,24路彩燈控制。
圖片1.png

二、硬件設計
原理圖如下:
圖片2.png
三、單片機軟件設計
1、首先是定時器初始化:
/*************定時器0初始化程序***************/
void init_time0()         
{
        EA   = 1;                   //開總中斷
        TMOD = 0X11;          //定時器0、工作方式1
        TH0 = (65536-10000)/256;  //重新加載初值
  TL0 = (65536-10000)%256;;

        ET0  = 1;                  //開定時器0中斷
        TR0  = 1;                  //允許定時器0定時
}
2、中斷服務程序
/**************定時器0中斷程序*****************/
void time0() interrupt 1
{                        
        static uchar value;

  unsigned char tmp;  //臨時變量
  static unsigned char index = 0;  //節(jié)拍輸出索引
  unsigned char code BeatCode[8] = {  //步進電機節(jié)拍對應的IO控制代碼
        0xE, 0xC, 0xD, 0x9, 0xB, 0x3, 0x7, 0x6
    };

  if (beats1 != 0)  //節(jié)拍數(shù)不為0則產(chǎn)生一個驅動節(jié)拍
    {
        tmp = P2;                    //用tmp把P2口當前值暫存
        tmp = tmp & 0xF0;            //用&操作清零低4位
        tmp = tmp | BeatCode[index]; //用|操作把節(jié)拍代碼寫到低4位
        P2  = tmp;                   //把低4位的節(jié)拍代碼和高4位的原值送回P2
                if(mode1==0)
        index++;                     //節(jié)拍輸出索引遞增
                if(mode1==1)
        index--;                     //節(jié)拍輸出索引遞增
        index = index & 0x07;        //用&操作實現(xiàn)到8歸零
        beats1--;                     //總節(jié)拍數(shù)-1
    }
    else  //節(jié)拍數(shù)為0則關閉電機所有的相
    {
        P2 = P2 | 0x0F;               
    }



        TH0 = (65536-10000)/256;  //重新加載初值
  TL0 = (65536-10000)%256;;

        value ++;           
        if((value % 10) == 0)         //100ms  
                flag_100ms = 1;         
        if(value >=20)                         //200ms
        {
                value = 0;
                flag_200ms = 1;
        }
}
3、按鍵檢測程序
void key()         //獨立按鍵程序
{
        static uchar key_new;
        key_can = 20;                   //按鍵值還原
        P3 |= 0x78;                     //對應的按鍵IO口輸出為1
        if((P3 & 0x78) != 0x78)                //按鍵按下
        {
                delay_1ms(10);                     //按鍵消抖動
                if(((P3 & 0x78) != 0x78) && (key_new == 1))
                {                                                //確認是按鍵按下
                        key_new = 0;
                        switch(P3 & 0x78)
                        {
                                case 0x70:  key_can = 4; //減
                                if(menu_1==0)
                                {
          mode++;
                                        if(mode>2) mode=0;
                                        num=0;
                                }


                                break;         //得到按鍵值
                                case 0x68:  key_can = 3;  
                                if(menu_1==0)
                                {
                                                if(number==1)        
                                        led=!led;
                                }


                                break;         //得到按鍵值
                                case 0x58:  key_can = 2;
                                if(menu_1==0)
                                {
                                                if(number==1)        
                                        led1=!led1;
                                }
                                if(led1==0)
                                {
                    mode1=0;

                 StartMotor1(360);
                                }
                                else

                                {
                    mode1=1;

                 StartMotor1(360);
                                }        

                                break;         //得到按鍵值
                                case 0x38:  key_can = 1;  break;         //得到按鍵值
                        }
                }                        
        }
        else
                key_new = 1;        
}
4、溫度檢測程序
/*************讀取溫度的值 讀出來的是小數(shù)***************/
uint read_temp()
{
        int value;
        uchar low;                           //在讀取溫度的時候如果中斷的太頻繁了,就應該把中斷給關了,否則會影響到18b20的時序
        init_18b20();                   //初始化18b20
        write_18b20(0xcc);           //跳過64位ROM
        write_18b20(0x44);           //啟動一次溫度轉換命令
        delay_uint(50);                   //500us

        init_18b20();                   //初始化18b20

        write_18b20(0xcc);           //跳過64位ROM
        write_18b20(0xbe);           //發(fā)出讀取暫存器命令

        EA = 0;
        low = read_18b20();           //讀溫度低字節(jié)
        value = read_18b20();  //讀溫度高字節(jié)
        EA = 1;
        value <<= 8;                   //把溫度的高位左移8位
        value |= low;                   //把讀出的溫度低位放到value的低八位中
        if(value< 0)                                //當溫度值為負數(shù)
  {

                fuhao=1;
                value=0;
        }
        else
        value *= 0.625;               //轉換到溫度值 小數(shù)
        return value;                   //返回讀出的溫度 帶小數(shù)
}


四、proteus仿真設計
Proteus軟件是一款應用比較廣泛的工具,它可以在沒有硬件平臺的基礎上通過自身的軟件仿真出硬件平臺的運行情況,這樣就可以通過軟件仿真來驗證我們設計的方案有沒有問題,如果有問題,可以重新選擇器件,連接器件,直到達到我們設定的目的,避免我們搭建實物的時候,如果當初選擇的方案有問題,我們器件都已經(jīng)焊接好了,再去卸載下去,再去焊接新的方案的器件,測試,這樣會浪費人力和物力,也給開發(fā)者帶來一定困惑,Proteus仿真軟件就很好的解決這個問題,我們在設計之初,就使用該軟件進行模擬仿真,測試,選擇滿足我們設計的最優(yōu)方案。最后根據(jù)測試沒問題的仿真圖紙,焊接實物,調(diào)試,最終完成本設計的作品。
圖片3.png


回復

使用道具 舉報

ID:582109 發(fā)表于 2023-7-22 22:26 | 顯示全部樓層
做個實物能挺好
回復

使用道具 舉報

ID:92810 發(fā)表于 2024-4-2 16:55 | 顯示全部樓層
做個實物能挺好
回復

使用道具 舉報

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

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

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

快速回復 返回頂部 返回列表