| 
 
| 下面是一个输出频率在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
 | 
 |