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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

想用89C52做一個測風(fēng)速的東西,求大神幫忙

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:202848 發(fā)表于 2017-5-20 14:10 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
怎么用89C52單片機做一個測風(fēng)速的東西,有人說用一個定時器來統(tǒng)計1分鐘碼盤的轉(zhuǎn)數(shù),具體C代碼怎么寫,有高人幫忙嗎
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:34643 發(fā)表于 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;                            //按鍵處理標(biāo)志位
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輸出標(biāo)志,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);
}
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 99热激情 | 亚洲精品视频网站在线观看 | 亚洲国产午夜 | 久久天堂 | 国产日韩欧美 | 国产综合精品一区二区三区 | 久久久久久九九九九 | 日本一卡精品视频免费 | 鲁一鲁资源影视 | 国产一级片一区二区三区 | 91精品中文字幕一区二区三区 | 欧美日韩在线成人 | 在线免费观看日本视频 | 一区二区三区影院 | 9色视频在线 | 久久69精品久久久久久久电影好 | 久久精品国产v日韩v亚洲 | 日韩av大片免费看 | 在线91| 国产精品日韩欧美一区二区三区 | 精品久久99 | 91成人在线视频 | 91xxx在线观看 | 黄a网站| 九九色综合 | 国产精品视频免费观看 | 精品在线一区二区三区 | www97影院 | 日韩精品久久久 | 黄网免费| 欧美一级免费 | 日韩免费1区二区电影 | yiren22 亚洲综合 | 亚洲视频第一页 | 成人做爰www免费看 午夜精品久久久久久久久久久久 | 成人在线观看黄 | 久久不射电影网 | 欧美区日韩区 | 国产有码 | 久久一区精品 | 欧美一区二区三区在线看 |