手把手教你做基于stm32的红外、语音、按键智能灯光控制(下)

目录:

    • 4.6. DHT11温湿度传感器模块
    • 4.7. 语音识别模块
    • 4.7. OLED显示屏模块
  • 5. 不同的工作模式
  • 6. 总结

在接着(上)写之前,首先来看一下效果:
链接: link

需要源码什么的可以私信我哦

4.6. DHT11温湿度传感器模块

这个模块主要就是用来监测环境温度的,没有什么其他的作用
.c文件

#include "stm32f10x.h"
#include "dht11.h"
#include "delay.h"uint8_t dat[5]={0x00,0x00,0x00,0x00,0x00};    //存储读取的温湿度信息
uint32_t sum=0;         //存放校验时的求和/****************************************
设置PB12端口为输出
*****************************************/
void DHT11_PortOutput(void)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//推挽输出GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//输出50MHzGPIO_Init(GPIOB,&GPIO_InitStructure);
}/****************************************
设置PB12端口为输入
*****************************************/
void DHT11_PortInput(void)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;//推挽输出GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//输出50MHzGPIO_Init(GPIOB,&GPIO_InitStructure);
}/****************************************
函数名称:void DHT_Read_Byte()
函数功能:对DHT的数据中的一个字节读取函数
输入参数:无
返回值:无
*****************************************/
uint8_t DHT_Read_Byte(void)
{uint8_t temp;      //存放读取到的位数据uint8_t ReadDat = 0;uint8_t i;uint8_t retry = 0;for(i=0;i<8;i++){while(DHT11 ==0 && retry < 100)     //等待DHT11输出高电平{delay_us(1);retry++;}retry = 0;delay_us(30);          //延时30us,由于‘0’代码高电平时间26~28us,'1'代码高电平时间70us,延时30us可判断出是1,还是0temp = 0;             //先将寄存器清零if(DHT11 ==1)        //延时30us之后如果还是高电平,证明为1代码temp = 1;            //将1存储while(DHT11 ==1 && retry < 100)      //等待信号被拉低,跳出{delay_us(1);retry++;			}retry = 0;ReadDat<<=1;           //数据左移1位,存放新得到的数据ReadDat|= temp;         //新得到的数据放到最后1位}return ReadDat;
}/*********************************************
函数名称:unsigned char DHT_Read()
函数功能:读取DHT11的温湿度
输入参数:无
返回值: flag--数据读取、校验成功标志
*********************************************/
uint8_t DHT_Read(void)
{uint8_t i;uint8_t retry = 0;DHT11_PortOutput();           //端口方向设置为输出DHT11_LOW;           //端口数据拉低delay_ms(18);          //延时18ms,时序要求DHT11_HIGH;           //端口数据拉高delay_us(40);          //延时40us,DHT11_PortInput();           //方向设置为输入delay_us(20);          //延时20usif(DHT11 ==0)          //如果读取到低电平,证明DHT11响应{while(DHT11 ==0 && retry < 100)  //等待变高电平{delay_us(1);retry++;				}retry = 0;while(DHT11 ==1 && retry < 100) //等待变低电平{delay_us(1);retry++;	}retry = 0;for(i=0;i<5;i++)    //循环5次将40位读出{dat[i] = DHT_Read_Byte();    //读出1个字节}delay_us(50);         //最后延时等待50us}sum=dat[0]+dat[1]+dat[2]+dat[3];     //前4个字节数据的和if(dat[4]==(u8)(sum))     //前4个数据和的末8位要和第5个数据相等,才算读取正确{return 1;                  //校验正确,返回1}elsereturn 0;                  //校验错误,返回0
}

.h文件

#ifndef  __DHT11_H__
#define  __DHT11_H__#define  DHT11  GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_12)
#define  DHT11_HIGH  GPIO_SetBits(GPIOB,GPIO_Pin_12)
#define  DHT11_LOW  GPIO_ResetBits(GPIOB,GPIO_Pin_12)void DHT11_PortOutput(void);
void DHT11_PortInput(void);
uint8_t DHT_Read_Byte(void);
uint8_t DHT_Read(void);#endif

