atmega128(与pc机通信)-皇冠最新app版本

×
嵌入式 > 嵌入式开发 > 详情

atmega128(与pc机通信)

发布时间:2026-06-22 发布时间:
|
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_d0;
a2=a2t/10;
a3=a2t;
}

//*************************************************************************
//串口相关中断服务子程序
//*************************************************************************
//数据发送结束中断向量
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; //开中断,用于下次接收中断
}
}



『本文转载自网络,皇冠最新app版本的版权归原作者所有,如有侵权请联系删除』

网站地图