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

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

QQ登錄

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

搜索
查看: 1140|回復(fù): 3
收起左側(cè)

有沒(méi)有大神幫我看看我的程序錯(cuò)在哪了?主要是用pwm波調(diào)節(jié)

[復(fù)制鏈接]
ID:513308 發(fā)表于 2019-5-21 11:00 | 顯示全部樓層 |閱讀模式
#include "lcd.h"
#include "reg52.h"    //此文件中定義了單片機(jī)的一些特殊功能寄存器
#include  <math.h>    //Keil library  
#include  <stdlib.h>  //Keil library  
#include  <stdio.h>   //Keil library       
#include  <INTRINS.H> //Keil library  
#define        BMP085_SlaveAddress   0xee          //定義器件在IIC總線中的從地址                              

#define OSS 0        // Oversampling Setting (note: code is not set up to use other OSS values)
                                                          
typedef unsigned char  BYTE;
typedef unsigned short WORD;
typedef unsigned char u8;
typedef unsigned int u16;

short ac1;
short ac2;
short ac3;
unsigned short ac4;
unsigned short ac5;
unsigned short ac6;
short b1;
short b2;
short mb;
short mc;
short md;
u8 ge,shi,bai,qian,wan,shiwan;           //顯示變量
void DisplayOneChar(u8 X,u8 Y,u8 DData);
void conversion(long temp_data);
void  Single_Write(u8 SlaveAddress,u8 REG_Address,u8 REG_data);   //單個(gè)寫入數(shù)據(jù)
u8 Single_Read(u8 REG_Address);                                      //單個(gè)讀取內(nèi)部寄存器數(shù)據(jù)
void  Multiple_Read(u8,u8);                                          //連續(xù)的讀取內(nèi)部寄存器數(shù)據(jù)
//------------------------------------

void BMP085_Start();
void BMP085_Stop();
void BMP085_SendACK(bit ack);
bit  BMP085_RecvACK();
void BMP085_SendByte(BYTE dat);
BYTE BMP085_RecvByte();
void BMP085_ReadPage();
void BMP085_WritePage();
//-----------------------------------

u8 disp1[]="status: fangjiu ";
u8 disp2[]="status: baguan  ";
u8 disp3[]="gear posi:low   ";
u8 disp4[]="gear posi:middle";
u8 disp5[]="gear posi:high  ";

sbit          SCL=P3^7;      //IIC時(shí)鐘引腳定義
sbit           SDA=P3^6;      //IIC數(shù)據(jù)引腳定義
sbit key2=P1^0;       //設(shè)置獨(dú)立按鍵作為模式切換按鍵
sbit pwm=P1^2;            //將單片機(jī)的P1.2端口定義為pwm
sbit key1=P1^1;                //用單片機(jī)按鍵去控制pwm的占空比
sbit key3=P1^6;                //控制時(shí)間
sbit kz=P1^7;                //控制真空泵的通斷
u16 l=1,j=0,t=0,m=0,num=0,pp=0,tt=0;

u8 k;





/***************************************************************************
   * 函數(shù)名      : delay
   * 功能        :延時(shí)函數(shù)
   *
***************************************************************************/


void delay(u16 i)
{
        while(i--);       
}

void Delay5us(void)   //誤差 0us
{
     _nop_();  //if Keil,require use intrins.h
    _nop_();  //if Keil,require use intrins.h
}

void Delay5ms(void)   //誤差 0us
{
    unsigned char a,b;
    for(b=15;b>0;b--)
        for(a=152;a>0;a--);
}


/**************************************
起始信號(hào)
**************************************/
void BMP085_Start()
{
    SDA = 1;                    //拉高數(shù)據(jù)線
    SCL = 1;                    //拉高時(shí)鐘線
    Delay5us();                 //延時(shí)
    SDA = 0;                    //產(chǎn)生下降沿
    Delay5us();                 //延時(shí)
    SCL = 0;                    //拉低時(shí)鐘線
}

