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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

藍牙與單片機收發問題

[復制鏈接]
跳轉到指定樓層
樓主
ID:300554 發表于 2018-4-2 03:53 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
我這程序,加入InitUART()      這串口初始化之后,lcd12864屏幕顯示的pm值為0,當然手機收到的也為0;但是如果把串口初始化語句去掉,lcd屏幕就有了數據,但是手機就收不到了。各位大神請問怎么解決這個問題呢?
#include <reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define ushort unsigned short
uchar TxBuf[32];      

sbit re=P2^5;  //液晶接口
sbit rw=P2^4;
sbit rs=P2^3;
sbit psb=P2^6;
sbit rst=P2^7;
sbit LED=P1^1;//粉塵傳感器控制接口
sbit ADCS=P1^4;//AD0832接口
sbit ADCLK=P1^0;
sbit ADDI=P1^2;
sbit ADDO=P1^2;
sbit SET=P3^3;//按鍵接口
sbit ADD=P3^4;
sbit DEC=P3^5;
sbit BEEP=P3^6;//蜂鳴器接口
        uchar j;
    uchar Tx_Buf[15];
uchar set_st;
uchar tab[4];
uint DUST_SET=35;//固體顆粒物的閥值
int x;    //計數器
//定義標志
uchar FlagStar=0;
float  DUST_Value;
uint DUST;
uchar num=0;
uchar mm;
uchar abc;
uchar ADC_Get[10]={0};//定義AD采樣數組
uchar str[5]={0};
uchar code tab0[]="pm2.5:";
uchar code tab1[]="溫度值:";
uchar code tab2[]="報警閥值:";
void InitUART(void);
void SendByte(unsigned char DUS);
void SendStr(unsigned char *s);   

void InitUART(void)                         //這是串口的基本配置,波特率是9600.
{
   SCON=0x50;                //設置為工作方式1                       
        TMOD=0x25;                //設置計數器工作方式2
       
        TH1=0xFD;                //計數器初值設置,波特率是4800
        TL1=0xFD;
        ES=1;                        //開中斷
        EA=1;                                               
        TR1=1;                        //開計數器
}

/*
* UART 發送一字節
*/
void UART_send_byte(char dat)
{
        SBUF = dat;
        while (TI == 0);
        TI = 0;
}

/*
* UART 發送字符串
*/
void UART_send_string(unsigned char *buf)
{
        while (*buf != '\0')
        {
                UART_send_byte(*buf++);
        }
}



void Delay280us()                //@11.0592MHz
{
        unsigned char i, j;

        _nop_();
        i = 3;
        j = 0;
        do
        {
                while (--j);
        } while (--i);
}
void Delay40us()                //@11.0592MHz
{
        unsigned char i;

        i = 108;
        while (--i);
}

