這個程序一開始是運行之后數碼管只能加到01,之前也發了一貼關于這個函數錯誤問題,后來自己瞎琢磨,感覺沒啥問題,最開始我設置的T1定時器初始值是(65536-50000)只能加到01,現在初始值改到(65536-500)數碼管可以加到99了,但是加一次的時間很長,正好看到書上有關于外部輸入計數脈沖的頻率有限定,且計數一次兩個機器周期才能檢測到一次,晶振頻率是12MHz,那么最高就是500KHz,我這個脈沖65.036ms出現,頻率大約為15Hz,并沒有超出范圍啊,難道是占空比的問題?需要保持高電平大于一個機器周期?求大佬解決一下,如果真的是占空比的問題,加_nop_(),是不是就可以了?
- #include<reg52.h>
- #define uchar unsigned char
- #define unit unsigned int
- uchar num,num2;
- unit count;
- uchar code table[]={0x3f,0x06,0x5b,0x4f,
- 0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x77,0x7c,
- 0x39,0x5e,0x79,0x71};
- sbit IS=P3^4;
- sbit led0=P1^0;
- sbit dula=P2^6;
- sbit wela=P2^7;
- /*************************
- 延遲函數
- **************************/
- void delayms(unit ms)
- {
- unit i,j;
- for(i=ms;i>0;i--)
- for(j=110;j>0;j--);
- }
- /*************************
- 初始化函數
- *************************/
- void init()
- {
- TMOD=0x15;
- EA=1;
- ET0=1;
- ET1=1;
- TR0=1;
- TR1=1;
- TH0=0xff;
- TL0=0xff;
- TH1=(65536-50000)/256;
- TL1=(65536-50000)%256;
- }
- /*************************
- 數碼管顯示函數
- *************************/
- void display(uchar shi,uchar ge)
- {
- P0=0x00;
- dula=1;
- dula=0;
- P0=table[shi];
- dula=1;
- dula=0;
- P0=0xfe;
- wela=1;
- wela=0;
- delayms(5);
- P0=0x00;
- dula=1;
- dula=0;
- P0=table[ge];
- dula=1;
- dula=0;
- P0=0xfd;
- wela=1;
- wela=0;
- delayms(5);
- }
- /**************************
- 主函數
- **************************/
- void main()
- {
- init();
- while(1)
- {
- IS=led0;
- display(num/10,num%10);
-
- }
- }
- /***************************
- 定時器中斷函數
- ***************************/
- void ser()interrupt 1
- {
- num++;
- TH0=0xff;
- TL0=0xff;
- }
- void ser1()interrupt 3
- {
- TH1=(65536-500)/256;
- TL1=(65536-500)%256;
- num2++;
- if(num2==10)
- {
- led0=~led0;
- }
- }
復制代碼
|