找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4450|回复: 0
收起左侧

[原创]编程检测转速的,

[复制链接]
ID:42157 发表于 2012-6-27 15:22 | 显示全部楼层 |阅读模式
哪位高手帮我看一下程序啊?有点错误,我改不了。#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define LCD_DATA P0 //LCD数据总线
sbit LCD_RS = P2^0; //1-选择数据选择器  0-选择指令选择器        
sbit LCD_RW = P2^1; //1-读操作          0-写操作
sbit LCD_EN = P2^2; //LCD使能端
uchar line1[16] = {"NowSpeed=    rps"};//显示缓存
uchar line2[16] = {"RH=   ,RL=   rps"};
uint N; //定义计数器脉冲值
int Nmax=100,Nmin=40; //定义报警上下限
uchar T0_count=0;
//LCD 1602A子程序---------------------------------//
//延时子函数//
void delay_ms(int ms)
{
   uchar y;
   while(ms--)
  {
     for(y = 0; y<250; y++)
     { _nop_();_nop_();_nop_();_nop_(); }
  }
}
//检查LCD忙状态,lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据//
bit lcd_busy()
{                          
    bit result;
    LCD_RS=0;LCD_RW=1; //忙标志读出
    LCD_EN=1; 
    {_nop_();_nop_();_nop_();_nop_();_nop_();};//延迟5个机器周期
    result=(bit)(LCD_DATA&0x80);
    LCD_EN=0; 
    return(result); 
}
//写指令数据到LCD---------------------------------//
//RS=L,RW=L,E=高脉冲,D0-D7=指令码。
void lcd_write_cmd(uchar cmd)
{                          
    while(lcd_busy());
    LCD_EN=0;
 LCD_RS=0;LCD_RW=0;//指令寄存器写入
    LCD_EN=1;
    LCD_DATA=cmd; //写命令
    LCD_EN=0; 
}
//写显示数据到LCD---------------------------------//                                               
//RS=H,RW=L,E=高脉冲,D0-D7=数据。                            
void lcd_write_data(uchar dat)
{                          
    while(lcd_busy());
    LCD_EN=0;
 LCD_RS=1;LCD_RW=0;//数据寄存器写入
    LCD_EN=1; 
    LCD_DATA=dat; //写数据
    LCD_EN=0;   
}
//LCD初始化设定----------------------------------//
void lcd_init()
{  
    LCD_DATA=0;
 delay_ms(10);            //延时
    lcd_write_cmd(0x38);      //16*2显示,5*7点阵,8位数据
    delay_ms(5);
 lcd_write_cmd(0x38);  //重复写入,解决冷启动时的异常
 delay_ms(5);
    lcd_write_cmd(0x0c);      //显示开,关光标
    delay_ms(5);
    lcd_write_cmd(0x06);        //移动光标
    delay_ms(5);
    lcd_write_cmd(0x01);      //清除LCD的显示内容
    delay_ms(5);
}
//设定显示位置-------------------------------------// 
void lcd_pos(uchar pos)
{                          
  lcd_write_cmd(pos | 0x80);  //数据指针=80+地址变量
}
//LCD显示-----------------------------------------//
display()
{
    uchar m;
 lcd_pos(0);       //设置显示位置为第一行第1个字符,00H-27H共40字符
    for(m=0;m<16;m++)
       lcd_write_data(line1[m]);
    lcd_pos(0x40);    //设置显示位置为第二行第1个字符,40H-67H共40字符
    for(m=0;m<16;m++)
       lcd_write_data(line2[m]);
}
//LCD 1602A子程序结束-----------------------------//
//计算转速并计算显存值--------------------------------//
void compute_rps(uint N)   // uint N;  //0-65535
{
   uint rps;
   uchar num_array[3]={0}; 
   uchar max_array[3]={0};
   uchar min_array[3]={0};
   uint num;
   uchar i=0; 
   rps=N; //计算转速值 r/s(转/秒)   rps=N/2 r/ 500 ms =N r/s */
   num=rps; 
   //分离num(num为整数)各位值的函数,最低位放在array[0]----//
   do{ 
       num_array[i++]=num%10;
   }while(num=num/10); //分号不能忽略!
   i=0;
   line1[10]=num_array[2]+0x30;
   line1[11]=num_array[1]+0x30;
   line1[12]=num_array[0]+0x30;
   num=Nmax;
   //分离num(num为整数)各位值的函数,最低位放在array[0]----
   do{ 
       max_array[i++]=num%10;
   }while(num=num/10); //分号不能忽略!
   i=0;
   line2[3]=max_array[2]+0x30;
   line2[4]=max_array[1]+0x30;
   line2[5]=max_array[0]+0x30;
   num=Nmin;
   //分离num(num为整数)各位值的函数,最低位放在array[0]----
   do{ 
       min_array[i++]=num%10;
   }while(num=num/10); //分号不能忽略!
   i=0;
   line2[10]=min_array[2]+0x30;
   line2[11]=min_array[1]+0x30;
   line2[12]=min_array[0]+0x30;
//定时器0中断--------------------//
void timer0(void) interrupt 1
{
   T0_count++;
   TH0=0x3C;TL0=0xB0; //T0重置,50ms   f0=12MHZ
   scan();
   if(T0_count>=10)
   {
     T0_count=0;
  ET0=0; //关中断开关
     TR0=0;TR1=0; //关T0,关T1
     N=256*TH1+TL1;  //统计50ms*10内的脉冲数N
     compute_rps(N);
     display();
     TH0=0x3C;TL0=0xB0; //T0重置,50ms   f0=12MHz 
     TH1=0x00;TL1=0x00; //T1重置
     ET0=1; //中断开关开
     TR0=1;TR1=1;  
   }
}
//主函数---------------------------//
main()
{ 
   lcd_init();  //初始化LCD             
   TMOD=0x51;  //设置定时器工作方式,即T0为16位定时器、T1为16位计数器。
         // GATE  C/T  M1  M0  GATE  C/T  M1  M0  
      //   0  1   0   1    0 0  0  1
   TH0=0x3C;TL0=0xB0; //T0初始化
   TH1=0x00;TL1=0x00; //T1初始化
   EA=1;        //打开总中断
                // EA  -  ET2  ES  ET1  EX1  ET0  EX0
    // 1  0   0 0 0  0   1    0
   ET0=1; //允许T0中断
   TR0=1;TR1=1; //启动T0,T1
       //TF1  TR1  TF0  TR0 
    //  1    1   
   while(1)
   {   
   }
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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