找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1462|回复: 0
打印 上一主题 下一主题
收起左侧

51单片机测量转速上下限报警程序

[复制链接]
跳转到指定楼层
楼主

部分程序如下:
#include<reg52.h>

#define uchar unsigned char
#define uint unsigned int
uint count,m,n;
unsigned long RPM;
long shangxian=10000;
long xiaxian=5000;
bit flag;
uchar code tab1[]={"H:00000  L:00000"};         //一行显示的固定字符
uchar code tab2[]={" RV:      r/min "};                //转速显示的固定字符

void delay(uint x)
{
        uint i,j;
        for(i=0;i<x;i++)
        for(j=0;j<110;j++);
}
void init()
{
        IT0=1;        //INT0负跳变触发        
    TMOD=0x01;//定时器工作于方式1
        TH0=0xfc;          //1ms
        TL0=0x18;
        EA=1; //CPU开中断总允许
        ET0=1;//开定时中断
        EX0=1;//开外部INTO中断
    TR0=1;//启动定时
}
/********液晶写入指令函数与写入数据函数,以后可调用**************/

void write_1602com(uchar com)//****液晶写入指令函数****
{
        rs=0;//数据/指令选择置为指令
        P0=com;//送入数据
        delay(1);
        en=1;//拉高使能端,为制造有效的下降沿做准备
        delay(1);
        en=0;//en由高变低,产生下降沿,液晶执行命令

}


void write_1602dat(uchar dat)//***液晶写入数据函数****
{
        rs=1;//数据/指令选择置为数据
        P0=dat;//送入数据
        delay(1);
        en=1; //en置高电平,为制造下降沿做准备
        delay(1);
        en=0; //en由高变低,产生下降沿,液晶执行命令
}


void lcd_init()//***液晶初始化函数****
{
        uchar a;
        write_1602com(0x38);//设置液晶工作模式,意思:16*2行显示,5*7点阵,8位数据
        write_1602com(0x0c);//开显示不显示光标
        write_1602com(0x06);//整屏不移动,光标自动右移
        write_1602com(0x01);//清显示

        write_1602com(0x80);//显示固定符号从第一行第1个位置之后开始显示
        for(a=0;a<16;a++)
        {
                write_1602dat(tab1[a]);//向液晶屏写固定符号部分
        }
        write_1602com(0x80+0x40);//显示固定符号写入位置,从第2个位置后开始显示
        for(a=0;a<16;a++)
        {
                write_1602dat(tab2[a]);//写显示固定符号
        }
}

