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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

[求助]單片機間串口通信無法實現

[復制鏈接]
跳轉到指定樓層
樓主
ID:33027 發表于 2011-11-4 16:03 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式

是我同學寫的數據采集器代碼,其他的都沒有問題,就是最后一步的串口通信沒法完成,以下是他的代碼,我看了很久都沒有看到問題,求各位大神幫幫忙~~謝謝你們了!!

硬件用了兩塊ATMEL 89C51,采集端有一塊ADC0809,晶振11.0592MHz,硬件沒有問題。。。

控制室代碼:


#include <reg51.h>
#include <intrins.h>
char eflag=0;      //報錯顯示   1:不改變show【】0:刷新數據
int counter=0;      //1秒顯示計數
int ecount=0;   //錯誤閃爍計數
char t = 0;          //串口接收數據序號
char ct =3;    //顯示數據位數序號
unsigned char x = 0;          //數碼顯示數據序號
char cond=0;         //狀態{0巡回顯示,1,2,鍵盤值,3按鍵處理}
char show[4]={0};    //當前顯示數據
unsigned char ch[8]={10,20,30,40,50,60,70,80};      //數據存儲空間
char en[4]={0x80,0x40,0x20,0x10};//位選使能
char seg[12]={0xf6,0xf5,0xf3,0xee,0xed,0xeb,0xde,0xdd,0xdb,0xbe,0xbd,0xbb}; //0~9 ,確定,巡回
char dseg[10]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09};    //數碼顯示
 //************************************延時函數*************
void delay()     //10ms
{
 int i,j;
 for(i=0;i<36;i++)
 for(j=0;j<256;j++);
}
 //**********************************掃鍵判斷****************
 //***************\\范圍0~11      ************
 //***************\\0~9數字鍵,10確定鍵,11巡回鍵    *********
int keyscan()
{
 unsigned char k,k_temp;
 int i=0;
 P1=0xf8;                     //需修改
 k=P1;
 if(k!=0xf8)
 {
  delay();
  k_temp=P1;
  if(k==k_temp)
  {
   k=0xfe;      //當P^1低判斷哪兩個聯通
   do
   {
    P1=k;
    if(k!=P1)
    {
     for(i=0;i<12;i++)
     {
      if(P1==seg)
      {
       while(P1==seg); //消耗長按
       return i;
      }
     }
    }
    k=_crol_(k,1);        //循環左移
   }while(k!=0xf7);
  }
 }
 return;
}
//**********************顯示*********************************
//*******  P2腳位選使能       *************
//*******  P0腳段選使能       *************
//*******  顯示狀態{0:巡回顯示,1,2:鍵盤值,3:按鍵已處理}*
void display()
{
 if(eflag)        //錯誤閃爍代碼
 {
  ecount++;
  if(ecount<40)
  {
   P2=0x00;
  }
  else
  {
   P2=en[ct];
   P0=dseg[show[ct]];
  }
  if(ecount==80)
  ecount=0;
 }
 else if((cond==0)||(cond==3))
 {
  P2=en[ct];
  P0=dseg[show[ct]];
 }
 else if((cond==1)||(cond==2))
 {
  if(ct>(3-cond))
  {
   P2=en[ct];
   P0=dseg[show[ct]];
  }
  else
  {
    P2=0x00;
  }
 }
 ct--;
 if(ct<0)
 ct=3;
}

//****************************指定序號數據顯示**********
void led_xunhui()
{
 show[0]=0;
 show[1]=x+1;
 show[2]=(ch[x])/10;
 show[3]=(ch[x])%10;
}
  //*******************************附屬keyjudge**********
 //************************    判斷,結果出錯   ******
  void led_kj_error()
  {
      show[0]=8;
  show[1]=8;
  show[2]=8;
  show[3]=8;
  cond=3;
  eflag=1;
}

 //*******************************附屬keyjudge**********
 //************************   判斷,結果正確  **********
void led_kj_right()
{
 x=show[3]-1;
 led_xunhui();  //數碼顯示
 cond=3;        //顯示對號數據
}

 //************************按鍵選擇判斷函數***************************
 //*************  輸入正確則改變顯示數組show【】=指定工號+數據   *****
 //*************  輸入錯誤則改變顯示數組show【】=“8888”   **********
 //*************  按下巡回鍵返回“循環顯示”中   **************
void keyjudge(int temp)
{
 if(temp==11)               //按下巡回鍵
 {
   x=0;                //顯示數據序號
   cond=0;       //顯示狀態(巡回)
   counter=0;             //計數清零
      led_xunhui();
                        eflag=0;             //巡回顯示
 }
   else if(temp>=0&&temp<=9)  //按下數字鍵
 {
    if(cond==0||(cond==3))    //首次輸入和報錯
    {
   show[3]=temp;        //右邊第一位
   cond=1;
                        eflag=0;
    }
    else if(cond==1)       //按下第二數
    {
   show[2]=show[3];
   show[3]=temp;
   cond=2;
    }
    else if(cond==2)    //按下第三數,報錯
    {
         led_kj_error();
    }
 }
 else if(temp==10) //按下確定鍵
 {        if(cond==0)
                {
                    eflag=0;
                }
  if(cond==1)
  {
   if(show[3]>=9||show[3]==0)  //判斷是否大于有效采樣個數且不為零
   {
       led_kj_error();
   }
   else if(show[3]>0)
   {
       led_kj_right();
   }
  }
  else if(cond==2)
  {
   if(show[3]+10*show[2]>8)
   {
    led_kj_error();
   }
   else if(show[3]>0)
   {
    led_kj_right();
   }
  }
 }
}
//*********************************改變顯示序號************************
//************************ 到4秒時:改變show【】內容 實現循環顯示 *****
//************************ 若處于單值監控(cond==3&&eflag==0): ********
//************************                 刷新當前工號內容  **********
//************************ 處于報錯狀態(cond==3&&eflag==0):則不改變***
//*********************************************************************
 void timer_0() interrupt  1
 {
        char tm;
  TH0=(65536-3600)/256;
 TL0=(65536-3600)%256;
 display();                     //顯示
 counter++;
 if(counter==256)      //1秒改變顯示內容
 {
//*********************串行通信********************
//*********************1秒一次*********************
  SBUF=x;
  if(TI)
  {
   REN=1;
   TI=0;
  }
                for(tm=0;tm<10;tm++);
  if(RI)
  {
   RI=0;
   REN=0;
   ch[x]=SBUF;
  }

//**************數據接收完畢**************************
  counter=0;
  if(cond==0)                //判斷是鍵盤顯示
  {
   led_xunhui();
   x++;
   if(x==8)
   x=0;
  }
  else if(cond==3)
  {
   if(eflag==0)
   led_xunhui();
  }
 }
 }


