找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 3567|回復(fù): 10
收起左側(cè)

求大神給個(gè)單片機(jī)與電腦串口通信的程序

[復(fù)制鏈接]
ID:246395 發(fā)表于 2017-11-6 09:56 | 顯示全部樓層 |閱讀模式
本人初入單片機(jī),小白一枚,現(xiàn)在用的開發(fā)板的單片機(jī)是stc89c52, 單片機(jī)的p20---p27口接的LED,想在電腦端 用“串口調(diào)試助手”直接控制這幾個(gè)LED燈 的亮或滅,  不知道怎么寫程序,大神能幫忙寫一個(gè)嗎,我研究研究,謝謝了
1.jpg
2.jpg
回復(fù)

使用道具 舉報(bào)

ID:7485 發(fā)表于 2017-11-6 10:38 | 顯示全部樓層
單片機(jī)的接收程序?單片機(jī)設(shè)置波特率,串口中斷接收,將接收到的數(shù)據(jù)送P2口。電腦上的可以用“串口助手”。
捕獲.JPG
回復(fù)

使用道具 舉報(bào)

ID:246395 發(fā)表于 2017-11-6 10:47 | 顯示全部樓層
ahshmj 發(fā)表于 2017-11-6 10:38
單片機(jī)的接收程序?單片機(jī)設(shè)置波特率,串口中斷接收,將接收到的數(shù)據(jù)送P2口。電腦上的可以用“串口助手”。 ...

不好意思我小白一枚,表達(dá)不準(zhǔn)確,我要就是燒到單片機(jī)上的那個(gè)代碼,還有 怎么設(shè)置這個(gè)穿孔助手軟件
回復(fù)

使用道具 舉報(bào)

ID:243921 發(fā)表于 2017-11-6 11:30 | 顯示全部樓層
你去找一下單片機(jī)串口例程的源碼  然后在源碼的基礎(chǔ)上修改一下就可以實(shí)現(xiàn)了  自己多看看書 多敲敲代碼  你這個(gè)其實(shí)不難的
自己動(dòng)手才有意思
回復(fù)

使用道具 舉報(bào)

ID:213173 發(fā)表于 2017-11-6 11:59 | 顯示全部樓層
本帖最后由 wulin 于 2017-11-6 13:26 編輯
ahshmj 發(fā)表于 2017-11-6 10:38
單片機(jī)的接收程序?單片機(jī)設(shè)置波特率,串口中斷接收,將接收到的數(shù)據(jù)送P2口。電腦上的可以用“串口助手”。 ...
發(fā)錯(cuò)了,撤銷........


無標(biāo)題.jpg
回復(fù)

使用道具 舉報(bào)

ID:213173 發(fā)表于 2017-11-6 13:22 | 顯示全部樓層
#include <reg51.h>
#define uchar unsigned char
uchar ch;
bit flag=0;                //接收完成標(biāo)志,

void init_uart()
{
        TMOD=0X20;         //定時(shí)器/計(jì)算器工作模式寄存器
        TH1=0XFD;         //波特率9600
        TL1=0XFD;         //波特率9600
        SCON=0X50;         //串行控制寄存器
        TR1=1;             //開定時(shí)器T1
        EA=1;                //開總中斷
        ES=1;                //開串行口中斷   
}

void main()
{
        init_uart();
        while(1)
        {
                if(flag==1)                //接收完成標(biāo)志為1
                {
                        ES=0;                //關(guān)串口中斷
                        flag=0;                //接收完成標(biāo)志清0
                        SBUF=ch;                //發(fā)送數(shù)據(jù)
                        while(!TI);        //等待發(fā)送中斷請(qǐng)求標(biāo)志位為1
                        TI=0;                //發(fā)送中斷請(qǐng)求標(biāo)志位清0
                        ES=1;                //開串口中斷
                }
                P2=~ch;                        //LED低電平顯示收到的數(shù)據(jù)

        }
}
void UART_interrupt() interrupt 4
{
        RI=0;     //接收中斷請(qǐng)求標(biāo)志位                 
        ch=SBUF;        //獲取SBUF接收到的數(shù)據(jù)
        flag=1;        //接收完成標(biāo)志置1      
} 無標(biāo)題.jpg

回復(fù)

使用道具 舉報(bào)

