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

標題: 想用89C52做一個測風速的東西,求大神幫忙 [打印本頁]

作者: sjxaaaa    時間: 2017-5-20 14:10
標題: 想用89C52做一個測風速的東西,求大神幫忙
怎么用89C52單片機做一個測風速的東西,有人說用一個定時器來統(tǒng)計1分鐘碼盤的轉(zhuǎn)數(shù),具體C代碼怎么寫,有高人幫忙嗎

作者: 51mcu    時間: 2017-5-20 16:35
給你個數(shù)碼管的測速程序:
#include<reg52.h>
#include<stdio.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define THC0 0xf8                   //0xf9
#define TLC0 0x30          //2ms  //0x0f
unsigned char  code Duan[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//共陽極數(shù)碼管,0-9段碼表

unsigned char  Data_Buffer[8]={0,0,0,0,0,0,0,0};  //轉(zhuǎn)速及定值顯示緩存

uchar i=0,n,Bit;
sbit led1=P2^0;                         //轉(zhuǎn)速千位顯數(shù)碼管位驅(qū)動端口
sbit led2=P2^2;                         //轉(zhuǎn)速百位顯數(shù)碼管位驅(qū)動端口
sbit led3=P2^4;                         //轉(zhuǎn)速個位顯數(shù)碼管位驅(qū)動端口
sbit led4=P2^6;                         //轉(zhuǎn)速十位顯數(shù)碼管位驅(qū)動端口

static uchar bdata ke;                 //可位尋址的狀態(tài)寄存器
sbit aj=ke^0;                            //按鍵處理標志位
sbit k1=P3^3;                                //功能按鍵
sbit k2=P3^4;                                //定值加按鍵
sbit k3=P3^5;                                //定值加按鍵
sbit PWM_FC=P2^7;                    //PWM調(diào)速輸出端


uchar T0_H = 0,T0_L = 0,T1_H=0,T1_L=0;  //用來裝計算出的初值
uchar flag=1;//        pwm輸出標志,0為輸出低電平,1為輸出高電平

int out=0;
uint Inpluse=0,num=0;                //脈沖計數(shù)
uint PWMTime=100;                        //脈沖寬度
unsigned char  arry[];
void SendString(uint ch);
void PIDControl();
void SystemInit();
void PWMOUT();
void SetSpeed();
void SegRefre();
void delay(i);                                //延時函數(shù)
/**************主函數(shù)************/
void main()
{
        SystemInit();                        //單片機初始化
        while(1)
        {
                SetSpeed();                           //按鍵處理程序
                SegRefre();                           //顯示處理
        }
}

void SystemInit()
{
        TMOD=0X11;    //t0,t1為16位
        TH0=THC0;
        TL0=TLC0;
        T0_H = (65535-300)/256;                                        //PWM=1時給定高位初值
        T0_L = (65535-300)%256;                                          //PWM=1時給定低位初值
        T1_H = (65535-(1000-300))/256;                        //PWM=0時給定高位初值       
        T1_L = (65535-(1000-300))%256;                          //PWM=0時給定低位初值
        ET1=1;
        ET0=1;
        TR0=1;
        TR1=1;
        EX0=1;                                                                     //中斷0用來測量轉(zhuǎn)速
        IT0=1;
        EA=1;
        out=300;                                                                        //開總中斷
//        n=30;
}
void SetSpeed()
{

                if (k2==0)                           //增加轉(zhuǎn)速定值按鍵按下時,每次增加定值100轉(zhuǎn)/分
            {
                    while(!k2);                   //再次進行按鍵按下判斷
                        delay(40);                   //延時
                        out+=50;           //增加定值100轉(zhuǎn)/分
                        if(out>1000)  //定值最大值為9900轉(zhuǎn)/分
                        {
                                out=1000; //定值=9900轉(zhuǎn)/分
                        }
                        T0_H = (65535-out)/256;                                //PWM=1高位初值計算
                        T0_L = (65535-out)%256;                                  //PWM=1低位初值計算
                        T1_H = (65535-(1000-out))/256;                //PWM=0高位初值計算        
                        T1_L = (65535-(1000-out))%256;                //PWM=0低位初值計算
                }       
                if (k3==0)                           //減小轉(zhuǎn)速定值按鍵按下時,每次增減定值100轉(zhuǎn)/分
            {
                    while(!k3);                   //再次進行按鍵按下判斷
                        delay(40);                   //延時
                        out-=50;           //減小定值100轉(zhuǎn)/分
                        if(out<100)   //定值最小值為200轉(zhuǎn)/分
                        {
                                out=100;  //定值=200轉(zhuǎn)/分
                        }
                        T0_H = (65535-out)/256;                                //PWM=1高位初值計算
                        T0_L = (65535-out)%256;                                  //PWM=1低位初值計算
                        T1_H = (65535-(1000-out))/256;                //PWM=0高位初值計算        
                        T1_L = (65535-(1000-out))%256;                //PWM=0低位初值計算                                
                }

                SegRefre();                          //顯示刷新                       
}
void SegRefre()                  //顯示刷新
{
        Data_Buffer[0]=num/1000;                           //轉(zhuǎn)速千位顯示轉(zhuǎn)換處理
        Data_Buffer[1]=num%1000/100;                   //轉(zhuǎn)速百位顯示轉(zhuǎn)換處理
        Data_Buffer[2]=num%100/10;                           //轉(zhuǎn)速十位顯示轉(zhuǎn)換處理
        Data_Buffer[3]=num%10;                                   //轉(zhuǎn)速個位顯示轉(zhuǎn)換處理
}

void int0() interrupt 0                                                  //進行轉(zhuǎn)速脈沖計數(shù)外部中斷處理
{
        Inpluse++;                                                                  //轉(zhuǎn)速脈沖加1
}


void t0() interrupt 1                 //2毫秒中斷一次
{
        static unsigned int time=0;
        TH0=THC0;
        TL0=TLC0;
        time++;                                  //轉(zhuǎn)速測量周期
        if(time>250)                          //0.5秒獲取一次轉(zhuǎn)速數(shù)據(jù),進行一次PID處理。
        {
                time=0;
                num=Inpluse*2;                 //碼盤數(shù)n num=Inpluse*60/n
                Inpluse=0;
        }
        led1=1;                                    //停止顯示
        led2=1;                                        //停止顯示
        led3=1;                                        //停止顯示
        led4=1;                                        //停止顯示
        Bit++;
        if(Bit>4) Bit=0;
        P0=Duan[Data_Buffer[Bit]];         //獲取顯示數(shù)據(jù)段碼
        switch(Bit)
        {
                case 0:led1=0;break;         //數(shù)碼管千位顯示
                case 1:led2=0;break;         //數(shù)碼管百位顯示
                case 2:led3=0;break;         //數(shù)碼管十位顯示
                case 3:led4=0;break;         //數(shù)碼管個位顯示
        }
}

void timer_1()  interrupt 3                 //PWM調(diào)速中斷處理程序
{
        if(flag)
        {
                TH1 = T0_H;                                 //通的初值高位
                TL1        = T0_L;                                 //通的初值低位
                PWM_FC= 1;                                 //PWM輸出=1
                flag= 0;       
        }
        else
        {
                TH1 = T1_H;                                //斷的初值高位
                TL1 = T1_L;                                //斷的初值低位
                PWM_FC= 0;                                //PWM輸出=0
                flag= 1;               
        }
}

void delay(i)                                //延時函數(shù)
{
           while(--i);
}




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 久国久产久精永久网页 | 欧美精品一区二区三区在线 | 国产欧美精品区一区二区三区 | 欧美乱操| 99久久婷婷国产综合精品电影 | 亚洲视频在线播放 | 99re热精品视频 | 精品国产鲁一鲁一区二区张丽 | 国产精品久久久久久久久久久免费看 | 久久亚洲春色中文字幕久久久 | 久久综合伊人 | 久久99久久99 | 男人av的天堂 | 美国十次成人欧美色导视频 | 青青久久| 日韩在线免费 | 91一区二区三区 | 国产精品久久久久久一区二区三区 | 久久久国产精品视频 | 夜夜av| 久久精品国产久精国产 | 毛片免费在线观看 | 特级黄一级播放 | 国产精品成人一区二区 | av大全在线观看 | 999观看免费高清www | 九九99九九精彩46 | www.久久久久久久久 | 国产97在线视频 | 久久综合激情 | 免费在线性爱视频 | 黄色在线播放视频 | 国内精品久久精品 | 日本电影网站 | 999国产视频| 国产精品久久久久久久一区二区 | 国产精品不卡一区 | 久久亚洲高清 | 国产精品日韩欧美一区二区 | 最新中文字幕久久 | 国产精品亚洲成在人线 |