//****************定時中斷初始化****************************
void inti_time()
{
 //TMOD=0X01;
 TH0=(65536-3600)/256;
 TL0=(65536-3600)%256;
 EA=1;
 ET0=1;
 TR0=1; //啟動定時器1
}
//***********串口初始化*******
  void uart_into()
 {
 SCON=0X50;
 //TMOD=0X20;
 TH1 =0XFD;
 TR1 =1;//啟動定時器2
 REN=0;
 }

void uart()interrupt 4
{
    if(RI)
    {
        ch[t]=SBUF;
        RI=0;
    }
    t++;
    if(t==8)
    t=0;
}
void main()
{
 char temp,i;
    TMOD=0x21;
 inti_time();
    uart_into();
 while(1)
 {
  temp=keyscan();
  keyjudge(temp);
        for(i=0;i<3;i++)
        delay();
 }
}

 

 

采集端代碼:

#include  <reg51.h>
int counter;
int D[8]={0};//數據存儲 
sbit da=P1^1; 
sbit db=P1^2; 
sbit dc=P1^3; 
sbit EOC=P1^4; 
sbit ST=P1^5;
sbit OE=P1^6; 

void delay()   //10ms
{
 int i,j;
 for(i=0;i<36;i++)
  for(j=0;j<256;j++);
 
}
 void timer_0() interrupt  1    //每秒送數據
 {
    char temp=0;
  TH0=(65536-3600)/256;
 TL0=(65536-3600)%256;
 counter++;
 if(counter==256)
 {
  SCON=0X50;
  TMOD=0X20;
  TH1=0XFD;  //9600bit/s
  TR1=1;//啟動定時器
  counter=0;
  if(TI)
  {
   TI=0;
   REN=1;
  }
  if(RI)
  {
   RI=0;
   temp=SBUF;
   SBUF=D[temp];
   REN=0;

  }

 } 
 }
 void judget(int t)
 {
        switch(t)
   {
     case 0:{dc=0;db=0;da=0;OE=0;break;}
   case 1:{dc=0;db=0;da=1;OE=0;break;}
   case 2:{dc=0;db=1;da=0;OE=0;break;}
   case 3:{dc=0;db=1;da=1;OE=0;break;}

   case 4:{dc=1;db=0;da=0;OE=0;break;}
   case 5:{dc=1;db=0;da=1;OE=0;break;}
   case 6:{dc=1;db=1;da=0;OE=0;break;}
   case 7:{dc=1;db=1;da=1;OE=0;break;}
   }
 } 
void main()
{  
  int t=0,tp;
  TMOD=0x21; 
  TH0=(65536-3600)/256; 
  TL0=(65536-3600)%256; 
  TR0=1; 
  ET0=1; 
  EA=1; 
 
  while(1)
  {
   judget(t);
      ST=0; 
       ST=1; 
       ST=0; 
      while(EOC==0); 
       OE=1; 
       tp=P2; 
       D[t]=tp*99/256;
    t++;
    if(t==8)
    t=0;
       OE=0; 
    delay();
  
  } 
}
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:33027 發表于 2011-11-4 19:30 | 只看該作者
求幫忙啊..... 下周就要用了、、、、
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日本黄色片免费在线观看 | 草草视频在线播放 | 特级做a爰片毛片免费看108 | 午夜精品一区二区三区免费视频 | 国产日本精品视频 | 久久天天躁狠狠躁夜夜躁2014 | 人人人人人爽 | 中文字幕日韩欧美一区二区三区 | 久久久蜜桃一区二区人 | 欧美在线a| 神马久久久久久久久久 | 综合久| 国产一区二区三区四 | 精品一区免费 | 成人国产在线观看 | 黄色大片视频 | 久久精品一 | 亚洲精品视频在线观看免费 | 视频1区2区 | 国产不卡一区 | 久久九九色 | 久久69精品久久久久久久电影好 | 亚洲成av| 91视频在线 | 伊人网站在线观看 | 日本不卡高字幕在线2019 | av免费网址 | 男人天堂手机在线视频 | 欧美91| 久久国产精品一区二区三区 | 国产亚洲久 | 97精品视频在线观看 | 日韩一区二区在线视频 | 久久久91 | 国产精品久久久久久久岛一牛影视 | 一区二区三区在线免费观看视频 | 在线国产欧美 | 欧美中文字幕在线观看 | 亚洲精品视频在线观看视频 | 欧美一区二区三区在线播放 | 欧美韩一区二区三区 |