嵌入式学习——硬件(UART)——day55

1. UART

1.1 定义

        UART(Universal Asynchronous Receiver/Transmitter,通用异步收发器)是一种用于串行通信的硬件设备或模块。它的主要功能是将数据在串行和并行格式之间进行转换。UART通常用于计算机与外围设备或嵌入式系统之间的数据传输。

1.2 特点

  1. 异步通信:UART不需要发送和接收设备之间的时钟信号同步,数据传输速率和传输格式(如起始位、数据位、校验位、停止位)在通信双方事先协商好。

  2. 全双工通信:UART可以同时进行数据的发送和接收。

  3. 串行数据传输:数据一位一位地传输,减少了连线数量,但需要更多的时间来传输数据。

  4. 组成部分

    • 发送器(Transmitter):将并行数据转换为串行数据并发送出去。
    • 接收器(Receiver):接收串行数据并将其转换为并行数据。

1.3 代码

#include <s3c2440.h>
#include <string.h>
#include <stdio.h>
#include "led.h"
#include "key.h"
#include "interrupt.h"
#include "delay.h"
#include "pwm.h"
#define ADDRESS 0X08

void init_wdt(void)	//初始化看门狗,禁止启动,关闭看门狗
{
	WTCON &= ~(1 << 0);
}

void init_clk(void)
{
	unsigned int t = MPLLCON; //将PCLK频率存入变量设置好再进行修改,防止频率修改中途器件因为频率过高而短路
	t &= ~((0xff << 12) | (0x3f << 4) | (3 << 0)); //利用锁相环将12MHz倍频
	t |= ((127 << 12) | (2 << 4) | (1 << 0)); //配置fclk频率大约为400Mhz
	CLKDIVN |= ((2 << 1) | (1 << 0));//分频,配置HCLK为100MHz,HCLK为50MHz	
	MPLLCON = t;//将所有频率配置好再进行设置,防止器件被烧坏
}

unsigned char buffer[128];//存储pc给s3c2440发送,s3c2440接收到的字符串
unsigned char tmpbuffer[128];
unsigned int pos;//已经收到字符的个数,下一个要收到字符的位置

vo
#include<reg52.h> #include<stdio.h> /*日期和时间变量*/ unsigned char sec=0; unsigned char min=0; unsigned char hour=0; unsigned char day=1; unsigned char month=1; unsigned char year=2023; /*定时器初始化*/ static void InitTimer0() { TMOD &= 0xF0; //设置定时器模式 TMOD|=0x01;//设置定时器0为工作模式1 TF0=0; TR0=1; TL0 = 0x18; //设置定时初始值 TH0 = 0xFC; //设置定时初始值 ET0=1;//允许中断 EA=1;//允许总中断 PT0=0; } /*串口初始化*/ static void InitUART() { SCON=0x50;//设置串口模式为8位数据 TMOD|=0x20;//设置定时器1为模式2 PCON=0x80;//设置波特率为双倍 TL1=0xFA;//设置定时器初始值 TH1=TL1;//设置定时器初始值 TR1=1;//启动定时器1 TI=1;//设置发送标志位 ES=1;//启用串口中断 } /*串口发送字符串*/ void UART_SendString(char*str) { while(*str) { SBUF=*str++; while(!TI); TI=0; } } /*中断处理程序*/ void Timer0_Handler() interrupt 1 { sec++; if(sec>=60) { sec=0; min++; if(min>=60) { min=0; hour++; if(hour>=24) { hour=0; day++; if((month==1||month==3||month==5||month==7||month==8||month==10||month==12)&&day>31) { day=1; month++; } else if((month==4||month==6||month==9||month==11)&&day>30) { day=1; month++; } else if(month==2&&((year%4==0&&year%100!=0)||year%400==0)&&day>29) { day=1; month++; } else if(month==2&&day>28) { day=1; month++; } if(month>12) { month=1; year++; } } } } } /*延时函数*/ void delay_ms(unsigned int ms) { unsigned int i,j; for(i=0;i<ms;i++) { for(j=0;j<120;j++) { } } } /*主函数*/ void main() { InitTimer0();//初始化中断 InitUART();//串口初始化 while(1) { char time_str[50]; sprintf(time_str,"Date: %d-%d-%d Time:%02d:%02d:%02d\n",year,month,
03-12
您提供的代码是一个基于单片机的时间管理与串口通信的程序框架,主要用于展示如何通过定时器中断来更新时间和利用串行通信将当前时间发送出去。下面我会对这段代码的关键部分进行解释,并说明它的功能: ### 关键组件解析 #### 包含头文件 ```c #include <reg52.h> #include <stdio.h> ``` `reg52.h` 提供了访问STC89系列单片机寄存器的功能;而 `stdio.h` 则是为了使用标准输入输出库函数如`sprintf()`。 #### 定义全局变量存储日期和时间信息 ```c unsigned char sec = 0; unsigned char min = 0; unsigned char hour = 0; ... unsigned char year = 2023; ``` 这里定义了一系列无符号字符类型的变量用于保存秒、分、小时等时间单位以及年月日的日历信息。 #### 初始化计时器(Timer) ```c static void InitTimer0() { // 配置TMOD寄存器设定为模式1(16位自动重装),同时配置初值以便每过一段时间触发一次溢出中断。 } ``` 此段代码设置了定时器的工作模式及预设的起始值,使得定时器可以周期性的生成中断事件,在每次到达该时刻就会发生溢出并进入相应的ISR (Interrupt Service Routine)即中断服务例程处理逻辑中去递增时间。 #### 设置UART通讯端口(UART Initialization) ```c static void InitUART() { // 指定SCON特殊功能寄存器的相关位以选择特定的数据传输方式, // 并调整波特率相关的参数保证双方能够正常交换信息。 } ``` 这部分主要是为了准备硬件资源,让MCU可以通过RS232串行线与其他设备建立联系并且保持同步传递ASCII码表示的文字内容给其他接收装置例如PC电脑终端上显示出来。 #### 中断响应函数(ISR - Interrupt Service Routine) ```c void Timer0_Handler() interrupt 1 { // 更新系统实时钟RTC(Reliable Timing Clock),检查是否需要翻转到下一分/下一小时等等直到完成一天内的所有进制转换操作为止; } ``` 当计数器达到上限产生借位后会立即跳到这里执行具体的业务流程——累加秒钟数值直至满刻度归零再继续前进至更高一级别单位(分钟->小时->天...)。此外还加入了闰年的判断条件确保每年二月份正确显示对应长度。 #### 主循环(Main Loop) ```c while(1){ ... UART_SendString(time_str); } ``` 无限次地构造包含当时确切时刻描述的信息字符串并通过已连接好的COM port传送给外界监视工具查看结果变化情况。 --- 综上所述,上述示例演示了一个简单的嵌入式应用实例,它实现了基本的时间管理和对外部请求做出适当回应的能力。如果您想进一步了解某个细节或者有新的需求,请参考以下相关内容。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值