導航:首頁 > 操作系統 > c上位機單片機

c上位機單片機

發布時間:2023-08-28 16:28:58

1. 用vc上位機控制51單片機的led燈亮滅,求大神指導如何實現

在MFC里用一個串口控制項,選中控制項屬性,裡面有個控制項屬性OnComm。點擊添加,在對話框CPP里會添加一個消息事件,用於實施監控串口的。除此之外還要為這個串口控制項添加一個相關的變數
這個控制項事件函數里可以這么寫:m_COM為這個串口控制項對應的變數,m_SendData,m_strReceive,為CString類型數據,全局變數,自己在xxxxDlg.h中自己定義
void CxxxxDlg::OnCommMscomm1()
{
VARIANT m_Input1;
COleSafeArray m_Input2;
long length,i;
BYTE data[1024];
CString str;
BYTE a;
if(m_COM.get_CommEvent() == 2) //事件值為2表示接收緩沖區內有字元
{
m_Input1 = m_COM.get_Input(); //讀緩沖區
m_Input2 = m_Input1;

length=m_Input2.GetOneDimSize();
for (i=0;i<length;i++)
{
m_Input2.GetElement(&i,data+i);
}
for (i=0;i<length;i++)
{
a=*(char*)(data+i);
str.Format("%c",a);
m_strReceive+=str;
}

}
UpdateData(FALSE); //變數->編輯框
SetDlgItemText(IDC_EDIT_COM_RecText,m_strReceive);//這里是把字元顯示到文本控制項上
}

下面寫PC端 VC的打開這個串口的函數,這里的nIndexSelect為串口號,自己給
void CxxxxDlg::OpenCom()
{

if (m_COM.get_PortOpen())
{
m_COM.put_PortOpen(FALSE);
}

m_COM.put__CommPort(nIndexSelect);//這里的nIndexSelect為串口號

m_COM.put_InBufferSize(1024);
m_COM.put_OutBufferSize(512);
m_COM.put_InputLen(0);
m_COM.put_InputMode(1);
m_COM.put_RThreshold(1);

m_COM.put_Settings("9600,N,8,1");
if (!m_COM.get_PortOpen())
m_COM.put_PortOpen(TRUE);
else
{
m_COM.put_OutBufferCount(0);
}

}

下面是PC上VC的發送函數
void CXXXXXDlg::OnBnClickedButton_Sendcom()
{

int i,Count;
GetDlgItemText(IDC_EDIT_COM_SendText,m_SendData);//獲取對話框上編輯框里的要發送的字元,IDC_EDIT_COM_SendText為自己文本編輯框的ID號,自己定
Count=m_SendData.GetLength();
CByteArray m_Array;
m_Array.RemoveAll();
m_Array.SetSize(Count);
for(i=0;i<Count;i++)
m_Array.SetAt(i,m_SendData[i]);
m_COM.put_Output(COleVariant(m_Array));
}

以上是PC上的程序
下面是單片機上的程序,我主要來控制單片機電機和LED的
#include<reg52.h>
#include<reg52.h>
#include <string.h>
sbit led_send=P1^6;
sbit led_rec=P1^7;
sbit led_working=P1^4;
sbit led_ready=P1^2;
sbit led_close=P1^0;

sbit led_1=P1^1;
sbit led_2=P1^3;
sbit led_3=P1^5;

unsigned int dli,dlj,i,j;
unsigned char ch;
bit read_flag=0;
unsigned char code table[]="I get ";

//步進電機聲明
sbit A1=P2^0;
sbit B1=P2^1;
sbit C1=P2^2;
sbit D1=P2^3;

#define Coil_AB1 {A1=1;B1=1;C1=0;D1=0;}
#define Coil_BC1 {A1=0;B1=1;C1=1;D1=0;}
#define Coil_CD1 {A1=0;B1=0;C1=1;D1=1;}
#define Coil_DA1 {A1=1;B1=0;C1=0;D1=1;}
#define Coil_OFF {A1=0;B1=0;C1=0;D1=0;}

unsigned int SPEED;

// 延時函數
void delay(unsigned int xms)
{
for(dli=xms;dli>0;dli--)
for(dlj=110;dlj>0;dlj--);
}

