找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 4397|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

[原創(chuàng)]編程檢測(cè)轉(zhuǎn)速的,

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:42157 發(fā)表于 2012-6-27 15:22 | 只看該作者 回帖獎(jiǎng)勵(lì) |正序?yàn)g覽 |閱讀模式
哪位高手幫我看一下程序。坑悬c(diǎn)錯(cuò)誤,我改不了。#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define LCD_DATA P0 //LCD數(shù)據(jù)總線(xiàn)
sbit LCD_RS = P2^0; //1-選擇數(shù)據(jù)選擇器  0-選擇指令選擇器        
sbit LCD_RW = P2^1; //1-讀操作          0-寫(xiě)操作
sbit LCD_EN = P2^2; //LCD使能端
uchar line1[16] = {"NowSpeed=    rps"};//顯示緩存
uchar line2[16] = {"RH=   ,RL=   rps"};
uint N; //定義計(jì)數(shù)器脈沖值
int Nmax=100,Nmin=40; //定義報(bào)警上下限
uchar T0_count=0;
//LCD 1602A子程序---------------------------------//
//延時(shí)子函數(shù)//
void delay_ms(int ms)
{
   uchar y;
   while(ms--)
  {
     for(y = 0; y<250; y++)
     { _nop_();_nop_();_nop_();_nop_(); }
  }
}
//檢查L(zhǎng)CD忙狀態(tài),lcd_busy為1時(shí),忙,等待。lcd-busy為0時(shí),閑,可寫(xiě)指令與數(shù)據(jù)//
bit lcd_busy()
{                          
    bit result;
    LCD_RS=0;LCD_RW=1; //忙標(biāo)志讀出
    LCD_EN=1; 
    {_nop_();_nop_();_nop_();_nop_();_nop_();};//延遲5個(gè)機(jī)器周期
    result=(bit)(LCD_DATA&0x80);
    LCD_EN=0; 
    return(result); 
}
//寫(xiě)指令數(shù)據(jù)到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;//指令寄存器寫(xiě)入
    LCD_EN=1;
    LCD_DATA=cmd; //寫(xiě)命令
    LCD_EN=0; 
}
//寫(xiě)顯示數(shù)據(jù)到LCD---------------------------------//                                               
//RS=H,RW=L,E=高脈沖,D0-D7=數(shù)據(jù)。                            
void lcd_write_data(uchar dat)
{                          
    while(lcd_busy());
    LCD_EN=0;
 LCD_RS=1;LCD_RW=0;//數(shù)據(jù)寄存器寫(xiě)入
    LCD_EN=1; 
    LCD_DATA=dat; //寫(xiě)數(shù)據(jù)
    LCD_EN=0;   
}
//LCD初始化設(shè)定----------------------------------//
void lcd_init()
{  
    LCD_DATA=0;
 delay_ms(10);            //延時(shí)
    lcd_write_cmd(0x38);      //16*2顯示,5*7點(diǎn)陣,8位數(shù)據(jù)
    delay_ms(5);
 lcd_write_cmd(0x38);  //重復(fù)寫(xiě)入,解決冷啟動(dòng)時(shí)的異常
 delay_ms(5);
    lcd_write_cmd(0x0c);      //顯示開(kāi),關(guān)光標(biāo)
    delay_ms(5);
    lcd_write_cmd(0x06);        //移動(dòng)光標(biāo)
    delay_ms(5);
    lcd_write_cmd(0x01);      //清除LCD的顯示內(nèi)容
    delay_ms(5);
}
//設(shè)定顯示位置-------------------------------------// 
void lcd_pos(uchar pos)
{                          
  lcd_write_cmd(pos | 0x80);  //數(shù)據(jù)指針=80+地址變量
}
//LCD顯示-----------------------------------------//
display()
{
    uchar m;
 lcd_pos(0);       //設(shè)置顯示位置為第一行第1個(gè)字符,00H-27H共40字符
    for(m=0;m<16;m++)
       lcd_write_data(line1[m]);
    lcd_pos(0x40);    //設(shè)置顯示位置為第二行第1個(gè)字符,40H-67H共40字符
    for(m=0;m<16;m++)
       lcd_write_data(line2[m]);
}
//LCD 1602A子程序結(jié)束-----------------------------//
//計(jì)算轉(zhuǎn)速并計(jì)算顯存值--------------------------------//
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; //計(jì)算轉(zhuǎn)速值 r/s(轉(zhuǎn)/秒)   rps=N/2 r/ 500 ms =N r/s */
   num=rps; 
   //分離num(num為整數(shù))各位值的函數(shù),最低位放在array[0]----//
   do{ 
       num_array[i++]=num%10;
   }while(num=num/10); //分號(hào)不能忽略!
   i=0;
   line1[10]=num_array[2]+0x30;
   line1[11]=num_array[1]+0x30;
   line1[12]=num_array[0]+0x30;
   num=Nmax;
   //分離num(num為整數(shù))各位值的函數(shù),最低位放在array[0]----
   do{ 
       max_array[i++]=num%10;
   }while(num=num/10); //分號(hào)不能忽略!
   i=0;
   line2[3]=max_array[2]+0x30;
   line2[4]=max_array[1]+0x30;
   line2[5]=max_array[0]+0x30;
   num=Nmin;
   //分離num(num為整數(shù))各位值的函數(shù),最低位放在array[0]----
   do{ 
       min_array[i++]=num%10;
   }while(num=num/10); //分號(hào)不能忽略!
   i=0;
   line2[10]=min_array[2]+0x30;
   line2[11]=min_array[1]+0x30;
   line2[12]=min_array[0]+0x30;
//定時(shí)器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; //關(guān)中斷開(kāi)關(guān)
     TR0=0;TR1=0; //關(guān)T0,關(guān)T1
     N=256*TH1+TL1;  //統(tǒng)計(jì)50ms*10內(nèi)的脈沖數(shù)N
     compute_rps(N);
     display();
     TH0=0x3C;TL0=0xB0; //T0重置,50ms   f0=12MHz 
     TH1=0x00;TL1=0x00; //T1重置
     ET0=1; //中斷開(kāi)關(guān)開(kāi)
     TR0=1;TR1=1;  
   }
}
//主函數(shù)---------------------------//
main()
{ 
   lcd_init();  //初始化LCD             
   TMOD=0x51;  //設(shè)置定時(shí)器工作方式,即T0為16位定時(shí)器、T1為16位計(jì)數(shù)器。
         // 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;        //打開(kāi)總中斷
                // EA  -  ET2  ES  ET1  EX1  ET0  EX0
    // 1  0   0 0 0  0   1    0
   ET0=1; //允許T0中斷
   TR0=1;TR1=1; //啟動(dòng)T0,T1
       //TF1  TR1  TF0  TR0 
    //  1    1   
   while(1)
   {   
   }
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表