ID:7485 發(fā)表于 2017-11-6 15:34 | 顯示全部樓層
且聽風(fēng)吟1314 發(fā)表于 2017-11-6 10:47
不好意思我小白一枚,表達(dá)不準(zhǔn)確,我要就是燒到單片機(jī)上的那個(gè)代碼,還有 怎么設(shè)置這個(gè)穿孔助手軟件[em04 ...

還是看不明白你的意思。
回復(fù)

使用道具 舉報(bào)

ID:164602 發(fā)表于 2017-11-7 09:36 | 顯示全部樓層
我的板子和你完全一樣,我這個(gè)程序,就是串口控制LED燈的。程序功能是:用字符方式發(fā)送1,LED燈最右邊的一個(gè)亮,以字符方式發(fā)送2,燈滅。
#include<reg52.h>

typedef unsigned char u8;
typedef unsigned int u16;

sbit LED1=P2^0;

u8 receiveData;
u8 n[]="12";

void UsartInit()//串口初始化函數(shù)
{
        SCON=0X50;//設(shè)置為工作方式1
        TMOD=0X20;//設(shè)置計(jì)數(shù)器工作方式2
        PCON=0X80;//波特率加倍
        TH1=0XF3;//計(jì)數(shù)器初始值設(shè)置,注意波特率是4800的
        TL1=0XF3;
        ES=1;//打開接收中斷
        EA=1;//打開總中斷
        TR1=1;//打開計(jì)數(shù)器
}

void main()
{
        UsartInit();//串口初始化
        while(1);
}

void Usart() interrupt 4//中斷函數(shù)
{
        unsigned char m;
        m=SBUF;
        if(m==n[0])
        {
                LED1=0;
        }         
        if (m==n[1])
        {
                LED1=1;
        }
        receiveData=SBUF;//出去接收到的數(shù)據(jù)
        RI = 0;//清除接收中斷標(biāo)志位
        SBUF=receiveData;//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
        while(!TI);//等待發(fā)送數(shù)據(jù)完成
        TI=0;//清除發(fā)送完成標(biāo)志位
}


串口調(diào)試軟件用的STC-ISP的串口調(diào)試功能。如圖所示設(shè)置就可以了。
1.jpg

注意:串口號(hào)是你的號(hào),這里的COM3是我的。
回復(fù)

使用道具 舉報(bào)

ID:246395 發(fā)表于 2017-11-7 10:05 | 顯示全部樓層
wulin 發(fā)表于 2017-11-6 13:22
#include
#define uchar unsigned char
uchar ch;

非常感謝,我現(xiàn)在通過以上程序能用串口控制這幾個(gè)LED了,但是如果要把其它P口加入到里面一起控制的話,如把p00-p07  p10-p17 一起加入用串口控制,程序要怎么改呢,麻煩了
回復(fù)

使用道具 舉報(bào)

ID:164602 發(fā)表于 2017-11-7 11:26 | 顯示全部樓層
且聽風(fēng)吟1314 發(fā)表于 2017-11-7 10:05
非常感謝,我現(xiàn)在通過以上程序能用串口控制這幾個(gè)LED了,但是如果要把其它P口加入到里面一起控制的話,如 ...

你先將這個(gè)程序好好看看吧。
看這么幾個(gè)方面?
第一:串口通訊都要設(shè)置些什么寄存器?
第二:每個(gè)寄存器的值是怎么來的?可不可以改變?
第三:控制部分在哪里?為什么可以控制?(這個(gè)看懂了,你自然會(huì)控制其它I/O口了)
我這個(gè)程序,只能是個(gè)示范程序,其實(shí)真的要完成有意義的控制,還有很多內(nèi)容,努力學(xué)吧,祝成功!
回復(fù)

使用道具 舉報(bào)

ID:213173 發(fā)表于 2017-11-7 11:41 | 顯示全部樓層
且聽風(fēng)吟1314 發(fā)表于 2017-11-7 10:05
非常感謝,我現(xiàn)在通過以上程序能用串口控制這幾個(gè)LED了,但是如果要把其它P口加入到里面一起控制的話,如 ...

只要把串口接收到的數(shù)據(jù)用一個(gè)函數(shù)加以解析就可以按需要控制任意端口,用這個(gè)函數(shù)替換P2=~ch;
void service()
{
        switch(ch)
        {
                case 0x01: P0=0X0F; break;
                case 0x02: P1=0Xf0; break;
                case 0x03: P2=0X55; break;
                ......
                ......
                case 0xff: P1=0Xaa; break;
                default: break;
        }       
}
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表