//步進電機正傳
void Moto_Left()
{
Coil_AB1
delay(SPEED);
Coil_BC1
delay(SPEED);
Coil_CD1
delay(SPEED);
Coil_DA1
delay(SPEED);
Coil_OFF

}
//步進電機反轉
void Moto_Right()
{
Coil_DA1
delay(SPEED);
Coil_CD1
delay(SPEED);
Coil_BC1
delay(SPEED);
Coil_AB1
delay(SPEED);
Coil_OFF
}

//串口初始化
void init_serialcom( void ) //串口通信初始設定
{
// SCON = 0x50 ; //UART為模式1,8位數據,允許接收
//TMOD |= 0x20 ; //定時器1為模式2,8位自動重裝
// PCON |= 0x80 ; //SMOD=1;
//TH1 = 0xFD ; //Baud:19200 fosc="11".0592MHz
// IE |= 0x90 ; //Enable Serial Interrupt
//TR1 = 1 ; // timer 1 run
// TI=1;

TMOD=0X20;
TH1=0Xfd;
TL1=0Xfd;
TR1=1;
TI=1;
REN=1;
SM0=0;
SM1=1;
EA=1;
ES=1;

led_ready=0;
delay(2000);
led_ready=1;
}

//串口接收中斷函數
void serial () interrupt 4
{
led_rec=0;
RI = 0 ;
ch=SBUF;

if(ch==97)//假如收到的字元在ASKII表裡對應號碼是97,就讓下面的燈亮,以及電機左轉
{
led_1=0;
led_2=1;
led_3=1;
j=64;
while(j--)
{
Moto_Left();
}

}
else if(ch==98)//假如收到的字元在ASKII表裡對應號碼是98,就讓下面的燈亮,以及電機右轉
{
led_2=0;
led_1=1;
led_3=1;
j=64;
while(j--)
{
Moto_Right();
}
}

led_3=0;
led_2=1;
led_1=1;
delay(100);
led_3=1;

read_flag= 1 ; //就置位取數標志
delay(100);
led_rec=1;

}
void main()
{
j=64;//旋轉一周時間
SPEED=5;
Coil_OFF

led_close=0;
delay(2000);
led_close=1;

delay(2000);

init_serialcom(); //初始化串口

while ( 1 )
{

led_working=0;
if (read_flag==1) //如果取數標志已置位,就將讀到的數從串口發出
{
ES=0;
led_send=0;
for(i=0;i<6;i++)
{

SBUF=table[i];
while(!TI);
TI=0;

}
SBUF=ch;
while(!TI);
TI=0;
ES=1;
led_send=1;
read_flag= 0 ; //取數標志清0

}
}
}

2. 要個計算機與單片機的串口通信上位機C語言程序

兄弟,下面是我自己寫的,希望給你幫助,把數據用Send_One_Uart()這個函數直接發送到串口就行了!最後求採納,哈哈!

//-----頭文件
#include<reg52.h>

//-----定義全局變數
unsigned char Temp;

/***************************************************
** 函數名稱: UART_Init
** 功能描述: 串口初始化函數
** 輸 入:無
** 輸 出: 無
** 說 明: 無
****************************************************/
void UART_Init(void)
{
SCON = 0x50; //-----SCON: 模式 1, 8-bit UART, 使能接收
TMOD |= 0x20; //-----TMOD: timer 1, mode 2, 8-bit 重裝
TH1 = 0xFD; //-----TH1: 重裝值 9600 波特率 晶振 11.0592MHz
TR1 = 1; //-----TR1: timer 1 打開
ES = 1; //-----打開串口中斷
EA = 1; //-----打開總中斷
}

/***************************************************
** 函數名稱: SendByte
** 功能描述: 發送位元組函數
** 輸 入:無
** 輸 出: 無
** 說 明: 無
****************************************************/
void SendByte(unsigned char dat)
{
SBUF = dat;
while(!TI);
TI = 0;
}

/***************************************************
** 函數名稱: SendStr
** 功能描述: 發送字元串函數
** 輸 入:無
** 輸 出: 無
** 說 明: 無
****************************************************/

void SendStr(unsigned char *s)
{
while(*s!='\0')
{
SendByte(*s);
s++;
}
}

