標題: [求助]編寫一個單片機接收上位機發送的數據并將該數據顯示在靜態數碼管上面,自己編的程序找不到問題所在,求教 [打印本頁]
作者: sideboy 時間: 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);
}
百思不得其解,快惡心死了!
作者: zuoluo 時間: 2012-3-14 09:19
你出現的是什么問題啊,是不顯示還是上位機不能傳啊??
還有的你的數碼管靜態顯示怎么是那樣的函數啊,怎么是串行輸出數據啊,數碼管不上并行接收數據嗎,所以你應該把你的原理圖也寫上!!
作者: sideboy 時間: 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編輯過]
作者: zuoluo 時間: 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循環,試試看!!
| 歡迎光臨 (http://www.raoushi.com/bbs/) |
Powered by Discuz! X3.1 |