根据提供的文件信息,我们可以归纳出以下关于51系列单片机的重要知识点: ### 一、配置文件(config.h) 在单片机编程中,配置文件是十分重要的,它定义了程序运行时的基本环境和参数。 #### 代码分析: ```c #ifndef _CONFIG_H #define _CONFIG_H #include <reg52.h> #include <intrins.h> typedef signed char int8; // 定义了一个8位带符号整型 typedef signed int int16; // 定义了一个16位带符号整型 typedef signed long int32; // 定义了一个32位带符号整型 typedef unsigned char uint8; // 定义了一个8位无符号整型 typedef unsigned int uint16; // 定义了一个16位无符号整型 typedef unsigned long uint32; // 定义了一个32位无符号整型 #define SYS_MCLK (11059200 / 12) // 定义系统时钟频率为921600Hz sbit ADDR0 = P1^0; // 外设地址线0 sbit ADDR1 = P1^1; // 外设地址线1 sbit ADDR2 = P1^2; // 外设地址线2 sbit ADDR3 = P1^3; // 外设地址线3 sbit ENLED = P1^4; // LED控制信号 #endif ``` #### 关键知识点: 1. **预处理指令**:`#ifndef`, `#define`, `#endif`用于避免重复包含头文件。 2. **类型定义**:通过`typedef`关键字定义了多种整型变量的别名,便于后续代码的编写与维护。 3. **宏定义**:`#define SYS_MCLK (11059200 / 12)`定义了系统的主时钟频率为921600Hz,这里采用的是内部振荡器,外部晶体振荡器频率为11.0592MHz,分频12得到921600Hz。 4. **特殊功能寄存器**:使用`reg52.h`头文件包含了对特殊功能寄存器的操作。 5. **特殊位定义**:使用`sbit`关键字定义了外设地址线和LED控制信号。 ### 二、主程序文件(main.c) #### 代码分析: ```c #define _MAIN_C #include "main.h" #include "config.h" #include "ledwater.h" void main() { ENLED = 0; // 禁用LED timer1_init(); // 初始化定时器1 while (1); // 主循环 } ``` #### 关键知识点: 1. **文件包含**:通过`#include`指令包含了必要的头文件。 2. **主函数**:`void main()`定义了程序的入口点。 3. **定时器初始化**:调用了`timer1_init()`函数来初始化定时器1,通常用于产生定时中断。 4. **主循环**:使用无限循环`while (1);`保持程序的持续运行。 ### 三、LED流水灯程序(ledwater.c) #### 代码分析: ```c #include "config.h" void main() { unsigned int i = 0; unsigned char dir = 0; // 方向标志 unsigned char shift = 0x01; // 移位寄存器初始值 ENLED = 0; // 禁用LED ADDR3 = 1; ADDR2 = 1; ADDR1 = 1; ADDR0 = 0; while (1) { P0 = ~shift; // 将移位寄存器的值反向后输出到P0口 for (i = 0; i < 20000; i++); // 延时 if (dir == 0) { shift = shift << 1; // 左移 if (shift == 0x80) dir = 1; // 达到最左端,改变方向 } else { shift = shift >> 1; // 右移 if (shift == 0x01) dir = 0; // 达到最右端,改变方向 } } } ``` #### 关键知识点: 1. **移位操作**:使用左移和右移操作实现LED的流水效果。 2. **延时函数**:通过循环计数实现了简单的软件延时。 3. **方向控制**:通过`dir`变量控制LED流动的方向。 4. **端口操作**:利用P0口输出数据,实现LED灯的亮灭。 ### 四、时间显示程序(ledtime.c) #### 代码分析: ```c #define _LEDTIME_C_ #include "config.h" #include "main.h" #include "ledtime.h" code uint8 number[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90}; uint8 a[4]; uint16 k = 0; void timer1_init(); void refresh_led(); void main() { timer1_init(); while (1); } void timer1_init() { /**/ P1E = 1; TMOD |= 0x10; TMOD &= 0xdf; TH1 = 0xFC; TL1 = 0x67; TR1 = 1; ET1 = 1; EA = 1; } void refresh_led() { static uint8 j = 0; switch (j) { case 0: P1A = 0; P1B = 0; P1C = 0; j++; P0 = number[a[0]]; break; case 1: P1A = 1; P1B = 0; P1C = 0; j++; P0 = number[a[1]]; break; case 2: P1A = 0; P1B = 1; P1C = 0; j++; P0 = number[a[2]]; break; case 3: P1A = 1; P1B = 1; P1C = 0; j = 0; P0 = number[a[3]]; break; default: break; } } void interrupt_timer1() interrupt 3 { static uint32 sec = 0; TH1 = 0xFC; TL1 = 0x67; k++; P0 = 0xFF; if (k == 100) { sec++; k = 0; a[0] = sec % 10; a[1] = sec / 10 % 6; a[2] = sec / 60 % 10; a[3] = sec / 600 % 6; } refresh_led(); } ``` #### 关键知识点: 1. **定时器配置**:通过配置定时器1的相关寄存器实现定时中断,每过一定时间触发一次中断。 2. **中断服务函数**:`void interrupt_timer1() interrupt 3`定义了定时器1的中断服务函数,实现定时更新秒表的时间。 3. **数字显示**:使用数组`number`存储数字0-9对应的7段码,通过P0口输出相应的7段码实现数字显示。 4. **刷新显示**:通过`refresh_led()`函数轮流显示各个数字,实现四位数字的动态显示效果。 以上就是从提供的代码片段中总结出的关键知识点,涵盖了51系列单片机的配置、定时器操作、LED控制等方面的基础知识。
- 粉丝: 0
- 资源: 3
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 学校课程软件工程常见10道题目以及答案demo
- javaweb新手开发中常见的目录结构讲解
- 新手小白的git使用的手册入门学习demo
- 基于Java观察者模式的info-express多对多广播通信框架设计源码
- 利用python爬取豆瓣电影评分简单案例demo
- 机器人开发中常见的几道问题以及答案demo
- 基于SpringBoot和layuimini的简洁美观后台权限管理系统设计源码
- 实验报告五六代码.zip
- hdw-dubbo-ui基于vue、element-ui构建开发,实现后台管理前端功能.zip
- (Grafana + Zabbix + ASP.NET Core 2.1 + ECharts + Dapper + Swagger + layuiAdmin)基于角色授权的权限体系.zip