【问天Block】STC15单片机PWM输出讲解
【问天Block】STC15单片机PWM输出讲解
示波器捕捉到的实时波形
采用的是自制开发板
我的开发板已经开源《【开源分享】自制STC15W408AS开发板》
开发工具:问天Block
采用的是字符编程方式,如果使用图像块编程频率是固定的11.0592MHz,我自制的STC15W408AS使用的是外部16MHz的晶振。
以PCA三路PWM输出范例参考
PWM频率调节
- 下面的函数是对时钟的分频,决定PWM的工作频率。
PCA_Clock_1T
频率最高,PCA_Clock_12T
频率最低。
PCA_InitStructure.PCA_Clock = PCA_Clock_1T; //PCA_Clock_1T, PCA_Clock_2T, PCA_Clock_4T, PCA_Clock_6T, PCA_Clock_8T, PCA_Clock_12T, PCA_Clock_Timer0_OF, PCA_Clock_ECI
PCA_Clock_1T
的频率:16MHz/256=62.5KHz;
(时钟频率采用的是外部晶振16MHz,)
PCA_Clock_12T = 16MHz/256/12=5208Hz
固定频率下的占空比调节
- 下面是关于占空比调整的函数,原函数调节的占空比是
0~100
占空比调整映射到0-254
之间不断变化的占空比值。注意:0对应的是最高占空比值,接近100%,254是最小占空比差不多为0.
void loop()
{for (i = 0; i < 255; i = i + 1) {UpdatePwm(PCA0, i);UpdatePwm(PCA1, i);UpdatePwm(PCA2, i);delay(50);}
}
主程序代码
#define SYS_CLK 16000000L//设置时钟频率16MHz#include <STC15X.h>
#include "lib/STC15_PCA.h"
#include "lib/STC15_delay.h"uint8 i;void setup()
{PCA_InitTypeDef PCA_InitStructure;PCA_InitStructure.PCA_Clock = PCA_Clock_12T; //PCA_Clock_1T, PCA_Clock_2T, PCA_Clock_4T, PCA_Clock_6T, PCA_Clock_8T, PCA_Clock_12T, PCA_Clock_Timer0_OF, PCA_Clock_ECIPCA_InitStructure.PCA_IoUse = PCA_P11_P10_P37; //PCA_P12_P11_P10_P37, PCA_P34_P35_P36_P37, PCA_P24_P25_P26_P27PCA_InitStructure.PCA_Interrupt_Mode = DISABLE; //ENABLE, DISABLEPCA_InitStructure.PCA_Polity = PolityHigh; //优先级设置 PolityHigh,PolityLowPCA_InitStructure.PCA_RUN = DISABLE; //ENABLE, DISABLEPCA_Init(PCA_Counter,&PCA_InitStructure);PCA_InitStructure.PCA_Mode = PCA_Mode_PWM; //PCA_Mode_PWM, PCA_Mode_Capture, PCA_Mode_SoftTimer, PCA_Mode_HighPulseOutputPCA_InitStructure.PCA_PWM_Wide = PCA_PWM_8bit; //PCA_PWM_8bit, PCA_PWM_7bit, PCA_PWM_6bitPCA_InitStructure.PCA_Interrupt_Mode = DISABLE; //PCA_Rise_Active, PCA_Fall_Active, ENABLE, DISABLEPCA_InitStructure.PCA_Value = 100 << 8; //对于PWM,高8位为PWM占空比PCA_Init(PCA0,&PCA_InitStructure);PCA_InitStructure.PCA_Mode = PCA_Mode_PWM; //PCA_Mode_PWM, PCA_Mode_Capture, PCA_Mode_SoftTimer, PCA_Mode_HighPulseOutputPCA_InitStructure.PCA_PWM_Wide = PCA_PWM_8bit; //PCA_PWM_8bit, PCA_PWM_7bit, PCA_PWM_6bitPCA_InitStructure.PCA_Interrupt_Mode = DISABLE; //PCA_Rise_Active, PCA_Fall_Active, ENABLE, DISABLEPCA_InitStructure.PCA_Value = 100 << 8; //对于PWM,高8位为PWM占空比PCA_Init(PCA1,&PCA_InitStructure);PCA_InitStructure.PCA_Mode = PCA_Mode_PWM; //PCA_Mode_PWM, PCA_Mode_Capture, PCA_Mode_SoftTimer, PCA_Mode_HighPulseOutputPCA_InitStructure.PCA_PWM_Wide = PCA_PWM_8bit; //PCA_PWM_8bit, PCA_PWM_7bit, PCA_PWM_6bitPCA_InitStructure.PCA_Interrupt_Mode = DISABLE; //PCA_Rise_Active, PCA_Fall_Active, ENABLE, DISABLEPCA_InitStructure.PCA_Value = 100 << 8; //对于PWM,高8位为PWM占空比PCA_Init(PCA2,&PCA_InitStructure);CR = 1; //1: 允许PCA计数器计数,必须由软件清0。//PCA三路输出PWM
}void loop()
{for (i = 0; i < 250; i = i + 1) {UpdatePwm(PCA0, i);UpdatePwm(PCA1, i);UpdatePwm(PCA2, i);delay(50);}
}void main(void)
{setup();while(1){loop();}
}
STC15_PCA.h
文件
#ifndef __STC15_PCA_H
#define __STC15_PCA_H#include <STC15X.h>#define TRUE 1
#define FALSE 0//=============================================================//========================================#define PolityLow 0 //低优先级中断
#define PolityHigh 1 //高优先级中断#define ENABLE 1
#define DISABLE 0#define PCA0 0
#define PCA1 1
#define PCA2 2
#define PCA_Counter 3
#define PCA_P11_P10_P37 (0<<4)
#define PCA_P35_P36_P37 (1<<4)
#define PCA_P25_P26_P27 (2<<4)
#define PCA_Mode_PWM 0x42 //B0100_0010
#define PCA_Mode_Capture 0
#define PCA_Mode_SoftTimer 0x48 //B0100_1000
#define PCA_Mode_HighPulseOutput 0x4c //B0100_1100
#define PCA_Clock_1T (4<<1)
#define PCA_Clock_2T (1<<1)
#define PCA_Clock_4T (5<<1)
#define PCA_Clock_6T (6<<1)
#define PCA_Clock_8T (7<<1)
#define PCA_Clock_12T (0<<1)
#define PCA_Clock_Timer0_OF (2<<1)
#define PCA_Clock_ECI (3<<1)
#define PCA_Rise_Active (1<<5)
#define PCA_Fall_Active (1<<4)
#define PCA_PWM_8bit (0<<6)
#define PCA_PWM_7bit (1<<6)
#define PCA_PWM_6bit (2<<6)typedef struct
{uint8 PCA_IoUse; //PCA_P12_P11_P10_P37, PCA_P34_P35_P36_P37, PCA_P24_P25_P26_P27uint8 PCA_Clock; //PCA_Clock_1T, PCA_Clock_2T, PCA_Clock_4T, PCA_Clock_6T, PCA_Clock_8T, PCA_Clock_12T, PCA_Clock_Timer0_OF, PCA_Clock_ECIuint8 PCA_Mode; //PCA_Mode_PWM, PCA_Mode_Capture, PCA_Mode_SoftTimer, PCA_Mode_HighPulseOutputuint8 PCA_PWM_Wide; //PCA_PWM_8bit, PCA_PWM_7bit, PCA_PWM_6bituint8 PCA_Interrupt_Mode; //PCA_Rise_Active, PCA_Fall_Active, ENABLE, DISABLEuint8 PCA_Polity; //优先级设置 PolityHigh,PolityLowuint16 PCA_Value;uint8 PCA_RUN; //ENABLE, DISABLE
} PCA_InitTypeDef;bit B_Capture0,B_Capture1,B_Capture2;
uint8 PCA0_mode,PCA1_mode,PCA2_mode;
uint16 CCAP0_tmp,PCA_Timer0;
uint16 CCAP1_tmp,PCA_Timer1;
uint16 CCAP2_tmp,PCA_Timer2;/************* 功能说明 ********************************************************///========================================================================
// 函数: UpdatePwm(uint8 PCA_id, uint8 pwm_value)
// 描述: 更新PWM值.
// 参数: PCA_id: PCA序号. 取值 PCA0,PCA1,PCA2,PCA_Counter
// pwm_value: pwm值, 这个值是输出低电平的时间.
// 返回: none.
// 版本: V1.0, 2012-11-22
//========================================================================
void UpdatePwm(uint8 PCA_id, uint8 pwm_value)
{if(PCA_id == PCA0) CCAP0H = pwm_value;else if(PCA_id == PCA1) CCAP1H = pwm_value;else if(PCA_id == PCA2) CCAP2H = pwm_value;
}//========================================================================
// 函数: void PCA_Init(PCA_id, PCA_InitTypeDef *PCAx)
// 描述: PCA初始化程序.
// 参数: PCA_id: PCA序号. 取值 PCA0,PCA1,PCA2,PCA_Counter
// PCAx: 结构参数,请参考PCA.h里的定义.
// 返回: none.
// 版本: V1.0, 2012-11-22
//========================================================================
void PCA_Init(uint8 PCA_id, PCA_InitTypeDef *PCAx)
{if(PCA_id > PCA_Counter) return; //id错误if(PCA_id == PCA_Counter) //设置公用Counter{CR = 0;CH = 0;CL = 0;AUXR1 = (AUXR1 & ~(3<<4)) | PCAx->PCA_IoUse; //切换IO口CMOD = (CMOD & ~(7<<1)) | PCAx->PCA_Clock; //选择时钟源CMOD = (CMOD & ~1) | (PCAx->PCA_Interrupt_Mode & 1); //ECFif(PCAx->PCA_Polity == PolityHigh) PPCA = 1; //高优先级中断else PPCA = 0; //低优先级中断if(PCAx->PCA_RUN == ENABLE) CR = 1;return;}PCAx->PCA_Interrupt_Mode &= (3<<4) + 1;if(PCAx->PCA_Mode >= PCA_Mode_SoftTimer) PCAx->PCA_Interrupt_Mode &= ~(3<<4);if(PCA_id == PCA0){CCAPM0 = PCAx->PCA_Mode | PCAx->PCA_Interrupt_Mode; //工作模式, 中断模式PCA_PWM0 = (PCA_PWM0 & ~(3<<6)) | PCAx->PCA_PWM_Wide; //PWM宽度PCA_Timer0 = PCAx->PCA_Value;B_Capture0 = 0;PCA0_mode = PCAx->PCA_Mode;CCAP0_tmp = PCA_Timer0;CCAP0L = (uint8)CCAP0_tmp; //将影射寄存器写入捕获寄存器,先写CCAP0LCCAP0H = (uint8)(CCAP0_tmp >> 8); //后写CCAP0H}if(PCA_id == PCA1){CCAPM1 = PCAx->PCA_Mode | PCAx->PCA_Interrupt_Mode;PCA_PWM1 = (PCA_PWM1 & ~(3<<6)) | PCAx->PCA_PWM_Wide;PCA_Timer1 = PCAx->PCA_Value;B_Capture1 = 0;PCA1_mode = PCAx->PCA_Mode;CCAP1_tmp = PCA_Timer1;CCAP1L = (uint8)CCAP1_tmp; //将影射寄存器写入捕获寄存器,先写CCAP0LCCAP1H = (uint8)(CCAP1_tmp >> 8); //后写CCAP0H}if(PCA_id == PCA2){CCAPM2 = PCAx->PCA_Mode | PCAx->PCA_Interrupt_Mode;PCA_PWM2 = (PCA_PWM2 & ~(3<<6)) | PCAx->PCA_PWM_Wide;PCA_Timer2 = PCAx->PCA_Value;B_Capture2 = 0;PCA2_mode = PCAx->PCA_Mode;CCAP2_tmp = PCA_Timer2;CCAP2L = (uint8)CCAP2_tmp; //将影射寄存器写入捕获寄存器,先写CCAP0LCCAP2H = (uint8)(CCAP2_tmp >> 8); //后写CCAP0H}
}//========================================================================
// 函数: void PCA_Handler (void) interrupt PCA_VECTOR
// 描述: PCA中断处理程序.
// 参数: None
// 返回: none.
// 版本: V1.0, 2012-11-22
//========================================================================
void PCA_Handler (void) interrupt 7
{if(CCF0) //PCA模块0中断{CCF0 = 0; //清PCA模块0中断标志if(PCA0_mode >= PCA_Mode_SoftTimer) //PCA_Mode_SoftTimer and PCA_Mode_HighPulseOutput{CCAP0_tmp += PCA_Timer0;CCAP0L = (uint8)CCAP0_tmp; //将影射寄存器写入捕获寄存器,先写CCAP0LCCAP0H = (uint8)(CCAP0_tmp >> 8); //后写CCAP0H}else if(PCA0_mode == PCA_Mode_Capture){CCAP0_tmp = CCAP0H; //读CCAP0HCCAP0_tmp = (CCAP0_tmp << 8) + CCAP0L;B_Capture0 = 1;}}if(CCF1) //PCA模块1中断{CCF1 = 0; //清PCA模块1中断标志if(PCA1_mode >= PCA_Mode_SoftTimer) //PCA_Mode_SoftTimer and PCA_Mode_HighPulseOutput{CCAP1_tmp += PCA_Timer1;CCAP1L = (uint8)CCAP1_tmp; //将影射寄存器写入捕获寄存器,先写CCAP0LCCAP1H = (uint8)(CCAP1_tmp >> 8); //后写CCAP0H}else if(PCA1_mode == PCA_Mode_Capture){CCAP1_tmp = CCAP1H; //读CCAP1HCCAP1_tmp = (CCAP1_tmp << 8) + CCAP1L;B_Capture1 = 1;}}if(CCF2) //PCA模块2中断{CCF2 = 0; //清PCA模块1中断标志if(PCA2_mode >= PCA_Mode_SoftTimer) //PCA_Mode_SoftTimer and PCA_Mode_HighPulseOutput{CCAP2_tmp += PCA_Timer2;CCAP2L = (uint8)CCAP2_tmp; //将影射寄存器写入捕获寄存器,先写CCAP0LCCAP2H = (uint8)(CCAP2_tmp >> 8); //后写CCAP0H}else if(PCA2_mode == PCA_Mode_Capture){CCAP2_tmp = CCAP2H; //读CCAP2HCCAP2_tmp = (CCAP2_tmp << 8) + CCAP2L;B_Capture2 = 1;}}if(CF) //PCA溢出中断{CF = 0; //清PCA溢出中断标志}}#endif
STC15_delay.h
文件
#ifndef __STC15_DELAY_H
#define __STC15_DELAY_H #include <STC15X.h>#ifndef SYS_CLK
#define SYS_CLK 11059200L
#endifvoid delay1ms(); //延迟1毫秒
void delay(uint16 time); //延迟time毫秒#if (SYS_CLK == 24000000)
void delay1us(); //延迟1微秒
void delay5us(); //延迟5微秒
void delay10us(); //延迟10微秒
void delay50us(); //延迟50微秒
void delay100us(); //延迟100微秒//========================================================================
// 描述: 延迟1微秒.
// 参数: none.
// 返回: none.
//========================================================================
void delay1us() //@24.000MHz
{uint8 i;_nop_();_nop_();i = 3;while (--i);
}//========================================================================
// 描述: 延迟5微秒.
// 参数: none.
// 返回: none.
//========================================================================
void delay5us() //@24.000MHz
{uint8 i;_nop_();_nop_();i = 27;while (--i);
}//========================================================================
// 描述: 延迟10微秒.
// 参数: none.
// 返回: none.
//========================================================================
void delay10us() //@24.000MHz
{uint8 i;_nop_();_nop_();i = 57;while (--i);
}//========================================================================
// 描述: 延迟50微秒.
// 参数: none.
// 返回: none.
//========================================================================
void delay50us() //@24.000MHz
{uint8 i, j;i = 2;j = 39;do{while (--j);} while (--i);
}//========================================================================
// 描述: 延迟100微秒.
// 参数: none.
// 返回: none.
//========================================================================
void delay100us() //@24.000MHz
{uint8 i, j;i = 3;j = 82;do{while (--j);} while (--i);
}#elif (SYS_CLK == 12000000)void delay1us(); //延迟1微秒
void delay5us(); //延迟5微秒
void delay10us(); //延迟10微秒
void delay50us(); //延迟50微秒
void delay100us(); //延迟100微秒//========================================================================
// 描述: 延迟1微秒.
// 参数: none.
// 返回: none.
//========================================================================
void delay1us() //@12.000
{_nop_();_nop_();_nop_();_nop_();
}//========================================================================
// 描述: 延迟5微秒.
// 参数: none.
// 返回: none.
//========================================================================
void delay5us() //@12.000
{uint8 i;_nop_();_nop_();i = 12;while (--i);
}//========================================================================
// 描述: 延迟10微秒.
// 参数: none.
// 返回: none.
//========================================================================
void delay10us() //@12.000
{uint8 i;_nop_();_nop_();i = 27;while (--i);
}//========================================================================
// 描述: 延迟50微秒.
// 参数: none.
// 返回: none.
//========================================================================
void delay50us() //@12.000
{uint8 i, j;i = 1;j = 146;do{while (--j);} while (--i);
}//========================================================================
// 描述: 延迟100微秒.
// 参数: none.
// 返回: none.
//========================================================================
void delay100us() //@12.000
{uint8 i, j;i = 2;j = 39;do{while (--j);} while (--i);
}#elif (SYS_CLK == 5529600)void delay1us(); //延迟1微秒
void delay5us(); //延迟5微秒
void delay10us(); //延迟10微秒
void delay50us(); //延迟50微秒
void delay100us(); //延迟100微秒//========================================================================
// 描述: 延迟1微秒.
// 参数: none.
// 返回: none.
//========================================================================
void delay1us() //@5.5296
{_nop_();
}//========================================================================
// 描述: 延迟5微秒.
// 参数: none.
// 返回: none.
//========================================================================
void delay5us() //@5.5296
{uint8 i;_nop_();_nop_();i = 4;while (--i);
}//========================================================================
// 描述: 延迟10微秒.
// 参数: none.
// 返回: none.
//========================================================================
void delay10us() //@5.5296
{uint8 i;_nop_();i = 11;while (--i);
}//========================================================================
// 描述: 延迟50微秒.
// 参数: none.
// 返回: none.
//========================================================================
void delay50us() //@5.5296
{uint8 i;_nop_();_nop_();i = 66;while (--i);
}//========================================================================
// 描述: 延迟100微秒.
// 参数: none.
// 返回: none.
//========================================================================
void delay100us() //@5.5296
{uint8 i, j;_nop_();i = 1;j = 134;do{while (--j);} while (--i);
}#else //11059200void delay1us(); //延迟1微秒
void delay5us(); //延迟5微秒
void delay10us(); //延迟10微秒
void delay50us(); //延迟50微秒
void delay100us(); //延迟100微秒//========================================================================
// 描述: 延迟1微秒.
// 参数: none.
// 返回: none.
//========================================================================
void delay1us() //@11.0592
{_nop_();_nop_();_nop_();
}//========================================================================
// 描述: 延迟5微秒.
// 参数: none.
// 返回: none.
//========================================================================
void delay5us() //@11.0592
{uint8 i;_nop_();i = 11;while (--i);
}//========================================================================
// 描述: 延迟10微秒.
// 参数: none.
// 返回: none.
//========================================================================
void delay10us() //@11.0592
{uint8 i;_nop_();i = 25;while (--i);
}//========================================================================
// 描述: 延迟50微秒.
// 参数: none.
// 返回: none.
//========================================================================
void delay50us() //@11.0592
{uint8 i, j;_nop_();i = 1;j = 134;do{while (--j);} while (--i);
}//========================================================================
// 描述: 延迟100微秒.
// 参数: none.
// 返回: none.
//========================================================================
void delay100us() //@11.0592
{uint8 i, j;_nop_();_nop_();i = 2;j = 15;do{while (--j);} while (--i);
}#endif//========================================================================
// 描述: 延迟1毫秒.
// 参数: none.
// 返回: none.
//========================================================================
void delay1ms() //1毫秒@sys_clk
{uint8 ms = 1;uint16 i;do{i = SYS_CLK / 13000;while(--i) ; //14T per loop}while(--ms);
}//========================================================================
// 描述: 延迟指定毫秒.
// 参数: 延迟时间(1-65535).
// 返回: none.
//========================================================================
void delay(uint16 time)
{if(time < 1){time = 1;} do { delay1ms();} while (--time);
}#endif //delay.h
【问天Block】STC15单片机PWM输出讲解相关推荐
- 单片机PWM输出控制直流电机(89c51系列、stc12c5a60s2系列)
目录 [pwm是如何控制电机转速] [89C51系列单片机产生pwm波] [STC12C5A60S2系列单片机输出PWM] [pwm是如何控制电机转速] 在本科学习中,学生所做的小车多数为使用lm29 ...
- 单片机PWM输出原理与实践
一.什么是PWM? PWM(Pulse Width Modulation)脉冲宽度调制,它是通过对一系列脉冲的宽度进行调制,等效出所需要的波形(包含形状以及幅值),对模拟信号电平进行数字编码. ...
- 单片机 PWM输出 c
#include<reg52.h> #include<intrins.h> //包含_nop_(),汇编中的子函数 #define uchar unsigned char s ...
- 基于天问block编译环境下ASRPRO语音芯片程序编写教程(二)语音识别,GPIO输入输出,PWM输出篇
本篇教程将基于天问block内的官方范例代码讲解如何编写ASRPRO语音芯片程序以实现语音识别,GPIO输入输出和PWM输出功能. 1.智能语音对话 该程序中添加识别词功能添加命令词选项(黑色部分)为 ...
- STC15单片机-通过PWM调整灯亮度
通过PWM调整灯亮度 学习经验 第一次去看STC15数据手册的CCP/PCA/PWM这一章时人都懵了,这到底是个啥玩意?首先是不懂为什么要叫这个名字,CCP/PCA/PWM是一个名字还是三个名字?后来 ...
- STM8单片机 PWM无波形输出解决方法
调试STM8单片机PWM功能的时候,经常会遇到一种情况,就是PWM初始化设置完成之后,程序下载到单片机中,确没有任何波形的输出.有时候代码是下载别的调试好的,但是在自己芯片上就是没有波形输出.这时 ...
- 合泰杯——合泰单片机工程7之PWM输出
合泰杯--合泰单片机工程7之PWM输出 前言 一.合泰系列的PWM实现方式? 二.PTM输出PWM波 二.具体实现过程 2.1配置PTM3C0和PTM3C1 2.3PWM的输出引脚功能选择 2.4呼吸 ...
- 普中51pwm_51单片机实现PWM输出功能的两种方法解析
51单片机没有PWM输出功能,可以采用定时器配合软件的方法实现,对精度要求不高的场合是非常实用的.采用高速光隔6N137输出,并将PWM的信号倒相. 一. 工作原理 二.PWM输出 1. 固定脉宽PW ...
- 【STC15】STC15单片机获取红外解码从软串口输出
[STC15]STC15单片机获取红外解码从软串口输出 单片机型号:STC15F2K60S2 采用外部晶振,频率:11.0592MHz 红外接收头,数据引脚接P3.2 这里软串口实现主要是位处理时间一 ...
- linux 普通io实现pwm,用普通IO口做PWM输出 - 51单片机 -
电子工程世界-论坛 -
手机版...
本人现在想用IO口做PWM输出,频率1KHz,然后用两按键(+.-)来调节占空比0-100%,对应数码管显示000-100. 现波形是OK了,也可以调占空比,但是出现一个问题数码管显示乱七八糟,调了两 ...
最新文章
- SimpleDateFormat 详解
- php 表单跳转,html - 思路问题:php表单跳转
- JavaScript 和 typeScript 中的 import、from
- 第 5-1 课:线程与死锁 + 面试题
- Java 在指定目录中查找文件
- WSS(Windows Storage Server)2008R2使用指南(三)配置及使用篇
- blfs(systemd版本)学习笔记-编译安装openssh软件包
- [Ubuntu] Your Firefox profile cannot be loaded. It may be missing or inaccessible
- java8 中的时间和数据的变化
- coverity静态安全扫描分析软件linux环境搭建
- 【电路】PT1000/PT100温度采集电路
- 真人qq秀代码_关于QQ我的记忆
- springboot毕业设计 基于springboot医院预约挂号系统毕业设计设计与实现参考
- Linux守护进程设计规范及python实现
- hdu 6078 Wavel Sequence
- Web前端--HTML+CSS+JavaScript响应式网络科技网页设计
- https 请求的端口是443 注意
- 世界上应用最广泛的算法之一的卡尔曼滤波算法原理-从放弃到精通-无人机/机器人应用
- php汉字转区位码,PHP里实现汉字转区位码的示例代码_php
- Roon 1.8(806) for Windows
热门文章
- 微处理器系统结构与嵌入式系统设计(一)
- 计算机主板接口识别,电脑主板上接口怎么接 主板所有接口插线功能作用识别图解...
- 解决QFontDatabase: Cannot find font directory XXX/lib/fonts
- 供应链管理的三个层次
- 护眼html颜色,在电脑中设置护眼颜色、更换网页背景色、一键护眼
- 3dsmax VRay分布式渲染
- 微信生成带参数二维码以及获取此二维码参数
- php3d建模,3d建模师容易找工作吗
- 英寸和厘米的换算python_OJ实例:厘米换算英尺英寸
- css背景颜色渐变 从左到右 从下到上