⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 m16uart.c

📁 M16Uart 实验现象: 通过超级终端或者是串口调试助手向单片机发送数据,以*开始#结束 单片机储存的是*#之间的数据, 发送R可将单片机最近一次记录的数 据传送给PC机,接收到新的
💻 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 + -