基于Atmega8单片机的串口收发程序

Atmega8出厂默认的内部时钟频率是1Mhz,做串口收发时波特率最高设置为4800,设置为9600会乱码,提高时钟频率才能将波特率提高。


#include <avr/io.h>
#include <avr/interrupt.h>

#define F_CPU 1000000//时钟频率
#define BAUD 4800//串口波特率

//定义接收字符
volatile char rx_data;
/************************************************************************/
/* 主程序                                                               */
/************************************************************************/
int main(void){
    //设置波特率
    UBRRH=(F_CPU/BAUD/16-1)/256;
    UBRRL=(F_CPU/BAUD/16-1)%256;
    //接收中断使能,接收使能,发送使能
    UCSRB|=(1<<RXCIE)|(1<<RXEN)|(1<<TXEN);
    sei(); //使能总中断
    while(1){
    }
}

/************************************************************************/
/* 串口接收中断                                                          */
/************************************************************************/
ISR(USART_RXC_vect){
    rx_data = UDR;
    
    //发送接收到的字符
    while(!(UCSRA & (1 << UDRE)));
    UDR = rx_data;
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在51单片机中,实现一个串口数字时钟通常会使用ATmega系列或者类似的8位MCU,如Arduino Uno等,配合液晶显示模块或数码管来显示时间。以下是一个基本的程序框架,使用UCI(通用异步接收/发送接口)来通过串口通信传输时间: ```c #include <reg52.h> #include <delay.h> // 假设使用的是USART0 sbit TX = P3_1; // 发送数据引脚 sbit RX = P3_0; // 接收数据引脚 sbit LCD_RS = P1_0; // LCD的数据线选择 sbit LCD_EN = P1_1; // LCD的使能信号 sbit LCD_D4 = P1_2; sbit LCD_D5 = P1_3; sbit LCD_D6 = P1_4; sbit LCD_D7 = P1_5; void initialize_USART(void) { TMOD &= ~0x0F; // 设置定时器T1为模式2 TH1 = 0xFD; // 预分频系数为256,波特率为9600 TL1 = 0xFD; TR1 = 1; // 启动定时器T1 SCON = 0b00001011; // UART设置为8位,1停止位,无校验和允许接收 } void send_time(char *time_str) { while (*time_str) { TX = *time_str++; __delay_ms(1); } } void display_time(char time[]) { // 这里用数组或字符串根据你的LCD驱动库来显示时间 LCD_Init(); // 初始化LCD LCD_Cmd(_LCD_CLE); // 清屏 LCD_Out(0, 0, time, LCD_RS, LCD_EN); LCD_Cmd(_LCD_DISP); // 显示 } int main(void) { initialize_USART(); while (1) { char received; // 假设最多接收6位数字 while (!RX); // 等待接收数据 received = RX; // 接收1位数据 // 假设接收到的是一位数,继续接收 send_time(received); // 读取剩余部分并处理 // 在实际应用中,可能需要解析接收到的时间并更新实际的计时器 } }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值