/***************************************************
** 函數名稱: main
** 功能描述: 主函數
** 輸 入:無
** 輸 出: 無
** 說 明: 無
****************************************************/
void main (void)
{
UART_Init(); //-----串口初始化

while(1)
{
if(Temp=='H'&&'i')
{
Temp=0;
SendStr("hello");
}
}
}

/***************************************************
** 函數名稱: UART_SER
** 功能描述: 串口中斷服務子函數
** 輸 入:無
** 輸 出: 無
** 說 明: 無
****************************************************/
void UART_SER (void) interrupt 4 //-----串列中斷服務程序
{
if(RI) //-----判斷是接收中斷產生
{
RI=0; //-----標志位清零
Temp=SBUF; //-----讀入緩沖區的值
}
}

3. 什麼是上位機和下位機,單片機屬於哪個

上位機是指人可以直接發出操控命令的計算機,一般是PC,屏幕上顯示各種信號變化(液壓,水位,溫度等)。系統中起主控,主要作為系統的規劃控制,屬於決策層。

下位機是指直接控制設備獲取設備狀況的的計算機,一般是PLC/單片機之類的。具體執行層,主要完成系統規劃層下達的任務。

單片機屬於下位機。


上位機與下位機的區別:

  1. 上位機:系統中起主控,主要作為系統的規劃控制,屬於決策層。

    下位機:具體執行層,主要完成系統規劃層下達的任務。


  2. 上位機是指人可以直接發出操控命令的計算機,一般是PC,屏幕上顯示各種信號變化(液壓,水位,溫度等)。

    下位機是直接控制設備獲取設備狀況的計算機,一般是PLC/單片機之類的。


  3. 上位機發出的命令首先給下位機,下位機再根據此命令解釋成相應時序信號直接控制相應設備。

    下位機不時讀取設備狀態數據(一般為模擬量),轉換成數字信號反饋給上位機。

簡言之如此,實際情況千差萬別,但萬變不離其宗:上下位機都需要編程,都有專門的開發系統。


參考:

上位機:http://ke..com/view/554441.htm

下位機:http://ke..com/view/1289019.htm

4. C語言可以開發單片機或者stm32的上位機嗎

沒太弄明白你想用c語言寫什麼,如果是在電腦上寫單片機的程序,可以安裝keil編寫。
如果是想寫在電腦上運行的與單片機進行通訊的電腦程序,c語言也是可以做到的,只不過要用的不再是keil了,而是VC什麼的。
如果是後面的這種最關鍵的是要定義好自己的通訊協議。

5. 有點單片機C語言的基礎適合哪個上位機編程語言

會C語言的話,C#很容易上手,我都沒學過C#,自己做界面也不太難,你是玩單片機的,我也是,我想你的需求應該在於連接串口,調用藍牙等,調用串口我用C++和C#都寫過,C#要方便,而且界面化也很好操作。藍牙我還沒需求,所以沒有試過。
你講的1、和C語言差不多的編程方式,C#簡直比C編程容易,而且也是如C++的風格,習慣C的肯定能喜歡C#,大家都講VB簡單,我反而不適用VB,風格跟C不一樣,用起來蹩腳;

2.圖形界面容易做,C#很容易做圖形界面,建立窗口工程就好了,控制項放好,內碼寫好,圖形界面半小時能出來。

辛苦打來,望採納!

閱讀全文

與c上位機單片機相關的資料

熱點內容
有沒有什麼app數學題型較多 瀏覽:337
政策pdf 瀏覽:290
有什麼好玩的文娛app 瀏覽:807
python教學合集 瀏覽:955
有什麼好用的小眾app嗎 瀏覽:116
芋道app源碼 瀏覽:447
計算機程序員怎麼找 瀏覽:280
智聯發pdf 瀏覽:236
c語言編譯錯誤變黑 瀏覽:72
手機軟體加密了怎麼解開 瀏覽:887
linux中的ln命令例子 瀏覽:142
為什麼玩cf第一次進入伺服器很慢 瀏覽:967
工作單源碼 瀏覽:619
安卓如何關閉app自動升級 瀏覽:137
new文件夾怎麼打開 瀏覽:633
安卓51如何優化 瀏覽:179
活塞式壓縮機原理圖 瀏覽:847
水環式壓縮機工作原理 瀏覽:717
阿里雲伺服器安裝後怎麼使用 瀏覽:935
去做APP開戶有什麼危險沒得啊 瀏覽:698