久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4474|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美久久一区 | 日韩精品成人一区二区三区视频 | 中文字幕一区二区三区乱码在线 | 久久精品亚洲国产奇米99 | 超碰人人插 | 成人在线观看黄 | 日韩欧美国产精品一区 | 中文视频在线 | 国产欧美日韩精品一区二区三区 | 日韩成人精品一区二区三区 | 伊人网伊人| 99久久精品国产一区二区三区 | 成人精品国产免费网站 | 九九热在线视频免费观看 | 97超碰成人| 自拍偷拍亚洲欧美 | 伊人精品在线 | 欧美在线观看黄色 | av特级毛片| 九九热在线视频 | 久久久久99 | 日韩av手机在线观看 | 国产一区二区免费电影 | 久久噜噜噜精品国产亚洲综合 | 久久久久国产一区二区三区 | 91免费版在线观看 | 一级毛片网 | 日韩欧美国产精品一区二区三区 | 亚洲国产在 | 中文字幕国产精品视频 | 欧美日韩国产中文字幕 | 精品熟人一区二区三区四区 | 国产伦精品一区二区三区精品视频 | 国产日韩欧美中文 | 精品国产综合 | 亚洲国产第一页 | 黄色毛片在线播放 | 国产精品日产欧美久久久久 | 久久久91 | 欧美在线视频网 | 不卡一区|