标题:
自己做的简易频率计 单片机源程序
[打印本页]
作者:
mamb24
时间:
2017-2-19 11:37
标题:
自己做的简易频率计 单片机源程序
希望高手指点一下!
完整代码下载:
频率计.zip
(50.7 KB, 下载次数: 43)
2017-2-19 11:34 上传
点击文件名下载附件
下载积分: 黑币 -5
主程序预览:
#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();
}
}
复制代码
作者:
Anu
时间:
2017-4-16 10:22
下载的附件里没有“LSH.h”的文件,重发一下
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1