標(biāo)題: [求助]編寫一個單片機接收上位機發(fā)送的數(shù)據(jù)并將該數(shù)據(jù)顯示在靜態(tài)數(shù)碼管上面,自己編的程序找不到問題所在,求教 [打印本頁]
作者: sideboy 時間: 2012-3-14 09:00
標(biāo)題: [求助]編寫一個單片機接收上位機發(fā)送的數(shù)據(jù)并將該數(shù)據(jù)顯示在靜態(tài)數(shù)碼管上面,自己編的程序找不到問題所在,求教
先貼上我的程序,請大家?guī)臀艺乙幌掠矀?br/>#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"}; //存儲從上位機讀出的數(shù)據(jù)
void _get_uchar_SerialPort(uchar);
void _init_SerialPort(void)
{
SCON=0x50; //設(shè)置串行口控制寄存器,方式1,多機通訊關(guān)閉,允許接收位
TMOD=0x20; //啟動定時器1為波特率發(fā)生器,工作于方式2—自動填裝8位計數(shù)器;啟動計數(shù)器0,方式0,13位計數(shù)器
TH1=0xFD;
TL1=0xFD; //設(shè)置波特率為9600
TR1=1; //啟動計數(shù)器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) //靜態(tài)數(shù)碼管顯示函數(shù)
{
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(); //初始化串口函數(shù);
for(i=0;i<8;i++)
{
_get_string_SerialPort(string,8);//從串口接收數(shù)據(jù);
}
for(i=0;i<8;i++)
{
h=string;
h=h-48;
_disp_(h);
}
while(1);
}
百思不得其解,快惡心死了!
作者: zuoluo 時間: 2012-3-14 09:19
你出現(xiàn)的是什么問題啊,是不顯示還是上位機不能傳啊??
還有的你的數(shù)碼管靜態(tài)顯示怎么是那樣的函數(shù)啊,怎么是串行輸出數(shù)據(jù)啊,數(shù)碼管不上并行接收數(shù)據(jù)嗎,所以你應(yīng)該把你的原理圖也寫上!!
作者: sideboy 時間: 2012-3-14 12:48
奧,我解釋一下,是這樣子的,我剛剛改了一下我的程序,接收函數(shù)我使用了中斷函數(shù)來代替上面我的兩個函數(shù),然后在上位機發(fā)個0,小燈亮,發(fā)個1,小燈滅,但是我是想在上位機上發(fā)一串?dāng)?shù)(上位機是我用C#編的,調(diào)試正常),并且至少是得用數(shù)碼管甚至是液晶屏顯示的,所以我的中斷函數(shù)是這么寫的:(補充,2L問我數(shù)碼管函數(shù)的問題,我的靜態(tài)數(shù)碼管是74HC164串并轉(zhuǎn)換的,所以只需要兩根線,一根時鐘一根DAT,這個不是關(guān)鍵的,關(guān)鍵的是串口接收這兒)
void serial (void) interrupt 4
{
uint i;
uchar temp;
if(RI==1)
{
RI=0;
temp=SBUF;//上位機數(shù)據(jù),送到temp 中
if(temp == '1') LED = 1;//如果上位機發(fā)了個1,那么小燈滅
if(temp == '0') LED = 0;//如果上位機發(fā)了個0,那么小燈亮
for(i=0;i<8;i++)
{
string=SBUF;//將從接收緩沖區(qū)得到的數(shù)據(jù)全部存在事先定義好的數(shù)組里面,然后把這個數(shù)組發(fā)到我的靜態(tài)數(shù)碼管的顯示函數(shù)里面去
}
}
}
[此貼子已經(jīng)被作者于2012-3-14 12:58:36編輯過]
作者: zuoluo 時間: 2012-3-16 21:56
你的中斷函數(shù)里面, if(temp == '1') 則要確保你上位機發(fā)的是字符1,不是數(shù)字1;
還有 for(i=0;i<8;i++)
{
string=SBUF;
}
這個循環(huán)是什么意思,你是想把SBUF重復(fù)的存8遍嗎??你是想把接收到的數(shù)據(jù)放到string數(shù)組里面吧,
我覺得應(yīng)該這樣做把i定義成全局變量,然后用string[i++]=SBUF代替你的for循環(huán),試試看!!
| 歡迎光臨 (http://www.raoushi.com/bbs/) |
Powered by Discuz! X3.1 |