基于C51单片机控制的L9110风扇代码
时间: 2023-10-03 22:05:34 浏览: 95
以下是一个基于C51单片机控制L9110风扇的示例代码:
```c
#include <reg51.h>
sbit IN1 = P1^0; // 定义引脚
sbit IN2 = P1^1;
void delay(unsigned int time_ms) {
unsigned int i, j;
for(i = 0; i < time_ms; i++)
for(j = 0; j < 112; j++);
}
void main() {
while(1) {
// 启动风扇
fanOn();
delay(5000); // 延迟5秒
// 停止风扇
fanOff();
delay(5000); // 延迟5秒
}
}
// 打开风扇
void fanOn() {
IN1 = 1;
IN2 = 0;
}
// 关闭风扇
void fanOff() {
IN1 = 0;
IN2 = 0;
}
```
请注意,该代码假设你已将L9110模块的IN1引脚连接到C51单片机的P1.0引脚,IN2引脚连接到P1.1引脚。你可以根据实际情况进行调整。确保在使用该代码之前,你已经正确地连接了C51单片机与L9110风扇驱动模块。
相关问题
基于c51单片机温度报警器设计代码
基于C51单片机设计温度报警器的代码主要包括两个模块:温度传感器模块和报警模块。
温度传感器模块的代码如下:
```C
#include <regx51.h> // 包含C51单片机头文件
sbit tempSensor = P2^1; // 温度传感器连接P2.1引脚
void delay(unsigned int time) // 延时函数
{
unsigned int i, j;
for (i = time; i > 0; i--)
for(j = 110; j > 0; j--);
}
unsigned int getTemperature() // 获取温度函数
{
unsigned int temperature = 0;
while(tempSensor); // 等待温度传感器准备就绪
EA = 0;
tempSensor = 0; // 向温度传感器发送请求信号
delay(18); // 等待温度传感器响应
tempSensor = 1; // 停止发送请求信号
delay(20); // 等待温度传感器发送温度数据
if(tempSensor) // 检查温度传感器是否发送完整温度数据
{
temperature = 127; // 温度传感器数据错误,设置温度为最大值
}
else
{
int i;
for(i = 0; i < 8; i++)
{
temperature >>= 1; // 温度数据从最高位开始存储
tempSensor = 1; // 等待温度传感器发送下一位数据
delay(2);
if(tempSensor) // 检查温度传感器发送的位是否为高电平
{
temperature |= 0x80; // 若为高电平,则将对应位设置为1
}
delay(2);
tempSensor = 0; // 温度传感器发送下一位
}
}
EA = 1;
return temperature; // 返回温度数据
}
```
报警模块的代码如下:
```C
#include <regx51.h> // 包含C51单片机头文件
sbit buzzer = P3^5; // 警报器连接P3.5引脚
void checkTemperature() // 检查温度函数
{
unsigned int temperature = getTemperature(); // 获取温度数据
if(temperature > 30) // 判断温度是否超过阈值
{
buzzer = 1; // 警报器鸣响
}
else
{
buzzer = 0; // 关闭警报器
}
}
void main() // 主函数
{
while(1)
{
checkTemperature(); // 检查温度
}
}
```
以上代码实现了基于C51单片机的温度报警器功能,通过温度传感器模块获取温度数据,并采用报警模块对温度进行实时监测和判断,若温度超过指定阈值则触发报警器。在主函数中,通过循环不断调用检查温度函数实现持续报警器监测温度。
基于C51单片机控制的OLED12864屏幕的显示代码
以下是一个基于C51单片机控制OLED 12864屏幕的显示代码的示例:
```c
#include <reg51.h>
#include <intrins.h>
#define LCD_SCL P1_0 // OLED串行时钟线
#define LCD_SDA P1_1 // OLED串行数据线
void delay_us(unsigned int t) {
while(t--);
}
void OLED_write_cmd(unsigned char cmd) {
LCD_SCL = 0;
LCD_SDA = 0;
LCD_SCL = 1;
LCD_SDA = 0;
LCD_SCL = 0;
_nop_();
for(int i = 0; i < 8; i++) {
LCD_SDA = (cmd >> i) & 0x01;
LCD_SCL = 1;
_nop_();
LCD_SCL = 0;
_nop_();
}
}
void OLED_write_data(unsigned char dat) {
LCD_SCL = 0;
LCD_SDA = 1;
LCD_SCL = 1;
LCD_SDA = 0;
LCD_SCL = 0;
_nop_();
for(int i = 0; i < 8; i++) {
LCD_SDA = (dat >> i) & 0x01;
LCD_SCL = 1;
_nop_();
LCD_SCL = 0;
_nop_();
}
}
void OLED_init() {
OLED_write_cmd(0xAE); // 关闭OLED显示
OLED_write_cmd(0x00); // 设置低列地址
OLED_write_cmd(0x10); // 设置高列地址
OLED_write_cmd(0x40); // 设置显示开始行
OLED_write_cmd(0xB0); // 设置页地址
OLED_write_cmd(0x81); // 设置对比度控制
OLED_write_cmd(0xCF); // 设置电荷泵倍率
OLED_write_cmd(0xA1); // 设置段重新映射
OLED_write_cmd(0xA6); // 设置正常/反向显示
OLED_write_cmd(0xA8); // 设置多重比例
OLED_write_cmd(0x3F); // 设置MUX比率
OLED_write_cmd(0xC8); // 设置COM扫描方向
OLED_write_cmd(0xD3); // 设置显示偏移
OLED_write_cmd(0x00); // 不偏移
OLED_write_cmd(0xD5); // 设置显示时钟分频
OLED_write_cmd(0x80); // 100分频
OLED_write_cmd(0xD9); // 设置预充电周期
OLED_write_cmd(0xF1); // PHASE 1: 2D, PHASE 2: 5D
OLED_write_cmd(0xDA); // 设置COM引脚硬件配置
OLED_write_cmd(0x12);
OLED_write_cmd(0xDB); // 设置VCOMH电压倍率
OLED_write_cmd(0x40);
OLED_write_cmd(0x8D); // 设置电荷泵使能/禁用
OLED_write_cmd(0x14);
OLED_write_cmd(0xAF); // 打开OLED显示
}
void OLED_clear() {
for(int i = 0; i < 8; i++) {
OLED_write_cmd(0xB0 + i);
OLED_write_cmd(0x00);
OLED_write_cmd(0x10);
for(int j = 0; j < 128; j++)
OLED_write_data(0x00);
}
}
void OLED_display(unsigned char page, unsigned char column, unsigned char *text) {
OLED_write_cmd(0xB0 + page);
OLED_write_cmd(((column & 0xF0) >> 4) | 0x10);
OLED_write_cmd(column & 0x0F);
for(int i = 0; i < 8; i++)
OLED_write_data(text[i]);
}
void main() {
OLED_init();
OLED_clear();
unsigned char text[8] = {
0x00, 0x3C, 0x42, 0x42, 0x3C, 0x00, 0x00, 0x00
};
OLED_display(0, 0, text);
while(1);
}
```
请注意,该代码假设你已将OLED 12864屏幕的串行时钟线连接到C51单片机的P1.0引脚,串行数据线连接到P1.1引脚。你可以根据实际情况进行调整。确保在使用该代码之前,你已经正确地连接了C51单片机与OLED 12864屏幕。