您的位置 首页 国产IC

ATmega128(与PC机通讯)

atmega128的USART串口发送与接收数据示例程序,采用串口1,发送和接收都是中断的方式//先发送200个FF,然后单片机处于接收状态,接收数据显…

atmega128的USART串口发送与接纳数据示例程序,选用串口1,发送和接纳都是中止的方法

//先发送200个FF,然后单片机处于接纳状况,接纳数据显现在数码管上,电脑发送的数据格式如09,16进制方式
//编译环境 AVR Studio 4.17/AVR GCC
//体系时钟11.0592MHZ,设置熔丝位为外部高频石英晶体振荡,发动时刻4.1ms

//***********************************************************************
//包括文件
//***********************************************************************

#include
#include
#define F_CPU11.0590200// 单片机主频为11.0592MHz,用于延时子程序
#include
#include
#include
#include //中止信号头文件

//***********************************************************************
//界说变量区
//***********************************************************************

#define Data_IO PORTA //数码管数据口
#define Data_DDR DDRA //数码管数据口方向寄存器
#define D_LE0 PORTD &= ~(1 << PD4) //数码管段操控位为0,锁存端口数据
#define D_LE1 PORTD |= (1 << PD4) //数码管段操控位为1,锁存器输出与端口共同
#define W_LE0 PORTD &= ~(1 << PD5) //数码管位操控位为0
#define W_LE1 PORTD |= (1 << PD5) //数码管位操控位为1

#define delay_us(x) _delay_us(x) //AVR GCC延时函数 x(us)
#define delay_ms(x) _delay_ms(x) //AVR GCC延时函数 x(ms)

#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long

#define baud 9600 //设置波特率的巨细
#define baud_setting (uint)((ulong)F_CPU/(16*(ulong)baud)-1) //波特率计算公式
#define baud_h (uchar)(baud_setting>>8) //提取高位
#define baud_l (uchar)(baud_setting) //低位

uint tx_count=200,tx_flag=0xff;
static uchar A1,A2,A3;
uchar usart_tx_data;
uchar usart_rx_data;

//***********************************************************************
//共阴数码管显现的断码表0~F
//***********************************************************************

uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

//***********************************************************************
//IO端口初始化
//***********************************************************************

void system_init()
{
Data_IO=0xFF; //数据口为输出
Data_DDR=0xFF;

PORTD=0xFF; //74HC573的操控口,设置为输出
DDRD=0xFF;
}

//*************************************************************************
//74HC573操控数码管动态扫描显现函数,显现收集到的温度
//*************************************************************************

void Display_Uart(uint data_b,uint data_s,uint data_g)
{
uchar i,j;
system_init();
j=0x01; //此数据用来操控位选
for(i=0;i<5;i++) //用后3位数码管来显现
{
D_LE1;
W_LE1;
Data_IO=~j;
W_LE0;
j=(j<<1);
Data_IO=0x00;
D_LE0;
delay_ms(1);
}
D_LE1;
W_LE1;
Data_IO=~j;
W_LE0;
j=(j<<1);
Data_IO=table[A1];
D_LE0;
delay_ms(1);

D_LE1;
W_LE1;
Data_IO=~j;
W_LE0;
j=(j<<1);
Data_IO=table[A2];
D_LE0;
delay_ms(1);

D_LE1;
W_LE1;
Data_IO=~j;
W_LE0;
j=(j<<1);
Data_IO=table[A3];
D_LE0;
delay_ms(1);

}

void usart_init()
{
UCSR1A=0x00; //单倍速形式
UCSR1B=0xF8; //接纳中止和发送中止答应
UCSR1C=(1<|(1<|(1<|(1< UBRR1H=baud_h; //写波特率的值
UBRR1L=baud_l;
}
|(1<|(1<|(1<

//*************************************************************************
//数据处理函数
//*************************************************************************
void data_do(uchar temp_d)
{
uchar A2t;
A1=temp_d/100; //分出百,十,和个位
A2t=temp_d%100;
A2=A2t/10;
A3=A2t%10;
}

//*************************************************************************
//串口相关中止服务子程序
//*************************************************************************
//数据发送完毕中止向量
SIGNAL(SIG_USART1_TRANS) //中止服务程序
{
delay_ms(10); //相关操作
}

//数据接纳完毕中止向量
SIGNAL(SIG_USART1_RECV) //中止服务程序
{
usart_rx_data=UDR1; //将接纳到的数据取出
data_do(usart_rx_data); //数据处理,得到个位十位百位

}
//数据寄存器空中止向量
SIGNAL(SIG_USART1_DATA) //中止服务程序
{

UDR1=usart_tx_data; //发送数据到数据寄存器
tx_count–;
if(tx_count==0x00)
{
tx_flag=0x01;
UCSR1B=0xF0; //制止发送
}
}

//*************************************************************************
//主程序
//*************************************************************************
void main()
{
system_init(); //体系初始化
usart_init(); //usart串口初始化装备
usart_tx_data=0xff;
SREG|=0x80; //敞开大局中止
while(1)
{
SREG=0x00; //关中止,PD口做IO口用,才干正常显现数码管
Display_Uart(A1,A2,A3); //显现接纳到的数据
SREG|=0x80; //开中止,用于下次接纳中止
}
}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/bandaoti/ic/276159.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部