4.7. 语音识别模块

这里要注意,语音识别模块本身也是一个51单片机,所以说这个语音识别模块的代码仅仅是语音模块的51单片机与stm32进行交互的代码,并不是51单片机的代码,但是一般来讲,商家给你发货以后,都会在里面提前烧录上代码,所以我们不用去管51里面的代码。
.c文件

#include "stm32f10x.h"                  // Device header
#include "voice.h"/*
PB10   :TXD
PB11   : RXD
*/
extern uint32_t flag_led_on_off;
//变量引用
//变量声明
u8 RXBUF[20];       //串口存储数组
u8 RXOVER=0;        //串口接收标志位
u8 RXCOUNT=0;       //串口计数变量  
u8 i;               //清空数组变量//串口IO初始化函数
void USART3_Init(u32 bound)
{GPIO_InitTypeDef GPIO_InitStructure;         //IO端口的初始化USART_InitTypeDef USART_InitStructure;			 //串口的初始化NVIC_InitTypeDef NVIC_InitStructure;         //使能中断接收RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);  //使能IO端口的时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE); //使能串口的时钟 //发送GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_10;  //发送引脚GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);//接收GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_11;  //接收引脚GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_InitStructure);USART_InitStructure.USART_BaudRate = bound;    //设置传输的波特率USART_InitStructure.USART_WordLength = USART_WordLength_8b;  //设置传输一帧数据的数据位USART_InitStructure.USART_StopBits = USART_StopBits_1;       //一位停止位USART_InitStructure.USART_Parity = USART_Parity_No;					 //无奇偶校验位USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;  //能使接收的发送USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;  //无硬件流控制USART_Init(USART3,&USART_InitStructure);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);          //优先级分组NVIC_InitStructure.NVIC_IRQChannel= USART3_IRQn;         //开启串口2的中断NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =0; //抢占优先级NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;       //响应优先级NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);USART_ITConfig(USART3,USART_IT_RXNE,ENABLE); //使能串口接收USART_Cmd(USART3,ENABLE);               //使能串口2}/*
函数名:USART3中断服务函数
功能:  接收数据
注意:接收数据长度可调:RXCOUNT
*/
void USART3_IRQHandler(void)
{u8 temp;if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET){USART_ClearITPendingBit(USART3,USART_IT_RXNE);temp = USART_ReceiveData(USART3);if(temp == '\n' || RXCOUNT == 20)   //判断是否接收到一个完整字符{RXCOUNT = 0;RXOVER =1;    //接收数据完成标志位置1USART_ITConfig(USART3,USART_IT_RXNE,DISABLE);//失能串口接收中断标志	}else{RXBUF[RXCOUNT] = temp;   //依次存放到数组中RXCOUNT++;		           //字符长度变化}}
}//串口处理函数
void USART_Deal(void)
{if(RXOVER){RXOVER = 0;    //清除接收标志位switch(RXBUF[0]-48){case   1:flag_led_on_off=1;   //点亮小灯break;case   2:flag_led_on_off=0; //熄灭小灯break;	default: break;			}for(i=0;i<20;i++)            //将已接收数据的数组清空:共20个字符长度{RXBUF[i] = 0;          	 //重置数据缓存区}USART_ITConfig(USART3,USART_IT_RXNE,ENABLE);//始能串口接收 }
}

.h文件

#ifndef    __VOICE_H
#define   __VOICE_Hvoid USART3_Init(u32 bound);
void USART_Deal(void);#endif

如果51单片机里面没有代码,就要使用串口工具进行烧录,需要问商家要源码,然后将hex文件烧录到里面。

4.7. OLED显示屏模块

OLED显示模块主要是用来显示和调试用的

OLED显示程序包括字库程序太大,放到以下链接中去下载,下载设置了0积分。
https://download.csdn.net/download/nbbskk/87238933

5. 不同的工作模式

以上第四章节完成了各个模块的驱动程序,那么接下来就要实现手动模式、自动模式和模式切换的代码了。

模式切换:

  1. 当最小系统板上电以后,自动进入模式选择界面,通过按键和红外遥控器可以进行模式的选择,选择的模式可用通过显示屏显示。
  2. 在选择完成相应的模式以后,也可以通过按键或者红外遥控器选择进入手动模式或者自动模式,进入相应模式以后,就可以执行相应的功能。
  3. 当进入相应模式以后,如果想要切换模式,可以通过手动退出,然后继续在模式选择界面进行选择。

.c文件

#include "stm32f10x.h"                  // Device header
#include "oled.h"
#include "mode_option.h"
#include "auto_mode.h"
#include "manu_mode.h"
#include "remote.h"extern uint32_t flag_auto_manu;
extern uint32_t flag_in_system;
uint32_t flag_break_mode=0;void mode_option_show(void)//文字显示
{OLED_ShowChinese(35,0,0,16,1);//选OLED_ShowChinese(51,0,1,16,1);//择OLED_ShowChinese(67,0,2,16,1);//模OLED_ShowChinese(83,0,3,16,1);//式OLED_Refresh();
}void auto_manu_option(void)//选择自动模式或者手动模式的函数
{if(flag_auto_manu==0){OLED_ShowChinese(50,30,4,16,1);//手OLED_ShowChinese(66,30,5,16,1);//动OLED_Refresh();}else{OLED_ShowChinese(50,30,6,16,1);//自OLED_ShowChinese(66,30,5,16,1);//动OLED_Refresh();	}}void system_in_auto_manu(void)//选择是否进入系统的函数
{if(flag_auto_manu==0&&flag_in_system==1)//如果手自动标志位为0并且进入系统标志位为1,则进入手动模式{flag_break_mode=0;//退出标志位置为0flag_in_system=0;//进入系统标志位置为0manu_mode_init();//手动模式初始化manu_go();//手动模式运行}else if(flag_auto_manu==1&&flag_in_system==1)//如果手自动标志位为1并且进入系统标志位为1,则进入自动模式{flag_break_mode=0;flag_in_system=0;auto_mode_init();auto_go();}
}

.h文件

#ifndef   __MODE_OPTION_H
#define  __MODE_OPTION_Hvoid mode_option_show(void);
void auto_manu_option(void);
void system_in_auto_manu(void);#endif

手动模式:

  1. 红外控制模式:使用带有红外遥控器的用户可以通过遥控器来对智能灯光进行控制。用户可以通过遥控器上的按键来打开/关闭灯光。
  2. 语音控制模式:使用语音助手的用户可以通过语音命令来控制智能灯光。用户可以说出指令,如“开灯”、“关灯”等,系统会解析语音指令并执行相应的操作。
  3. 按键控制模式:用户可以通过智能灯光控制系统配备的按键来控制灯光。
    .c文件
#include "stm32f10x.h"                  // Device header
#include "manu_mode.h"
#include "LED.h"
#include "remote.h"
#include "dht11.h"
#include "oled.h"
#include "voice.h"extern uint32_t flag_break_mode;
extern uint32_t flag_led_on_off;
extern uint8_t dat[5];//存放温度数值void manu_mode_init(void)
{LED_Init();//led灯初始化USART3_Init(9600);//语音模块初始化OLED_Clear();OLED_ShowChinese(0,0,7,16,1);//灯OLED_ShowChinese(16,0,8,16,1);//光OLED_ShowChar(32,0,':',16,1);OLED_ShowChinese(0,16,9,16,1);//温OLED_ShowChinese(16,16,10,16,1);//度OLED_ShowChar(32,16,':',16,1);
}void manu_go(void)
{flag_led_on_off=0;//进入模式后,默认关灯while(1){remote_receive();//循环检测红外遥控USART_Deal();//循环检测语音模块if(flag_break_mode==1)//判断是否需要退出{flag_break_mode=0;OLED_Clear();break;}if(flag_led_on_off==0)//如果LED灯标志位为0,LED灯关闭{LED1_off();OLED_ShowChinese(40,0,12,16,1);//关}else//如果LED灯标志位为1,LED灯打开{LED1_on();OLED_ShowChinese(40,0,13,16,1);//开}if(DHT_Read())//读到DHT11温湿度传感器的数值并显示{OLED_ShowNum(40,16,dat[2],2,16,1);OLED_ShowChar(56,16,'.',16,1);OLED_ShowNum(60,16,dat[3],1,16,1);OLED_ShowChinese(70,16,10,16,1);//度OLED_Refresh();}}
}

.h文件

#ifndef  __MANU_MODE_H
#define __MANU_MODE_Hvoid manu_mode_init(void);
void manu_go(void);#endif

自动模式:

  1. 当外部环境变暗的时候,光照度传感器会检测到光照度的降低并输出相应的信号,这些信号会传递给单片机进行处理,并且会使得相应的标志位进行标记。
  2. 当红外检测传感器检测到周围有人的时候,也会产生相应的信号传递给单片机,将相应的标志位进行置位。
  3. 当同时满足外部环境变暗并且周围有人的时候,这是系统会自动处理事件,将灯打开;当其中一个事件不满足的时候,灯光就会关闭。
    .c文件
#include "stm32f10x.h"                  // Device header
#include "auto_mode.h"
#include "LED.h"
#include "remote.h"
#include "delay.h"
#include "bh1750.h"
#include "oled.h"
#include "infrared.h"
#include "dht11.h"extern uint32_t flag_break_mode;
extern uint32_t flag_infrared;
uint16_t light_value=0;
extern uint8_t dat[5];void auto_mode_init(void)
{LED_Init();infrared_Init();BH1750_Config_Init();     //BH1750的初始化bh_data_send(BHPowOn);   //打开模块等待测量命令bh_data_send(BHReset);     //重置数据寄存器值在PowerOn模式下有效bh_data_send(BHModeL);      //低分辨率 单位4lx  测量时间16ms delay_ms(180);             //等待测量结束延时180ms,保证通讯    OLED_Clear();OLED_ShowChinese(0,0,7,16,1);//灯OLED_ShowChinese(16,0,8,16,1);//光OLED_ShowChar(32,0,':',16,1);OLED_ShowChinese(0,16,9,16,1);//温OLED_ShowChinese(16,16,10,16,1);//度OLED_ShowChar(32,16,':',16,1);OLED_ShowChinese(0,32,11,16,1);//亮OLED_ShowChinese(16,32,10,16,1);//度OLED_ShowChar(32,32,':',16,1);
}void auto_go(void)
{while(1){remote_receive();if(flag_break_mode==1){flag_break_mode=0;OLED_Clear();break;}light_value = bh_data_read()*4/1.2;  //光照强度的计算公式 = 寄存器值*分辨率/1.2 infrared_read();//检测红外检测模块的值OLED_ShowNum(40,32,light_value,4,16,1);//显示亮度值OLED_ShowString(72,32,(uint8_t*)"lx",16,1);//显示单位if(light_value<1000&&flag_infrared==1)//当亮度小于1000lx,并且红外检测模块标志位置为1,则开灯{LED1_on();OLED_ShowChinese(40,0,13,16,1);//开}		else//否则关灯{LED1_off();OLED_ShowChinese(40,0,12,16,1);//关}	if(DHT_Read()){OLED_ShowNum(40,16,dat[2],2,16,1);OLED_ShowChar(56,16,'.',16,1);OLED_ShowNum(60,16,dat[3],1,16,1);OLED_ShowChinese(70,16,10,16,1);//度OLED_Refresh();}}
}

.h文件

#ifndef   __AUTO_MODE_H
#define  __AUTO_MODE_Hvoid auto_mode_init(void);
void auto_go(void);#endif

6. 总结

基于stm32的红外、语音、按键智能灯光控制基本就可以实现了,如果想要完整的源码、原理图、PCB、流程图可以私信我,谢谢大家!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/197396.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C陷阱与缺陷——第2章语法陷阱

1. 理解函数声明 硬件将调用首地址为0位置的子例程 (*(void(*)())0)(); 任何C变量的声明都由两部分组成&#xff1a;类型以及一组类似表达式的声明符&#xff0c;声明符从表面看与表达式有些类似&#xff0c;对它求值应该返回一个声明中给定类型的结果。 假定变量fp是一个函…

[go 面试] 构建高效微服务通信:选择合适的通信方式

关注公众号【爱发白日梦的后端】分享技术干货、读书笔记、开源项目、实战经验、高效开发工具等&#xff0c;您的关注将是我的更新动力&#xff01; 构建分布式系统或微服务架构时&#xff0c;服务间通信成为至关重要的一环。不同的通信方式各有优劣&#xff0c;因此在选择时需根…

数据库sql是什么?

数据库是什么&#xff1f; 为了将数据持久保存&#xff0c;java中的对象都是在内存中&#xff0c;程序结束数据就会销毁&#xff0c;在学习IO过程中将数据存储在文件中&#xff0c;但是内容整体是字符串&#xff0c;使用起来不方便。所以需要数据库长久保存数据还便于提取 数…

值和引用的传递与初始化块

值&#xff1a;1.基本类型数据&#xff1b;2.对象的地址 引用&#xff1a;传句柄的地址 在java中只有按值传递没有按引用传递&#xff0c;c语言也只有按值传递&#xff0c;只有c才有引用传递。 块&#xff1a; 静态块>块>构造方法 package com;public class Person {pri…

揭秘预付费电表怎么无线收费——方便快捷收费

【摘要】针对目前市场上普遍以Ic卡作为售电介质的预付费售电系统存在的问题&#xff0c;介绍了一种新型的无线预付费售电系统及其构成&#xff0c;并给出了整个系统设计的完整方案。整个系统包括用户终端和电力管理系统端&#xff0c;它们之间通过双工通信可以将用户用电信息和…

Kubernetes存储搭建NFS挂载失败处理

搞NFS存储时候发现如下问题&#xff1a; Events:Type Reason Age From Message---- ------ ---- ---- -------Normal Scheduled 5m1s default-scheduler Successful…

JavaScrip之函数柯理化、参数复用、提前确认、延迟执行

MENU 1、参数复用2、提前确认 (惰性函数)3、延迟运行4、初步封装5、递归封装6、经典面试题 1、参数复用 // 普通函数验证 function check(regExp, text) {return regExp.test(text); }console.log(check(/^\d$/g, 123)); // true console.log(check(/^\d$/g, 2d)); // false…

LeetCode算法练习top100:(7)递归回溯

package top100.递归回溯;import java.util.*;public class TOP {//46. 不含重复数字的全排列List<List<Integer>> res new ArrayList<>();public List<List<Integer>> permute(int[] nums) {LinkedList<Integer> path new LinkedList&l…

电子学会全国青少年软件编程等级考试 中小学生python一级历年真题解析【更新至2023年9月 持续更新】

中国电子学会python等级考试一级历年真题解析 一、考级知识点分析 一、 了解Python多种开发环境&#xff0c;熟练使用Python自带的IDLE开 发环境&#xff0c;能够进行程序编写、调试和分析&#xff0c;具备使用Python开发 环境进行程序设计的能力 了解Python常见的几种编程环…

堆排序详细解读

简介 堆排序是一种基于二叉堆数据结构的排序算法&#xff0c;它的特点是不同于传统的比较排序算法&#xff0c;它是通过建立一个堆结构来实现的。堆排序分为两个阶段&#xff0c;首先建立堆&#xff0c;然后逐步将堆顶元素与堆的最后一个元素交换并调整堆&#xff0c;使得最大…

EM32DX-C2【C#】

1说明&#xff1a; 分布式io&#xff0c;CAN总线&#xff0c;C#上位机二次开发&#xff08;usb转CAN模块&#xff09; 2DI&#xff1a; 公共端是&#xff1a; 0V【GND】 X0~X15&#xff1a;自带24v 寄存器地址&#xff1a;0x6100-01 6100H DI输入寄存器 16-bit &#x…

ROS2 galactic生成的bag包里的MarkerArray在humble下播放不正常

近期发现ROS2 galactic下生成的bag包在humble下回放时使用rviz可视化&#xff0c;bag里的点云可以正常看到&#xff0c;但是使用Marker和MarkerArray画的box却死活看不到&#xff0c;感觉很纳闷&#xff0c;看网上有人报告说foxy下生成的bag包在galactic下播放会报SQL错误&…

Redis部署-哨兵模式

目录 redis sentinel相关名词 redis sentinel架构 故障转移流程 基于docker搭建redis哨兵 准备工作 搭建过程 模拟主节点宕机,观察哨兵节点的工作流程 哨兵重新选取主节点的流程 1.主观下线 2.客观下线 3.哨兵节点推举出一个leader节点 4.leader选举完毕,leader挑选…

RflySim | 姿态控制器设计实验一

姿态控制器设计实验1 一. 姿态控制设计简介 本文是建立在多旋翼的姿态即控制器中的反馈信号能够被较好地估计的前提下&#xff0c;控制器中的反馈信号是估计值。不过&#xff0c;为了更加简便根据分离原理&#xff0c;我们用真值代替反馈信号。本文的目的是让多旋翼的姿态能够…

Linux入门攻坚——7、磁盘管理——文件系统挂载管理及RAID、LVM

已经安装文件系统的分区需要经过挂载才能使用。 一切文件系统的使用都是从根开始&#xff0c;根是文件系统的起始点。 计算机启动过程&#xff1a;加电自检——bootloader——kernel——rootfs——/sbin/init kernel第一步要加载根系统。 将额外文件系统与根文件系统某现存的…

【ARM64 ATF 系列 3.1 -- cpu 复位,解复位及 reset 三者之间的关系】

文章目录 概述复位信号名称复位 (Reset)解复位 (Deassert Reset)Reset 信号它们之间的关系复位信号电特性复位信号的设计注意事项概述 在 ARM CPU 架构中,复位(Reset)、解复位(Deassert Reset)以及 Reset 信号是密切相关的概念,涉及到处理器的启动、初始化和恢复到已知状…

scss:修改element组件样式(el-select)

重点解析&#xff1a; 1.el-select组件可以分为输入框和下拉弹窗两个部分&#xff0c;下面会从这两个部分进行修改 2.element组件库中弹窗会加入到和#app元素同等级别的位置&#xff0c;相关html代码可打开浏览器检查在最下方找到&#xff0c;便于修改样式 实践方法&#xf…

用swig封装c++代码给python使用

前面我们用swig封装了c的代码给java使用&#xff1a; 如何用SWIG封装c接口给java使用&#xff1f;-CSDN博客 但是由于我们的代码写的太好了&#xff0c;python用户也想用&#xff0c;我们需要将c代码封装一下给python用户使用。 这种需求很常见吧。 现在AI动不动就是用pytho…

Python如何从文件中读取数据

从文件中读取数据 1. 读取整个文件 要读取文件&#xff0c;首先来创建一个文件&#xff1a; 然后打开并读取这个文件&#xff0c;再将其内容显示到屏幕上&#xff1a; file_reader.py with open(pi_digits.txt) as file_object:contents file_object.read()print(contents)…

SQL 常见函数整理 _ DATENAME() 返回指定日期的给定日期部分的名称

1. 用法 返回指定日期的给定日期部分的名称&#xff0c;如年份、月份、星期几等。 2. 语法 DATENAME ( datepart , date )datepart DATENAME 将返回的 date 参数的特定部分。 此表列出了所有有效的 datepart 参数 。 select getdate() 2023-12-01 16:25:47.513 datepart缩写…