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/单片机之类的。具体执行层,主要完成系统规划层下达的任务。
单片机属于下位机。
上位机与下位机的区别:
上位机:系统中起主控,主要作为系统的规划控制,属于决策层。
下位机:具体执行层,主要完成系统规划层下达的任务。
上位机是指人可以直接发出操控命令的计算机,一般是PC,屏幕上显示各种信号变化(液压,水位,温度等)。
下位机是直接控制设备获取设备状况的计算机,一般是PLC/单片机之类的。
上位机发出的命令首先给下位机,下位机再根据此命令解释成相应时序信号直接控制相应设备。
下位机不时读取设备状态数据(一般为模拟量),转换成数字信号反馈给上位机。
简言之如此,实际情况千差万别,但万变不离其宗:上下位机都需要编程,都有专门的开发系统。
参考:
上位机: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#很容易做图形界面,建立窗口工程就好了,控件放好,内码写好,图形界面半小时能出来。
辛苦打来,望采纳!