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

📄 usart_m8.c

📁 AVR单片机的T_TO_TWI通讯方式
💻 C
字号:
/*****************************************************************
//ICC-AVR application builder : 2005-8-19 14:40:53
// Target : M8
// Crystal: 7.3728Mhz
// Crystal: 4.6080Mhz

实验:做usart串行通讯实验
目的:了解及会使用usart串口
CPU:atmega8L
相关的5个寄存器:UCSRA,UCSRB,UCSRC,UDR,UBRR(UBRRH,UBRRL)
	         其中:UBRRH和UCSRC共用一个地址
******************************************************************/
/*配置:CKOPT=0,CKSEL3..0=1111,SUT1..0=11(65ms慢速上升电源)*/
#include "usart_m8.h"

unsigned char UART_RX_buff[UART_RX_BUFFER_SIZE];
unsigned char UART_TX_buff[UART_TX_BUFFER_SIZE];
unsigned char Rx_Flag;
unsigned char Rx_Temp,Rx_Count;
unsigned char Rx_Start_Pack_Flag,Rx_Over_Pack_Flag;

unsigned char Write_Error[6] = {'x','w','4','0','x',0};//后面这个零是一定要加的,表示字符串结束
unsigned char Read_Error[6]  = {'x','w','8','0','x',0};//或者"\0"
unsigned char aa[5] = {'o','p'};

#pragma interrupt_handler uart0_rx_isr:12
void uart0_rx_isr(void)
{
   //uart has received a character in UDR
  
	UART_RX_buff[Rx_Count] = UDR;
    Rx_Count = Rx_Count+1;
    if(Rx_Count == 9)
       {
          Rx_Flag  = true; 
	      //USART_TransmitByte((Rx_Count+0x30));
		  Rx_Count = 0;
		  //上位机在这时候要停一会儿,才能发第二串数据
	   }
	//USART_TransmitByte((Rx_Count+0x30));
}

//UART0 initialize
// desired baud rate: 9600
// actual: baud rate:9600 (0.0%)
// char size: 8 bit
// parity: Disabled
void uart0_init(void)
{
 Rx_Count = 0;
 Rx_Flag  = false;
 Rx_Start_Pack_Flag = false;
 Rx_Over_Pack_Flag  = false;
 //本身的uart的初始化
 UCSRB = 0x00; //disable while setting baud rate
 //UCSRB[RXCIE,TXCIE,UDRIE,RXEN,TXEN,UCSZ2,RXB8,TXB8]
 //Bit 7 – RXCIE: RX Complete Interrupt Enable

 UCSRA = 0x00;
 //UCSRA[RXC,TXC,UDRE,FE,DOR,PE,U2X,MPCM]
 
 UCSRC = (BIT(URSEL)|BIT(UCSZ1)|BIT(UCSZ0));//设置成8位
 //UCSRC[URSEL,UMSEL,UPM1,UPM0,USBS,UCSZ1,UCSZ0,UCPOL]
 //位URSEL:寄存器选择("1"为UCSRC或"0"为UBRRH)
 //位UMSEL:工作模式选择(0为异步,1为同步)
 //位UPM1..0:为校验方式,硬件支持校验
 //位USBS:停止位选择(0为一位,1为两位)
 //位UCSZ0..2:发送位数选择(如果是8位:011)
 //位UCPOL:时钟极性(只在同步模式使用,异步应置为"0")
 
 UBRRL = 0x77;//baudrate; //set baud rate lo
 UBRRH = 0x00; //set baud rate hi(设置波特率只用低四位,加起来一共12位)
 //UBRR = baudrate; /* set the baud rate */

 UCSRB = ((1<<RXCIE)|(1<<RXEN)|(1<<TXEN));
}
/************************************************************************
接收时采用中断方式,,,以"包"为单位接收(9个字符)
*************************************************************************/
void UART_Receive(void)
{
   if(Rx_Flag == true)
    {
   		Rx_Flag = false;
		
		if((UART_RX_buff[0] == 0x58)&&(UART_RX_buff[8] == 0x58))//0x58  = 'w'
        {
			Rx_Over_Pack_Flag  = true;      //这个标志,可以让主函数去查
			//Rx_Count = 0;//接收计数器清零
		}
		//USART_TransmitByte('p');//接收一包完,就发一个信号叫上机暂停发

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -