希望高手指点一下!
完整代码下载:
频率计.zip
(50.7 KB, 下载次数: 43)
主程序预览:
- #include "reg52.h"
- #include "lsh.h"
- #include "intrins.h"
- sbit SER = P3^4;
- sbit RCLK1 = P3^5;
- sbit SRCLK = P3^6;
- uchar code smgduan[17]=
- {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值
- uchar code smgwei[] = //--- 数码管显示的位选通段代码表 ---
- {
- 0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,
- };
- uchar DispData[8];
- //--定义全局变量--//
- ulong Freq; //用来存放要显示的频率值
- ulong TimeCount; //用于计算1S钟的
- void SerialSend(uchar DAT) //--- 串并转换函数(595控制数码管显示) ---
- {
- uchar i;
- for(i=0;i<8;i++)
- {
- DAT <<= 1;
- SER = CY;
- SRCLK = 0;
- _nop_();
- _nop_();
- SRCLK = 1;
- }
- }
- /*******************************************************************************
- * 函 数 名 : DigDisplay
- * 函数功能 : 数码管动态扫描函数,循环扫描8个数码管显示
- *******************************************************************************/
- void Scan_Disp()
- {
- uchar i;
- for(i=0; i<6; i++)
- {
- RCLK1 = 0;
- SerialSend(DispData[i]); //--- 送显示代码到串口引脚 ---
- SerialSend(smgwei[i]); //--- 送选通代码到串口引脚 ---
- RCLK1 = 0;
- _nop_();
- _nop_();
- RCLK1 = 1; //--- 扫描计数变量加1 ---
- Delay(100);
- }
- }
- /*******************************************
- *函数名 :TIMER_Configuration
- *功 能 :配置定时/计数器T0和T1
- *输 入 :无
- *输 出 :无
- *******************************************/
- void Timer_Init()
- {
- //--定时器T1做计数器,工作方式1(16位定时器),只由TRx打开计数器--//
- //--定时器T0做定时器,工作方式1(16位定时器),只由TRx打开定时器--//
- TMOD=0x51;
- T2MOD = 0x02;//选择为定时器2模式,工作方式1,仅用TR1打开启动。
- RCAP2H = 0xFD;
- RCAP2L = 0xC8;
- //--设置定时器晶振为12MHZ时定时50ms--//
- TH0=0xD8;
- TL0=0xF0;
- TH2 = 0xFD;
- TL2 = 0xC8; //1us
- //--打开中断-//
- ET0=1;
- ET1=1;
- ET2=1;//打开定时器1中断允许
- EA=1;
- //--打开定时器*/
- TR0=1;
- TR1=1;
- TR2=1;//打开定时器
- }
- /*******************************************
- *函数名 :Disp_Fre
- *功 能 :显示所计算的频率值
- *输 入 :无
- *输 出 :无
- *******************************************/
- void Disp_Fre()
- {
- if(TR1 == 0) //当计数器停下的时候,表明计数完毕
- {
- Freq = Freq + TL1; //读取TL的值
- Freq = Freq + (TH1 * 256); //读取TH的值
- //--求频率的个十百千万十万位--//
- DispData[0] = smgduan[Freq%1000000/100000];
- DispData[1] = smgduan[Freq%100000/10000];
- DispData[2] = smgduan[Freq%10000/1000];
- DispData[3] = smgduan[Freq%1000/100];
- DispData[4] = smgduan[Freq%100/10];
- DispData[5] = smgduan[Freq%10];
-
- //--显示完,重新计算下一次频率。--//
- Freq = 0;//将计算的频率清零
- TH1 = 0; //将计数器的值清零
- TL1 = 0;
- TR0 = 1; //开启定时器
- TR1 = 1; //开启计数器
- }
- //--显示求得的数值--//
- Scan_Disp();
- }
- /*******************************************
- *函数名 :Timer0
- *功 能 :定时器0的中断函数
- *输 入 :无
- *输 出 :无
- *******************************************/
- void Timer0() interrupt 1
- {
- Scan_Disp();
- //--12MHZ设置定时50ms的初值--//
- TH0=0xD8;
- TL0=0xF0;
-
- TimeCount++;
- if(TimeCount==100)//计时到1S
- {
- TR0=0;
- TR1=0;
- TimeCount=0;
- }
- }
- /*******************************************
- *函数名 :Timer1
- *功 能 :计数器1的中断函数
- *输 入 :无
- *输 出 :无
- *******************************************/
- void Timer1() interrupt 3
- {
- //--进入一次中断,表明计数到了65536--//
- Freq=Freq+65536;
- }
- void Timer2(void) interrupt 5 //3 为定时器1的中断号 1 定时器0的中断号 0 外部中断1 2 外部中断2 4 串口中断
- {
- TF2 = 0;
-
- }
- /*******************************************************************************
- * 函 数 名 : main
- * 函数功能 : 主函数
- * 输 入 : 无
- * 输 出 : 无
- *******************************************************************************/
- void main()
- {
- Timer_Init();
- while(1)
- {
- Disp_Fre();
- }
- }
复制代码
|