/**************************************
停止信號(hào)
**************************************/
void BMP085_Stop()
{
    SDA = 0;                    //拉低數(shù)據(jù)線
    SCL = 1;                    //拉高時(shí)鐘線
    Delay5us();                 //延時(shí)
    SDA = 1;                    //產(chǎn)生上升沿
    Delay5us();                 //延時(shí)
}

/**************************************
發(fā)送應(yīng)答信號(hào)
入口參數(shù):ack (0:ACK 1:NAK)
**************************************/
void BMP085_SendACK(bit ack)
{
    SDA = ack;                  //寫應(yīng)答信號(hào)
    SCL = 1;                    //拉高時(shí)鐘線
    Delay5us();                 //延時(shí)
    SCL = 0;                    //拉低時(shí)鐘線
    Delay5us();                 //延時(shí)
}

/**************************************
接收應(yīng)答信號(hào)
**************************************/
bit BMP085_RecvACK()
{
    SCL = 1;                    //拉高時(shí)鐘線
    Delay5us();                 //延時(shí)
    CY = SDA;                   //讀應(yīng)答信號(hào)
    SCL = 0;                    //拉低時(shí)鐘線
    Delay5us();                 //延時(shí)

    return CY;
}

/**************************************
向IIC總線發(fā)送一個(gè)字節(jié)數(shù)據(jù)
**************************************/
void BMP085_SendByte(BYTE dat)
{
    BYTE i;

    for (i=0; i<8; i++)         //8位計(jì)數(shù)器
    {
        dat <<= 1;              //移出數(shù)據(jù)的最高位
        SDA = CY;               //送數(shù)據(jù)口
        SCL = 1;                //拉高時(shí)鐘線
        Delay5us();             //延時(shí)
        SCL = 0;                //拉低時(shí)鐘線
        Delay5us();             //延時(shí)
    }
    BMP085_RecvACK();
}

/**************************************
從IIC總線接收一個(gè)字節(jié)數(shù)據(jù)
**************************************/
BYTE BMP085_RecvByte()
{
    BYTE i;
    BYTE dat = 0;

    SDA = 1;                    //使能內(nèi)部上拉,準(zhǔn)備讀取數(shù)據(jù),
    for (i=0; i<8; i++)         //8位計(jì)數(shù)器
    {
        dat <<= 1;
        SCL = 1;                //拉高時(shí)鐘線
        Delay5us();             //延時(shí)
        dat |= SDA;             //讀數(shù)據(jù)               
        SCL = 0;                //拉低時(shí)鐘線
        Delay5us();             //延時(shí)
    }
    return dat;
}

//*********************************************************
//讀出BMP085內(nèi)部數(shù)據(jù),連續(xù)兩個(gè)
//*********************************************************
short Multiple_read(u8 ST_Address)
{   
        u8 msb, lsb;
        short _data;
    BMP085_Start();                          //起始信號(hào)
    BMP085_SendByte(BMP085_SlaveAddress);    //發(fā)送設(shè)備地址+寫信號(hào)
    BMP085_SendByte(ST_Address);             //發(fā)送存儲(chǔ)單元地址
    BMP085_Start();                          //起始信號(hào)
    BMP085_SendByte(BMP085_SlaveAddress+1);         //發(fā)送設(shè)備地址+讀信號(hào)

    msb = BMP085_RecvByte();                 //BUF[0]存儲(chǔ)
    BMP085_SendACK(0);                       //回應(yīng)ACK
    lsb = BMP085_RecvByte();     
        BMP085_SendACK(1);                       //最后一個(gè)數(shù)據(jù)需要回NOACK

    BMP085_Stop();                           //停止信號(hào)
    Delay5ms();
    _data = msb << 8;
        _data |= lsb;       
        return _data;
}
//********************************************************************
long bmp085ReadTemp(void)
{

    BMP085_Start();                  //起始信號(hào)
    BMP085_SendByte(BMP085_SlaveAddress);   //發(fā)送設(shè)備地址+寫信號(hào)
    BMP085_SendByte(0xF4);                  // write register address
    BMP085_SendByte(0x2E);               // write register data for temp
    BMP085_Stop();                   //發(fā)送停止信號(hào)
        delay(10);        // max time is 4.5ms
       
        return (long) Multiple_read(0xF6);
}
//*************************************************************
long bmp085ReadPressure(void)
{
        long pressure = 0;

    BMP085_Start();                   //起始信號(hào)
    BMP085_SendByte(BMP085_SlaveAddress);   //發(fā)送設(shè)備地址+寫信號(hào)
    BMP085_SendByte(0xF4);                  // write register address
    BMP085_SendByte(0x34);                 // write register data for pressure
    BMP085_Stop();                    //發(fā)送停止信號(hào)
        delay(10);                              // max time is 4.5ms
       
        pressure = Multiple_read(0xF6);
        pressure &= 0x0000FFFF;
       
        return pressure;       
        //return (long) bmp085ReadShort(0xF6);
}

