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

📄 serial__.c

📁 atmega16的串口调试程序
💻 C
字号:
#include <Mega16.h>
	#ifndef __SLEEP_DEFINED__
	#define __SLEEP_DEFINED__
	.EQU __se_bit=0x40
	.EQU __sm_mask=0xB0
	.EQU __sm_powerdown=0x20
	.EQU __sm_powersave=0x30
	.EQU __sm_standby=0xA0
	.EQU __sm_ext_standby=0xB0
	.EQU __sm_adc_noise_red=0x10
	.SET power_ctrl_reg=mcucr
	#endif

#define F_CPU   11059200
#define UDRE    0x20
#define RXEN    0x10
#define TXEN    0x08
#define URSEL   0x80
#define RXC     0x80
const unsigned char buffer[]="Hi,How are you?";

//UART0 initialize
// desired baud rate: 9600
// actual: baud rate:9600 (0.0%)
// char size: 8 bit
// parity: Disabled

void USART_Init( unsigned int baud )
{
unsigned int tmp;
/* 设置波特率*/
tmp= F_CPU/baud/16-1;
UBRRH = (unsigned char)(tmp>>8);
UBRRL = (unsigned char)tmp;
/*接收器与发送器使能*/
UCSRB = 0xD8;
/*设置帧格式: 8个数据位, 1停止位*/
UCSRC = 0x86;
}

//数据发送(发送5到8位数据位的帧
void USART_Transmit( unsigned char data )
{
/*等待发送缓冲器为空*/
while ( !( UCSRA & UDRE) )
;
/*将数据放入缓冲器,发送数据*/
UDR = data;
}


//数据接收(以5到8个数据位的方式接收数据帧
unsigned char USART_Receive( void )
{
/*等待接收数据*/
while ( !(UCSRA & RXC) )
;
/*从缓冲器中获取病返回数据*/
return UDR;
}

//连续发送字符
void USART_Transmit_2( void )
{
while ( !( UCSRA & UDRE) )
;
UDR = 'H';
while ( !( UCSRA & UDRE) )
;
UDR = 'e';
while ( !( UCSRA & UDRE) )
;
UDR = 'l';
while ( !( UCSRA & UDRE) )
;
UDR = 'l';
while ( !( UCSRA & UDRE) )
;
UDR = 'o';
}

void delay(int ms)
{
 int i,j;
 for(i=0;i<3000;i++)
  for(j=0;j<ms;j++)
  ;
}

void main(void)
{
unsigned char n=0,tmp=0;

USART_Init(9600); //波特率9600初始化串口
//uart0_init();
DDRC =0xFF;
for(n=0;n<20;n++) //发送数组里面的字符串,[url]http://www.avrvi.com[/url]
{
USART_Transmit(buffer[n]);
PORTC.0=0x01;
PORTC.1=0x00;
delay(2);
PORTC.1=0x01;
delay(2);
}

USART_Transmit(0x0d); //发送一个回车   RED
for(n=0;n<10;n++){
  PORTC.0=0x00;
  delay(5);
  PORTC.0=0x01;
  delay(5);
  }
USART_Transmit(0x0a); //发送一个换行 YELLOW
for(n=0;n<10;n++){
  PORTC.1=0x01;
  delay(5);
  PORTC.1=0x00;
  delay(5);
  }
while(1)
{
if(UCSRA & RXC) //如果接收缓冲区有数据
{
tmp=USART_Receive(); //接收数据   YELLOW,RED
PORTC.1=0x01;
PORTC.0=0x00;
delay(10);
USART_Transmit(tmp); //发送数据  RED,YELLOW
PORTC.1=0x00;
PORTC.0=0x01;
delay(10);
if(tmp=='a')   //对接收到的数据进行,如果是a,再发一个OK回来
{
USART_Transmit('O');  //RED
 for(n=0;n<4;n++){
  PORTC.0=0x01;
  delay(20);
  PORTC.0=0x00;
  delay(20);
  }
USART_Transmit('K');  //YELLOW
 for(n=0;n<8;n++){
 PORTC.1=0x01;
 delay(10);
 PORTC.1=0x00;
 delay(50);
 }
}
if(tmp=='A')   //对接收到的数据进行,如果是A,再发一个Hello回来
{
USART_Transmit_2();  // REN-ON,YELLOW =OFF
for(n=0;n<10;n++){
PORTC.0=0x01;
PORTC.1=0X00;
delay(50);
PORTC.0=0x00;
PORTC.1=0x01;
delay(10);
}
}
//if(tmp=='G')   //对接收到的数据进行,如果是G,跳转flash程序区
//{
// MCUCR = 0x01;
//  MCUCR = 0x00;             //将中断向量表迁移到应用程序区头部
//  RAMPZ = 0x00;             //RAMPZ清零初始化
//   asm("jmp 0x0000;\n");           //转到Flash的0x0000处,执行用户的应用程序
//}
}
}
}

⌨️ 快捷键说明

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