用C语言写个用89C51单片机做的频率计和报警器,求原理图和完整源程序,能静态扫描频率并输出到LED上。

//==声明区====================================#include<reg51.h>//定义8051寄存器的头文件#defineSEG... //==声明区====================================

#include <reg51.h> //定义8051寄存器的头文件
#define SEG P2 //定义7段LED数码管接至Port 2
#define SCANP P1
sbit PB0=P3^2; //声明PB0按钮,接至P3.2
sbit buzzer=P3^3;
char TAB[11]={0xc0,0xf9,0xa4,0xb0,0x99, //数字0-4
0x92,0x83,0xf8,0x80,0x98,0xbf}; //数字5-9,及-号
char disp[4]={0xc0,0xc0,0xc0,0xc0}; //声明显示区数组初始显示0000

/*声明T0定时相关声明*/
#define count_M1 50000 //T0(MODE 1)的计数值,0.05s
#define H_0 (65636-count_M1)/256 //T0(MODE 1)的计数高8位
#define L_0 (65636-count_M1)%256 //T0(MODE 1)的计数低8位
int times=0; //计算T0中断次数

/*声明基本变量*/
bit status_F=1; //状态标志位
char scan=1; //扫描信号
unsigned int freq=0; //频率变量
sfr16 DPTR=0x82; //声明DPTR
void delay1m(int); //声明1ms延迟函数
void delay(int); //声明蜂鸣器延迟函数
void pulse_BZ(int,int,int); //声明蜂鸣器发声函数
void measure(void);
void display(void); //声明显示函数
//==主程序========
main()
{
P1=0X0F

while(1) //无穷循环
{

if(PB0==1)
{ //进入测量阶段
measure(); //调用测量函数

if (DPTR>=1000)
{ pulse_BZ(100,1,1); //蜂鸣器发声100*(0.5ms+0.5ms)=0.1S
// delay(1000); //延迟1000*0.5ms=0.5s

display();
}
//TH1=0;TL1=0; //设置T1计数器清零
}
} //while循环结束

}
//===显示函数====
void display(void) //
{ char i; //声明i变量
scan=0x01; //初始扫描信号
for(i=0;i<4;i++); //扫描4次
{ //SEG=0xff; //关闭7段LED数码管
SCANP=~scan; //输出扫描信号
SEG=disp[i]; //输出显示信号
delay1m(4); //延迟4ms
scan<<=1; //下一个扫描信号
} //for结束扫描4次
//结束while
} //显示函数结束
//==测量函数===============================================================
void measure(void) //测量函数开始
{ SCANP=0xff; //关闭显示
IE=0x8a;
TMOD=0x51;
TH0=H_0 ; //设置T0及数量的高低八位
TL0=L_0;
TH1=0; //设置T1归零
TL1=0;
TR0=1; //启动T0、T1
TR1=1;
status_F=0;
} //测量结束
我的程序写了一部分,剩下的贴不上来了,这是老师给布置的作业,比较急,只需要能读出1000以内的频率,超出后报警就行了,还有,老师说我写的好像是用动态扫描,他说这样不方便,让我用静态扫描做,为什么?
我现在的程序在通电后,数码管不亮或者随机亮几个数码管,怎么样让他显示“0”呢,貌似我这个如果亮的话都是“8”?
展开
 我来答
pctops
2011-11-15 · TA获得超过935个赞
知道小有建树答主
回答量:1154
采纳率:50%
帮助的人:430万
展开全部
给你说下原理,团滚
你把T1设置为外部计数模式,频率信号加在T1的引脚上,另外T0做计时,同时动态刷新LED,
T0计满1S,把T1上统计的数值处理下,显示到LED。就是输出频差或哗率了。
如果做报警处理,你在T0里加个判断就可以了。如果嫌1S时间太长,那虚行么你t0在0.5统计下,但是这样你的频率计数精度只能达到2HZ。
T1最大计数65535,如果溢出,你另外弄个辅助全局变量+1,即可。
追问
是这样的,我前头部分的原理基本就是按照你说的来写的,但刚接触这个单片机,不熟,写出来的不对,你有Q或者邮箱吗,我把我写的全发给你,能帮我看下吗?
至于频率,我只需要把压频电路里头的电容电阻换小点就可以满足1000Hz的需要了。
我的电路是照书上搭的,可以的话我一起发给你。但老师说静态扫描比较适合,我不大会,有现成的原理图和程序吗?
或者说谁能帮我详细介绍一下静态扫描的过程?
百度网友701e1b1
2011-11-21 · TA获得超过1017个赞
知道小有建树答主
回答量:522
采纳率:100%
帮助的人:543万
展开全部
这几个程序任务又不复杂,完全可以动态扫描的,而且动绝逗态销巧扫描简化硬亏宏键件。
如果你用静态显示就得增加硬件(如:74系列数字集成块),多麻烦
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
寒冰雨0919
2012-03-07
知道答主
回答量:38
采纳率:0%
帮助的人:18.3万
展开全部
您好,可以把你的这个频率输出尘旦和报察辩警的程序发给我看下嘛?我最近也要写个频率输出程序但是我是初学者还不懂应该怎么写,所以想参照您的!如果可以麻烦发给我败兄缺下好吗?谢谢您了,447201178@qq.com
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式