用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”? 展开
#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”? 展开
3个回答
展开全部
给你说下原理,团滚
你把T1设置为外部计数模式,频率信号加在T1的引脚上,另外T0做计时,同时动态刷新LED,
T0计满1S,把T1上统计的数值处理下,显示到LED。就是输出频差或哗率了。
如果做报警处理,你在T0里加个判断就可以了。如果嫌1S时间太长,那虚行么你t0在0.5统计下,但是这样你的频率计数精度只能达到2HZ。
T1最大计数65535,如果溢出,你另外弄个辅助全局变量+1,即可。
你把T1设置为外部计数模式,频率信号加在T1的引脚上,另外T0做计时,同时动态刷新LED,
T0计满1S,把T1上统计的数值处理下,显示到LED。就是输出频差或哗率了。
如果做报警处理,你在T0里加个判断就可以了。如果嫌1S时间太长,那虚行么你t0在0.5统计下,但是这样你的频率计数精度只能达到2HZ。
T1最大计数65535,如果溢出,你另外弄个辅助全局变量+1,即可。
追问
是这样的,我前头部分的原理基本就是按照你说的来写的,但刚接触这个单片机,不熟,写出来的不对,你有Q或者邮箱吗,我把我写的全发给你,能帮我看下吗?
至于频率,我只需要把压频电路里头的电容电阻换小点就可以满足1000Hz的需要了。
我的电路是照书上搭的,可以的话我一起发给你。但老师说静态扫描比较适合,我不大会,有现成的原理图和程序吗?
或者说谁能帮我详细介绍一下静态扫描的过程?
展开全部
这几个程序任务又不复杂,完全可以动态扫描的,而且动绝逗态销巧扫描简化硬亏宏键件。
如果你用静态显示就得增加硬件(如:74系列数字集成块),多麻烦
如果你用静态显示就得增加硬件(如:74系列数字集成块),多麻烦
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
您好,可以把你的这个频率输出尘旦和报察辩警的程序发给我看下嘛?我最近也要写个频率输出程序但是我是初学者还不懂应该怎么写,所以想参照您的!如果可以麻烦发给我败兄缺下好吗?谢谢您了,447201178@qq.com
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询