📄 serial__.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 + -