📄 atmega8串口通信.c
字号:
#include <avr/interrupt.h>
#include <avr/io.h>
#include <avr/signal.h>
#define uchar unsigned char
#define uint unsigned int
/******************************************/
void port_init();
void delayms(uint k);
void uart();
unsigned char Getchar(void);
void sendchar(uchar *s);
volatile uchar Buf=0;
uchar RecvBuf[16]={0};
uchar SendBuf[16]={119,121,123,125,127,129,131,189,199,212,222};
uchar aaa[64]={3,121,3,121,6,252,3,121,3,121,6,252,3,121,6,252,
3,121,6,252,3,121,3,121,6,252,3,121,3,121,6,252,
6,252,3,121,3,121,3,121,6,252,3,121,6,252};
/******************************************/
int main()
{
port_init();
uart();
sei();
delayms(500);
//sendchar("AVR-ARM RS232 TEST CODE");
PORTC=0xfd;
delayms(1000);
sendchar(aaa);
while(1)
{
if(Buf=='a')
{
Buf='0';
sendchar("shaozhanyu");
sendchar(SendBuf);
PORTC=0xfc;
delayms(5000);
}
if(Buf=='b')
{
Buf='0';
sendchar("shaozhanyu2");
PORTC=0xfd;
delayms(5000);
}
}
}
/******************************************/
void port_init()
{
DDRC=0xFF;
PORTC=0x7e;
}
/******************************************/
void uart() //特别注意写UCSRC时,要把最高位置1,否则写不进去
{
UCSRB = 0x00; //先不使能发送接收
UCSRA = 0x00; //Bit1为1则倍速发送,这里不倍速
UCSRC = 0x86; //8位数据格式,异步方式,URSEL=1时,写UCSRC寄存器
UBRRL = 51; //波特率:9600 Bps 8MHZ时钟 51 1MHZ 6 2MHZ 12 4MHZ 25
UBRRH = 0x00; //误差率:0.156%
UCSRB = 0x98; //使能发送接收,使能接收中断
}
//-----------------------------------------------------------
//串口接收字节子程序
//-----------------------------------------------------------
unsigned char Getchar(void)
{
while(!(UCSRA& (1<<RXC)));
return UDR;
}
/******************************************/
void sendchar(uchar *s)
{
while (*s)
{
while (!(UCSRA&(1<<UDRE)));
UDR=*s;
s++;
}
while (!(UCSRA&(1<<UDRE)));
UDR=0x0a; //回车换行
while (!(UCSRA&(1<<UDRE)));
UDR=0x0d;
}
SIGNAL(SIG_UART_RECV)
{
Buf=UDR;
}
/******************************************/
void delayms(uint k)
{
uint i,j;
for(i=0;i<k;i++)
{
for(j=0;j<100;j++)
{;}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -