51单片机基础练习源码
目录嵌入式 / 51单片机 / 基础练习格式ZIP大小33.3 KB
在线预览
28 个文件14 个目录112.2 KB 解压后大小
C7H5YML4UVOPT3UVPROJ3A513JSON2TXT1
查看完整目录 · 28 个文件
9.0 KB 51_oled/OLED_Font.h
7.3 KB 51_oled/oled.c
671 B 51_oled/oled.h
1.2 KB led_beep_relay_time/driver/hardware.c
273 B led_beep_relay_time/driver/hardware.h
6.3 KB led_beep_relay_time/main.uvopt
14.4 KB led_beep_relay_time/main.uvproj
6.2 KB led_beep_relay_time/STARTUP.A51
2.6 KB led_beep_relay_time/user/main.c
1.3 KB led_beep_relay_time/vscode/.eide/eide.yml
689 B led_beep_relay_time/vscode/.eide/files.options.yml
50 B led_beep_relay_time/vscode/.eide/stc.flash.json
1.2 KB led_beep_relay/driver/hardware.c
273 B led_beep_relay/driver/hardware.h
5.8 KB led_beep_relay/main.uvopt
14.4 KB led_beep_relay/main.uvproj
6.2 KB led_beep_relay/STARTUP.A51
1.7 KB led_beep_relay/user/main.c
308 B README.txt
1.2 KB Round_Robin/driver/hardware.c
273 B Round_Robin/driver/hardware.h
6.3 KB Round_Robin/main.uvopt
14.4 KB Round_Robin/main.uvproj
6.2 KB Round_Robin/STARTUP.A51
1.9 KB Round_Robin/user/main.c
1.3 KB Round_Robin/vscode/.eide/eide.yml
689 B Round_Robin/vscode/.eide/files.options.yml
50 B Round_Robin/vscode/.eide/stc.flash.json可读文件预览
README.txt308 B
51单片机基础练习源码
本压缩包由开源协会知识库从学习目录中自动精选生成。
已排除安装包、视频、编译缓存、目标文件、可执行文件、私钥和大型第三方依赖。
部分工程需要通过对应 IDE、SDK 或配置文件重新生成依赖后再编译。51_oled/oled.c7.3 KB
#include "OLED_Font.h"
/*引脚配置*/
sbit OLED_W_SCL=P2^0;
sbit OLED_W_SDA=P2^1;
/**
* @brief I2C开始
* @param 无
* @retval 无
*/
void OLED_I2C_Start(void)
{
OLED_W_SDA=1;
OLED_W_SCL=1;
OLED_W_SDA=0;
OLED_W_SCL=0;
}
/**
* @brief I2C停止
* @param 无
* @retval 无
*/
void OLED_I2C_Stop(void)
{
OLED_W_SDA=0;
OLED_W_SCL=1;
OLED_W_SDA=1;
}
void IIC_Wait_Ack()
{
OLED_W_SCL=1;
OLED_W_SCL=0;
}
/**
* @brief I2C发送一个字节
* @param Byte 要发送的一个字节
* @retval 无
*/
void OLED_I2C_SendByte(unsigned char Byte)
{
unsigned char i;
OLED_W_SCL=0;
for (i = 0; i < 8; i++)
{
OLED_W_SDA=Byte & (0x80 >> i);
OLED_W_SCL=1;
OLED_W_SCL=0;
}
}
/**
* @brief OLED写命令
* @param Command 要写入的命令
* @retval 无
*/
void OLED_WriteCommand(unsigned char Command)
{
OLED_I2C_Start();
OLED_I2C_SendByte(0x78); //从机地址
IIC_Wait_Ack();
OLED_I2C_SendByte(0x00); //写命令
IIC_Wait_Ack();
OLED_I2C_SendByte(Command);
IIC_Wait_Ack();
OLED_I2C_Stop();
}
/**
* @brief OLED写数据
* @param Data 要写入的数据
* @retval 无
*/
void OLED_WriteData(unsigned char Data)
{
OLED_I2C_Start();
OLED_I2C_SendByte(0x78); //从机地址
IIC_Wait_Ack();
OLED_I2C_SendByte(0x40); //写数据
IIC_Wait_Ack();
OLED_I2C_SendByte(Data);
IIC_Wait_Ack();
OLED_I2C_Stop();
}
/**
* @brief OLED设置光标位置
* @param Y 以左上角为原点,向下方向的坐标,范围:0~7
* @param X 以左上角为原点,向右方向的坐标,范围:0~127
* @retval 无
*/
void OLED_SetCursor(unsigned char Y, unsigned char X)
{
OLED_WriteCommand(0xB0 | Y); //设置Y位置
OLED_WriteCommand(0x10 | ((X & 0xF0) >> 4)); //设置X位置高4位
OLED_WriteCommand((X & 0x0F)); //设置X位置低4位
}
/**
* @brief OLED清屏
* @param 无
* @retval 无
*/
void OLED_Clear(void)
{
unsigned char i, j;
for (j = 0; j < 8; j++)
{
OLED_SetCursor(j, 0);
for(i = 0; i < 128; i++)
{
OLED_WriteData(0x00);
}
}
}
/**
* @brief OLED显示一个字符
* @param Line 行位置,范围:1~4
* @param Column 列位置,范围:1~16
* @param Char 要显示的一个字符,范围:ASCII可见字符
* @retval 无
*/
void OLED_ShowChar(unsigned char Line, unsigned char Column, char Char)
{
unsigned char i;
OLED_SetCursor((Line - 1) * 2, (Column - 1) * 8); //设置光标位置在上半部分
for (i = 0; i < 8; i++)
{
OLED_WriteData(OLED_F8x16[Char - ' '][i]); //显示上半部分内容
}
OLED_SetCursor((Line - 1) * 2 + 1, (Column - 1) * 8); //设置光标位置在下半部分
for (i = 0; i < 8; i++)
{
OLED_WriteData(OLED_F8x16[Char - ' '][i + 8]); //显示下半部分内容
}
}
/**
* @brief OLED显示字符串
* @param Line 起始行位置,范围:1~4
* @param Column 起始列位置,范围:1~16
* @param String 要显示的字符串,范围:ASCII可见字符
* @retval 无
*/
void OLED_ShowString(unsigned char Line, unsigned char Column, char *String)
{
unsigned char i;
for (i = 0; String[i] != '\0'; i++)
{
OLED_ShowChar(Line, Column + i, String[i]);
}
}
/**
* @brief OLED次方函数
* @retval 返回值等于X的Y次方
*/
unsigned int OLED_Pow(unsigned int X, unsigned int Y)
{
unsigned int Result = 1;
while (Y--)
{
Result *= X;
}
return Result;
}
/**
* @brief OLED显示数字(十进制,正数)
* @param Line 起始行位置,范围:1~4
* @param Column 起始列位置,范围:1~16
* @param Number 要显示的数字,范围:0~4294967295
* @param Length 要显示数字的长度,范围:1~10
* @retval 无
*/
void OLED_ShowNum(unsigned char Line, unsigned char Column, unsigned int Number, unsigned char Length)
{
unsigned char i;
for (i = 0; i < Length; i++)
{
OLED_ShowChar(Line, Column + i, Number / OLED_Pow(10, Length - i - 1) % 10 + '0');
}
}
/**
* @brief OLED显示数字(十进制,带符号数)
* @param Line 起始行位置,范围:1~4
* @param Column 起始列位置,范围:1~16
* @param Number 要显示的数字,范围:-2147483648~2147483647
* @param Length 要显示数字的长度,范围:1~10
* @retval 无
*/
void OLED_ShowSignedNum(unsigned char Line, unsigned char Column, int Number, unsigned char Length)
{
unsigned char i;
unsigned int Number1;
if (Number >= 0)
{
OLED_ShowChar(Line, Column, '+');
Number1 = Number;
}
else
{
OLED_ShowChar(Line, Column, '-');
Number1 = -Number;
}
for (i = 0; i < Length; i++)
{
OLED_ShowChar(Line, Column + i + 1, Number1 / OLED_Pow(10, Length - i - 1) % 10 + '0');
}
}
/**
* @brief OLED显示数字(十六进制,正数)
* @param Line 起始行位置,范围:1~4
* @param Column 起始列位置,范围:1~16
* @param Number 要显示的数字,范围:0~0xFFFFFFFF
* @param Length 要显示数字的长度,范围:1~8
* @retval 无
*/
void OLED_ShowHexNum(unsigned char Line, unsigned char Column, unsigned int Number, unsigned char Length)
{
unsigned char i, SingleNumber;
for (i = 0; i < Length; i++)
{
SingleNumber = Number / OLED_Pow(16, Length - i - 1) % 16;
if (SingleNumber < 10)
{
OLED_ShowChar(Line, Column + i, SingleNumber + '0');
}
else
{
OLED_ShowChar(Line, Column + i, SingleNumber - 10 + 'A');
}
}
}
/**
* @brief OLED显示数字(二进制,正数)
* @param Line 起始行位置,范围:1~4
* @param Column 起始列位置,范围:1~16
* @param Number 要显示的数字,范围:0~1111 1111 1111 1111
* @param Length 要显示数字的长度,范围:1~16
* @retval 无
*/
void OLED_ShowBinNum(unsigned char Line, unsigned char Column, unsigned int Number, unsigned char Length)
{
unsigned char i;
for (i = 0; i < Length; i++)
{
OLED_ShowChar(Line, Column + i, Number / OLED_Pow(2, Length - i - 1) % 2 + '0');
}
}
/**
* @brief OLED初始化
* @param 无
* @retval 无
*/
void OLED_Init(void)
{
OLED_WriteCommand(0xAE); //关闭显示
OLED_WriteCommand(0xD5); //设置显示时钟分频比/振荡器频率
OLED_WriteCommand(0x80);
OLED_WriteCommand(0xA8); //设置多路复用率
OLED_WriteCommand(0x3F);
OLED_WriteCommand(0xD3); //设置显示偏移
OLED_WriteCommand(0x00);
OLED_WriteCommand(0x40); //设置显示开始行
OLED_WriteCommand(0xA1); //设置左右方向,0xA1正常 0xA0左右反置
OLED_WriteCommand(0xC8); //设置上下方向,0xC8正常 0xC0上下反置
OLED_WriteCommand(0xDA); //设置COM引脚硬件配置
OLED_WriteCommand(0x12);
OLED_WriteCommand(0x81); //设置对比度控制
OLED_WriteCommand(0xCF);
OLED_WriteCommand(0xD9); //设置预充电周期
OLED_WriteCommand(0xF1);
OLED_WriteCommand(0xDB); //设置VCOMH取消选择级别
OLED_WriteCommand(0x30);
OLED_WriteCommand(0xA4); //设置整个显示打开/关闭
OLED_WriteCommand(0xA6); //设置正常/倒转显示
OLED_WriteCommand(0x8D); //设置充电泵
OLED_WriteCommand(0x14);
OLED_WriteCommand(0xAF); //开启显示
OLED_Clear(); //OLED清屏
}
led_beep_relay_time/driver/hardware.c1.2 KB
#include "hardware.h"
// LED控制函数
void LED_Control(unsigned char state)
{
/***************开门*****************/
P2&=0x1F; //将P2口高三位清零
P2|=0x80; //将P27设置为高电平P26,P25为低电平,选择控制LED的Y4对应的锁存器
//0x80=1000 0000
/****************送“外卖”*****************/
P0 = state; //将state的值送到P0口
/***************关门*****************/
P2&=0x1F; //将P2口高三位清零
}
// 蜂鸣器和继电器控制函数
void BEEP_Relay_Control(unsigned char BEEP_state, unsigned char Relay_state)
{
/***************开门****************/
P2&=0x1F; //将P2口高三位清零
P2|=0xa0; //将P27,P26设置为高电平,选择控制蜂鸣器和继电器的Y5对应的锁存器
//0xA0=1010 0000
/***************送“外卖”*****************/
P0=0X00; //先将P0口清零
if(BEEP_state==ON)
P0|=0x40; //0x40=0100 0000 将P06位置高电平,控制蜂鸣器鸣叫
else
P0&=~0x40; //将P06位置低电平,控制蜂鸣器停止鸣叫
if(Relay_state==ON)
P0|=0x10; //0x10=0001 0000 将P04位置高电平,控制继电器吸合
else
P0&=~0x10; //将P04位置低电平,控制继电器释放
/***************关门*****************/
P2=P2&0x1f;
}led_beep_relay/driver/hardware.c1.2 KB
#include "hardware.h"
// LED控制函数
void LED_Control(unsigned char state)
{
/***************开门*****************/
P2&=0x1F; //将P2口高三位清零
P2|=0x80; //将P27设置为高电平P26,P25为低电平,选择控制LED的Y4对应的锁存器
//0x80=1000 0000
/****************送“外卖”*****************/
P0 = state; //将state的值送到P0口
/***************关门*****************/
P2&=0x1F; //将P2口高三位清零
}
// 蜂鸣器和继电器控制函数
void BEEP_Relay_Control(unsigned char BEEP_state, unsigned char Relay_state)
{
/***************开门****************/
P2&=0x1F; //将P2口高三位清零
P2|=0xa0; //将P27,P26设置为高电平,选择控制蜂鸣器和继电器的Y5对应的锁存器
//0xA0=1010 0000
/***************送“外卖”*****************/
P0=0X00; //先将P0口清零
if(BEEP_state==ON)
P0|=0x40; //0x40=0100 0000 将P06位置高电平,控制蜂鸣器鸣叫
else
P0&=~0x40; //将P06位置低电平,控制蜂鸣器停止鸣叫
if(Relay_state==ON)
P0|=0x10; //0x10=0001 0000 将P04位置高电平,控制继电器吸合
else
P0&=~0x10; //将P04位置低电平,控制继电器释放
/***************关门*****************/
P2=P2&0x1f;
}Round_Robin/driver/hardware.c1.2 KB
#include "hardware.h"
// LED控制函数
void LED_Control(unsigned char state)
{
/***************开门*****************/
P2&=0x1F; //将P2口高三位清零
P2|=0x80; //将P27设置为高电平P26,P25为低电平,选择控制LED的Y4对应的锁存器
//0x80=1000 0000
/****************送“外卖”*****************/
P0 = state; //将state的值送到P0口
/***************关门*****************/
P2&=0x1F; //将P2口高三位清零
}
// 蜂鸣器和继电器控制函数
void BEEP_Relay_Control(unsigned char BEEP_state, unsigned char Relay_state)
{
/***************开门****************/
P2&=0x1F; //将P2口高三位清零
P2|=0xa0; //将P27,P26设置为高电平,选择控制蜂鸣器和继电器的Y5对应的锁存器
//0xA0=1010 0000
/***************送“外卖”*****************/
P0=0X00; //先将P0口清零
if(BEEP_state==ON)
P0|=0x40; //0x40=0100 0000 将P06位置高电平,控制蜂鸣器鸣叫
else
P0&=~0x40; //将P06位置低电平,控制蜂鸣器停止鸣叫
if(Relay_state==ON)
P0|=0x10; //0x10=0001 0000 将P04位置高电平,控制继电器吸合
else
P0&=~0x10; //将P04位置低电平,控制继电器释放
/***************关门*****************/
P2=P2&0x1f;
}led_beep_relay_time/user/main.c2.6 KB
#include <STC15F2K60S2.H>
#include "hardware.h"
#include "intrins.h"
void Delay500ms(void) //@12.000MHz
{
unsigned char data i, j, k;
_nop_();
_nop_();
i = 23;
j = 205;
k = 120;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
unsigned char LED_State = 0xFF; //LED状态变量
unsigned char BEEP_State = OFF; //蜂鸣器状态变量
unsigned char Relay_State = OFF; //继电器状态变量
int i = 0;
int time1s=0;
void Timer0_Init(void) //1毫秒@12.000MHz
{
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x18; //设置定时初始值
TH0 = 0xFC; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
EA=1; //打开总中断
ET0 = 1; //使能定时器0中断
}
void main(void)
{
Timer0_Init();
while(1)
{
for(i=0;i<9;i++)
{
LED_State&=(0xff<<i); //依次点亮LED
LED_Control(LED_State); //调用LED控制函数
// if(i%2==0) //当i为偶数时,蜂鸣器开启,继电器关闭
// {
// BEEP_State=ON; //蜂鸣器开启
// Relay_State=OFF; //继电器关闭
// }
// else //当i为奇数时,蜂鸣器关闭,继电器开启
// {
// BEEP_State=OFF; //蜂鸣器关闭
// Relay_State=ON; //继电器开启
// }
// BEEP_Relay_Control(BEEP_State, Relay_State); //蜂鸣器开启,继电器关闭
Delay500ms(); //延时500毫秒
}
for(i=0;i<9;i++)
{
LED_State|=~(0xff>>i); //依次熄灭LED
LED_Control(LED_State); //调用LED控制函数
// if(i%2==0) //当i为偶数时,蜂鸣器开启,继电器关闭
// {
// BEEP_State=OFF; //蜂鸣器开启
// Relay_State=ON; //继电器关闭
// }
// else //当i为奇数时,蜂鸣器关闭,继电器开启
// {
// BEEP_State=ON; //蜂鸣器关闭
// Relay_State=OFF; //继电器开启
// }
// BEEP_Relay_Control(BEEP_State, Relay_State); //蜂鸣器开启,继电器关闭
Delay500ms(); //延时500毫秒
}
}
}
bit beep_relay_flag=0;
void Timer0_Isr(void) interrupt 1
{
if(time1s++>=1000)
{
if(beep_relay_flag == 0)
{
BEEP_State=ON; //蜂鸣器开启
Relay_State=OFF; //继电器关闭
BEEP_Relay_Control(BEEP_State, Relay_State); //蜂鸣器开启,继电器关闭
beep_relay_flag = 1;
}
else if(beep_relay_flag == 1)
{
BEEP_State=OFF; //蜂鸣器关闭
Relay_State=ON; //继电器开启
BEEP_Relay_Control(BEEP_State, Relay_State); //蜂鸣器关闭,继电器开启
beep_relay_flag = 0;
}
time1s=0;
}
}