void delaym1s(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
   void DelayMs(uchar k)
{ uchar i;
i=k;
while(i--);
}
void wr_date(uchar date)//寫數據
{
uint i;
uchar a,p;
delaym1s(10);
a=date;
rs=1;                //數據命令選擇=1時讀取數據
re=0;             //串口時鐘,未開
rw=1;              //選擇串口方式
for(i=0;i<5;i++)    //開啟字節
{
  re=1;
  re=0;
}
rw=0;             // 寫
re=1;           //開啟時鐘脈沖
re=0;
rw=1;           //選擇數據

re=1;         
re=0;
rw=0;         
re=1;
re=0;
for(p=0;p<2;p++)
{
  for(i=0;i<4;i++)
  {
   a=a<<1;    //左移目的是為了將溢出數據(即0或1)賦予std     
   rw=CY;    //單片機特殊功能寄存器,“CY”用于存放字符串溢出字符   
   re=1;   //一開一鎖將數據顯示
   re=0;
  }
  rw=0;         
  for(i=0;i<4;i++)
  {
   re=1;
   re=0;
  }
}
}
void wr_com(uchar com) //寫命令
{
uchar a,p;
uint i;
delaym1s(10);
a=com;
rs=1;              //數據命令選擇=1時讀取數據
re=0;            //串口時鐘,未開
rw=1;            //選擇串口方式
for(i=0;i<5;i++)   //開啟字節
{
  re=1;
  re=0;
}
rw=0;         
re=1;         //開啟時鐘脈沖
re=0;
rw=0;         
re=1;      
re=0;
rw=0;         
re=1;
re=0;
for(p=0;p<2;p++)
{
  for(i=0;i<4;i++)
  {
   a=a<<1;//左移目的是為了將溢出數據(即0或1)賦予std
   rw=CY;//單片機特殊功能寄存器,“CY”用于存放字符串溢出字符   
   re=1;//一開一鎖將數據顯示
   re=0;
  }
  rw=0;   
  for(i=0;i<4;i++)//延時一下為下一數據到來做準備   
  {
   re=1;
   re=0;
  }
}

}

void write_lcd() //向液晶寫入顯示內容
{
uchar num;
wr_com(0x80);
for(num=0;num<7;num++)
{
  wr_date(tab0[num]);
  delaym1s(1);
}
wr_com(0x90);
for(num=0;num<7;num++)
{
  wr_date(tab1[num]);
  delaym1s(1);
}
wr_com(0x88);
for(num=0;num<10;num++)
{
  wr_date(tab2[num]);
  delaym1s(1);
}
// wr_com(0x98);
// for(num=0;num<16;num++)
// {
//   wr_date(tab3[num]);
//   delay(1);
// }
}
void init_lcd()
{
rst=1;
psb=0;         //選串口
wr_com(0x30); //30---基本指令動作
wr_com(0x01); //清屏,地址指針指向00H
delaym1s(1);
wr_com(0x06); //光標的移動方向即讀入或寫入數據后指針加一
wr_com(0x0c); //開顯示,關游標類似1602
return;
}
void init()
{
init_lcd();
write_lcd();
}


/*******初始化定時器0***********/
void InitTimer(void)
{
TMOD=0x01;
TH0=(65536-10000)/256;//定時10ms
TL0=(65536-10000)%256;
TR0=1;
ET0=1;
EA=1;
}

/****************顯示函數********************/
void disp(uint Data)//PM2,5值顯示
{  
uint Temp;  
Temp=Data%10000;
TxBuf[0]=Temp/1000+0x30;//千位            
Temp%=1000;               
TxBuf[1]='.';               
TxBuf[2]=Temp/100+0x30;//百位
Temp%=100;
TxBuf[3]=Temp/10+0x30;//十位
TxBuf[4]=Temp%10+0x30;//個位
wr_com(0x83);  
wr_date(TxBuf[0]);
wr_date(TxBuf[1]);
wr_com(0x84);
wr_date(TxBuf[2]);
wr_date(TxBuf[3]);
wr_com(0x85);
wr_date(TxBuf[4]);
wr_date('m');
wr_com(0x86);
wr_date('g');
wr_date('/');
wr_com(0x87);
wr_date('m');
wr_date('3');

   InitUART() ;

    j = Data %10000;

  Tx_Buf[0]=j/1000+0x30;                //將度數據送往發送數組,送給藍牙模塊讓手機顯示
   j%=1000;
   Tx_Buf[1]='.';
    Tx_Buf[2]=j/100+0x30;
        j%=100;
         Tx_Buf[3]=j/10+0x30;
          Tx_Buf[4]=j%10+0x30;
           Tx_Buf[5]=0;//結束符

                UART_send_string( Tx_Buf);  }




/*********報警值顯示**********/
void baojing()
{
wr_com(0x8d);
wr_date(TxBuf[12]);
wr_date(TxBuf[13]);
wr_com(0x8e);
wr_date(TxBuf[14]);
wr_date(TxBuf[15]);
}
/******延時********/
void Delay(uint num)
{
while(--num);
}

/*******按鍵檢測********/
void checkkey()
{
if(SET==0)
{
Delay(2000);
do{}while(SET==0);
set_st++;
if(set_st>1)set_st=0;
}
if(set_st==0)
{
}
else if(set_st==1)
{
if(DEC==0)
{
Delay(2000);
do{}while(DEC==0);

if(DUST_SET>0) DUST_SET--;
if(DUST_SET==0) DUST_SET=0;
}
if(ADD==0)
{
Delay(2000);
do{}while(ADD==0);
DUST_SET++;
if(DUST_SET>80) DUST_SET=80;
}
}
TxBuf[12]=DUST_SET/100;
TxBuf[13]='.';
TxBuf[14]=DUST_SET%100/10;
TxBuf[15]=DUST_SET%100%10;
}

///******報警子程序*******/
/*void Alarm()
{
if(x>=10){beep_st=~beep_st;x=0;}
if(DUST/10>DUST_SET&&beep_st==1) BEEP=1;
else BEEP=0;
if(DUST/10>0&&DUST/10<10){LED2=0;LED3=1;LED4=1;}
if(DUST/10>=10&&DUST/10<30){LED2=1;LED3=0;LED4=1;}
if(DUST/10>=30){LED2=1;LED3=1;LED4=0;}
}*/

/*******AD0832轉換程序**********/
uchar AD0832(bit mode,bit channel)      //AD轉換,返回結果
{
uchar i,dat,ndat;

ADCS=0;// 拉低CS端
_nop_();
_nop_();

ADDI=1;  //第一個下降沿為高電平
ADCLK=1;  //  拉高CLK端
_nop_();
_nop_();
ADCLK=0;// 拉低CLK端,形成下降沿1
_nop_();
_nop_();

ADDI=mode;  //低電平為差分模式,高電平為單通道模式。
ADCLK=1;  //  拉高CLK端
_nop_();
_nop_();
ADCLK=0;// 拉低CLK端,形成下降沿2
_nop_();
_nop_();

ADDI=channel;  //低電平為CH0,高電平為CH1
ADCLK=1;  //  拉高CLK端
_nop_();
_nop_();
ADCLK=0;// 拉低CLK端,形成下降沿3
ADDI=1;// 控制命令結束(經試驗必須)
dat=0;
//下面開始讀取轉換后的數據,從最高位開始依次輸出(D7~D0)
for(i=0;i<8;i++)
{
dat<<=1;
ADCLK=1;//拉高時鐘端
_nop_();
_nop_();
ADCLK=0;//拉低時鐘端形成一次時鐘脈沖
_nop_();
_nop_();
dat|=ADDO;
}
ndat=0;   //記錄 D0
if(ADDO==1)
ndat|=0x80;
  //下面開始讀取反序的數據從(D1到D7)
  for(i=0;i<7;i++)
  {
  ndat>>=1;
ADCLK=1;//拉高時鐘端
_nop_();
_nop_();
ADCLK=0;//拉低時鐘端形成一次時鐘脈沖
_nop_();
_nop_();
if(ADDO==1)
ndat|=0x80;
  }
  ADCS=1;//拉高cs端,結束轉換
  ADCLK=0;//拉低CLK端
  ADDI=1;//拉高數據段,回到初始狀態
  if(dat==ndat)
  return(dat);
  else
  return 0;
}

/**********定時器0中斷服務程序***************/
void timer0(void) interrupt 1
{


TH0=(65536-10000)/256;//定時10us
TL0=(65536-10000)%256;
LED=1;

Delay280us();//延時0.28ms

abc=AD0832(1,0);   //開啟ADC采集
Delay40us();
LED=0;

FlagStar=1;         
TR0=0;
EA=0;


}

/**************************************************************
中值濾波  算法:先進行排序,然后將數組的中間值作為當前值返回。
**************************************************************/
uchar Error_Correct(uchar *str,uchar num)
{
uchar i=0;
uchar j=0;
uchar Temp=0;

//排序
for(i=0;i<num-1;i++)
{
for(j=i+1;j<num;j++)
{
if(str[i]<str[j])
{
Temp=str[i];
str[i]=str[j];
str[j]=Temp;
}
}
}
//去除誤差,取中間值
return str[num/2];
}

/*******主函數*********/
void main()
{

// uchar a;
//初始化定時器  
LED=1;

DelayMs(255);//等待電源穩定,液晶復位完成
InitTimer();  
init(); //12864 液晶初始化
// DS18B20_Init(); //18B20 初始化,可不用初始化,因為18B20 出廠時默認是12 位精度
delaym1s(100);
while(1)
{
checkkey(); //按鍵檢測

if(set_st==0)
{
// write_com(0x0c);
if(FlagStar==1)
{
num++;
ADC_Get[num]=abc;
if(num>9)
{
num=0;
DUST=Error_Correct(ADC_Get,10);//求取10次AD采樣的值
DUST_Value=(DUST/256.0)*5000;   //轉化成電壓值mv
DUST_Value=DUST_Value*0.17-0.1; //固體懸浮顆粒濃度計算 Y=0.17*X-0.1  X--采樣電壓
if(DUST_Value<0)  DUST_Value=0;
if(DUST_Value>19600)  DUST_Value=760;  //限位
DUST=(uint)DUST_Value;
}
TH0=(65536-10000)/256;//定時10ms
TL0=(65536-10000)%256;
TR0=1;  //開啟定時器0
  EA = 1;
FlagStar=0;           
}
// Alarm();  //報警檢測
}
baojing(); //顯示報警值
disp(DUST);  //顯示粉塵濃度值

//if(set_st==1)  //報警值閃動
//{
//  write_com(0xca);
//write_com(0x0d);
delaym1s(150);
//}
}
}

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:82765 發表于 2018-4-2 13:45 | 只看該作者
提示: 作者被禁止或刪除 內容自動屏蔽
回復

使用道具 舉報

板凳
ID:300554 發表于 2018-4-2 23:45 | 只看該作者
cjjcjj1 發表于 2018-4-2 13:45
那是你的串口中斷和定時器中斷有了沖突,導致定時器工作異常

對,我感覺也是這部分的問題,但是關鍵怎么改呢?
回復

使用道具 舉報

地板
ID:311457 發表于 2018-4-19 10:16 | 只看該作者
想問一下,那個粉塵傳感器必須接一個三極管嗎
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人激情视频在线播放 | 91色视频在线观看 | 91久久国产综合久久 | 日本一区二区在线视频 | 男女视频在线免费观看 | 中文字幕不卡 | 毛片网站在线观看 | 日韩亚洲视频 | 国产国拍亚洲精品av | av一区二区三区 | 九九视频在线观看 | 国产一区91精品张津瑜 | 五月激情综合网 | 超碰在线免费av | 久久精品国产亚洲a | 亚洲三级在线观看 | 国精产品一品二品国精在线观看 | 中文字幕的av | 欧美性极品xxxx做受 | 国产视频一区二区 | 91精品久久久久久久久中文字幕 | 中文字幕av网站 | 秋霞在线一区 | 欧美成人精品激情在线观看 | 99av成人精品国语自产拍 | 日韩久久精品视频 | 国产精品免费看 | 日韩精品一区在线 | 狠狠爱视频| 欧美性久久 | 日韩精品在线视频免费观看 | 91精品国产综合久久福利软件 | www.99久久.com| 狠狠操狠狠操 | 免费成年网站 | 一区二区三区亚洲 | 欧美猛交| www.亚洲精品 | 欧美日韩在线精品 | 国产视频久久久 | 久久中文一区二区 |