//**************************************************************

//初始化BMP085,根據(jù)需要請(qǐng)參考pdf進(jìn)行修改**************
void Init_BMP085()
{
        ac1 = Multiple_read(0xAA);
        ac2 = Multiple_read(0xAC);
        ac3 = Multiple_read(0xAE);
        ac4 = Multiple_read(0xB0);
        ac5 = Multiple_read(0xB2);
        ac6 = Multiple_read(0xB4);
        b1 =  Multiple_read(0xB6);
        b2 =  Multiple_read(0xB8);
        mb =  Multiple_read(0xBA);
        mc =  Multiple_read(0xBC);
        md =  Multiple_read(0xBE);
}


void bmp085Convert()
{
        long ut;
        long up;
        long x1, x2, b5, b6, x3, b3, p;
        unsigned long b4, b7;
        long  temperature;
        long  pressure;
       
        ut = bmp085ReadTemp();
        ut = bmp085ReadTemp();           // 讀取溫度
        up = bmp085ReadPressure();
        up = bmp085ReadPressure();  // 讀取壓強(qiáng)
       
        x1 = ((long)ut - ac6) * ac5 >> 15;
        x2 = ((long) mc << 11) / (x1 + md);
        b5 = x1 + x2;
         temperature = (b5 + 8) >> 4;



         b6 = b5 - 4000;
        x1 = (b2 * (b6 * b6 >> 12)) >> 11;
        x2 = ac2 * b6 >> 11;
        x3 = x1 + x2;
        b3 = (((long)ac1 * 4 + x3) + 2)/4;
        x1 = ac3 * b6 >> 13;
        x2 = (b1 * (b6 * b6 >> 12)) >> 16;
        x3 = ((x1 + x2) + 2) >> 2;
        b4 = (ac4 * (unsigned long) (x3 + 32768)) >> 15;
        b7 = ((unsigned long) up - b3) * (50000 >> OSS);
        if( b7 < 0x80000000)
             p = (b7 * 2) / b4 ;
           else  
                    p = (b7 / b4) * 2;
        x1 = (p >> 8) * (p >> 8);
        x1 = (x1 * 3038) >> 16;
        x2 = (-7357 * p) >> 16;
         pressure = p + ((x1 + x2 + 3791) >> 4);
          pressure=pressure/1000;








          if(j==0)
                 {          
                         if(key2==0)
                          {       
                           delay(1000);
                           if(key2==0)
                           { while(!key2);
                           
                             LcdWriteCom(0x01);//必須要加上清屏指令,因?yàn)閘cd1602有儲(chǔ)存功能,必須把上一屏清除掉之后才能寫入下一屏的數(shù)據(jù)
                         delay(1000);
                                for(k=0;k<16;k++)
                                {
                                        LcdWriteData(disp1[k]);//顯示仿灸功能       
                                }
                            j=1;
                                kz=0;
                               
                                while(1)
                                {
                                 if(pressure<98)
                                 break;
                               
                                }
                                kz=1;
                           }
                      }
             }


          if(j==1)
                 {
                         if(key2==0)
                          {       
                           delay(1000);
                           if(key2==0)
                           { while(!key2);
                           
                             LcdWriteCom(0x01);//必須要加上清屏指令,因?yàn)閘cd1602有儲(chǔ)存功能,必須把上一屏清除掉之后才能寫入下一屏的數(shù)據(jù)
                         delay(1000);
                                for(k=0;k<16;k++)
                                {
                                        LcdWriteData(disp2[k]);//顯示拔罐功能       
                                }
                            j=0;
                                kz=0;
                               
                                while(1)
                                {
                                 if(pressure<82)
                                 break;
                               
                                }
                                kz=1;
                           }
                      }
             }


//        conversion(pressure);
//     DisplayOneChar(4,1,'P');    //顯示壓強(qiáng)
//     DisplayOneChar(5,1,':');
//         DisplayOneChar(6,1,shiwan);
//         DisplayOneChar(7,1,wan);   
//     DisplayOneChar(8,1,qian);
//     DisplayOneChar(9,1,'.');
//     DisplayOneChar(10,1,bai);
//     DisplayOneChar(11,1,shi);
//         DisplayOneChar(12,1,'K');   //氣壓?jiǎn)挝?br /> //         DisplayOneChar(13,1,'p');
//         DisplayOneChar(14,1,'a');


}