void display()
{
        uchar gw,sw,bw,qw,ww;
        if(RPM<=99999)                 //范围内时
        {
                ww=RPM/10000;
                qw=RPM%10000/1000;
                bw=RPM%1000/100;//取得百位
                sw=RPM%100/10;//取得十位数字
                gw=RPM%10;//取得个位数字
                write_1602com(0x80+0x40+5);

                if(ww==0)
                write_1602dat(' ');
                else
                write_1602dat(0x30+ww);

                if((ww+qw)==0)
                write_1602dat(' ');
                else
                write_1602dat(0x30+qw);

                if((ww+qw+bw)==0)
                write_1602dat(' ');
                else
                write_1602dat(0x30+bw);

                if((ww+qw+bw+sw)==0)
                write_1602dat(' ');
                else
                write_1602dat(0x30+sw);

                write_1602dat(0x30+gw);//数字+30得到该数字的LCD1602显示码
        }
        else                  //超过范围时显示-----
        {
                write_1602com(0x80+0x40+5);
                write_1602dat('-');
                write_1602dat('-');
                write_1602dat('-');
                write_1602dat('-');
                write_1602dat('-');
        }
}
void display_shangxian()
{
        write_1602com(0x80+2);

        if(shangxian/10000==0)
        write_1602dat(' ');
        else
        write_1602dat(0x30+shangxian/10000);

        if((shangxian/1000)==0)
        write_1602dat(' ');
        else
        write_1602dat(0x30+shangxian%10000/1000);

        if((shangxian/100)==0)
        write_1602dat(' ');
        else
        write_1602dat(0x30+shangxian%10000%1000/100);

        if((shangxian/10)==0)
        write_1602dat(' ');
        else
        write_1602dat(0x30+shangxian%10000%1000%100/10);

        write_1602dat(0x30+shangxian%10000%1000%100%10);//数字+30得到该数字的LCD1602显示码


        write_1602com(0x80+11);

        if(xiaxian/10000==0)
        write_1602dat(' ');
        else
        write_1602dat(0x30+xiaxian/10000);

        if((xiaxian/1000)==0)
        write_1602dat(' ');
        else
        write_1602dat(0x30+xiaxian%10000/1000);

        if((xiaxian/100)==0)
        write_1602dat(' ');
        else
        write_1602dat(0x30+xiaxian%10000%1000/100);

        if((xiaxian/10)==0)
        write_1602dat(' ');
        else
        write_1602dat(0x30+xiaxian%10000%1000%100/10);

        write_1602dat(0x30+xiaxian%10000%1000%100%10);//数字+30得到该数字的LCD1602显示码
}
void key()
{
        uint key_press_num;
        uchar p;
        if(add_H==0)
        {
                delay(20);
                if(add_H==0)
                {
                        while(!add_H)
                        {
                                key_press_num++;
                                if(key_press_num>=20)
                                {
                                        key_press_num=0;
                                        while(!add_H)
                                        {
                                                shangxian=shangxian+10;
                                                if(shangxian>20000)
                                                shangxian=0;
                                        //        for(p=0;p<20;p++)
                                                display_shangxian();
                                        }
                                }
                                display();
                                delay(10);
                        }
                        if(key_press_num!=0)
                        {
                                key_press_num=0;
                                shangxian++;
                                if(shangxian>20000)
                                shangxian=0;
                        }
                }
        }
        if(dec_H==0)
        {
                delay(20);
                if(dec_H==0)
                {
                        while(!dec_H)
                        {
                                key_press_num++;
                                if(key_press_num>=20)
                                {
                                        key_press_num=0;
                                        while(!dec_H)
                                        {
                                                shangxian=shangxian-10;
                                                if(shangxian<=xiaxian+10)
                                                shangxian=xiaxian+10;
                                        //        for(p=0;p<20;p++)
                                                display_shangxian();
                                        }
                                }
                                display();
                                delay(10);
                        }
                        if(key_press_num!=0)
                        {
                                key_press_num=0;
                                shangxian--;
                                if(shangxian<=xiaxian+10)
                                shangxian=xiaxian+10;
                        }
                }
        }
        if(add_L==0)
        {
                delay(20);
                if(add_L==0)
                {
                        while(!add_L)
                        {
                                key_press_num++;
                                if(key_press_num>=20)
                                {
                                        key_press_num=0;
                                        while(!add_L)
                                        {
                                                xiaxian=xiaxian+10;
                                                if(xiaxian>=shangxian-10)
                                                xiaxian=shangxian-10;
                                        //        for(p=0;p<20;p++)
                                                display_shangxian();
                                        }
                                }
                                display();
                                delay(10);
                        }
                        if(key_press_num!=0)
                        {
                                key_press_num=0;
                                xiaxian++;
                                if(xiaxian>=shangxian-10)
                                xiaxian=shangxian-10;
                        }
                }
        }
        if(dec_L==0)
        {
                delay(20);
                if(dec_L==0)
                {
                        while(!dec_L)
                        {
                                key_press_num++;
                                if(key_press_num>=20)
                                {
                                        key_press_num=0;
                                        while(!dec_L)
                                        {
                                                xiaxian=xiaxian-10;
                                                if(xiaxian<=0)
                                                xiaxian=0;
                                        //        for(p=0;p<20;p++)
                                                display_shangxian();
                                        }
                                }
                                display();
                                delay(10);
                        }
                        if(key_press_num!=0)
                        {
                                key_press_num=0;
                                xiaxian--;
                                if(xiaxian<=0)
                                xiaxian=0;
                        }
                }
        }
}

void alarm()
{
        if(RPM>0)
        {
                if(RPM>=shangxian||RPM<=xiaxian)
                BUZZ=0;
                else
                BUZZ=1;
                if(RPM>=shangxian)
                {
                        LED_H=0;
                        LED_L=1;
                }
                else if(RPM<=xiaxian)
                {
                        LED_H=1;
                        LED_L=0;
                }
                else
                {
                        LED_H=LED_L=1;
                }
        }
        else
        {
                LED_H=LED_L=BUZZ=1;
        }
}

void main()
{
        init();
        lcd_init();
        while(1)
        {
                display();
                display_shangxian();
                key();
                alarm();
        }
}

void EXINT0() interrupt 0
{
        count++;
        flag=1;
        n=0;
        if(count>=10)
        {
                RPM=600000/m;                                        //60*1000*10                  RPM=个数*60*1000/m   m单位为ms  所以乘以1000
                m=0;
                count=0;
        }        
}

void time0() interrupt 1
{
        TH0=0xfc;
        TL0=0x18;         //1ms
        
        if(flag==1)
        {
                n++; m++;
                if(n==6000)
                {
                        RPM=(60000*count)/m;
                        m=0;
                        n=0;
                        count=0;
                        flag=0;
                }
        }
        if(flag==0&&count==0)
        {
                n++;
                if(n==3000)
                {
                        RPM=0;
                        n=0;
                }
        }
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表