这个程序一开始是运行之后数码管只能加到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;
- }
- }
复制代码
|