求51单片机风扇转速监控程序 C语言

风扇每转发送2个周期的脉,要求速度低于1000转/分的时候会报警。你们爱怎么写就怎么写,我只是拿来参考。(要求C语言,我不懂汇编)以下是我的失败作品别模仿:#include#include#define uint unsigned int #define uchar unsigned char sbit D1=P3^1; //喇叭的端口sbit LED=P3^5; // 提示灯sbit FAN=P3^2; // 电压信号端uint num;uint bei;uint zhu;void delay2S(); //声明延时函数void delay(uint); //声明延时函数void main(){ EA=1; // 总开关 ET0=1; // TO开关 TMOD=0x05; // 模式 TR0=1; // 启动T0 TH0=0; //高8位 附0 TL0=0; //低8位 附0 FAN=1; //风扇的电压信号,条件不达成为1,不实行监控 LED=1; //监控提示灯 while(1) { if(FAN==0) //判断风扇电压是否达到(此信号由比较器提供) { LED=0; TH0=0; //附初值 TL0=0; //附初值 delay2S(); //延时2秒(为了取样) zhu=TL0; //把T0低8位的值附给 zhu bei=TH0; //把高8位附给 bei bei=(66*bei); // num=(zhu+bei); //把计数器的值附给num if(num>65) // 2000转/分钟的风扇,每转2个周期的脉冲输出,要求在某电压条件下达到1000转/分钟,2秒取样哟低于65报警 { D1=1; //喇叭不响 } else //实行报警 { uchar gld; for(gld=0;gld<6;gld++) d1="~D1;" th0="0;" tl0="0;" else="" led="1;" void="" unsigned="" char="" i="85;" j="13;" k="227;" do="" while="" uint="" uchar="" x="z;x">0;x--) for(y=20;y>0;y--); } void exter0() interrupt 1{ }

给你个我写的基于89c52的单片机测频率的程序,你参考下

#include <reg52.h>
#include <intrins.h>
#include <stdlib.h>
#define uchar unsigned char
#define uint unsigned int
#define LCD_data P0
sbit LCD_RS=P2^0;
sbit LCD_RW=P2^1;
sbit LCD_EN=P2^2;
sbit LCD_PSB=P2^3;
bit flag=0;
uint num1=0,num2=0,count=0;
void display();
void delayms(uint x)
{
uint i,j;
for(j=0;j<x;j++)
for(i=0;i<110;i++)
;
}
void write_cmd(uchar cmd)    //12864写命令函数
{
LCD_RS=0;
LCD_RW=0;
LCD_EN=0;
P0=cmd;
delayms(5);
LCD_EN=1;
delayms(5);
LCD_EN=0;
}
void write_dat(uchar dat)  //12864写数据函数
{
LCD_RS=1;
LCD_RW=0;
LCD_EN=0;
P0=dat;
delayms(5);
LCD_EN=1;
delayms(5);
LCD_EN=0;
}
void lcd_pos(uchar X,uchar Y)    //12864写位置函数
{
uchar pos;
if(X==0)
X=0x80;
else if(X==1)
X=0x90;
else if(X==2)
X=0x88;
else if(X==3)
X=0x98;
pos=X+Y;
write_cmd(pos);
}
void lcd_init()  //12864初始化函数
{
LCD_PSB=1;
write_cmd(0x30);
delayms(5);
write_cmd(0x0c);
delayms(5);
write_cmd(0x01);
delayms(5);
}
void Time2_Init(void)    //T2定时器自动重装初值定时1s
{
EA=1;
ET2=1;
TR2=1;
RCAP2L=(65535-46083)%256;
RCAP2H=(65535-46083)/256;
}
void display()    //12864显示函数
{  
lcd_pos(0,0);
write_dat(num1/1000+'0'); 
write_dat(num1/100%10+'0');
write_dat(num1/10%10+'0');
write_dat(num1%10+'0');
lcd_pos(1,0);
write_dat(num2/1000+'0'); 
write_dat(num2/100%10+'0');
write_dat(num2/10%10+'0');
write_dat(num2%10+'0');
}
main()
{
lcd_init();
Time2_Init();
TMOD=0x55;
TR0=1;
TR1=1;
while(1)
{
TH0=0;
TL0=0;
TH1=0;
TL1=0;
flag=0;
while(!flag);
num1=TH0<<8|TL0; //num1为T0在1s内统计的下降沿次数,输入引脚为P3.4
num2=TH1<<8|TL1; //num2为T1在1s内统计的下降沿次数,输入引脚为P3.5
display(); 
}    
}
void Time2(void) interrupt 5    //T2定时器中断1s
{
TF2=0;
count++;
if(count==20)
{
flag=1;
count=0; 
}
}


温馨提示:答案为网友推荐,仅供参考
相似回答