找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1994|回復(fù): 9
收起左側(cè)

用單片機(jī)定時(shí)中斷做個(gè)定時(shí)水循環(huán)系統(tǒng),代碼不報(bào)錯(cuò),時(shí)間和預(yù)想的不一樣

[復(fù)制鏈接]
ID:821461 發(fā)表于 2022-4-19 19:07 | 顯示全部樓層 |閱讀模式
求幫助!我用定時(shí)中斷做個(gè)定時(shí)水循環(huán)系統(tǒng),代碼沒報(bào)錯(cuò),但是關(guān)水泵的時(shí)間和預(yù)想的不一樣,請教大佬,我哪里弄錯(cuò)了原定計(jì)劃是:5分鐘開, 30分鐘關(guān),這樣一直循環(huán)。
void time0_init(void)
{
        TMOD|=0X01;//選擇為定時(shí)器0模式,工作方式1
        TH0=0XFC;        //給定時(shí)器賦初值,定時(shí)1ms
        TL0=0X18;        
        ET0=1;//打開定時(shí)器0中斷允許
        EA=1;//打開總中斷
        TR0=1;//打開定時(shí)器               
}
void main()
{        
        time0_init();//定時(shí)器0中斷配置
//        beng=0;
        while(1)
        {                        

        }               
}


void time0() interrupt 1 //定時(shí)器0中斷函數(shù)
{
        static u16 i;//定義靜態(tài)變量i
        static u8 j;  //定義秒變量
        static u8 k;  //定義分鐘變量
        TH0=0XFC;        //給定時(shí)器賦初值,定時(shí)1ms
        TL0=0X18;
        i++;
        if(i==1000)                  //一秒的計(jì)時(shí)
        {
                i=0;
                j++;
        }               
        if(j==60)                  //一分鐘的計(jì)時(shí)
        {
                k++;
                j=0;
                i=0;
        }        
        if(k==5 && beng==0)          //到了5分鐘,并且水泵打開的情況下
        {
                beng=1;                          //關(guān)閉水泵
                k=0;
                i=0;
                j=0;
        }
        if(k==30 && beng==1)          //到了30分鐘,并且水泵關(guān)閉的情況下
        {
                beng=0;                          //打開水泵
                k=0;
                i=0;
                j=0;
        }                        
}


回復(fù)

使用道具 舉報(bào)

ID:624769 發(fā)表于 2022-4-19 21:39 來自手機(jī) | 顯示全部樓層
把定時(shí)器設(shè)置為10ms,i改成char 定100看看會(huì)不會(huì)準(zhǔn)點(diǎn)
回復(fù)

使用道具 舉報(bào)

ID:911455 發(fā)表于 2022-4-19 22:09 | 顯示全部樓層
用的什么型號(hào)的單片機(jī),晶振頻率呢?說到底還初值賦的對不對,定義個(gè)輸出引腳,看下輸出周期對不對
回復(fù)

使用道具 舉報(bào)

ID:213173 發(fā)表于 2022-4-20 05:37 | 顯示全部樓層
  1. void time0() interrupt 1 //定時(shí)器0中斷函數(shù)
  2. {
  3.         static u16 i;//定義靜態(tài)變量i
  4.         static u8 j;  //定義秒變量
  5.         static u8 k;  //定義分鐘變量
  6.         TH0=0XFC;        //給定時(shí)器賦初值,定時(shí)1ms
  7.         TL0=0X18;
  8.         i++;
  9.         if(i==1000)                  //一秒的計(jì)時(shí)
  10.         {
  11.                 i=0;
  12.                 j++;               
  13.                 if(j==60)                  //一分鐘的計(jì)時(shí)
  14.                 {
  15.                         j=0;
  16.                         k++;
  17.                         if(k==35)k=0;               
  18.                 }               
  19.         }
  20.         if(k<5)beng=0;  //打開水泵
  21.         if(k>=5)beng=1; //關(guān)閉水泵
  22. }
復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

ID:821461 發(fā)表于 2022-4-20 10:01 | 顯示全部樓層
感謝,wulin 、188610329、innere 各位大佬,已經(jīng)解決了。萬分感謝。
回復(fù)

使用道具 舉報(bào)

ID:911455 發(fā)表于 2022-4-20 10:13 | 顯示全部樓層
xiaosps 發(fā)表于 2022-4-20 10:01
感謝,wulin 、188610329、innere 各位大佬,已經(jīng)解決了。萬分感謝。

別光感謝啊,解決了說說是哪的原因?
回復(fù)

使用道具 舉報(bào)

ID:821461 發(fā)表于 2022-4-20 17:49 | 顯示全部樓層
innere 發(fā)表于 2022-4-20 10:13
別光感謝啊,解決了說說是哪的原因?

單片機(jī)是51的,晶振是12M,我原來的意思是想水泵工作5分鐘,休息30分鐘。
代碼成功燒錄后遇到的問題是,休息時(shí)間過長,工作時(shí)間太短。
使用的是wulin大佬的辦法解決的,我看了下應(yīng)該是我的判斷不對,導(dǎo)致重復(fù)判斷了。
回復(fù)

使用道具 舉報(bào)

ID:1023659 發(fā)表于 2022-5-4 00:20 | 顯示全部樓層
代碼主體沒問題,就是在判斷水泵開關(guān)的時(shí)候判斷反了,beng=1為關(guān),beng=0為開
回復(fù)

使用道具 舉報(bào)

ID:593706 發(fā)表于 2022-5-5 17:06 | 顯示全部樓層
用普通的單片機(jī)做定時(shí)器,不管程序?qū)懙亩嗝春茫刖_定時(shí)是不可能地,這是單片機(jī)的硬件和軟件同共造成的誤差,如果使用外部時(shí)鐘源,情況就會(huì)好很多,我以前用單片機(jī)內(nèi)部中斷做過電子鐘,每24小時(shí)誤差隨便都在15秒以上,用外部的時(shí)鐘源配合單片機(jī)做的時(shí)鐘,一個(gè)月的誤差不超過5秒
回復(fù)

使用道具 舉報(bào)

ID:1026496 發(fā)表于 2022-5-15 10:55 | 顯示全部樓層
static u16 i;//定義靜態(tài)變量i         static u8 j;  //定義秒變量         static u8 k;  //定義分鐘變量 中加入Volatile
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表