微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 求助单片机串口程序

求助单片机串口程序

时间:10-02 整理:3721RD 点击:
1、使用串口助手;
2、按键控制单片机P2^1,当P2^1==0时,发送数据0x57,串口助手收到0x57,有去抖功能。
3、串口助手发送数据0x01,单片机可以收到,P1_0口动作。
4、89C52单片机,22.1148晶振,9600波特率, 方式一发送。
以上,请帮忙写个程序吧。 收取数据我调试没问题了。但是发送一致搞不成。烦请写一下代码实现以上功能,烦请带注释,谢谢,谢谢。

把你的程序发出来,提出问题在哪吧


  1. #include <AT89X52.h>       //调用51单片机的头文件

  2. //串口接收寄存器设置
  3. unsigned char USARTbuf;    //设置8位的unsigend char型寄存器用来暂存串口接收内容
  4. //---------------------------------------
  5. void UART_SER (void) interrupt 4
  6. {     
  7.         RI=0;              //清除接收标志位
  8.         USARTbuf=SBUF;     //将接收缓冲区内容转至USARTbuf寄存器中
  9.         P1=USARTbuf;       //P1口按照接受的8为数据工作
  10. }

  11. void main()            //主函数
  12. {
  13.     //*****USART串口初始化*****
  14.     TMOD&=0x0F;            //把TMOD高4位清0
  15.     TMOD|=0x20;            //将TMOD的M1位置1,设置成自动装入的8位定时器
  16.     TH1=0xFA;              //设置波特率为9600
  17.     TL1=0xFA;              //设置波特率为9600
  18.     TR1=1;                 //启动定时器T1,作为串口波特率发生器
  19.     SCON=0x50;             //10位异步收发,波特率由定时器控制,允许串口接收
  20.     ES=1;                  //允许串口中断
  21.     //***开全局中断设置****
  22.     //串口接口UART设置了中断允许,此处要开全局中断
  23.     EA=1;                  //开全局中断
  24.     while(1)               //死循环
  25.     {
  26.                
  27.                         if(P2_0==0)     //如果P2_0口按键按下,发送数据到串口助手
  28.                         {
  29.                                                 ES=0;
  30.                                                  SBUF=0x55;          //发送0x55,自己想发送的数据
  31.                                                  while(!TI);        //一直等到数据发送完毕
  32.                                                  TI=0;              //清零
  33.                                                  ES=1;              //中断
  34.                         }
  35.         }
  36. }

复制代码

请上QQ525291581送资料给你

以下内容来源于《51单片机轻松入门—基于STC15W4K系列》第4章,请参考。

4.1.4  单片机与计算机通信的简单例子

例4.1 单片机向电脑发送0~255范围内不断增大的数据,使用串口1,定时器T1作波特率发生器,波特率9600/22.1184MHz。单片机串口1接收引脚是RXD/P3.0,串口1发送引脚是TXD/P3.1,也就是默认的程序下载引脚,程序下载完毕即可通过串口助手进行测试。

#include "STC15W4K.H"      // 包含 "STC15W4K.H"寄存器定义头文件

void delay500ms(void)

{   // 由第一章介绍的软件计算得出   

}

void UART_init(void)

{         

    // 下面代码设置定时器1

    TMOD = 0x20;    // 0010 0000 定时器1工作于方式2(8位自动重装方式)

    TH1  = 0xFA;    //波特率:9600 /22.1184MHZ

    TL1  = 0xFA;    //波特率:9600 /22.1184MHZ

    TR1  = 1;

    // 下面代码设置定串口

    AUXR =0x00;      // 很关键,使用定时器1作为波特率发生器,S1ST2=0

    SCON = 0x50;      //0101 0000 SM0.SM1=01(最普遍的8位通信),REN=1(允许接收)

}

void UART_send_byte(unsigned  char dat)

{

    SBUF = dat;

    while(!TI);     

    TI=0;            // 此句可以不要,不影响后面数据的发送,只供代码查询数据是否发送完成

}

void main()

{

    unsigned  char num=0;   

    UART_init();

    while(1)

    {      

        UART_send_byte(num++);

        delay500ms();

    }

}

运行结果如图4-4所示。



很好很好,谢谢,学习了

串行通讯是计算机与其他机器之间通讯的一种常用方法,在Windows操作系统中提供了实现了各种串行通讯的API函数。通常可按以下步骤实现串行通讯:打开串口、设置串口、监视串口事件、发送数据、接收数据和关闭串口。
3.1 打开串口
将串口设备作为文件以独占方式打开。
        m_hComm = CreateFile(" \\\\.\\COM1",
                GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING,
                FILE_FLAG_OVERLAPPED, NULL);
        if (m_hComm == INVALID_HANDLE_VALUE)
        {
                // 打开串口失败
        }
3.2 设置串口
在Windows的SDK中定义了一个DCB结构,其中的成员是对串口设备的设置,常用的有以下几个:
DWORD BaudRate;     // 波特率
DWORD fParity;       // 奇偶校验
BYTE ByteSize;       // 字节长度
BYTE StopBits;       // 停止位
实例:
        if (!GetCommState(m_hComm, &m_dcb))
        {
                // 获取串口设置失败
        }
        m_dcb.BaudRate = lBaudRate;
        m_dcb.ByteSize = cByteSize;
        m_dcb.Parity   = cParity;
        m_dcb.StopBits = cStopBits;
        if (!SetCommState(m_hComm, &m_dcb))
        {
                // 设置串口失败
        }
3.3 监视串口事件
开辟一个监视线程循环监测串口事件的发生,当有事件发生时,发送相应的消息。
OVERLAPPED os;
ZeroMemory(&os, sizeof(OVERLAPPED));
PurgeComm(m_hComm, PURGE_RXCLEAR |
PURGE_TXCLEAR | PURGE_RXABORT | PURGE_TXABORT);
while (m_hComm != NULL)
{
        dwEvtMask = 0;
        ClearCommError(m_hComm, &dwErrorFlags, &ComStat);
        if (!WaitCommEvent(m_hComm, &dwEvtMask, &os))
        {
                if ((dwEvtMask & EV_RXCHAR) == EV_RXCHAR)
                {
                        SendMessage(m_hWnd, WM_SERIAL_READ,
(WPARAM) 0, (LPARAM) &pSerialComm->m_nPort);
                }
        }
        WaitForSingleObject(m_hEvent, 50);
}
3.4 发送数据
WriteFile(m_hComm, pBuffer, dwLength, &dwBytesWritten, &os);
3.5 接收数据
ReadFile(m_hComm, pBuffer, dwBytesRead, &dwBytesRead, &os);
3.6 关闭串口
SetCommMask(m_hComm, 0);
// 停止发送和接收数据,并清除发送和接收缓冲区
PurgeComm(m_hComm, PURGE_TXABORT | PURGE_RXABORT |
PURGE_TXCLEAR | PURGE_RXCLEAR);
CloseHandle(m_hComm);
m_hComm = NULL;

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top