下面是一个输出频率在1Hz-1KHz间可调的程序。频率越高精度越低,现正在改进。 望各位高手们对我的程序给点意见。 我是新手,这是我的第一个C程序。多多包涵。
对了,还有一个问题老是搞不懂,用PROTEUS仿真的时候为什么数值在256以下的时候显示都正常,超过256后个位显示就不正常了。十位百位都正常 。最下面有仿真的文件下载,大虾们帮我看下,感谢了! /**************************************************** 名称:方波信号发生器 作者:小发 日期:2007年11月1日 邮箱:fabest@yahoo.cn ****************************************************/
#include<reg52.h> #include<stdio.h> #define uchar unsigned char #define uint unsigned int sbit P20=0xA0; sbit P21=0xA1; sbit P22=0xA2; sbit P23=0xA3; sbit P10=0x90; sbit P11=0x91; sbit P12=0x92; sbit P13=0x93; sbit Output=0xB7; //P3.7为输出
bit Fast_Key; uint Timercount,Hz_data,nCount, KeyCount;
void Delay1ms(uint count) { uint i,j; for(i=0;i<count;i++) for(j=0;j<120;j++); } /******** 定时器初始化 ********************/ void InitialTimer0(viod) { TMOD=0x02; //工作方式2,自动重装 TH0=0xcd; //50us定时 TL0=0xcd; ET0=1; EA=1; TR0=1; } /*********** 寄存器初始化 *****************/ void InitialCPU(void) { Timercount=0; Hz_data=1; nCount=10000; P1=0xff; P2=0xff; } /********** 定时器中断函数 *****************/ void Timer0_overflow() interrupt 1 using 0 { Timercount++; //定时器中断计数器 if(Timercount>nCount) //注意,这里不能用等号,否则可能永远也满足不了条件 { Timercount=0; Output=!Output; //输出取反 }
}
/************** 检测键盘并处理 ******************
说明:短按时加1,当长按超过2秒时,快速连加
*************************************************/ GetKey_Dispose() { if(P1==0xff) { Fast_Key=0; KeyCount=0; //按键释放清除快加控制位 return; } Delay1ms(10); if(P1==0xff)return; //延时消抖 if((P10==0)&&(Hz_data<1000)) { if(!Fast_Key) { Fast_Key=1; //当第一次按下时置标志位 Hz_data++; nCount=10000/Hz_data; } else { KeyCount++; if(!(KeyCount==50))return; //这里的常数设定进入快加的时间,越大延时越长. KeyCount-=1; //这里的常数设定快加时的速度,越大越慢. Hz_data++; nCount=10000/Hz_data; } }
if((P11==0)&&(Hz_data>1)) { if(!Fast_Key) { Fast_Key=1; Hz_data--; nCount=10000/Hz_data; } else { KeyCount++; if(!(KeyCount==50))return; KeyCount-=1; Hz_data--; nCount=10000/Hz_data; } } return; }
/************** 显示当前频率 ****************/ uchar code tab[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; void DISPLAY(void) { uint nTemp,nIndex; nTemp=Hz_data; P20=0; nIndex=nTemp%10; P0=tab[nIndex]; Delay1ms(1); P20=1; //显示最低个位 nTemp/=10; P21=0; nIndex=nTemp%10; P0=tab[nIndex]; Delay1ms(1); P21=1; //显示十位 nTemp/=10; P22=0; nIndex=nTemp%10; P0=tab[nIndex]; Delay1ms(1); P22=1; //显示百位 nTemp/=10; P23=0; nIndex=nTemp%10; P0=tab[nIndex]; Delay1ms(1); P23=1; //显示千位 }
/*************** 主函数 *********************/ void main(void) { InitialCPU(); InitialTimer0();
while(1) { DISPLAY(); GetKey_Dispose(); //读键并处理
} } 相关链接:https://bbs.21ic.com/upfiles/img/200711/2007119181231419.rar |