欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
單片機源程序如下:測雙路脈沖的占空比,有一路數(shù)據(jù)不對
[打印本頁]
作者:
ADMIN_ALLENY
時間:
2021-7-14 16:39
標題:
單片機源程序如下:測雙路脈沖的占空比,有一路數(shù)據(jù)不對
現(xiàn)在想用外部中斷0和外部中斷1來測雙路脈沖的占空比,實現(xiàn)的方法是先把定時器0設置成TMOD |=0x08(//T0開始計時的條件是INT0腳為高電平及TR0置1時)模式,以此來測P3^2腳輸入脈沖高電平的時間,然后外部中斷0是下降沿中斷,通過兩次下降沿中斷來測P3^2腳輸入脈沖的周期,以此來算占空比;同理用同樣的再去測P3^3腳輸入脈沖的占空比,兩路脈沖每測試完以此刷新一下屏幕顯示,然后延遲500ms再去測兩個輸入脈沖,如此循環(huán),可是測量的結果卻不對,P3^2腳的輸入脈沖沒有問題,但是P3^3腳輸入脈沖的周期測試不準確,正常是8點幾毫秒,但是測出來的值時零點幾毫秒,但是高電平時間是對的。思考了好長時間實在找不到錯誤,因此來尋求大神的幫助,望不吝賜教。
單片機源程序如下:
#include "stc15.h"
#include "COMMON.H"
#include "LCD12864.H"
ulong atime_h =0; //a路正脈沖頻寬
ulong atime = 0; //a路脈沖周期
ulong Dutycycle_a = 0; //a路脈沖占空比
uint int0_count = 0; //外部中斷0的中斷次數(shù)
ulong btime_h =0; //b路正脈沖頻寬
ulong btime = 0; //b路脈沖周期
ulong Dutycycle_b = 0; //b路脈沖占空比
uint int1_count = 0; //外部中斷1的中斷次數(shù)
uint flag = 0;
void display_data(uchar address,ulong b) //脈沖周期或正脈沖頻寬的顯示函數(shù) (6位)
{
lcd_write_byte(0xf8,address);
lcd_write_byte(0xfa,b/100000+0x30);
lcd_write_byte(0xfa,(b%100000)/10000+0x30);
lcd_write_byte(0xfa,(b%10000)/1000+0x30);
lcd_write_byte(0xfa,(b%1000)/100+0x30);
lcd_write_byte(0xfa,(b%100)/10+0x30);
lcd_write_byte(0xfa,(b%10)+0x30);
}
void display_data1(uchar address,ulong b)
{
lcd_write_byte(0xf8,address);
lcd_write_byte(0xfa,b/100+0x30);
lcd_write_byte(0xfa,(b%100)/10+0x30);
lcd_write_byte(0xfa,0x2e); //小數(shù)點
lcd_write_byte(0xfa,(b%10)+0x30);
}
void int0_init()
{
IT0 = 1; //為 1 是下降沿; 為 0 是下降沿或上升沿
EX0 = 0; //為 1 允許中斷; 為 0 是禁止中斷
}
void int1_init()
{
IT1 = 1; //為 1 是下降沿; 為 0 是下降沿或上升沿
EX1 = 0; //為 1 允許中斷; 為 0 是禁止中斷
}
void t0_init() //65536us@12MHz
{
AUXR &= 0x7F; //定時器時鐘12T模式
TMOD &= 0xF8; //設置定時器模式
//TMOD |= 0x08; //T0開始計時的條件是INT0腳為高電平及TR0置1時
TL0 = 0x00; //設置定時初值
TH0 = 0x00; //設置定時初值
TF0 = 0; //清除TF0標志
ET0 = 1; //允許T0中斷
TR0 = 0; //定時器0停止計時
}
void t1_init() //65536us@12MHz
{
AUXR &= 0xBF; //定時器時鐘12T模式
TMOD &= 0x8F; //設置定時器模式
//TMOD |= 0x80; //T1開始計時的條件是INT1腳為高電平及TR1置1時
TL1 = 0x00; //設置定時初值
TH1 = 0x00; //設置定時初值
TF1 = 0; //清除TF1標志
ET1 = 1; //允許T1中斷
TR1 = 0; //定時器1停止計時
}
void show_freq()
{
if(flag == 1)
{
display_data1(0x91,Dutycycle_a);
display_data(0x95,atime_h);
display_data1(0x89,Dutycycle_b);
display_data(0x8D,btime);
delay_xms(500);
flag = 0;
}
else
{
TMOD |= 0x08;
EX0 = 1;
}
}
void fuwei() //復位函數(shù)
{
TR0 = 0;
TR1 = 0;
EX0 = 0;
EX1 = 0;
TH0 = 0;
TL0 = 0;
TH1 = 0;
TL1 = 0;
int0_count = 0;
int1_count = 0;
}
void main()
{
stc_init();
int0_init();
int1_init();
t0_init();
t1_init();
lcd_init();
delay_xms(5);
lcd_clean();
delay_xms(5);
lcd_write_string(0x80," 占空比 正周期");
lcd_write_string(0x90,"A:");
lcd_write_string(0x93,"%");
lcd_write_string(0x88,"B:");
lcd_write_string(0x8B,"%");
lcd_write_string(0x98,"C:");
lcd_write_string(0x9B,"%");
delay_xms(5);
EA=1;
while(1)
{
show_freq();
}
}
void int0() interrupt 0
{
if(flag == 0)
{
int0_count++;
}
if(int0_count == 1)
{
TR1 = 1;
TR0 = 1;
}
if(int0_count == 2)
{
TR0 = 0;
TR1 = 0;
atime_h = TH0<<8|TL0;
atime = TH1<<8|TL1;
Dutycycle_a = atime_h*1000/atime;
EX0 = 0;
TH0 = 0;
TL0 = 0;
TH1 = 0;
TL1 = 0;
int0_count = 0;
TMOD &= 0xF7;
TMOD |= 0x80;
EX1 = 1;
}
}
void int1() interrupt 2
{
if(flag == 0)
{
int1_count++;
}
if(int1_count == 1)
{
TR1 = 1;
TR0 = 1;
}
if(int1_count == 2)
{
TR0 = 0;
TR1 = 0;
btime_h = TH1<<8|TL1;
btime = TH0<<8|TL0;
Dutycycle_b = btime_h*1000/btime;
EX1 = 0;
TH0 = 0;
TL0 = 0;
TH1 = 0;
TL1 = 0;
int1_count = 0;
TMOD &= 0x7F;
flag = 1;
}
}
void t0() interrupt 1
{
fuwei();
}
void t1() interrupt 3
{
fuwei();
}
復制代碼
作者:
yzwzfyz
時間:
2021-7-15 11:14
道理:INT0中斷服務過程中,INT1是不會被響應的,需要等INT0中斷服務結束,INT1才能被響應,這樣INT1就失去了計時的準確性。
你需要好好的規(guī)劃一下,解決中斷優(yōu)先級不平等的問題,或者將誤差縮小到可接受的范圍內。
作者:
ADMIN_ALLENY
時間:
2021-7-15 11:40
yzwzfyz 發(fā)表于 2021-7-15 11:14
道理:INT0中斷服務過程中,INT1是不會被響應的,需要等INT0中斷服務結束,INT1才能被響應,這樣INT1就失去 ...
額,可是我就是在外部中斷0的服務過程中完成取定時器的值后把外部中斷0的中斷允許位置0了,然后置位了外部中斷1的中斷允許位,就是一步步來的,先外部中斷0后外部中斷1.
作者:
glinfei
時間:
2021-7-15 17:29
TMOD&=0xF7 是否改成0xD5,M1M0至11時,是8位計數(shù)啊,也就能計算零點幾個毫秒。
另外就是這句TMOD |= 0x80;是否應去掉?沒意義。
作者:
開心就好hhhh
時間:
2021-7-15 17:40
在一個中斷函數(shù)中置位另一個中斷是不會立即響應的,就算你已經(jīng)關閉了本次中斷,也要等本次中斷結束才能響應另外一個中斷
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1