PIC16F877单片机与PC机通讯的汇编程序
2012-10-25
标签: PIC

;PIC16F877单片机程序
LISTP=16F876
#INCLUDEP16F876.INC
CBLOCK 0X24
COUNT
TEMP
ENDC
ORG0X0000
NOP
STARTGOTOMAIN
ORG0X020
MAINMOVLW0X30;将RAM单元初始化
MOVWFFSR
BCFSTATUS,RP0
MOVLW0X22
MOVWFCOUNT
INTRAMMOVFCOUNT,0
MOVWFINDF
INCFCOUNT,1
INCFFSR,1
BTFSSFSR,7
GOTOINTRAM
BANKSELTXSTA;波特率设置为9 600 bps
MOVLW0X19
MOVWFSPBRG;异步高速方式
MOVLW0X04
MOVWFTXSTA
BCFSTATUS,RP0
MOVLW0X80;串行口使能
MOVWFRCSTA
MOVLW0X30
MOVWFFSR
BSFRCSTA,CREN;接收允许
BSFSTATUS,RP0
BSFTXSTA,TXEN;发送允许
BCFSTATUS,RP0
WAITBTFSSPIR1,RCIF;接收PC机命令
GOTOWAIT
MOVFRCREG,0
MOVWFTEMP
MOVWFINDF
INCFFSR
DECFSZTEMP;接收到的数据为1,则接收
GOTOTXW;否则发送数据
MOVLW0X06
MOVWFTEMP
WAIT1BTFSSPIR1,RCIF;接收一个数据
GOTOWAIT1
MOVFRCREG,0
MOVWFCOUNT
MOVWFTXREG
LOOPTXBTFSSPIR1,TXIF;将接收到的数据送回PC机
GOTOLOOPTX
MOVFCOUNT,0
MOVWFINDF
INCFFSR
DECFSZTEMP
GOTOWAIT1
GOTOOVER;处理完毕
TXWMOVLW0X09;向PC机发送9个数据
MOVWFTEMP
MOVLW0X30
MOVWFFSR
TXW0MOVFINDF,0
MOVWFTXREG
INCFFSR
TXW1BTFSSPIR1,TXIF
GOTOTXW1
DECFSZTEMP
GOTOTXW0
OVERBCFRCSTA,CREN;通信任务完成,关接受和发送允许
BSFSTATUS,RP0
BCFTXSTA,TXEN
BCFSTATUS,RP0
CALLLED;调用显示子程序,将发送(或接收)的数据显示出来
END;程序完

PC 机程序

PC采用Toubr C 进行编写。程序如下:

#defineport0x3f8/*利用串口1进行通信*/
int ch[15];
main()
{
    int a;
    int i, j;
    int b[6] = {88, 15, 38, 26, 20, 0};
    char c;
    clrscr();
    outportb(port + 3, 0x80); /*准备设置波特率*/
    outportb(port, 0x0C); /*波特率设置为9 600 bps*/
    outportb(port + 1, 0x00);
    outportb(port + 3, 0x03); /*8位数据位,奇偶检验,1位停止位*/
    outportb(port + 1, 0x00); /*关中断*/
    inportb(port + 5); /*读一次线路状态寄存器,使其复位*/

    printf("\t\tsend data or receive data: (s or r?)\n\n\n");
    c = getchar();
    switch (c) {
    case 's':
    case 'S': {
        while (!(inportb(port + 5) & 0x20)); /*发送保持器满则等待*/
        outportb(port, 0x01); /*否则发送数据01通知单片机准备接收*/
        for (i = 0; i < 6; i++) { /*共发送6个数据*/
            a = b[i];
            while (!(inportb(port + 5) & 0x20)) {
                delay(100);    /*发送保持器满,等待*/
            }
            outportb(port, a); /*发送a*/
            printf("%d\n", a); /*显示a*/
            while (!(inport(port + 5) & 1)); /*接收单片机送回的数据*/
            ch[i] = inport(port); /*保存*/
        }
        delay(10);
        for (j = 0; j < 8; j++) { /*显示接收的回送数据*/
            printf("\n%d\n", ch[j]);
        }
        getch();
        break;
    }
    case'r':/*接收数据*/
    case'R': {
        while (!(inportb(port + 5) & 0x20));
        outportb(port, 0x02); /*发送数据02通知单片机发送数据*/
        for (j = 0; j < 9; j++) { /*共接收9个数据*/
            while (!(inportb(port + 5) & 1));
            ch[j] = inportb(port);
        }
        for (j = 0; j < 9; j++) {
            printf("\n %d\n", ch[j]);
        }
        getch();
        break;
    }
    }
}
}


可能会用到的工具/仪表
本站简介 | 意见建议 | 免责声明 | 版权声明 | 联系我们
CopyRight@2024-2039 嵌入式资源网
蜀ICP备2021025729号