/***************************************************************************
   * 函數(shù)名      : Timerinit
   * 功能        :定時(shí)器初始化
   *
***************************************************************************/

        void Timerinit()
    {   TMOD=0x01;                 //模式設(shè)置,00000001,可見(jiàn)采用的是定時(shí)器0,工作與模式1(M1=0,M0=1)。
        TR0=1;                         //打開(kāi)定時(shí)器
        TH0=0Xff;                 //定時(shí)器設(shè)置,每隔100微秒發(fā)起一次中斷。
        TL0=0Xa4;
        ET0=1;                         //開(kāi)定時(shí)器0中斷
        EA=1;   
        }
   /***************************************************************************
   * 函數(shù)名          : keyscan
   * 函數(shù)功能                 : 按鍵掃描
   *
   ***************************************************************************/
        void keyscan()
        {  if(l==1)
                {  if(key1==0)
                  {         
                   delay(1000);
                   if(key1==0)
                   { while(!key1);
                     Timerinit();
                      LcdWriteCom(0x01);//必須要加上清屏指令,因?yàn)閘cd1602有儲(chǔ)存功能,必須把上一屏清除掉之后才能寫入下一屏的數(shù)據(jù)
                         delay(1000);
                                for(k=0;k<16;k++)
                                {
                                        LcdWriteData(disp5[k]);//顯示為高檔位       
                                }
                           num=90000;
                        l=2;
                   }
                  }
                  
                }
       

                if(l==2)
                        {  if(key1==0)
                          {       
                           delay(1000);
                           if(key1==0)
                           { while(!key1);
                             Timerinit();
                           LcdWriteCom(0x01);//必須要加上清屏指令,因?yàn)閘cd1602有儲(chǔ)存功能,必須把上一屏清除掉之后才能寫入下一屏的數(shù)據(jù)
                         delay(1000);
                                for(k=0;k<16;k++)
                                {
                                        LcdWriteData(disp4[k]);//顯示為中檔位       
                                }
                                   num=70000;
                                l=3;
                           }
                          }
                          
                        }
       

                if(l==3)
                        {  if(key1==0)
                          {       
                           delay(1000);
                           if(key1==0)
                           { while(!key1);
                                   Timerinit();
                                   LcdWriteCom(0x01);//必須要加上清屏指令,因?yàn)閘cd1602有儲(chǔ)存功能,必須把上一屏清除掉之后才能寫入下一屏的數(shù)據(jù)
                                 delay(1000);
                                for(k=0;k<16;k++)
                                {
                                        LcdWriteData(disp3[k]);//顯示為低檔位       
                                }
                                   num=50000;
                                l=1;
                           }
                          }
                          
                        }
               
          
        if(m==0)
          { if(key3==0)
           {
                   delay(1000);
                if(key3==0)
                        {                          
            while(!key3);
                         Timerinit();
                          t=0;
                          tt=30000;
                          m=1;
                        }
                  
          
           }
          }

         if(m==1)
          { if(key3==0)
           {
                   delay(1000);
                if(key3==0)
                        { while(!key3);
                          Timerinit();
                          tt=40000;
                          t=0;
                          m=2;
                        }
                  
          
           }
          }

         if(m==2)
          { if(key3==0)
           {
                   delay(1000);
                if(key3==0)
                        { while(!key3);
                          Timerinit();
                          tt=50000;
                          t=0;
                          m=0;
                        }
                  
          
           }
          }

        }
