欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

[求助]編寫一個單片機接收上位機發送的數據并將該數據顯示在靜態數碼管上面,自己編的程序找不到問題所在,求教

[復制鏈接]
跳轉到指定樓層
樓主
ID:36225 發表于 2012-3-14 09:00 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
先貼上我的程序,請大家幫我找一下硬傷!
#include<reg51.h>

#define uchar unsigned char
#define uint unsigned int

sbit DAT=P3^0;
sbit CLK=P3^1;

uchar code table[]={0x77,0x14,0xb3,0xb6,0xd4,0xe6,0xe7,0x34,0xf7,0xf6};
uchar string[]={"12345678"}; //存儲從上位機讀出的數據
void _get_uchar_SerialPort(uchar);


void _init_SerialPort(void)
{
  SCON=0x50;  //設置串行口控制寄存器,方式1,多機通訊關閉,允許接收位   
  TMOD=0x20;  //啟動定時器1為波特率發生器,工作于方式2—自動填裝8位計數器;啟動計數器0,方式0,13位計數器 
  
   TH1=0xFD;
     TL1=0xFD; //設置波特率為9600
   TR1=1; //啟動計數器1
   EA=1; //開中斷
   TI=0;//初始化中斷,傳送過程中為1,需要軟件清零
}

  void delay(uint z)
  {
    uint x,y;
    for(x=0;x<z;x++)
    for(y=0;y<170;y++);
}





void _get_string_SerialPort(uchar *str,uint strlen)
{
   uint k=0;
  do
    {
        _get_uchar_SerialPort(*(str+k));
         k++;
    }
while(k < strlen);
}

void _get_uchar_SerialPort(uchar temp)
  {
    temp=SBUF;
    while(TI==0);
    TI=0;
}





void _disp_(uchar digit) //靜態數碼管顯示函數
{
  uint Count;
  char CK;
  CK=table[digit];
for(Count=0;Count<8;Count++)
{
 
  CLK=0;
  DAT=CK&0x01;
  CLK=1;
  CK>>=1;

  }  
}



int main(void)
{


    uint i;
uchar h;
    _init_SerialPort(); //初始化串口函數;

for(i=0;i<8;i++)
   {
    _get_string_SerialPort(string,8);//從串口接收數據;

  }
   for(i=0;i<8;i++)
{
   h=string;
     h=h-48;
        _disp_(h);
}
while(1);
}
百思不得其解,快惡心死了!
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:34608 發表于 2012-3-14 09:19 | 只看該作者

你出現的是什么問題啊,是不顯示還是上位機不能傳啊??

還有的你的數碼管靜態顯示怎么是那樣的函數啊,怎么是串行輸出數據啊,數碼管不上并行接收數據嗎,所以你應該把你的原理圖也寫上!!

回復

使用道具 舉報

板凳
ID:36225 發表于 2012-3-14 12:48 | 只看該作者

奧,我解釋一下,是這樣子的,我剛剛改了一下我的程序,接收函數我使用了中斷函數來代替上面我的兩個函數,然后在上位機發個0,小燈亮,發個1,小燈滅,但是我是想在上位機上發一串數(上位機是我用C#編的,調試正常),并且至少是得用數碼管甚至是液晶屏顯示的,所以我的中斷函數是這么寫的:(補充,2L問我數碼管函數的問題,我的靜態數碼管是74HC164串并轉換的,所以只需要兩根線,一根時鐘一根DAT,這個不是關鍵的,關鍵的是串口接收這兒)

void serial (void) interrupt 4
 {
  uint i;
  uchar temp;
  if(RI==1)
  {  
    RI=0;
    temp=SBUF;//上位機數據,送到temp 中
     if(temp == '1')  LED = 1;//如果上位機發了個1,那么小燈滅
     if(temp == '0')  LED = 0;//如果上位機發了個0,那么小燈亮
   for(i=0;i<8;i++)
    {
   string=SBUF;//將從接收緩沖區得到的數據全部存在事先定義好的數組里面,然后把這個數組發到我的靜態數碼管的顯示函數里面去
    }
 
  }
 
}

[此貼子已經被作者于2012-3-14 12:58:36編輯過]
回復

使用道具 舉報

地板
ID:34608 發表于 2012-3-16 21:56 | 只看該作者

你的中斷函數里面, if(temp == '1')  則要確保你上位機發的是字符1,不是數字1;

還有 for(i=0;i<8;i++)
    {
   string=SBUF;
    }
這個循環是什么意思,你是想把SBUF重復的存8遍嗎??你是想把接收到的數據放到string數組里面吧,

我覺得應該這樣做把i定義成全局變量,然后用string[i++]=SBUF代替你的for循環,試試看!!

 

回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表