1,364
社区成员




中国中国大学生开发C51单片机博客
在现代科技发展日新月异的时代,单片机技术在各个领域发挥着重要作用。作为一名中国大学生,我有幸学习并参与了C51单片机的开发工作。在这篇博客中,我将分享我在开发C51单片机过程中所遇到的挑战和收获。
C51单片机是一种广泛应用于嵌入式系统中的微控制器,具有强大的数据处理能力和丰富的外设接口。我在大学期间参与了一个项目,旨在开发一个基于C51单片机的智能家居控制系统。这个系统可以通过手机APP或者语音指令控制家庭中的各种设备,如灯光、电视、空调等。
在项目开始之初,我首先学习了C语言和汇编语言的基础知识,这是编写C51单片机程序的基础。然后,我深入学习了C51单片机的体系结构和编程方式。通过掌握C语言和汇编语言的技巧,我能够编写出高效、稳定的单片机程序。
在项目的硬件设计方面,我学习了电路设计和PCB布局的基本知识。我使用Altium Designer这样的软件工具进行原理图绘制和PCB设计。同时,我还学习了焊接和调试电路的技巧,
c 51 单片机相关概念
C51单片机是一种经典的8位嵌入式微控制器,它具有以下相关概念:
1. CPU:中央处理器,是单片机的核心部件,负责执行指令并控制系统的运行。
2. ROM:只读存储器,用于存储程序代码。
3. RAM:随机存取存储器,用于存储临时数据和程序变量。
4. I/O口:输入/输出端口,用于连接单片机与外部设备之间的数据传输。
5. 中断系统:用于处理单片机内部和外部事件的优先级管理。
6. 定时器/计数器:用于计时、计数、脉冲宽度调制等应用。
7. 串口通信:用于单片机与其他设备之间的数据通信。
8. 模拟多路转换器:用于将多个模拟信号转换为单个数字信号。
9. A/D转换器:模拟到数字转换器,用于将模拟信号转换为数字信号。
10. 显示驱动电路:用于控制显示器上的像素点的亮灭状态。
11. 脉宽调制电路:用于控制信号的占空比,从而改变信号的波形形状。
12. 模拟多路转换器和A/D转换器:用于将模拟信号转换为数字信号,以便进行数字处理。
这些概念是C51单片机硬件结构的重要组成部分,它们的组合和使用可以实现各种嵌入式应用程序。
学习C51单片机可能会遇到以下难懂的点:
1. 汇编语言:C51单片机使用汇编语言编写程序,对于初学者来说,汇编语言的语法和指令集可能会比较难以理解。
2. 中断系统:中断系统是单片机内部和外部事件的优先级管理系统,需要理解优先级、中断向量表、中断优先级等概念。
3. 定时器/计数器:定时器/计数器用于计时、计数、脉冲宽度调制等应用,需要理解计数器、定时器、模式寄存器等概念。
4. 串口通信:串口通信是单片机与其他设备之间的数据通信方式之一,需要理解波特率、数据位、停止位等概念以及串口的寄存器配置。
5. 显示驱动电路:显示驱动电路用于控制显示器上的像素点的亮灭状态,需要理解像素点的工作原理、驱动电路的设计等概念。
6. 模拟多路转换器和A/D转换器:模拟多路转换器和A/D转换器用于将模拟信号转换为数字信号,需要理解模拟信号的特性、转换器的工作原理等概念。
7. 中断处理程序:中断处理程序是单片机内部或外部事件发生时自动执行的程序,需要理解中断向量表、中断优先级等概念。
8. 编程方法:C51单片机的编程方法与其他编程语言不同,需要掌握一些特殊的编程技巧和方法,例如中断程序的编写、中断处理程序的嵌套
c51单片机流水灯开发点亮
#include <reg52.h>
#define uchar unsigned char // UINT8, u8
#define uint unsigned int // UINT16, u16
#define GPIO P0
#define GPIO2 P2
#define XMS 5
float temp = 21.5; // temp*10 = 215
uchar SEG_Code[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E};
uint Temp_Buffer[4] = {0, 0, 0, 0}; // 温度数据的缓冲区
uchar SEG_Bit[4] = {0xFE, 0xFD, 0xFB, 0xF7}; // 数码管位选端位码
void delay_xms(uint xms);
void Data_Process();
void main(void)
{
uchar i;
GPIO = 0xFF; // 初始化端口
GPIO2 = 0xFF;
while(1)
{
Data_Process();
for(i=0; i<4; i++)
{
if(i == 2)
GPIO = SEG_Code[Temp_Buffer[i]] & 0x7F; // 80: 0111 1111
else
GPIO = SEG_Code[Temp_Buffer[i]];
GPIO2 = SEG_Bit[i];
delay_xms(XMS);
GPIO = 0xFF; // 消隐
}
}
}
void Data_Process()
{
Temp_Buffer[3] = (int)(temp*10) / 100; // 2
Temp_Buffer[2] = (int)(temp*10) % 100 / 10; // 1
Temp_Buffer[1] = (int)(temp*10) % 10; // 5
Temp_Buffer[0] = 12; // C
}
void delay_xms(uint xms)
{
uint i;
while(xms--)
{
for(i=0; i<234; i++);
}
}
l 流水灯连续点亮代码
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit KEY1 = P3^1;
sbit LED1 = P2^0;
uchar KeyFlag; // 声明按键的标志位:为1时按下,为0时没按下
void Key_Scan(); // 声明按键扫描函数
void delay_xms(uint xms);
void main(void)
{
P2 = 0xFF;
P3 = 0xFF;
while(1)
{
Key_Scan();
/*if(KeyFlag == 0)
{
LED1 = 1;
}
else
{
LED1 = 0;
KeyFlag = 0;
}*/
if(KeyFlag == 1)
{
LED1 = ~LED1;
delay_xms(200);
}
}
}
void Key_Scan()
{
if(KEY1 == 0)
{
delay_xms(10);
if(KEY1 == 0)
{
KeyFlag = 1; // 识别了按键已按下,锁定按键按下状态
}
}
else
{
KeyFlag = 0;
}
}
void delay_xms(uint xms)
{
uint i;
while(xms--)
{
for(i=0; i<234; i++);
}
}