/***************************************************************************
   * 函數(shù)名      : time0
   * 功能        :中斷函數(shù)
   *
***************************************************************************/
   void time0() interrupt 1
{       TH0=0Xff;
        TL0=0Xa4;
        pp++;
                t++;
          
       
}
/*******************************************************************************
* 函 數(shù) 名       : main
* 函數(shù)功能                 : 主函數(shù)
* 輸    入       : 無(wú)
* 輸    出             : 無(wú)
*******************************************************************************/
void main()
{        Timerinit();
    LcdInit();
        Init_BMP085();
        while(1)
        {
        keyscan();
        bmp085Convert();
        if(tt>0)
{        if(t>=tt)
        { t=0;
          tt=0;
          pwm=1;
          TR0=0;
          EA=0;
          ET0=0;
          
        }
}                                  
        if(pp<num)
        pwm=1;
        else
        pwm=0;
               
        if(pp==100000)                //當(dāng)占空比為100%
    pp=0;
               
        }               
}
剩下的子程序是lcd1602的,這個(gè)就不放了,肯定沒(méi)錯(cuò)誤

回復(fù)

使用道具 舉報(bào)

ID:513308 發(fā)表于 2019-5-21 11:27 | 顯示全部樓層
結(jié)果是0錯(cuò)誤0警告,但是pwm波控制的時(shí)間根本不對(duì),而且那個(gè)按鍵控制時(shí)間的也不對(duì),調(diào)了好多天了,不知道哪錯(cuò)了,有沒(méi)有人能幫幫我?
回復(fù)

使用道具 舉報(bào)

ID:543711 發(fā)表于 2019-5-21 13:36 | 顯示全部樓層
沒(méi)有看懂,我也是新手進(jìn)來(lái)膜拜大神的
回復(fù)

使用道具 舉報(bào)

ID:527827 發(fā)表于 2019-5-21 13:57 | 顯示全部樓層
把pwm占空比調(diào)節(jié)的代碼放到中斷里,放在主循環(huán)里執(zhí)行太慢
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚洲成人www | 成人免费视频观看视频 | 成人欧美一区二区三区在线播放 | 四虎影音 | 久久999 | 久久不射电影网 | 日韩一区二区三区视频在线播放 | 亚洲一二三在线 | 欧洲妇女成人淫片aaa视频 | 精品福利在线 | 看一级毛片视频 | 久久久www成人免费无遮挡大片 | 欧美黄色一区 | 亚洲精品视频一区 | 精精国产xxxx视频在线播放7 | 中文字幕一区二区三区四区五区 | 美女艹b | 一级在线 | 一级黄色片在线看 | 久久国产精品-国产精品 | 91精品国产92 | 国产一区二区三区视频免费观看 | 亚洲一区二区久久 | 成人欧美一区二区三区 | 精品成人av | 免费观看一级毛片视频 | 亚洲欧美日韩电影 | 成人啊啊啊| 欧美欧美欧美 | 国产成人精品免费 | 欧美精品在线观看 | 国外成人在线视频网站 | 欧美久久精品一级c片 | 亚洲不卡在线观看 | 日韩中文字幕久久 | 成人性生交大片免费看中文带字幕 | 成人在线精品 | 天天综合国产 | 久久国产精品偷 | 秋霞电影院午夜伦 | 精品一区av |