📄 usart.c
字号:
//******************************************************************************
// *
// FileName : 实验板uart.c ICCAVR V6.31A编译 *
// Function : uart应用练习 ,回送PC发送的数据,从而双向通讯。 *
// Date : 2006-05-07 *
// Version : 1.0 *
// *
// Author : 开关电源 hongtusy@163.com *
// Company : 电子信息技术咨询网 http://www.itsn.cn *
// *
//***************************描述与记事*****************************************
//实验板的AVR程序,uart应用,和计算机通讯,回送PC发送的数据
//接线定义:PD0-RXD PD1-TXD 开关位置:SW6-7/8打开。
//使用串口调试器,使用十六进制方式,首先让PC发送一个字符给MCU,然后将接收到MCU返回的值。
//记事:本程序旨在对uart的理解与演示,程序适合初学者使用.
//使用片外8MHz晶体,9600bps波特率
//******************************************************************************
#include <iom16v.h> //头文件,ATmega8535单片机的寄存器定义
#include <macros.h> //包含有SEI()、CLI()、NOP()、WDR()、等宏定义.
typedef unsigned char uchar; //数据类型说明,无符号整型,两字节大小。
typedef unsigned int uint; //数据类型说明,无符号字符型,单字节大小。
#define BAUDRATE 9600 //波特率
#define F_CPU 8000000 //系统晶体频率
uchar temprecv=0xf0,tempsend;
/*========*/
#pragma interrupt_handler uart0_rx_isr: 12
void uart0_rx_isr(void)
{
temprecv=UDR;
//while(!(UCSRA&(1<<UDRE)));
UDR = temprecv;
}
/************************************************
函 数 名: DelaymS()
功 能: 毫秒级延时函数
输入参数: 延迟时间/系统晶体
输出参数: 做相应的延迟处理
描 述: /
***********************************************/
void DelaymS (uint i) //延时函数,参数i为延时时间
{
uchar j; //双重延时
for (;i!=0;i--)
{
for (j=30;j!=0;j--);
}
}
/********************************************************
子程序名: usart_Init()
功 能: 串口初始化
输入参数: /
输出参数: /
描 述: /
********************************************************/
void usart_Init (void)
{
CLI(); //关闭中断
UBRRL= (F_CPU/BAUDRATE/16-1)%256;
UBRRH= (F_CPU/BAUDRATE/16-1)/256;
//UBRRL=51; //波特率寄存器,UART:9600bps,8.000MHz
UCSRB = (1<<RXEN)|(1<<TXEN)|(1<<RXCIE); //接收结束中断使能,RXD&TXD使能
UCSRC = (1<<URSEL)|(1<<UPM1)|(1<<UCSZ0)|(1<<UCSZ1);
//访问UCSRC寄存器,偶校验,8个数据位,默认一个停止位,
SREG = 0b10000000;
//TIMSK =0X00;
//SEI(); //开全局中断使能
}
//*****************主程序**********************************
void main (void)
{
uchar temp=0xff;
usart_Init(); //串口初始化
while(1) //无限循环执行
{
//if (UCSRA & (1<<RXC)) //等待接收完成,
//{
// temp = UDR; //将接收到的数据暂存
//while(!(UCSRA&(1<<UDRE)));
if(temp!=temprecv)
{
while(!(UCSRA&(1<<UDRE)));
UDR = temprecv; //将接收到的数据发送出去
}
temp=temprecv;
// }
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -