单片机 > 单片机程序设计 > 详情

上位机控制单片机LED

发布时间:2020-06-06 发布时间:
|

整了一天程序,写了个上位机程序和单片机程序。总结下。。。

上位机部分:

相关参考资料: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
            safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组
        for(k=0;k
        {
            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
#include
#include
#include     //标准函数
#include     //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 length
 
uchar   readCounts;    
uchar   trdata[MAX_LEN] = {'0', '0', '0', '0'};    //四个LED数码管初始显示都为0
uchar   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;
}





『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
ARM JTAG 调试原理