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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4355|回復: 0
打印 上一主題 下一主題
收起左側

[原創]編程檢測轉速的,

[復制鏈接]
跳轉到指定樓層
樓主
ID:42157 發表于 2012-6-27 15:22 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
哪位高手幫我看一下程序。坑悬c錯誤,我改不了。#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)
   {   
   }
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品久久久免费 | 亚洲毛片| 亚洲欧美一区二区三区视频 | 美女国产 | 欧美.com| 欧美精品一 | 中文字幕在线精品 | 日本又色又爽又黄的大片 | 国产真实乱对白精彩久久小说 | 激情久久久久 | 欧美日韩一区二区视频在线观看 | av免费看在线 | 欧美激情网站 | 亚洲国产精品久久久久 | 免费激情 | 久久人人爽人人爽人人片av免费 | 成人午夜影院 | 亚洲国产精品一区二区www | 免费福利视频一区二区三区 | 99re66在线观看精品热 | 青青久在线视频 | 精品久久久一区 | 国产 亚洲 网红 主播 | 亚洲精品欧美一区二区三区 | 夜夜操天天操 | av在线免费网 | 久久91精品国产一区二区 | a在线视频 | 日本黄色片免费在线观看 | 正在播放一区二区 | 久久se精品一区精品二区 | 免费在线视频一区二区 | 亚洲国产精品久久久 | 中文字幕亚洲欧美 | 日韩免费一区 | 欧美精品片 | 365夜爽爽欧美性午夜免费视频 | 国产精品毛片一区二区三区 | 国产精品一区二区三区四区 | 免费国产视频 | 天天人人精品 |