求助单片机串口程序
2、按键控制单片机P2^1,当P2^1==0时,发送数据0x57,串口助手收到0x57,有去抖功能。
3、串口助手发送数据0x01,单片机可以收到,P1_0口动作。
4、89C52单片机,22.1148晶振,9600波特率, 方式一发送。
以上,请帮忙写个程序吧。 收取数据我调试没问题了。但是发送一致搞不成。烦请写一下代码实现以上功能,烦请带注释,谢谢,谢谢。
把你的程序发出来,提出问题在哪吧
- #include <AT89X52.h> //调用51单片机的头文件
- //串口接收寄存器设置
- unsigned char USARTbuf; //设置8位的unsigend char型寄存器用来暂存串口接收内容
- //---------------------------------------
- void UART_SER (void) interrupt 4
- {
- RI=0; //清除接收标志位
- USARTbuf=SBUF; //将接收缓冲区内容转至USARTbuf寄存器中
- P1=USARTbuf; //P1口按照接受的8为数据工作
- }
- void main() //主函数
- {
- //*****USART串口初始化*****
- TMOD&=0x0F; //把TMOD高4位清0
- TMOD|=0x20; //将TMOD的M1位置1,设置成自动装入的8位定时器
- TH1=0xFA; //设置波特率为9600
- TL1=0xFA; //设置波特率为9600
- TR1=1; //启动定时器T1,作为串口波特率发生器
- SCON=0x50; //10位异步收发,波特率由定时器控制,允许串口接收
- ES=1; //允许串口中断
- //***开全局中断设置****
- //串口接口UART设置了中断允许,此处要开全局中断
- EA=1; //开全局中断
- while(1) //死循环
- {
-
- if(P2_0==0) //如果P2_0口按键按下,发送数据到串口助手
- {
- ES=0;
- SBUF=0x55; //发送0x55,自己想发送的数据
- while(!TI); //一直等到数据发送完毕
- TI=0; //清零
- ES=1; //中断
- }
- }
- }
请上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;
