📄 m16uart.c
字号:
/*******************************************************************
实验六
实验名称: 串口通信实验
实验目的: 学习AVR单片机的串行通信功能
实验现象: 通过超级终端或者是串口调试助手向单片机发送数据,以*开始#结束
单片机储存的是*#之间的数据, 发送R可将单片机最近一次记录的数
据传送给PC机,接收到新的数据,以前的数据将被清除, 数据长度在
255个字节以内
环 境: ICCAVR6.31A
时钟频率: 单片机内部1M频率的时钟
设 计 者: shinea8868
说 明: 部分程序原型源自网络,经本人修改调试可用,请尊重知识产权,如
作商业用途请保留本段文字
完成日期: 2007年4月10日
*******************************************************************/
#include <iom16v.h>
#include <macros.h>
#include "..\ICC_H\SOFTWARE.h"
uchar RecvData[255]; //记录接收到的数据
uchar i = 0;
uchar NewBeginFlag = 0; //接收到新的数据,清除原有数据
uchar RecvDataFlag = 0; //当有新的数据串接收是置一,结束为0
uchar ReadFlag = 0; //读数据标志
/*-----------------------------------------------------------------
函数名称: void Uart0Init(void)
函数功能: 串口初始化
波特率 9600 0.2% 字符长度 8bit 无奇偶校验
参 数:
返 回 值: 无
-----------------------------------------------------------------*/
void Uart0Init(void)
{
UCSRB = 0x00; //关串口
UCSRA = 0x02; //倍速模式 M16中文P151
UCSRC = BIT(URSEL) | 0x06; //写UCSRC寄存器,设定8个bit
UBRR = 0x000c; //设定串口波特率为9600
UCSRB = 0x98; //开串口
}
/*-----------------------------------------------------------------
函数名称: void Uart0Init(void)
函数功能: 串口初始化
波特率 9600 0.2% 字符长度 8bit 无奇偶校验
参 数:
返 回 值: 无
-----------------------------------------------------------------*/
#pragma interrupt_handler UartRecvData:12
void UartRecvData(void)
{
uchar temp;
temp = UDR;
if( temp == '*') //判断是否是数据开始标志
{
NewBeginFlag = 1;
RecvDataFlag = 1;
}
else if( RecvDataFlag)
{
if( temp == '#') //判断是否是数据结束标志
{
RecvDataFlag = 0; //置接收结束标志
}
else
{
RecvData[i++] = temp; //暂存数据
}
}
else if((temp == 'R')||(temp == 'r'))
{
ReadFlag = 1;
}
}
/*-----------------------------------------------------------------
函数名称: void UartTransmitData(void)
函数功能: 发送字符串
参 数:
返 回 值: 无
-----------------------------------------------------------------*/
void UartTransmitData(void)
{
uchar j,Er[6] = "ERROR";
if( i == 0) //判断接收到的数据是否为空
{
for( j = 0;j < 5; j++)
{
while(!(UCSRA&0x20)); //等待数据寄存器为空
UDR = Er[j]; //发送字符
}
}
else
{
for( j = 0;j < i; j++)
{
while(!(UCSRA&0x20)); //等待数据寄存器为空
UDR = RecvData[j]; //发送字符
}
}
}
/*-----------------------------------------------------------------
函数名称: void InitDevices(void)
函数功能: 初始化各种信息
参 数:
返 回 值: 无
-----------------------------------------------------------------*/
void InitDevices(void)
{
CLI(); //关全部中断
Uart0Init();
MCUCR = 0x00;
SEI();
}
void main( void)
{
uchar j;
InitDevices();
while(1)
{
if( NewBeginFlag) //有新的数据接收,清除原有数据
{
NewBeginFlag = 0;
for( j = 1; j ; j++ )
{
RecvData[j] = 0;
}
}
if( ReadFlag)
{
UartTransmitData();
ReadFlag = 0;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -