標(biāo)題: 二個(gè)很菜的單片機(jī)中斷延時(shí)計(jì)數(shù)問題請(qǐng)高手指教修正 [打印本頁(yè)]
作者: xmcai 時(shí)間: 2020-4-8 20:21
標(biāo)題: 二個(gè)很菜的單片機(jī)中斷延時(shí)計(jì)數(shù)問題請(qǐng)高手指教修正
在一段中斷計(jì)數(shù)延時(shí)的單片機(jī)程序設(shè)計(jì)中,被二個(gè)很菜的問題困擾著,請(qǐng)高手師傅指教改正。
1、 利用中斷計(jì)數(shù)設(shè)計(jì)一段8小時(shí)的長(zhǎng)時(shí)間延時(shí)程序,計(jì)數(shù)滿8小時(shí)后繼電器自動(dòng)接通工作5分鐘,然后重新進(jìn)入8小時(shí)延時(shí)程序,如此循環(huán),直至外部打斷使flag_5計(jì)時(shí)標(biāo)志為0止。測(cè)試時(shí),每個(gè)計(jì)數(shù)節(jié)用(20*60)*2時(shí)(即2分鐘),9節(jié)共18分鐘,可以正常接通繼電器,然后5分鐘后斷開,程序正常執(zhí)行。但當(dāng)每個(gè)計(jì)數(shù)節(jié)用(20*60)*54時(shí)(即54分鐘,最大也只能設(shè)定為54分鐘,因?yàn)樽畲笥?jì)數(shù)為65536),按理應(yīng)該在8.1小時(shí)后繼電器接通,但實(shí)際卻執(zhí)行不了,繼電器始終不接通,不知問題出在哪?請(qǐng)高手指教改正。
if( flag_5==1 ) //如果計(jì)時(shí)標(biāo)志5為1,進(jìn)入下面8小時(shí)延時(shí)
{
temp_5++; //中斷計(jì)數(shù)變時(shí)5自+1
if(temp_5>=(20*60)*54) //(20*60)為延時(shí)1分鐘基數(shù),*54可延時(shí)54分鐘
{
temp_6++;
if(temp_6>=(20*60)*54)
{
temp_7++;
if(temp_7>=(20*60)*54)
{
temp_8++;
if(temp_8>=(20*60)*54)
{
temp_9++;
if(temp_9>=(20*60)*54)
{
temp_10++;
if(temp_10>=(20*60)*54)
{
temp_11++;
if(temp_11>=(20*60)*54)
{
temp_12++;
if(temp_12>=(20*60)*54)
{
temp_13++;
if(temp_13>=(20*60)*54)
{
Relay=1; //上面計(jì)數(shù)延時(shí)滿山8小時(shí),繼電器接通
temp_4=0;
temp_5=0;
temp_6=0;
temp_7=0;
temp_8=0;
temp_9=0;
temp_10=0;
temp_11=0;
temp_12=0;
temp_13=0;
flag_5=0;
flag_6=1;
}
}
}
}
}
}
}
}
}
}
if(flag_6==1) //如果計(jì)時(shí)標(biāo)位flag_6=1
{
temp_6++; //中斷變量temp_6+1
if(temp_6>=(20*60)*54) //(20*60)為延時(shí)1分鐘,*5可延時(shí)5分鐘
{
Relay=0; //繼電器斷開
temp_6=0;
flag_6=0; //計(jì)時(shí)標(biāo)志6清零
flag_5=1; //計(jì)時(shí)標(biāo)志5為1,重新進(jìn)入上面的循環(huán)
}
}
2、用一段do-while的循環(huán)程序替代上面的九節(jié)計(jì)數(shù)環(huán)節(jié),卻延時(shí)不了,錯(cuò)在何處,也請(qǐng)高手師傅指教一下。
if( flag_5==1) //如果計(jì)數(shù)標(biāo)志為1,進(jìn)入下面的循環(huán)環(huán)節(jié)
{
temp_5=0;
temp_6=0;
do
{
temp_5++;
if(temp_5>=(20*60)*54)
{
temp_5=0;
temp_6=temp_6+1;
}
}
while(temp_6<=9);
}
if(temp_6>=9)
{
Relay0=1; //繼電器接通
flag_5=0;
flag_6=1;
}
作者: hujj 時(shí)間: 2020-4-8 22:29
既然項(xiàng)目最小的計(jì)時(shí)單位是5分鐘,為什么不設(shè)置一個(gè)5分鐘的變量,每隔5分鐘這個(gè)變量增1,這樣整個(gè)處理過(guò)程應(yīng)該會(huì)簡(jiǎn)化很多。
作者: f556 時(shí)間: 2020-4-9 01:30
1、把主頻分頻降低,據(jù)各種MCU,有128分頻,設(shè)寄存器就行了
2、用一個(gè)變量計(jì)中斷次數(shù),不行設(shè)個(gè)unsigned long變量,幾個(gè)小時(shí)不成問題
作者: wulin 時(shí)間: 2020-4-9 08:12
給你一個(gè)示例,定時(shí)精度取決于晶振精度。未經(jīng)實(shí)物驗(yàn)證,只是供參考。如果加上數(shù)碼管顯示和進(jìn)一步優(yōu)化可以做成倒計(jì)時(shí)顯示并使計(jì)時(shí)誤差控制在1秒內(nèi)。
- #include <reg51.h>
- #define uint unsigned int
- #define uchar unsigned char
- sbit key=P1^0;
- sbit LED=P1^6;
- sbit OUT=P1^7;
- uchar Cnt50ms=0;sec=0;//50毫秒、秒變量
- uint min=0;//分變量
- bit flag_5=0;//計(jì)時(shí)標(biāo)志
- void Timer0Init() //50毫秒@12.000MHz
- {
- TMOD= 0x01; //設(shè)置定時(shí)器模式
- TL0 = 0xB0; //設(shè)置定時(shí)初值
- TH0 = 0x3C; //設(shè)置定時(shí)初值
- TR0 = 1; //定時(shí)器0開始計(jì)時(shí)
- EA = 1; //開總中斷
- ET0= 1; //開定時(shí)器0中斷
- }
- void keyscan()
- {
- static bit key_sign=0;//按鍵自鎖標(biāo)志變量
- static uchar count=0; //消抖計(jì)數(shù)變量
- if(!key)
- {
- if(++count>=100 && key_sign==0)
- {
- key_sign=1;//自鎖
- flag_5=~flag_5;//取反
- if(flag_5==0)
- LED=1;//燈熄 定時(shí)器停止工作
- else
- LED=0;//燈亮 定時(shí)器工作中
- //清0 為重新計(jì)時(shí)準(zhǔn)備
- Cnt50ms=0;
- sec=0;
- min=0;
- }
- }
- else//松手
- {
- count=0;//消抖計(jì)數(shù)變量清0
- key_sign=0;//自鎖標(biāo)志清0
- }
- }
- void main()
- {
- OUT=0; //初始化輸出端口
- Timer0Init();//初始化定時(shí)器
- while(1)
- {
- keyscan();//按鍵掃描
- }
- }
- /**************中斷服務(wù)程序*****************/
- void timer0() interrupt 1
- {
- TL0 = 0xB0; //重裝定時(shí)初值
- TH0 = 0x3C; //重裝定時(shí)初值
- if(flag_5==1)
- {
- Cnt50ms++; //中斷變量Cnt50ms自+1
- if(Cnt50ms>=20) //1秒
- {
- Cnt50ms=0;
- sec++;
- if(sec>=60) //1分
- {
- sec=0; //秒計(jì)數(shù)
- min++;
- }
- }
- if(min<480) //8小時(shí)
- OUT=0;
- if(min>=480||min<485) //8小時(shí)與8小時(shí)零5分之間
- OUT=1;
- if(min>=485) //8小時(shí)零5分時(shí)間到
- {//全部清0
- OUT=0;
- Cnt50ms=0;
- sec=0;
- min=0;
- // flag_5=0;//不重復(fù)循環(huán)
- }
- }
- }
復(fù)制代碼
作者: 黃youhui 時(shí)間: 2020-4-9 08:46
看著代碼好費(fèi)勁啊,你就不能將你的temp_5++ temp_6++封裝個(gè)函數(shù)調(diào)用一下嗎
作者: xmcai 時(shí)間: 2020-4-9 12:15
非常感謝wulin師傅的無(wú)私指導(dǎo),您已多次指導(dǎo),受您啟發(fā),多次受益,均已成功,謝謝您!!
作者: game灬boy 時(shí)間: 2020-4-9 13:14
你的測(cè)試5分鐘可行對(duì)吧;然后在5分鐘的基礎(chǔ)上再定義1個(gè)變量 分鐘m;
假設(shè)你的5分鐘技數(shù)count=50時(shí)為5分鐘
8小時(shí)60*8=480分鐘480/5=96
m=96時(shí);繼電器使能;m=97時(shí);繼電器關(guān)閉使能;
if (count==50)
{
m++;
if(m==96)
使能flag=1;
if(m==97)
{
使能flag=0;
m=0;
}
count=0;
}
作者: xmcai 時(shí)間: 2020-4-9 21:38
謝謝指導(dǎo)!
| 歡迎光臨 (http://m.raoushi.com/bbs/) |
Powered by Discuz! X3.1 |