|
現(xiàn)在想用外部中斷0和外部中斷1來(lái)測(cè)雙路脈沖的占空比,實(shí)現(xiàn)的方法是先把定時(shí)器0設(shè)置成TMOD |=0x08(//T0開(kāi)始計(jì)時(shí)的條件是INT0腳為高電平及TR0置1時(shí))模式,以此來(lái)測(cè)P3^2腳輸入脈沖高電平的時(shí)間,然后外部中斷0是下降沿中斷,通過(guò)兩次下降沿中斷來(lái)測(cè)P3^2腳輸入脈沖的周期,以此來(lái)算占空比;同理用同樣的再去測(cè)P3^3腳輸入脈沖的占空比,兩路脈沖每測(cè)試完以此刷新一下屏幕顯示,然后延遲500ms再去測(cè)兩個(gè)輸入脈沖,如此循環(huán),可是測(cè)量的結(jié)果卻不對(duì),P3^2腳的輸入脈沖沒(méi)有問(wèn)題,但是P3^3腳輸入脈沖的周期測(cè)試不準(zhǔn)確,正常是8點(diǎn)幾毫秒,但是測(cè)出來(lái)的值時(shí)零點(diǎn)幾毫秒,但是高電平時(shí)間是對(duì)的。思考了好長(zhǎng)時(shí)間實(shí)在找不到錯(cuò)誤,因此來(lái)尋求大神的幫助,望不吝賜教。
單片機(jī)源程序如下:
- #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ù)點(diǎn)
- 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; //定時(shí)器時(shí)鐘12T模式
- TMOD &= 0xF8; //設(shè)置定時(shí)器模式
- //TMOD |= 0x08; //T0開(kāi)始計(jì)時(shí)的條件是INT0腳為高電平及TR0置1時(shí)
- TL0 = 0x00; //設(shè)置定時(shí)初值
- TH0 = 0x00; //設(shè)置定時(shí)初值
- TF0 = 0; //清除TF0標(biāo)志
- ET0 = 1; //允許T0中斷
- TR0 = 0; //定時(shí)器0停止計(jì)時(shí)
- }
- void t1_init() //65536us@12MHz
- {
- AUXR &= 0xBF; //定時(shí)器時(shí)鐘12T模式
- TMOD &= 0x8F; //設(shè)置定時(shí)器模式
- //TMOD |= 0x80; //T1開(kāi)始計(jì)時(shí)的條件是INT1腳為高電平及TR1置1時(shí)
- TL1 = 0x00; //設(shè)置定時(shí)初值
- TH1 = 0x00; //設(shè)置定時(shí)初值
- TF1 = 0; //清除TF1標(biāo)志
- ET1 = 1; //允許T1中斷
- TR1 = 0; //定時(shí)器1停止計(jì)時(shí)
- }
- 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() //復(fù)位函數(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();
- }
復(fù)制代碼 |
|