上位机控制单片机LED
整了一天程序,写了个上位机程序和单片机程序。总结下。。。
上位机部分:
相关参考资料:http://wenku.baidu.com/view/5ea8670403d8ce2f00662322.html

1.先添加各控件,添加后的对话框如下图:

2.再添加对应的成员变量。
3.最后添加函数(事件处理函数)。
3.1初始化,设置串口各参数。
BOOL CLedControlDlg::OnInitDialog(){ CDialog::OnInitDialog(); // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动 // 执行此操作 SetIcon(m_hIcon, TRUE); // 设置大图标 SetIcon(m_hIcon, FALSE); // 设置小图标 // TODO: 在此添加额外的初始化代码 m_ctrlComm.put__CommPort(5); //选择com3 m_ctrlComm.put_InputMode(1); //以二进制方式输入 m_ctrlComm.put_InBufferSize(1024); m_ctrlComm.put_OutBufferSize(512); //设置串口,波特率115200,无校验位,数据位8,停止位1 m_ctrlComm.put_Settings(_T("115200,n,8,1")); //参数1表示当接受缓冲区有多于等于1个字符 //引发OnComm m_ctrlComm.put_RThreshold(1); if (!m_ctrlComm.get_PortOpen()) { m_ctrlComm.put_PortOpen(TRUE);//打开串口 } m_ctrlComm.put_InputLen(0); //设置当前缓冲区为0 m_ctrlComm.get_Input(); //先预读缓冲区 return TRUE; // 除非将焦点设置到控件,否则返回 TRUE} |
3.2处理串口发来的数据。
void CLedControlDlg::OnComm(){ // TODO: 在此处添加消息处理程序代码 VARIANT variant_inp; COleSafeArray safearray_inp; LONG len,k; BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integerthat is not signed. CString strtemp; if(m_ctrlComm.get_CommEvent()==2) //事件值为2表示接收缓冲区内有字符 { ////////以下你可以根据自己的通信协议加入处理代码 variant_inp=m_ctrlComm.get_Input(); //读缓冲区 safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量 len=safearray_inp.GetOneDimSize(); //得到有效数据长度 for(k=0;k<len;k++) safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组 for(k=0;k<len;k++) //将数组转换为Cstring型变量 { BYTE bt=*(char*)(rxdata+k); //字符型 strtemp.Format("%c",bt); //将字符送入临时变量strtemp存放 m_strEditRXData+=strtemp; //加入接收编辑框对应字符串 } } UpdateData(FALSE); //更新编辑框内容} |
3.3串口发送数据出去。
void CLedControlDlg::OnButtonManualsend(){ // TODO: 在此添加控件通知处理程序代码 UpdateData(true); m_ctrlComm.put_Output(COleVariant(m_strEditTXData)); UpdateData(false);} |
单片机部分:
#include <c8051f040.h> #include <intrins.h>#include <absacc.h>#include <stdlib.h> //标准函数#include <stdio.h> //I/O口函数#define _Nop() _nop_()#define uchar unsigned char#define uint unsigned int#define LEDCTL0Low P4&=~0x01;#define LEDCTL0High P4|=0x01;#define LEDCTL1Low P4&=~0x02;#define LEDCTL1High P4|=0x02;#define LEDCTL2Low P4&=~0x04;#define LEDCTL2High P4|=0x04;#define LEDCTL3Low P4&=~0x08;#define LEDCTL3High P4|=0x08;//--------------------------------------------------------------------// 全局常量//--------------------------------------------------------------------#define SYSCLK 22118400 // SYSCLK frequency in Hz#define BAUDRATE 115200 // Baud rate of UART in bps#define MAX_LEN 50 //receive buf MAX lengthuchar readCounts; uchar trdata[MAX_LEN] = {'0', '0', '0', '0'}; //四个LED数码管初始显示都为0uchar sendlen;uchar message[]="Receive Buf is full";bit readFlag; bit frameFlag; char data SFRPAGE_SAVE;uchar code LEDSEG1[]= {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xc6,0X89};//0~9,C,H,正uchar code LEDSEG2[]= {0xC0,0xCF,0xA4,0x86,0x8B,0x92,0x90,0xC7,0x80,0x82,0xF0,0X89};//0~9,C,H,倒//--------------------------------------------------------------------//函数声明//--------------------------------------------------------------------void SYSCLK_Init (void);void PORT_Init(void);void UART0_Init(void) ;void Send_Char(uchar ch) ;void send_string_com(unsigned char *str,unsigned int strlen);void display(unsigned char *str);void Delay(uint tt);//--------------------------------------------------------------------// 主函数//--------------------------------------------------------------------void main (void) { WDTCN = 0xde; WDTCN = 0xad; //关闭WDT SYSCLK_Init (); PORT_Init(); UART0_Init(); EA=1; ES0=1; SFRPAGE = LEGACY_PAGE; while(1) { if (frameFlag) { frameFlag=0; send_string_com(trdata,sendlen); } display(trdata); } }//-----------------------------------------------------------------------------// 系统时钟配置//-----------------------------------------------------------------------------void SYSCLK_Init (void){ int i = 0; //char SFRPAGE_SAVE = SFRPAGE; // Save Current SFR page SFRPAGE = CONFIG_PAGE; // set SFR page OSCXCN = 0x67; // start external oscillator with // 22.1184MHz crystal for (i=0; i < 3000; i++) ; // XTLVLD blanking interval (>1ms) while (!(OSCXCN & 0x80)) ; // Wait for crystal osc. to settle CLKSEL = 0x01; //SYSCLK derived from the External Oscillator circuit OSCICN &= ~0x80; //Internal Oscillator Disabled }//-----------------------------------------------------------------------------// I/O配置//-----------------------------------------------------------------------------void PORT_Init(){ SFRPAGE = CONFIG_PAGE; // set SFR page before writing to // registers on this page XBR0 = 0x04; //允许UART0,RX,TX连到2个端口引脚. XBR0=0000,0100 XBR1 = 0x00; XBR2 = 0x40; //交*开关使能 P0MDOUT |= 0x01; /*使能TX0作为推挽输出*/ P4MDOUT = 0xff; P5MDOUT = 0xff; //推挽输出 }//-----------------------------------------------------------------------------//串口初始化//CONFIG_PAGE=0x0F;UART0_PAGE=0x00;TIMER01_PAGE=0x00;//-----------------------------------------------------------------------------void UART0_Init(void) { SFRPAGE = UART0_PAGE; SCON0 = 0x50; // SCON0: mode 1, 8-bit UART, enable RX SSTA0 = 0x10; // SMOD00 = 1 TMOD = 0x20; // TMOD: timer 1, mode 2, 8-bit reload TH1 = -(SYSCLK/BAUDRATE/16); // set Timer1 reload value for baudrate TR1 = 1; // start Timer1 CKCON |= 0x10; // Timer1 uses SYSCLK as time base TI0 = 1; // Indicate TX0 ready } //-----------------------------------------------------------------------------//发送单个字符 //-----------------------------------------------------------------------------void Send_Char(uchar ch) { SBUF0 = ch; //送入缓冲区 while(TI0 == 0); //等待发送完毕 TI0 = 0; //软件清零 } //-----------------------------------------------------------------------------//向串口发送一个字符串,strlen为该字符串长度//-----------------------------------------------------------------------------void send_string_com(unsigned char *str,unsigned int strlen){ unsigned int k=0; do { Send_Char(*(str + k)); k++; } while(k < strlen);}//-----------------------------------------------------------------------------//UART0中断服务程序. 接收字符 //-----------------------------------------------------------------------------void UART0_ISR(void) interrupt 4 using 1 { uchar rxch; if(RI0) //中断标志 RI0=1 数据完整接收 { RI0 = 0; //软件清零 rxch = SBUF0; //读缓冲 8i trdata[readCounts] = rxch; //存入数组,供发送 readCounts++; if (readCounts >= 0x04) //字符串结束标志 { frameFlag=1; sendlen= 4; readCounts = 0; } } } void Delay( uint tt ){ while( tt-- );}void display(unsigned char *str) { SFRPAGE_SAVE = SFRPAGE; SFRPAGE = CONFIG_PAGE; P5=LEDSEG1[*(str + 0) - '0']; LEDCTL0Low; Delay(500); LEDCTL0High; P5=LEDSEG1[*(str + 1) - '0']; LEDCTL1Low; Delay(500); LEDCTL1High; P5=LEDSEG2[*(str + 2) - '0']; LEDCTL2Low; Delay(500); LEDCTL2High; P5=LEDSEG2[*(str + 3) - '0']; LEDCTL3Low; Delay(500); LEDCTL3High; SFRPAGE = SFRPAGE_SAVE; } |
单片机程序学习总结:

浙公网安备 33010602011771号