欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
單片機定時器程序問題
[打印本頁]
作者:
xiaocui007
時間:
2020-2-10 19:08
標題:
單片機定時器程序問題
求教:定時器中這部分放在主函數中,程序不能正常運行。放在定時器函數中可以正常運行,請問是怎么回事?
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
aa++;
if (aa==20)
{ aa=0;
if(temp==100)
temp=0;
temp++;
}
bai=temp/100;
shi=temp%100/10;
ge=temp%10;
}
作者:
xianfajushi
時間:
2020-2-10 19:58
從理論上來說描述的問題是不存在的,紅色部分正確的代碼放在主函數中一定是可以正常運行的,除非主函數中有其他的代碼影響了這段代碼的正確運行。
作者:
智多星520
時間:
2020-2-10 20:37
1. 增加定時器定時長度測試一下
作者:
智多星520
時間:
2020-2-10 20:38
2. 將 bai shi ge計算放到 temp++后面試試。
作者:
智多星520
時間:
2020-2-10 20:39
后面帶了除法與取余計算,不知道你的這些變量是什么型的。
作者:
智多星520
時間:
2020-2-10 20:42
不知道你這些變量是什么 類型的,后面的bai shi ge 每次都要做除法與取余運算,這些都是比較耗時間的。
放在主函數里的話,也許你沒算玩 aa已經加了好幾次了,所以你沒法切到aa==20
有3個方法可以測試
1. 加大定時器定時長度測試一下。
2. 將ge shi bai計算放到 temp++后面
3. 將aa==20改為 aa>=20
作者:
xiaocui007
時間:
2020-2-10 21:21
這是我的程序:
#include<reg51.h>
//#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar temp,bai,shi,ge;
uint aa,time;
void delay(uint z);
void display(uchar bai,uchar shi,uchar ge);
void init();
sbit wela=P2^7;
sbit dula=P2^6;
void main()
{
init();
time=60;
while(1)
{
display(bai,shi,ge);
}
}
void display(uchar bai,uchar shi,uchar ge)
{
dula=1;
P0=table[bai];
dula=0;
P0=0x00;
wela=1;
P0=0xf7;
wela=0;
delay(time) ;
dula=1;
P0=table[shi];
dula=0;
P0=0x00;
wela=1;
P0=0xef;
wela=0;
delay(time) ;
dula=1;
P0=table[ge];
dula=0;
P0=0x00;
wela=1;
P0=0xdf;
wela=0;
delay(time) ;
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
{
for(y=110;y>0;y--);
}
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
aa++;
if (aa==20)
{ aa=0;
if(temp==100)
temp=0;
temp++;
}
bai=temp/100;
shi=temp%100/10;
ge=temp%10;
}
void init()
{
temp=0;
wela=0;
dula=0;
TMOD=0x01;//設置定時器0為工作方式1;
TH0=(65536-50000)/256;//定時器高8位值;
TL1=(65536-50000)%256;//定時器低8位值;
EA=1;//開總中斷;
ET0=1;//打開定時器0中斷;
TR0=1;//啟動定時器0;
}
作者:
tyrl800
時間:
2020-2-10 21:43
應該是全局與局部變量設置問題
作者:
bh2030693
時間:
2020-2-10 22:40
定時器時間短,中斷太頻繁了。一般這樣寫可以避免此類問題:
批注 2020-02-10 223801.png
(33.86 KB, 下載次數: 24)
下載附件
2020-2-10 22:40 上傳
作者:
尼古拉斯-趙四
時間:
2020-2-10 22:54
aa是定義的全局變量嗎?這個邏輯上是沒錯的,我以前也寫過類似程序
作者:
wulin
時間:
2020-2-11 07:37
1.紅色部分代碼放在主函數中可能是因為主函數查詢aa周期大于中斷周期,前一次查詢aa<20,后一次查詢aa>20,aa不能及時清0而出錯。
2.如果在主函數中改變查詢條件 if (aa>=20),雖然不會出錯但有可能積累誤差而計時不準。
3.比較好的方案是添加一個標志,在主函數中查詢這個標志。
定義一個全局位變量
bit flag;
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
aa++;
if(aa==20)
{
aa=0;
flag=1;
}
}
主函數中查詢
if(flag==1)
{
flag=0;
temp++;
bai=temp/100;
shi=temp%100/10;
ge=temp%10;
}
作者:
hantu
時間:
2020-2-11 13:21
bai=temp/100;
shi=temp%100/10;
ge=temp%10;
這幾個可放在主函數中,其它的仍放在中斷里就行了。
作者:
xiaocui007
時間:
2020-2-11 15:59
感謝各位大師的指導
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1