基于AT89C51与霍尔元件的测速及LCD1602显示

//电机转速表设计
#include<reg52.h>    //包含单片机寄存器的头文件
#include<intrins.h>  //包含_nop_()函数定义的头文件
#define   uchar unsigned char
#define   uint unsigned int    
sbit CS=P3^5;
sbit SID=P3^6;
sbit SCLK=P3^4;
sbit PSB=P3^7;
uchar code digit[ ]={"0123456789"}; //定义字符数组显示数字
uint v;   //储存电机转速
uchar count,count1;  //储存定时器T0中断次数
bit flag;      //计满1秒钟标志位

//**********液晶延时***************    
void delay_1ms(uint x)
{
      uint i,j;
      for(j=0;j<x;j++)
         for(i=0;i<110;i++); 
}                            

/*********************写命令***************************/
void send_command(uchar command_data)
{
   uchar i;
   uchar i_data;
   i_data=0xf8;                      /*********0xf8命令控制字*************/
   CS=1;
   SCLK=0;
   for(i=0;i<8;i++)
   {
     SID=(bit)(i_data&0x80);        /***************命令的送入8个字节*****************/
     SCLK=0;
     SCLK=1;
     i_data=i_data<<1;
   }
   i_data=command_data;
   i_data&=0xf0;                 /****************命令的高四位的四个字节******************/
   for(i=0;i<8;i++)
   {
      SID=(bit)(i_data&0x80);
     SCLK=0;
     SCLK=1;
     i_data=i_data<<1;
   }
    i_data=command_data;
    i_data<<=4;
    for(i=0;i<8;i++)
    {
     SID=(bit)(i_data&0x80);   /****************命令的低四位的四个字节**************/
     SCLK=0;
     SCLK=1;
     i_data=i_data<<1;
    }
    CS=0;
    delay_1ms(10);
}
/**********************写数据********************************/        

void send_data(uchar command_data)
{
   uchar i;
   uchar i_data;
   i_data=0xfa;                    /******************0xfa数据控制字********************/
   CS=1;
   for(i=0;i<8;i++)
   {
      SID=(bit)(i_data&0x80);            
     SCLK=0;
     SCLK=1;
     i_data=i_data<<1; 
   }
    i_data=command_data;
    i_data&=0xf0;              /********************数据的高四位*****************/
    for(i=0;i<8;i++)
    {
     SID=(bit)(i_data&0x80);
     SCLK=0;
     SCLK=1;
     i_data=i_data<<1;
     }
     i_data=command_data;
    i_data<<=4;                                  /********************数据的低四位*****************/
    for(i=0;i<8;i++)
    {
     SID=(bit)(i_data&0x80);
     SCLK=0;
     SCLK=1;
     i_data=i_data<<1;
    }
    CS=0;
    delay_1ms(10);
}

  
void lcd_init()
{
   delay_1ms(100);
   send_command(0x30);
   send_command(0x02);
   send_command(0x06);
   send_command(0x0c);
   send_command(0x01);
   send_command(0x80);
}

 /******************************************************************************
 函数功能:显示速度数值                        
******************************************************************************/
void display_val(unsigned int x)
{  
 unsigned char i,j,k,l;     //j,k,l分别储存温度的百位、十位和个位
   i=x/1000;         //取千位
   j=(x%1000)/100;   //取百位 
   k=(x%100)/10;     //取十位 
   l=x%10;           //取个位 
   send_command(0x91);
      send_data(digit[i]);         
      send_data(digit[j]);
      send_data(digit[k]);
      send_data(digit[l]);
      send_data(' ');
      send_data('r');
      send_data('/');
      send_data('f');
      send_data('e');
      send_data('n');
 } 

 void counter(void) interrupt 0
{
    EX1=0;                            //关外部中断0
    count1++;
    if(count1==4)                        //4次循环为电机转一圈
    {
        count1=1;                    //初始化计数
        v++;                        //转圈计数加1
    }                        //计数+1
    EX1=1;                            //开外部中断0
    return;
}
/*******************************************************
函数功能:主函数
********************************************************/
 void main(void)
 {    PSB=0;EX1=1;
    lcd_init();            //调用LCD初始化函数    
    TMOD=0x51;                //定时器T1工作于计数模式1,定时器T0工作于计时模式1;
    TH0=(65536-46083)/256;    //定时器T0的高8位设置初值,每50ms产生一次中断
    TL0=(65536-46083)%256;    //定时器T0的低8位设置初值,每50ms产生一次中断
    EA=1;                     //开总中断
    ET0=1;                    //定时器T0中断允许
    TR0=1;                    //启动定时器T0
    count=0;                  //将T0中断次数初始化为0
  display_val(0000);         //显示器工作正常标志
     while(1)                 //无限循环
      {
             TR1=1;            //定时器T1启动
          TH1=0;            //定时器T1高8位赋初值0
          TL1=0;            //定时器T1低8位赋初值0
          flag=0;           //时间还未满1分钟
          while(flag==0)  ;   //时间未满等待
            
    //     v=(TH1*256+TL1)*60; // /16 //计算速度,每周产生16个脉冲
         display_val(v);        //显示速度
    }            
}
/*******************************************************
函数功能:定时器T0的中断服务函数
********************************************************/
void Time0(void ) interrupt 1 using 1 //定时器T0的中断编号为1,使用第1组工作寄存器
  {
    count++;          //T0每中断1次,count加1
     if(count==20)     //若累计满20次,即计满1秒钟
      {
        flag=1;        //计满1秒钟标志位置1
         count=0;       //清0,重新统计中断次数
      }
     TH0=(65536-46083)/256;   //定时器T0高8位重新赋初值
     TL0=(65536-46083)%256;   //定时器T0低8位重新赋初值
    
  }  

评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Rookie boy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值