软件

keil5

实现

1.使用stm32f407中的DS18B20传感器采集空气温度

2.使用stm32f407中的DHT11传感器采集空气的温度和湿度

3.显示到stm32f407的LCD液晶显示器上

4.当温度超过30℃时,led灯 和 电磁继电器控制的灯闪烁,蜂鸣器持续响

5.当温度低于30℃时,一切恢复

效果

源码

main.c

  1. #include "led.h"
  2. #include "button.h"
  3. #include "buzzer.h"
  4. #include "delay.h"
  5. #include "lcd.h"
  6. #include "ds18b20.h"
  7. #include "dht11.h"
  8. #define WAR_T 30
  9. int main(void) {
  10. int yan;
  11. char buf[10];
  12. char dht[5];
  13. delay_init();
  14. LCD_Init();
  15. buzzer_init();
  16. //320 * 240
  17. DS18B20_Init();
  18. dht_init();
  19. LCD_Clear(0x01CF);
  20. BRUSH_COLOR = WHITE;
  21. BACK_COLOR = 0x1f << 11;
  22. //BACK_COLOR = BLACK;
  23. //LCD_DisplayString(30, 50, 24, (u8 *)" 0.0 ");
  24. LCD_DisplayMyname(10,200); //Ãû×Ö
  25. LCD_Draw_Rectangle(1, 1, 318, 238);
  26. LCD_Draw_Line( 110,1 ,110 ,160 );
  27. LCD_Draw_Line( 220,1 ,220 ,160 );
  28. LCD_Draw_Line( 1,120 ,220 ,120 );
  29. LCD_Draw_Line( 1,160 ,318 ,160 );
  30. LCD_DisplayString(10, 70, 16, (u8 *)"PM2.5 ug/m3");
  31. LCD_DisplayString(125, 70, 16, (u8 *)"HCHO mg/m3");
  32. LCD_DisplayString(260, 170, 24, (u8 *)"TIME");
  33. LCD_DisplayString(220, 200, 24, (u8 *)"12 : 00");
  34. LCD_DisplayString(30, 175, 24, (u8 *)"WELCOME !");
  35. LCD_DisplayTu1(225,20);
  36. LCD_DisplayTu2(225,100);
  37. //for(yan=0xF800;yan<=0xFFE0;yan++);
  38. LCD_Draw_Rectangle(10, 90, 90, 100);
  39. LCD_Draw_Rectangle(125, 90, 210, 100);
  40. LCD_Fill_onecolor(10, 95, 90, 100,yan);
  41. LCD_Fill_onecolor(125, 95, 210, 100,yan);
  42. while(1) {
  43. int i;
  44. get_temperature(buf);
  45. LCD_DisplayString(225, 50, 24, (u8 *)buf);
  46. LCD_DisplayOTherChar(295,50,0,24);//温度符号
  47. dht_get_data(dht);
  48. LCD_DisplayNum(285, 100, dht[0], 2, 24, 0);
  49. LCD_DisplayNum(285, 20, dht[2], 2, 24, 0);
  50. //if( buf[1] >= '0'+2 && buf[2] >= 9+'0')
  51. delay_ms(500);
  52. }
  53. }

led.h

  1. #ifndef __LED_H
  2. #define __LED_H
  3. #include "stm32f4xx_conf.h"
  4. /*
  5. LED0 PE3
  6. LED1 PE4
  7. LED2 PG9
  8. GPIO管脚输出高电压时灯灭 低电压时亮
  9. 1.对于GPIO管脚打开时钟
  10. */
  11. #define GPIOE_MODER (*(volatile unsigned int *)(GPIOE_BASE + 0x00))
  12. #define GPIOE_OTYPER (*(volatile unsigned int *)(GPIOE_BASE + 0x04))
  13. #define GPIOE_OSPEEDR (*(volatile unsigned int *)(GPIOE_BASE + 0x08))
  14. #define GPIOE_PUPDR (*(volatile unsigned int *)(GPIOE_BASE + 0x0C))
  15. #define GPIOE_ODR (*(volatile unsigned int *)(GPIOE_BASE + 0x14))
  16. #define GPIOG_MODER (*(volatile unsigned int *)(GPIOG_BASE + 0x00))
  17. #define GPIOG_OTYPER (*(volatile unsigned int *)(GPIOG_BASE + 0x04))
  18. #define GPIOG_OSPEEDR (*(volatile unsigned int *)(GPIOG_BASE + 0x08))
  19. #define GPIOG_PUPDR (*(volatile unsigned int *)(GPIOG_BASE + 0x0C))
  20. #define GPIOG_ODR (*(volatile unsigned int *)(GPIOG_BASE + 0x14))
  21. extern void led_init(void);
  22. extern void led_on(int no);
  23. extern void led_off(int no);
  24. #endif

led.c

  1. #include "led.h"
  2. #include "bitband.h"
  3. void led_init(void) {
  4. GPIO_InitTypeDef LED;
  5. RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE | RCC_AHB1Periph_GPIOG, ENABLE);
  6. LED.GPIO_Mode = GPIO_Mode_OUT;
  7. LED.GPIO_OType = GPIO_OType_PP;
  8. LED.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4;
  9. LED.GPIO_PuPd = GPIO_PuPd_NOPULL;
  10. LED.GPIO_Speed = GPIO_Fast_Speed;
  11. GPIO_Init(GPIOE, &LED);
  12. LED.GPIO_Pin = GPIO_Pin_9;
  13. GPIO_Init(GPIOG, &LED);
  14. GPIO_SetBits(GPIOE, GPIO_Pin_3 | GPIO_Pin_4);
  15. GPIO_SetBits(GPIOG, GPIO_Pin_9);
  16. }
  17. void led_on(int no) {
  18. switch(no) {
  19. case 0 :
  20. PGOut(9) = 0;
  21. break;
  22. case 1 :
  23. PEOut(4) = 0;
  24. break;
  25. case 2 :
  26. PEOut(3) = 0;
  27. break;
  28. default:
  29. break;
  30. }
  31. }
  32. void led_off(int no) {
  33. switch(no) {
  34. case 0 :
  35. PGOut(9) = 1;
  36. break;
  37. case 1 :
  38. PEOut(4) = 1;
  39. break;
  40. case 2 :
  41. PEOut(3) = 1;
  42. break;
  43. default:
  44. break;
  45. }
  46. }

button.h

  1. #ifndef __BUTTON_H
  2. #define __BUTTON_H
  3. #include "stm32f4xx_conf.h"
  4. extern void button_init(void);
  5. extern int button_state(int);
  6. #endif

button.c

  1. #include "button.h"
  2. #include "bitband.h"
  3. // PF9 PF8 PF7 PE6
  4. //按键按下是1 抬起是0
  5. void button_init(void) {
  6. GPIO_InitTypeDef BUTTON;
  7. RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE | RCC_AHB1Periph_GPIOF, ENABLE);
  8. BUTTON.GPIO_Mode = GPIO_Mode_IN;
  9. BUTTON.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9;
  10. BUTTON.GPIO_PuPd = GPIO_PuPd_NOPULL;
  11. GPIO_Init(GPIOF, &BUTTON);
  12. BUTTON.GPIO_Pin = GPIO_Pin_6;
  13. GPIO_Init(GPIOE, &BUTTON);
  14. }
  15. int button_state(int no) {
  16. int ret;
  17. switch(no) {
  18. case 0 :
  19. ret = PFIn(9);
  20. break;
  21. case 1 :
  22. ret = PFIn(8);
  23. break;
  24. case 2 :
  25. ret = PFIn(7);
  26. break;
  27. case 3 :
  28. ret = PEIn(6);
  29. break;
  30. default:
  31. ret = 1;
  32. break;
  33. } return !ret;
  34. }

buzzer.h

  1. #ifndef __BUZZER_H
  2. #define __BUZZER_H
  3. #include "stm32f4xx_conf.h"
  4. extern void buzzer_init(void);
  5. extern void buzzer_on(void);
  6. extern void buzzer_off(void);
  7. #endif

buzzer.c

  1. #include "buzzer.h"
  2. #include "bitband.h"
  3. //pd7
  4. void buzzer_init(void) {
  5. GPIO_InitTypeDef BUZZER;
  6. RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
  7. BUZZER.GPIO_Mode = GPIO_Mode_OUT;
  8. BUZZER.GPIO_OType = GPIO_OType_PP;
  9. BUZZER.GPIO_Pin = GPIO_Pin_7;
  10. BUZZER.GPIO_PuPd = GPIO_PuPd_NOPULL;
  11. BUZZER.GPIO_Speed = GPIO_Fast_Speed;
  12. GPIO_Init(GPIOD, &BUZZER);
  13. GPIO_ResetBits(GPIOD, GPIO_Pin_7);
  14. }
  15. void buzzer_on(void) {
  16. PDOut(7) = 1;
  17. }
  18. void buzzer_off(void) {
  19. PDOut(7) = 0;
  20. }

delay.h

  1. #ifndef __DELAY_H
  2. #define __DELAY_H
  3. #include "stm32f4xx.h"
  4. typedef uint32_t u32;
  5. typedef uint16_t u16;
  6. typedef uint8_t u8;
  7. #define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))
  8. #define MEM_ADDR(addr) *((volatile unsigned long *)(addr))
  9. #define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum))
  10. //GPIO
  11. #define GPIOA_ODR_Addr (GPIOA_BASE+20) //0x40020014
  12. #define GPIOB_ODR_Addr (GPIOB_BASE+20) //0x40020414
  13. #define GPIOC_ODR_Addr (GPIOC_BASE+20) //0x40020814
  14. #define GPIOD_ODR_Addr (GPIOD_BASE+20) //0x40020C14
  15. #define GPIOE_ODR_Addr (GPIOE_BASE+20) //0x40021014
  16. #define GPIOF_ODR_Addr (GPIOF_BASE+20) //0x40021414
  17. #define GPIOG_ODR_Addr (GPIOG_BASE+20) //0x40021814
  18. #define GPIOH_ODR_Addr (GPIOH_BASE+20) //0x40021C14
  19. #define GPIOI_ODR_Addr (GPIOI_BASE+20) //0x40022014
  20. //GPIO
  21. #define GPIOA_IDR_Addr (GPIOA_BASE+16) //0x40020010
  22. #define GPIOB_IDR_Addr (GPIOB_BASE+16) //0x40020410
  23. #define GPIOC_IDR_Addr (GPIOC_BASE+16) //0x40020810
  24. #define GPIOD_IDR_Addr (GPIOD_BASE+16) //0x40020C10
  25. #define GPIOE_IDR_Addr (GPIOE_BASE+16) //0x40021010
  26. #define GPIOF_IDR_Addr (GPIOF_BASE+16) //0x40021410
  27. #define GPIOG_IDR_Addr (GPIOG_BASE+16) //0x40021810
  28. #define GPIOH_IDR_Addr (GPIOH_BASE+16) //0x40021C10
  29. #define GPIOI_IDR_Addr (GPIOI_BASE+16) //0x40022010
  30. #define PAOut(n) BIT_ADDR(GPIOA_ODR_Addr,n)
  31. #define PAIn(n) BIT_ADDR(GPIOA_IDR_Addr,n)
  32. #define PBOut(n) BIT_ADDR(GPIOB_ODR_Addr,n)
  33. #define PBIn(n) BIT_ADDR(GPIOB_IDR_Addr,n)
  34. #define PCOut(n) BIT_ADDR(GPIOC_ODR_Addr,n)
  35. #define PCIn(n) BIT_ADDR(GPIOC_IDR_Addr,n)
  36. #define PDOut(n) BIT_ADDR(GPIOD_ODR_Addr,n)
  37. #define PDIn(n) BIT_ADDR(GPIOD_IDR_Addr,n)
  38. #define PEOut(n) BIT_ADDR(GPIOE_ODR_Addr,n)
  39. #define PEIn(n) BIT_ADDR(GPIOE_IDR_Addr,n)
  40. #define PFOut(n) BIT_ADDR(GPIOF_ODR_Addr,n)
  41. #define PFIn(n) BIT_ADDR(GPIOF_IDR_Addr,n)
  42. #define PGOut(n) BIT_ADDR(GPIOG_ODR_Addr,n)
  43. #define PGIn(n) BIT_ADDR(GPIOG_IDR_Addr,n)
  44. #define PHOut(n) BIT_ADDR(GPIOH_ODR_Addr,n)
  45. #define PHIn(n) BIT_ADDR(GPIOH_IDR_Addr,n)
  46. #define PIOut(n) BIT_ADDR(GPIOI_ODR_Addr,n)
  47. #define PIIn(n) BIT_ADDR(GPIOI_IDR_Addr,n)
  48. #define SYSCLK 168 //调用系统时钟
  49. void delay_init(void);
  50. void delay_ms(u16 nms);
  51. void delay_us(u32 nus);
  52. #endif

delay.c

  1. #include "delay.h"
  2. //利用系统定时,编写的延时函数
  3. static u8 fac_us=0; //us延时倍乘数
  4. static u16 fac_ms=0; //ms延时倍乘数,在ucos下,代表每个街拍的ms数
  5. /****************************************************************************
  6. * 名称: delay_init()
  7. *功能:延时函数初始化
  8. * 入口参数:无
  9. * 返回参数:无
  10. ****************************************************************************/
  11. void delay_init() {
  12. SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
  13. fac_us=SYSCLK/8;
  14. fac_ms=(u16)fac_us*1000; //每个ms需要的systick时钟数
  15. }
  16. /****************************************************************************
  17. * 名称: void delay_us(u32 nus)
  18. * 功能:延时nus
  19. * 入口参数:要延时的微秒数
  20. * 返回参数:无
  21. * 说明:nus的值 不要大于798915us
  22. ****************************************************************************/
  23. void delay_us(u32 nus) {
  24. u32 midtime;
  25. SysTick->LOAD=nus*fac_us; //时间加载
  26. SysTick->VAL=0x00; //清空计数器
  27. SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ; //开始倒数
  28. do {
  29. midtime=SysTick->CTRL;
  30. }
  31. while((midtime&0x01)&&!(midtime&(1<<16)));//等待时间到达
  32. SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk; //关闭计数器
  33. SysTick->VAL =0X00; //清空计数器
  34. }
  35. /****************************************************************************
  36. * 名称: void delay_xms(u16 nms)
  37. * 功能:延时nms
  38. * 入口参数:要延时的毫秒数
  39. * 返回参数:无
  40. * 说明:SysTick->LOAD为24位寄存器,所以,最大延时为:nms<=0xffffff*8*1000/SYSCLK
  41. 对168M条件下nms<=798ms
  42. ****************************************************************************/
  43. void delay_xms(u16 nms) {
  44. u32 midtime;
  45. SysTick->LOAD=(u32)nms*fac_ms;//时间加载(SysTick->LOAD为24bit)
  46. SysTick->VAL =0x00; //清空计数器
  47. SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ; //开始倒数
  48. do {
  49. midtime=SysTick->CTRL;
  50. }
  51. while((midtime&0x01)&&!(midtime&(1<<16)));//等待时间到达
  52. SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk; //关闭计数器
  53. SysTick->VAL =0X00; //清空计数器
  54. }
  55. /****************************************************************************
  56. * 名称: void delay_ms(u16 nms)
  57. * 功能:延时nms
  58. * 入口参数:要延时的毫秒数
  59. * 返回参数:无
  60. * 说明:nms:0~65535
  61. ****************************************************************************/
  62. void delay_ms(u16 nms) {
  63. u8 repeat=nms/540; //这里用540,是考虑到某些地方可能超频使用
  64. //比如超频到248M的时候,delay_xms最大智能延时541ms左右了
  65. u16 remain=nms%540;
  66. while(repeat) {
  67. delay_xms(540);
  68. repeat--;
  69. }
  70. if(remain)delay_xms(remain);
  71. }

lcd.h

  1. #ifndef __LCD_H
  2. #define __LCD_H
  3. #include "delay.h"
  4. #include "stdlib.h"
  5. //LCD驱动重要参数集
  6. extern u16 lcd_id; //LCD ID
  7. extern u8 dir_flag; //横屏还是竖屏控制:0,竖屏;1,横屏
  8. extern u16 lcd_width; //LCD宽度
  9. extern u16 lcd_height; //LCD高度
  10. extern u16 write_gramcmd; //写gram指令
  11. extern u16 setxcmd; //设置x坐标指令
  12. extern u16 setycmd; //设置y坐标指令
  13. //LCD的画笔颜色和背景色
  14. extern u16 BRUSH_COLOR;//默认红色
  15. extern u16 BACK_COLOR; //背景颜色 默认为白色
  16. //-----------------LCD背光端口定义----------------
  17. #define LCD_BACK PDOut(3)//PFout(10) //LCD背光 PF10
  18. //根据硬件电路图可以看靠我们使用NOR/SRAM的Bank1.sector4,地址位 HADDR[27,26]=11
  19. //A12作为数据命令区分线
  20. //因为我们使用的是16位的数据高度,所以要注意设置时STM32内部会右移一位对齐
  21. #define CMD_BASE ((u32)(0x6C000000 | 0x00000000))
  22. #define DATA_BASE ((u32)(0x6C000000 | 0x00002000))
  23. #define LCD_CMD ( * (volatile u16 *) CMD_BASE )
  24. #define LCD_DATA ( * (volatile u16 *) DATA_BASE)
  25. //扫描方向定义
  26. #define L2R_U2D 0 //从左到右 从上到下
  27. #define L2R_D2U 1 //从左到右 从下到上
  28. #define R2L_U2D 2 //从右到左 从上到下
  29. #define R2L_D2U 3 //从右到左 从下到上
  30. #define U2D_L2R 4 //从上到下 从左到右
  31. #define U2D_R2L 5 //从上到下 从右到左
  32. #define D2U_L2R 6 //从下到上 从左到右
  33. #define D2U_R2L 7 //从下到上 从右到左
  34. #define INIT_SCAN_DIR R2L_U2D //设置初始化扫描方向
  35. //颜色值定义
  36. #define WHITE 0xFFFF
  37. #define BLACK 0x0000
  38. #define BLUE 0x001F
  39. #define GREEN 0x07E0
  40. #define BRED 0XF81F
  41. #define GRED 0XFFE0
  42. #define GBLUE 0X07FF
  43. #define BROWN 0XBC40
  44. #define BRRED 0XFC07
  45. #define GRAY 0X8430
  46. #define RED 0xF800
  47. #define MAGENTA 0xF81F
  48. #define CYAN 0x7FFF
  49. #define YELLOW 0xFFE0
  50. #define DARKBLUE 0X01CF //深蓝
  51. #define LIGHTBLUE 0X7D7C //浅蓝
  52. #define GRAYBLUE 0X5458 //灰蓝
  53. #define JBS for(JBS=RED;JBS<=DARKBLUE;JBS++)
  54. void LCD_WriteReg(u16 LCD_Reg, u16 LCD_Value);
  55. u16 LCD_ReadReg(u16 LCD_Reg);
  56. void LCD_WriteRAM_Prepare(void);
  57. void LCD_Init(void);//初始化
  58. void LCD_DisplayOn(void);//开显示
  59. void LCD_DisplayOff(void);//关显示
  60. void LCD_Clear(u16 Color);//清屏
  61. void LCD_SetCursor(u16 Xpos, u16 Ypos); //设置光标
  62. void LCD_DrawPoint(u16 x,u16 y); //画点
  63. void LCD_Color_DrawPoint(u16 x,u16 y,u16 color); //颜色画点
  64. u16 LCD_GetPoint(u16 x,u16 y); //读点
  65. void LCD_AUTOScan_Dir(u8 dir);
  66. void LCD_Display_Dir(u8 dir);
  67. void LCD_Set_Window(u16 sx,u16 sy,u16 width,u16 height);
  68. void LCD_Draw_Circle(u16 x0,u16 y0,u8 r); //画图
  69. void LCD_Draw_Line(u16 x1, u16 y1, u16 x2, u16 y2);//画线
  70. void LCD_Draw_Rectangle(u16 x1, u16 y1, u16 x2, u16 y2); //画矩形
  71. void LCD_Fill_onecolor(u16 sx,u16 sy,u16 ex,u16 ey,u16 color); //填充单个颜色
  72. void LCD_Draw_Picture(u16 sx,u16 sy,u16 ex,u16 ey,u16 *color); //填充指定颜色
  73. void LCD_DisplayChar(u16 x,u16 y,u8 word,u8 size); //显示一个字符
  74. void LCD_DisplayOTherChar(u16 x,u16 y,u8 word,u8 size); //显示除ASCII之外的字符
  75. void LCD_DisplayNum(u16 x,u16 y,u32 num,u8 len,u8 size,u8 mode); //显示 数字
  76. void LCD_DisplayNum_color(u16 x,u16 y,u32 num,u8 len,u8 size,u8 mode,u16 brushcolor,u16 backcolor); //显示自定义数字
  77. void LCD_DisplayString(u16 x,u16 y,u8 size,u8 *p); //显示一个12/16/24字体字符串
  78. void LCD_DisplayString_color(u16 x,u16 y,u8 size,u8 *p,u16 brushcolor,u16 backcolor); //显示一个12/16/24字体自定义颜色的字符串
  79. void LCD_DisplayMyname(u16 x,u16 y);
  80. void LCD_DisplayTu1(u16 x,u16 y);
  81. void LCD_DisplayTu2(u16 x,u16 y);
  82. #endif

lcd.c

  1. #include "lcd.h"
  2. #include "cfont.h"
  3. //初始化LCD的画笔颜色和背景色
  4. u16 BRUSH_COLOR=BLACK; //画笔颜色
  5. u16 BACK_COLOR=WHITE; //背景色
  6. //管理LCD驱动重要参数
  7. u16 lcd_id; //LCD ID
  8. u16 lcd_width; //LCD的宽度
  9. u16 lcd_height; //LCD的高度
  10. u16 write_gramcmd=0X2C;
  11. u16 read_gramcmd = 0x2E;
  12. u16 setxcmd=0X2A;
  13. u16 setycmd=0X2B;
  14. /****************************************************************************
  15. * 名称: void LCD_WriteReg(u16 LCD_Reg, u16 LCD_Value)
  16. * 功能:LCD写寄存器
  17. * 入口参数:LCD_Reg: 寄存器地址
  18. * LCD_RegValue: 要写入的数据
  19. ****************************************************************************/
  20. void LCD_WriteReg(u16 LCD_Reg, u16 LCD_Value) {
  21. LCD_CMD = LCD_Reg; //写入要写的寄存器序号
  22. LCD_DATA = LCD_Value; //向寄存器写入的数据
  23. }
  24. /****************************************************************************
  25. * 名称: u16 LCD_ReadReg(u16 LCD_Reg)
  26. * 功能:LCD读寄存器
  27. * 入口参数:LCD Reg:寄存器地址
  28. * 返回参数:督导该寄存器序号里的值
  29. ****************************************************************************/
  30. u16 LCD_ReadReg(u16 LCD_Reg) {
  31. LCD_CMD=LCD_Reg; //写入要读的寄存器序号
  32. delay_us(5);
  33. return LCD_DATA; //返回读到的值
  34. }
  35. //开始写GRAM
  36. void LCD_WriteRAM_Prepare(void) {
  37. LCD_CMD=write_gramcmd;
  38. }
  39. //lcd延时函数
  40. void lcdm_delay(u8 i) {
  41. while(i--);
  42. }
  43. //LCD开启显示
  44. void LCD_DisplayOn(void) {
  45. LCD_CMD=0x29;
  46. }
  47. //LCD关闭显示
  48. void LCD_DisplayOff(void) {
  49. LCD_CMD=0x28;
  50. }
  51. /****************************************************************************
  52. *名称: void LCD_SetCursor(u16 Xaddr, u16 Yaddr)
  53. * 功能:设置光标位置
  54. * 入口参数:x:x坐标 y:y坐标
  55. ****************************************************************************/
  56. void LCD_SetCursor(u16 Xaddr, u16 Yaddr) {
  57. LCD_CMD=setxcmd;
  58. LCD_DATA=(Xaddr>>8);
  59. LCD_DATA=(Xaddr&0XFF);
  60. LCD_CMD=setycmd;
  61. LCD_DATA=(Yaddr>>8);
  62. LCD_DATA=(Yaddr&0XFF);
  63. }
  64. /****************************************************************************
  65. * 名称: void LCD_AUTOScan_Dir(u8 dir)
  66. * 功能:设置LCD的自动扫描方向
  67. * 入口参数:dir:扫描方向
  68. ****************************************************************************/
  69. void LCD_AUTOScan_Dir(u8 dir) {
  70. u16 regval=0;
  71. u16 dirreg=0;
  72. switch(dir) {
  73. case L2R_U2D://从左到右 从上到下
  74. regval|=(0<<7)|(0<<6)|(0<<5); break;
  75. case L2R_D2U://从左到右 从下到上
  76. regval|=(1<<7)|(0<<6)|(0<<5); break;
  77. case R2L_U2D://从右到左 从上到下
  78. regval|=(0<<7)|(1<<6)|(0<<5); break;
  79. case R2L_D2U://从右到左 从下到上
  80. regval|=(1<<7)|(1<<6)|(0<<5); break;
  81. case U2D_L2R://从上到下 从左到右
  82. regval|=(0<<7)|(0<<6)|(1<<5); break;
  83. case U2D_R2L://从上到下 从右到左
  84. regval|=(0<<7)|(1<<6)|(1<<5); break;
  85. case D2U_L2R://从下到上 从左到右
  86. regval|=(1<<7)|(0<<6)|(1<<5);break;
  87. case D2U_R2L://从下到上 从右到左
  88. regval|=(1<<7)|(1<<6)|(1<<5); break;
  89. }
  90. //设置扫描方法
  91. dirreg=0X36;
  92. regval|=0X08;
  93. LCD_WriteReg(dirreg,regval);
  94. LCD_CMD=setxcmd; //x的最小值
  95. LCD_DATA=0;
  96. LCD_DATA=0;//x的最大值
  97. LCD_DATA=(lcd_width-1)>>8;
  98. LCD_DATA=(lcd_width-1)&0XFF;
  99. LCD_CMD=setycmd; //y的最小值
  100. LCD_DATA=0;
  101. LCD_DATA=0;//y的最大值
  102. LCD_DATA=(lcd_height-1)>>8;
  103. LCD_DATA=(lcd_height-1)&0XFF;
  104. }
  105. /****************************************************************************
  106. * 名称: void LCD_Display_Dir(u8 dir)
  107. * 功能:这只LCD显示方向
  108. * 入口参数:dir: 0,竖屏 1,横屏
  109. ****************************************************************************/
  110. void LCD_Display_Dir(u8 dir) {
  111. switch (dir) {
  112. case L2R_U2D:
  113. case L2R_D2U:
  114. case R2L_U2D:
  115. case R2L_D2U:
  116. //先左右后上下的是竖屏
  117. lcd_width=240;
  118. lcd_height=320;
  119. break;
  120. default:
  121. //先上下后左右的是横屏显示
  122. lcd_width=320;
  123. lcd_height=240;
  124. break;
  125. }
  126. LCD_AUTOScan_Dir(dir); //设置扫描方向
  127. }
  128. /****************************************************************************
  129. * 名称: u16 LCD_GetPoint(u16 x,u16 y)
  130. * 读取某点的颜色值
  131. * 入口参数:x:x坐标 y:y坐标
  132. * 返回参数:此点的颜色
  133. ****************************************************************************/
  134. u16 LCD_GetPoint(u16 x,u16 y) {
  135. vu16 r=0,g=0,b=0;
  136. if(x>=lcd_width||y>=lcd_height)
  137. return 0; //超过了范围 直接返回
  138. LCD_SetCursor(x,y);
  139. LCD_CMD = read_gramcmd; //9341 发送读GRAM指令
  140. if(LCD_DATA)
  141. r=0;
  142. lcdm_delay(2);
  143. r=LCD_DATA; //实际坐标颜色
  144. lcdm_delay(2);
  145. b=LCD_DATA;
  146. g=r&0XFF; //对于9341第一次读取的是RG的值 R在前 G在后 个占8位
  147. g<<=8;
  148. return (((r>>11)<<11)|((g>>10)<<5)|(b>>11)); //ILI9341需要公式转换一下}
  149. /****************************************************************************
  150. * 名称: void LCD_DrawPoint(u16 x,u16 y)
  151. * 功能:画点(在该点写入画笔的颜色)
  152. * 入口参数:x:x坐标 y:y坐标
  153. * 返回参数:无
  154. * 说明 RUSH_COLOR:此点的颜色值
  155. ****************************************************************************/
  156. void LCD_DrawPoint(u16 x,u16 y) {
  157. LCD_SetCursor(x,y); //设置光标位置
  158. LCD_WriteRAM_Prepare(); //开始写入GRAM
  159. LCD_DATA=BRUSH_COLOR;
  160. }
  161. /****************************************************************************
  162. * 名称: void LCD_Color_DrawPoint(u16 x,u16 y,u16 color)
  163. * 功能:在设置的坐标除画相应颜色(在该点写入自定义颜色)
  164. * 入口参数:x:x坐标 y:y坐标
  165. color 此点的颜色值
  166. *说明:color:写入此点的颜色值 UCGUI调用该函数
  167. ****************************************************************************/
  168. void LCD_Color_DrawPoint(u16 x,u16 y,u16 color) {
  169. LCD_CMD=setxcmd;
  170. LCD_DATA=(x>>8);
  171. LCD_DATA=(x&0XFF);
  172. LCD_CMD=setycmd;
  173. LCD_DATA=(y>>8);
  174. LCD_DATA=(y&0XFF);
  175. LCD_CMD=write_gramcmd;
  176. LCD_DATA=color;
  177. }
  178. /****************************************************************************
  179. * 名称: void LCD_Set_Window(u16 sx,u16 sy,u16 width,u16 height)
  180. * 功能:设置窗口,最后并设置画点坐标到窗口左上角(sx,sy)
  181. *入口参数:sx,sy:窗口起始坐标(左上角) width,height:窗口宽度和高度
  182. *说明:窗口大小width*height.
  183. ****************************************************************************/
  184. void LCD_Set_Window(u16 sx,u16 sy,u16 width,u16 height) {
  185. width=sx+width-1;
  186. height=sy+height-1;
  187. LCD_CMD=setxcmd;
  188. LCD_DATA=(sx>>8);
  189. LCD_DATA=(sx&0XFF);
  190. LCD_DATA=(width>>8);
  191. LCD_DATA=(width&0XFF);
  192. LCD_CMD=setycmd;
  193. LCD_DATA=(sy>>8);
  194. LCD_DATA=(sy&0XFF);
  195. LCD_DATA=(height>>8);
  196. LCD_DATA=(height&0XFF);
  197. }
  198. /****************************************************************************
  199. * 名称: void LCD_Clear(u16 color)
  200. * 功能:清屏函数
  201. * 入口参数:color: 要清屏的填充色
  202. ****************************************************************************/
  203. void LCD_Clear(u16 color) {
  204. u32 i=0;
  205. u32 pointnum=0;
  206. pointnum=lcd_width*lcd_height; //得到LCD总点数
  207. LCD_SetCursor(0x00,0x00); //设置光标位置
  208. LCD_WriteRAM_Prepare(); //开始写入GRAM
  209. for(i=0;i<pointnum;i++) {
  210. LCD_DATA=color;
  211. }
  212. }
  213. /****************************************************************************
  214. * 名称: void LCD_Fill_onecolor(u16 sx,u16 sy,u16 ex,u16 ey,u16 color)
  215. *功能:在指定的区域内填充单个颜色
  216. * 入口参数:(sx,sy),(ex,ey):填充矩形对角坐标 color:要填充的颜色
  217. *说明:区域大小为:(ex-sx+1)*(ey-sy+1)
  218. ****************************************************************************/
  219. void LCD_Fill_onecolor(u16 sx,u16 sy,u16 ex,u16 ey,u16 color) {
  220. u16 i,j;
  221. u16 nlen=0;
  222. nlen=ex-sx+1;
  223. for(i=sy;i<=ey;i++) {
  224. LCD_SetCursor(sx,i); //设置光标位置
  225. LCD_WriteRAM_Prepare(); //开始写入GRAM
  226. for(j=0;j<nlen;j++)LCD_DATA=color; //设置光标位置
  227. }
  228. }
  229. /****************************************************************************
  230. * 名称: void LCD_Draw_Picture(u16 sx,u16 sy,u16 ex,u16 ey,u16 *color)
  231. * 功能:在指定区域内画入图片
  232. * 入口参数:(sx,sy),(ex,ey):填充矩形对角坐标 color:要填充的图片像素颜色数组
  233. *说明:区域大小为:(ex-sx+1)*(ey-sy+1)
  234. ****************************************************************************/
  235. void LCD_Draw_Picture(u16 sx,u16 sy,u16 ex,u16 ey,u16 *color) {
  236. u16 height,width;
  237. u16 i,j;
  238. width=ex-sx+1; //得到图片的宽度
  239. height=ey-sy+1; //得到图片的高度
  240. for(i=0;i<height;i++) {
  241. LCD_SetCursor(sx,sy+i); //设置光标位置
  242. LCD_WriteRAM_Prepare(); //开始写入GRAM
  243. for(j=0;j<width;j++)LCD_DATA=color[i*height+j];//写入颜色值
  244. }
  245. }
  246. /****************************************************************************
  247. * 名称: void LCD_Draw_Line(u16 x1, u16 y1, u16 x2, u16 y2)
  248. * 功能:画线
  249. * 入口参数:x1,y1:起点坐标 x2,y2:终点坐标
  250. * 说明:有三种情况的画线,水平线、垂直线与斜线(画线、划矩形与画圆参考网上代码)
  251. ************************2****************************************************/
  252. void LCD_Draw_Line(u16 x1, u16 y1, u16 x2, u16 y2) {
  253. u16 i;
  254. int xm1=0,ym2=0,model_x,model_y,model, mcx,mcy,mRow,mCol;
  255. model_x=x2-x1; //计算直线的模 画线坐标增量
  256. model_y=y2-y1;
  257. mRow=x1;
  258. mCol=y1;
  259. if(model_x>0)mcx=1;
  260. else if(model_x==0)mcx=0; //垂直线
  261. else {mcx=-1;model_x=-model_x;}
  262. if(model_y>0)mcy=1;
  263. else if(model_y==0)mcy=0; //水平线
  264. else{mcy=-1;model_y=-model_y;}
  265. if( model_x>model_y)model=model_x;
  266. else model=model_y;
  267. for(i=0;i<=model+1;i++ ) //画线输出
  268. {
  269. LCD_DrawPoint(mRow,mCol);
  270. xm1+=model_x ;
  271. ym2+=model_y ;
  272. if(xm1>model) {
  273. xm1-=model;
  274. mRow+=mcx;
  275. }
  276. if(ym2>model) {
  277. ym2-=model;
  278. mCol+=mcy;
  279. }
  280. }
  281. }
  282. /****************************************************************************
  283. * 名称: void LCD_Draw_Rectangle(u16 x1, u16 y1, u16 x2, u16 y2)
  284. * 功能:画矩形
  285. * 入口参数:(x1,y1),(x2,y2):矩形的对角坐标
  286. ****************************************************************************/
  287. void LCD_Draw_Rectangle(u16 x1, u16 y1, u16 x2, u16 y2) {
  288. LCD_Draw_Line(x1,y1,x2,y1);
  289. LCD_Draw_Line(x1,y1,x1,y2);
  290. LCD_Draw_Line(x1,y2,x2,y2);
  291. LCD_Draw_Line(x2,y1,x2,y2);
  292. }
  293. /****************************************************************************
  294. * 名称: void LCD_Draw_Circle(u16 x0,u16 y0,u8 r)
  295. *功能:字指定位置画一个指定大小的圆
  296. * 入口参数:(x,y):中心点 r :半径
  297. ****************************************************************************/
  298. void LCD_Draw_Circle(u16 x0,u16 y0,u8 r) {
  299. int a,b;
  300. int di;
  301. a=0;b=r;
  302. di=3-(r<<1); //判断下个点位置的标志
  303. while(a<=b) {
  304. LCD_DrawPoint(x0+a,y0-b);
  305. LCD_DrawPoint(x0+b,y0-a);
  306. LCD_DrawPoint(x0+b,y0+a);
  307. LCD_DrawPoint(x0+a,y0+b);
  308. LCD_DrawPoint(x0-a,y0+b);
  309. LCD_DrawPoint(x0-b,y0+a);
  310. LCD_DrawPoint(x0-a,y0-b);
  311. LCD_DrawPoint(x0-b,y0-a);
  312. a++;
  313. if(di<0)di +=4*a+6; //使用Bresenham算法画圆
  314. else {
  315. di+=10+4*(a-b);
  316. b--;
  317. }
  318. }
  319. }
  320. /****************************************************************************
  321. * 名称: void LCD_DisplayChar(u16 x,u16 y,u8 num,u8 size)
  322. * 功能:在指定位置显示一个字符
  323. * 入口参数:x,y:起始坐标
  324. word:要显示的字符:abcdefg1234567890...
  325. size:字体大小 12/16/24
  326. *说明:取字模参考网上取字模方式,改字模取模方向为先从上到下,再从左到右
  327. ****************************************************************************/
  328. void LCD_DisplayChar(u16 x,u16 y,u8 word,u8 size) {
  329. u8 bytenum,bytedata, a,b;
  330. u16 ymid=y;
  331. if(size==12) bytenum=12; // 判断各个字体子啊字库数组中占的字节数
  332. else if(size==16) bytenum=16;
  333. else if(size==24) bytenum=36;
  334. else return;
  335. word=word-' '; //得到偏移后的值 因为空格之前的字符没在font.h中的数组里面
  336. for(b=0;b<bytenum;b++) {
  337. if(size==12)bytedata=char_1206[word][b]; //调用1206字体
  338. else if(size==16)bytedata=char_1608[word][b]; //调用1608字体
  339. else if(size==24)bytedata=char_2412[word][b]; //调用2412字体
  340. else return; //没有的字符数组 没字符字库
  341. for(a=0;a<8;a++) {
  342. if(bytedata&0x80)LCD_Color_DrawPoint(x,y,BRUSH_COLOR);
  343. else LCD_Color_DrawPoint(x,y,BACK_COLOR);
  344. bytedata<<=1;
  345. y++;
  346. if(y>=lcd_height)return; //超区域 退出函数
  347. if((y-ymid)==size) {
  348. y=ymid;
  349. x++;
  350. if(x>=lcd_width)return; //超区域 退出函数
  351. break;
  352. }
  353. }
  354. }
  355. }
  356. /****************************************************************************
  357. * 名称: void LCD_DisplayOtherChar(u16 x,u16 y,u8 num,u8 size)
  358. * 功能:在指定位置显示一个除ASCII之外的字符
  359. * 入口参数:x,y:起始坐标 word:要显示的字符 0:摄氏度标志 size:字体大小 12/16/24
  360. * 说明:取字模参考网上 该字模取模方向为先从上到下 再从左到右
  361. ****************************************************************************/
  362. void LCD_DisplayOTherChar(u16 x,u16 y,u8 word,u8 size) {
  363. u8 bytenum,bytedata, a,b;
  364. u16 ymid=y;
  365. if(size==12) bytenum=24; // 判断各个字体子啊字库数组中占的字节数
  366. else if(size==16) bytenum=32;
  367. else if(size==24) bytenum=72;
  368. else return;
  369. for(b=0;b<bytenum;b++) {
  370. if(size==12)bytedata=otherChar_1212[word][b]; //调用1212字体
  371. else if(size==16)bytedata=otherChar_1616[word][b]; //调用1616字体
  372. else if(size==24)bytedata=otherChar_2424[word][b]; //调用2424字体
  373. else return; //没有的字符数组,没字符字库
  374. for(a=0;a<8;a++) {
  375. if(bytedata&0x80)LCD_Color_DrawPoint(x,y,BRUSH_COLOR);
  376. else LCD_Color_DrawPoint(x,y,BACK_COLOR);
  377. bytedata<<=1;
  378. y++;
  379. if(y>=lcd_height)return; //超区域 退出函数
  380. if((y-ymid)==size) {
  381. y=ymid;
  382. x++;
  383. if(x>=lcd_width)return; //超区域 退出函数
  384. break;
  385. }
  386. }
  387. }
  388. }
  389. //m^n函数
  390. //返回值:m^n次方
  391. u32 LCD_Pow(u8 m,u8 n) {
  392. u32 mid=1;
  393. while(n--)mid*=m;
  394. return mid;
  395. }
  396. /****************************************************************************
  397. * 名称: : void LCD_DisplayNum(u16 x,u16 y,u32 num,u8 len,u8 size,u8 mode)
  398. * 功能: 在指定位置显示一串数字
  399. * 入口参数:x,y:起始坐标
  400. num:数值(0~999999999);
  401. len:长度(即要显示的位数)
  402. size:字体大小
  403. mode: 0:高位为0 不显示
  404. 1:高位为0显示0
  405. ****************************************************************************/
  406. void LCD_DisplayNum(u16 x,u16 y,u32 num,u8 len,u8 size,u8 mode) {
  407. u8 t,numtemp;
  408. u8 end0=0;
  409. for(t=0;t<len;t++) {
  410. numtemp=(num/LCD_Pow(10,len-t-1))%10;
  411. if(end0==0&&t<(len-1)) {
  412. if(numtemp==0) {
  413. if(mode)LCD_DisplayChar(x+(size/2)*t,y,'0',size);
  414. else LCD_DisplayChar(x+(size/2)*t,y,' ',size);
  415. continue;
  416. }else end0=1;
  417. }
  418. LCD_DisplayChar(x+(size/2)*t,y,numtemp+'0',size);
  419. }
  420. }
  421. /****************************************************************************
  422. * 名称: void LCD_DisplayNum_color(u16 x,u16 y,u32 num,u8 len,u8 size,u8 mode)
  423. * 功能:在指定位置显示一串自定义颜色的数字
  424. * 入口参数: x,y:起始坐标
  425. num:数值(0~999999999);
  426. len:长度(即要显示的位数)
  427. size:字体大小
  428. mode: 0:高位为0 不显示 1:高位为0显示0
  429. brushcolor:自定义画笔颜色
  430. backcolor:自定义背景颜色
  431. ****************************************************************************/
  432. void LCD_DisplayNum_color(u16 x,u16 y,u32 num,u8 len,u8 size,u8 mode,u16 brushcolor,u16 backcolor) {
  433. u16 bh_color,bk_color;
  434. bh_color=BRUSH_COLOR; //暂存画笔颜色
  435. bk_color=BACK_COLOR; //暂存背景颜色
  436. BRUSH_COLOR=brushcolor;
  437. BACK_COLOR=backcolor;
  438. LCD_DisplayNum(x,y,num,len,size,mode);
  439. BRUSH_COLOR=bh_color; //不改变系统颜色
  440. BACK_COLOR=bk_color;
  441. }
  442. /****************************************************************************
  443. * 名称: void LCD_DisplayString(u16 x,u16 y,u8 size,u8 *p)
  444. * 功能:显示字符串
  445. * 入口参数:x,y:起始坐标
  446. * size:字体大小 *p:字符串起始地址
  447. ****************************************************************************/
  448. void LCD_DisplayString(u16 x,u16 y,u8 size,u8 *p) {
  449. while((*p<='~')&&(*p>=' ')) //判断是不是非法字符! {
  450. LCD_DisplayChar(x,y,*p,size);
  451. x+=size/2;
  452. if(x>=lcd_width) break;
  453. p++;
  454. }
  455. }
  456. /****************************************************************************
  457. *名称: : void LCD_DisplayString(u16 x,u16 y,u8 size,u8 *p)
  458. * 功能: 显示自定义字符串
  459. * 入口参数:x,y:起始坐标
  460. * width,height:区域大小
  461. * size:字体大小
  462. * *p:字符串起始地址
  463. * brushcolor:自定义画笔颜色
  464. * backcolor:自定义背景颜色
  465. ****************************************************************************/
  466. void LCD_DisplayString_color(u16 x,u16 y,u8 size,u8 *p,u16 brushcolor,u16 backcolor) {
  467. u16 bh_color,bk_color;
  468. bh_color=BRUSH_COLOR; //暂存画笔颜色
  469. bk_color=BACK_COLOR; //暂存背景颜色
  470. BRUSH_COLOR=brushcolor;
  471. BACK_COLOR=backcolor;
  472. LCD_DisplayString(x,y,size,p);
  473. BRUSH_COLOR=bh_color; //不改变系统颜色
  474. BACK_COLOR=bk_color;
  475. }
  476. //配置FSMC可变静态存储控制器
  477. void LCD_FSMC_Config() {
  478. GPIO_InitTypeDef GPIO_InitStructure;
  479. FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStructure;
  480. FSMC_NORSRAMTimingInitTypeDef readWriteTiming;
  481. FSMC_NORSRAMTimingInitTypeDef writeTiming;
  482. RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD|RCC_AHB1Periph_GPIOE|RCC_AHB1Periph_GPIOF|RCC_AHB1Periph_GPIOG, ENABLE);//使能PD PE PF PG时钟
  483. RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FSMC,ENABLE);//使能FSMC时钟
  484. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; //PF10 推挽输出 控制背光
  485. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //普通输出模式
  486. GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽输出
  487. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //100MHz
  488. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
  489. GPIO_Init(GPIOD, &GPIO_InitStructure); //初始化 //
  490. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_14 | GPIO_Pin_15;
  491. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //复用输出
  492. GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽输出
  493. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
  494. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
  495. GPIO_Init(GPIOD, &GPIO_InitStructure); //初始化
  496. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
  497. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //复用输出
  498. GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽输出
  499. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
  500. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉­
  501. GPIO_Init(GPIOE, &GPIO_InitStructure); //初始化
  502. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PG2,FSMC_A12
  503. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //¸´ÓÃÊä³ö
  504. GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //ÍÆÍìÊä³ö
  505. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
  506. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //ÉÏÀ­
  507. GPIO_Init(GPIOG, &GPIO_InitStructure); //³õʼ»¯
  508. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; //PG12
  509. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //复用输出
  510. GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽输出
  511. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
  512. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉­­
  513. GPIO_Init(GPIOG, &GPIO_InitStructure); //初始化
  514. GPIO_PinAFConfig(GPIOD,GPIO_PinSource0,GPIO_AF_FSMC);//PD0,AF12
  515. GPIO_PinAFConfig(GPIOD,GPIO_PinSource1,GPIO_AF_FSMC);//PD1,AF12
  516. GPIO_PinAFConfig(GPIOD,GPIO_PinSource4,GPIO_AF_FSMC);
  517. GPIO_PinAFConfig(GPIOD,GPIO_PinSource5,GPIO_AF_FSMC);
  518. GPIO_PinAFConfig(GPIOD,GPIO_PinSource8,GPIO_AF_FSMC);
  519. GPIO_PinAFConfig(GPIOD,GPIO_PinSource9,GPIO_AF_FSMC);
  520. GPIO_PinAFConfig(GPIOD,GPIO_PinSource10,GPIO_AF_FSMC);
  521. GPIO_PinAFConfig(GPIOD,GPIO_PinSource14,GPIO_AF_FSMC);
  522. GPIO_PinAFConfig(GPIOD,GPIO_PinSource15,GPIO_AF_FSMC);//PD15,AF12
  523. GPIO_PinAFConfig(GPIOE,GPIO_PinSource7,GPIO_AF_FSMC); //PE7,AF12
  524. GPIO_PinAFConfig(GPIOE,GPIO_PinSource8,GPIO_AF_FSMC);
  525. GPIO_PinAFConfig(GPIOE,GPIO_PinSource9,GPIO_AF_FSMC);
  526. GPIO_PinAFConfig(GPIOE,GPIO_PinSource10,GPIO_AF_FSMC);
  527. GPIO_PinAFConfig(GPIOE,GPIO_PinSource11,GPIO_AF_FSMC);
  528. GPIO_PinAFConfig(GPIOE,GPIO_PinSource12,GPIO_AF_FSMC);
  529. GPIO_PinAFConfig(GPIOE,GPIO_PinSource13,GPIO_AF_FSMC);
  530. GPIO_PinAFConfig(GPIOE,GPIO_PinSource14,GPIO_AF_FSMC);
  531. GPIO_PinAFConfig(GPIOE,GPIO_PinSource15,GPIO_AF_FSMC);//PE15,AF12
  532. GPIO_PinAFConfig(GPIOG,GPIO_PinSource2,GPIO_AF_FSMC);//PF12,AF12
  533. GPIO_PinAFConfig(GPIOG,GPIO_PinSource12,GPIO_AF_FSMC);
  534. readWriteTiming.FSMC_AddressSetupTime = 0XF; //地址建立时间(ADDSET)为16个HCLK 1/168M=6ns*16=96ns > 90
  535. readWriteTiming.FSMC_AddressHoldTime = 0x00; //地址保持时间(ADDHLD)模式A未用到
  536. readWriteTiming.FSMC_DataSetupTime = 60; //数据存储时间为60个HCLK =6*60=360ns > 255
  537. readWriteTiming.FSMC_BusTurnAroundDuration = 0x00;
  538. readWriteTiming.FSMC_CLKDivision = 0x00;
  539. readWriteTiming.FSMC_DataLatency = 0x00;
  540. readWriteTiming.FSMC_AccessMode = FSMC_AccessMode_A; //模式A
  541. writeTiming.FSMC_AddressSetupTime = 3; //地址建立时间(ADDSET)为3个HCLK =18ns > 15
  542. writeTiming.FSMC_AddressHoldTime = 0x00; //地址保持时间(ADDHLD) 模式A不使用
  543. writeTiming.FSMC_DataSetupTime = 2; //数据保存时间为6ns*3个HCLK=18ns > 15
  544. writeTiming.FSMC_BusTurnAroundDuration = 0x00;
  545. writeTiming.FSMC_CLKDivision = 0x00;
  546. writeTiming.FSMC_DataLatency = 0x00;
  547. writeTiming.FSMC_AccessMode = FSMC_AccessMode_A; //模式A
  548. FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM4;// 使用E4,也就对应BTCR[6],[7]
  549. FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable; // 不复用数据地址
  550. FSMC_NORSRAMInitStructure.FSMC_MemoryType =FSMC_MemoryType_SRAM;// FSMC_MemoryType_SRAM; //SRAM
  551. FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;//存储器数据宽度为16bit
  552. FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode =FSMC_BurstAccessMode_Disable;// FSMC_BurstAccessMode_Disable;
  553. FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;
  554. FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait=FSMC_AsynchronousWait_Disable;
  555. FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;
  556. FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;
  557. FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable; //存储器写使能
  558. FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;
  559. FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Enable; // 读写使用不同的时序
  560. FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;
  561. FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &readWriteTiming; //读写时序
  562. FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &writeTiming; //写时序
  563. FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure); //初始化FSMC配置
  564. FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM4, ENABLE); // 使能BANK1
  565. delay_ms(50); // delay 50 ms
  566. }
  567. //初始化lcd
  568. void LCD_Init(void) {
  569. LCD_FSMC_Config();
  570. //尝试9341 ID的读取
  571. LCD_CMD=0XD3;
  572. lcd_id=LCD_DATA; //dummy read
  573. lcd_id=LCD_DATA; //读到0X00
  574. lcd_id=LCD_DATA; //读取93
  575. lcd_id<<=8;
  576. lcd_id|=LCD_DATA; //读取41
  577. LCD_CMD=0xCF;
  578. LCD_DATA=0x00;
  579. LCD_DATA=0xC1;
  580. LCD_DATA=0X30;
  581. LCD_CMD=0xED;
  582. LCD_DATA=0x64;
  583. LCD_DATA=0x03;
  584. LCD_DATA=0X12;
  585. LCD_DATA=0X81;
  586. LCD_CMD=0xE8;
  587. LCD_DATA=0x85;
  588. LCD_DATA=0x10;
  589. LCD_DATA=0x7A;
  590. LCD_CMD=0xCB;
  591. LCD_DATA=0x39;
  592. LCD_DATA=0x2C;
  593. LCD_DATA=0x00;
  594. LCD_DATA=0x34;
  595. LCD_DATA=0x02;
  596. LCD_CMD=0xF7;
  597. LCD_DATA=0x20;
  598. LCD_CMD=0xEA;
  599. LCD_DATA=0x00;
  600. LCD_DATA=0x00;
  601. LCD_CMD=0xC0; //Power control
  602. LCD_DATA=0x1B; //VRH[5:0]
  603. LCD_CMD=0xC1; //Power control
  604. LCD_DATA=0x01; //SAP[2:0];BT[3:0]
  605. LCD_CMD=0xC5; //VCM control
  606. LCD_DATA=0x30; //3F
  607. LCD_DATA=0x30; //3C
  608. LCD_CMD=0xC7; //VCM control2
  609. LCD_DATA=0XB7;
  610. LCD_CMD=0x36; // Memory Access Control
  611. LCD_DATA=0x48;
  612. LCD_CMD=0x3A;
  613. LCD_DATA=0x55;
  614. LCD_CMD=0xB1;
  615. LCD_DATA=0x00;
  616. LCD_DATA=0x1A;
  617. LCD_CMD=0xB6; // Display Function Control
  618. LCD_DATA=0x0A;
  619. LCD_DATA=0xA2;
  620. LCD_CMD=0xF2; // 3Gamma Function Disable
  621. LCD_DATA=0x00;
  622. LCD_CMD=0x26; //Gamma curve selected
  623. LCD_DATA=0x01;
  624. LCD_CMD=0xE0; //Set Gamma
  625. LCD_DATA=0x0F;
  626. LCD_DATA=0x2A;
  627. LCD_DATA=0x28;
  628. LCD_DATA=0x08;
  629. LCD_DATA=0x0E;
  630. LCD_DATA=0x08;
  631. LCD_DATA=0x54;
  632. LCD_DATA=0XA9;
  633. LCD_DATA=0x43;
  634. LCD_DATA=0x0A;
  635. LCD_DATA=0x0F;
  636. LCD_DATA=0x00;
  637. LCD_DATA=0x00;
  638. LCD_DATA=0x00;
  639. LCD_DATA=0x00;
  640. LCD_CMD=0XE1; //Set Gamma
  641. LCD_DATA=0x00;
  642. LCD_DATA=0x15;
  643. LCD_DATA=0x17;
  644. LCD_DATA=0x07;
  645. LCD_DATA=0x11;
  646. LCD_DATA=0x06;
  647. LCD_DATA=0x2B;
  648. LCD_DATA=0x56;
  649. LCD_DATA=0x3C;
  650. LCD_DATA=0x05;
  651. LCD_DATA=0x10;
  652. LCD_DATA=0x0F;
  653. LCD_DATA=0x3F;
  654. LCD_DATA=0x3F;
  655. LCD_DATA=0x0F;
  656. LCD_CMD=0x2B;
  657. LCD_DATA=0x00;
  658. LCD_DATA=0x00;
  659. LCD_DATA=0x01;
  660. LCD_DATA=0x3f;
  661. LCD_CMD=0x2A;
  662. LCD_DATA=0x00;
  663. LCD_DATA=0x00;
  664. LCD_DATA=0x00;
  665. LCD_DATA=0xef;
  666. LCD_CMD=0x11; //Exit Sleep
  667. delay_ms(120);
  668. LCD_CMD=0x29; //display on
  669. LCD_Display_Dir(U2D_R2L); //初始化为 横屏
  670. LCD_BACK=1; //点亮背光
  671. LCD_Clear(WHITE);
  672. }
  673. void LCD_DisplayMyname(u16 x,u16 y) {
  674. u8 bytenum,bytedata, a,b;
  675. u16 ymid=y;
  676. bytenum = sizeof(gao);//
  677. for(b=0;b<bytenum;b++) {
  678. bytedata=gao[b]; //调用1206字体
  679. //没有的字符数组 没字符字库
  680. for(a=0;a<8;a++) {
  681. if(bytedata&0x80)LCD_Color_DrawPoint(x,y,RED);
  682. else LCD_Color_DrawPoint(x,y,YELLOW);
  683. bytedata<<=1;
  684. y++;
  685. if(y>=lcd_height)return; //超区域 退出函数
  686. if((y-ymid)==32) {
  687. y=ymid;
  688. x++;
  689. if(x>=lcd_width)return; //超区域 退出函数
  690. break;
  691. }
  692. }
  693. }
  694. }
  695. void LCD_DisplayTu1(u16 x,u16 y) {
  696. u8 bytenum,bytedata, a,b;
  697. u16 ymid=y;
  698. bytenum = sizeof(biao1);//
  699. for(b=0;b<bytenum;b++) {
  700. bytedata=biao1[b]; //调用1206字体
  701. //没有的字符数组 没字符字库
  702. for(a=0;a<8;a++) {
  703. if(bytedata&0x80)LCD_Color_DrawPoint(x,y,WHITE);
  704. else LCD_Color_DrawPoint(x,y,BLUE);
  705. bytedata<<=1;
  706. y++;
  707. if(y>=lcd_height)return; //超区域 退出函数
  708. if((y-ymid)==32) {
  709. y=ymid;
  710. x++;
  711. if(x>=lcd_width)return; //超区域 退出函数
  712. break;
  713. }
  714. }
  715. }
  716. }
  717. void LCD_DisplayTu2(u16 x,u16 y) {
  718. u8 bytenum,bytedata, a,b;
  719. u16 ymid=y;
  720. bytenum = sizeof(biao2);//
  721. for(b=0;b<bytenum;b++) {
  722. bytedata=biao2[b]; //调用1206字体
  723. //没有的字符数组 没字符字库
  724. for(a=0;a<8;a++) {
  725. if(bytedata&0x80)LCD_Color_DrawPoint(x,y,WHITE);
  726. else LCD_Color_DrawPoint(x,y,BLUE);
  727. bytedata<<=1;
  728. y++;
  729. if(y>=lcd_height)return; //超区域 退出函数
  730. if((y-ymid)==32) {
  731. y=ymid;
  732. x++;
  733. if(x>=lcd_width)return; //超区域 退出函数
  734. break;
  735. }
  736. }
  737. }
  738. }

cfont.h

  1. #ifndef __CFONT_H
  2. #define __CFONT_H
  3. //字库均来源于网络工具生成 此处略
  4. //摄氏度符号
  5. const unsigned char otherChar_1212[1][24] = {{0x00,0x00,0x60,0x00,0x60,0x00,0x00,0x00,0x1F,0x80,0x20,0x40,0x20,0x40,0x20,0x40,0x20,0x40,0x20,0xC0,0x11,0x80,0x00,0x00}};
  6. const unsigned char otherChar_1616[1][32] = {{0x00,0x00,0x30,0x00,0x48,0x00,0x30,0x00,0x00,0x00,0x03,0xF0,0x0E,0x18,0x08,0x0C,0x10,0x04,0x10,0x04,0x10,0x04,0x10,0x04,0x08,0x0C,0x0C,0x38,0x00,0x00,0x00,0x00}};

ds18b20.h

  1. #ifndef S3C_DS_H
  2. #define S3C_DS_H
  3. extern void DS18B20_Init(void);
  4. extern void get_temperature(char *buf);
  5. #endif

ds18b20.c

  1. #include "stm32f4xx.h"
  2. #include "ds18b20.h"
  3. #include "delay.h"
  4. extern void gpio_out_state(int);
  5. extern int gpio_input_state(void);
  6. int DS1820_Reset(void); //DS1820 复位
  7. void DS1820_WriteData(char wData); //写数据到 DS1820
  8. /**********************************************************
  9. *DS1820 复位及存在检测(通过存在脉冲可以判断 DS1820 是否损坏)
  10. *函数名称:DS1820_Reset()
  11. *说明:函数返回一个位标量(0 或 1)flag=0 存在,反之 flag=1 不存在
  12. **********************************************************/
  13. int DS1820_Reset(void) {
  14. int flag;
  15. gpio_out_state(0);
  16. //延时 480 微秒,产生复位脉冲
  17. delay_us(480);
  18. gpio_out_state(1);
  19. //延时 80 微秒对总线采样
  20. delay_us(80);
  21. flag = gpio_input_state();
  22. //对数据脚采样
  23. delay_us(400); //延时 400 微秒等待总线恢复
  24. return flag; //根据 flag 的值可知 DS1820 是否存在或损坏 ,可加声音告警提示 DS1820 故障
  25. }
  26. /**********************************************************
  27. *写数据到 DS1820
  28. *函数名称:DS1820_WriteData()
  29. **********************************************************/
  30. void DS1820_WriteData(char wData) {
  31. char i;
  32. for(i = 8; i > 0; i--) {
  33. gpio_out_state(0); //拉低总线,产生写信号
  34. delay_us(4); //延时 4us
  35. gpio_out_state(wData & 0x01); //发送 1 位
  36. delay_us(60); //延时 60us,写时序至少要 60us
  37. gpio_out_state(1); //释放总线,等待总线恢复
  38. wData >>= 1; //准备下一位数据的传送
  39. }
  40. }
  41. /**********************************************************
  42. *DS18B20 初始化
  43. *函数名称:DS1820_WriteData()
  44. *说明:本初始化程序可以不要,因为 18B20 在出厂时就被配置为 12 位精度了
  45. **********************************************************/
  46. void DS18B20_Init(void) {
  47. DS1820_Reset();
  48. DS1820_WriteData(0xCC); // 跳过 ROM
  49. DS1820_WriteData(0x4E); // 写暂存器
  50. DS1820_WriteData(0x20); // 往暂存器的第三字节中写上限值
  51. DS1820_WriteData(0x00); // 往暂存器的第四字节中写下限值
  52. DS1820_WriteData(0x7F); // 将配置寄存器配置为 12 位精度
  53. DS1820_Reset();
  54. }
  55. /**********************************************************
  56. *从 DS1820 中读出数据
  57. *函数名称:DS1820_ReadData()
  58. **********************************************************/
  59. char DS1820_ReadData(void) {
  60. char i,TmepData = 0;
  61. for(i = 8; i > 0; i--) {
  62. TmepData >>= 1;
  63. gpio_out_state(0); //拉低总线,产生读信号
  64. delay_us(4); //延时 4us
  65. gpio_out_state(1); //释放总线,准备读数据
  66. delay_us(8); //延时 8 微秒读数据
  67. if(gpio_input_state())
  68. TmepData |= 0x80;
  69. delay_us(60); //延时 60us
  70. gpio_out_state(1); //拉高总线,准备下一位数据的读取.
  71. }
  72. return TmepData; //返回读到的数据
  73. }
  74. /**********************************************************
  75. *转换子程序
  76. **********************************************************/
  77. void tem_to_string(char *buf, char temperature[]) {
  78. unsigned char temp_data,temp_data_2;
  79. unsigned short TempDec; //用来存放 4 位小数
  80. temp_data = temperature[1];
  81. temp_data &= 0xf8; //取高 4 位
  82. if(temp_data == 0xf8) { //判断是正温度还是负温度读数
  83. //负温度读数求补,取反加 1,判断低 8 位是否有进位
  84. if(temperature[0]==0) { //有进位,高 8 位取反加 1
  85. temperature[0]=~temperature[0]+1;
  86. temperature[1]=~temperature[1]+1;
  87. }else { //没进位,高 8 位不加 1
  88. temperature[0]=~temperature[0]+1;
  89. temperature[1]=~temperature[1];
  90. }
  91. }
  92. //温度格式 temperature[1]:[xxxxAAAA] AAAA 温度的高4位
  93. //温度格式 temperature[0]:[BBBBCCCC] BBBB 温度的低4位 CCCC小数(乘以0.0625得到的是温度)
  94. temp_data = temperature[1]<<4; //取高字节低 4 位(温度读数高 4 位),注意此时是 12 位精度
  95. temp_data_2 = temperature[0]>>4; //取低字节高 4 位(温度读数低 4 位),注意此时是 12 位精度
  96. temp_data = temp_data | temp_data_2; //组合成完整数据
  97. buf[0] = temp_data / 100 + 0x30; //取百位转换为 ASCII 码
  98. buf[1] = (temp_data % 100) / 10 + 0x30; //取十位转换为 ASCII 码
  99. buf[2] = (temp_data % 100 ) % 10 + 0x30; //取个位转换为 ASCII 码
  100. buf[3] = '.';
  101. #if 0
  102. 1111 = 15;
  103. 2 ^ 3 + 2 ^ 2 + 2 ^ 1 + 2 ^ 0 = 15
  104. 1111 = (2 ^ 3 + 2 ^ 2 + 2 ^ 1 + 2 ^ 0) * 0.0625 = 15 * 0.0625
  105. #endif
  106. temperature[0] &= 0x0f; //取小数位转换为 ASCII 码
  107. TempDec = temperature[0] * 625; //625=0.0625*10000,表示小数部分,扩大 1 万倍 ,方便显示
  108. buf[4] = TempDec / 1000 + 0x30; //取小数十分位转换为 ASCII 码
  109. buf[5] = (TempDec % 1000) / 100 + 0x30; //取小数百分位转换为 ASCII 码
  110. buf[6] = ((TempDec % 1000) % 100) / 10 + 0x30; //取小数千分位转换为 ASCII 码
  111. buf[7] = ((TempDec % 1000) % 100) % 10 + 0x30; //取小数万分位转换为 ASCII 码
  112. buf[8] = '\0';
  113. }
  114. void get_temperature(char *buf) {
  115. int i;
  116. char temperature[2]; //存放温度数据
  117. DS1820_Reset(); //复位
  118. DS1820_WriteData(0xcc); //跳过 ROM 命令
  119. DS1820_WriteData(0x44); //温度转换命令
  120. DS1820_Reset(); //复位
  121. DS1820_WriteData(0xcc); //跳过 ROM 命令
  122. DS1820_WriteData(0xbe); //读 DS1820 温度暂存器命令
  123. for (i=0;i<2;i++){
  124. temperature[i] = DS1820_ReadData(); //采集温度
  125. }
  126. DS1820_Reset(); //复位,结束读数据
  127. tem_to_string(buf, temperature);
  128. delay_us(50);
  129. }

dht11.h

  1. #ifndef __DHT_H
  2. #define __DHT_H
  3. #include "stm32f4xx_conf.h"
  4. extern void dht_init(void);
  5. extern void dht_get_data(char *buf);
  6. #endif

dht11.c

  1. #include "dht11.h"
  2. #include "delay.h"
  3. #include "bitband.h"
  4. void dht_init(void) {
  5. RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
  6. }
  7. void dht_gpio_out(void) {
  8. GPIO_InitTypeDef Gpio_Value;
  9. RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
  10. Gpio_Value.GPIO_Mode = GPIO_Mode_OUT;
  11. Gpio_Value.GPIO_OType = GPIO_OType_PP;
  12. Gpio_Value.GPIO_Pin = GPIO_Pin_4;
  13. Gpio_Value.GPIO_PuPd = GPIO_PuPd_NOPULL;
  14. Gpio_Value.GPIO_Speed = GPIO_Fast_Speed;
  15. GPIO_Init(GPIOA, &Gpio_Value);
  16. }
  17. void dht_gpio_in(void) {
  18. GPIO_InitTypeDef Gpio_Value;
  19. RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
  20. Gpio_Value.GPIO_Mode = GPIO_Mode_IN;
  21. Gpio_Value.GPIO_Pin = GPIO_Pin_4;
  22. Gpio_Value.GPIO_PuPd = GPIO_PuPd_NOPULL;
  23. Gpio_Value.GPIO_Speed = GPIO_Fast_Speed;
  24. GPIO_Init(GPIOA, &Gpio_Value);
  25. }
  26. void dht_output_state(int state) {
  27. dht_gpio_out();
  28. if(state)
  29. PAOut(4) = 1;
  30. else
  31. PAOut(4) = 0;
  32. }
  33. int dht_input_state(void) {
  34. dht_gpio_in();
  35. return PAIn(4);
  36. }
  37. void dht_get_data(char *buf) {
  38. char i;
  39. char tmp = 0;
  40. dht_output_state(0);
  41. delay_ms(20);
  42. dht_output_state(1);
  43. while(dht_input_state());
  44. while(!dht_input_state());
  45. for(i = 0; i < 40; i++) {
  46. while(dht_input_state());
  47. while(!dht_input_state());
  48. delay_us(40);
  49. tmp <<= 1;
  50. if(dht_input_state())
  51. tmp |= 1;
  52. if((i + 1) % 8 == 0)// 7 15 23 31 {
  53. buf[i / 8] = tmp;
  54. tmp = 0;
  55. }
  56. }
  57. dht_output_state(1);
  58. }

STM32 f407 温湿度采集报警的更多相关文章

  1. 嵌入式系统及应用课程设计——基于STM32的温湿度监测系统

    大三上学期期末总结,嗯,没错上学期,写在新学期开始,hhh. 上学期学了一门嵌入式系统及应用的课程,期末的课程设计题目是基于STM32的温湿度监测系统. 记得刚开始做课程设计的时候,听说先设计画出原理 ...

  2. 温湿度监测系统设计:基于 STM32 的温湿度变送器的设计与实现

    前言:这个是2018年上半年完成的,这里只贴出硬件设计部分,软件设计部分可以看上位机说明书. 设计总说明 随着科学技术的不断发展,高集成度.高精度.高可靠性的一体化温湿度变送器开始 得到广泛的应用.同 ...

  3. STM32读取温湿度传感器DHT11和DHT21(AM2301)系列问题

    1.DHT11和DHT21传感器 这两种传感器都是奥松公司的产品,具体的传感器说明书在其官网上有(www.aosong.com). DHT11 数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合 ...

  4. 基于FSIOT_A 实验平台SAM3S4B cortex-M3的温湿度采集

    作者:卢老师,华清远见嵌入式学院讲师. DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器.它应用专用的数字模块采集技术和温湿度传感器技术,确保产品具有极高的可靠性与卓越的长期稳 ...

  5. [置顶] STM32的ADC1采集多条通道,可以不使用DMA功能吗?

    类似的问题 为什么我采集5条通道的电压,而采集到的值却都是第一条的呢? 我什么时候需要使用DMA功能? Ⅰ关于ADC的一些知识 STM32的ADC是一种12位逐次逼近型的模拟数字转换器.它有多达18条 ...

  6. STM32—ADC多通道采集电压

    文章目录 ADC详解 程序说明 函数主体 引脚配置 ADC和DMA配置 主函数 ADC详解 前面的博客中详细介绍了STM32中ADC的相关信息,这篇博客是对ADC内容的一个总结提升,ADC的详细介绍: ...

  7. 电信NB-IOT的温湿度采集器开发记录

    1. 首先打开浏览器,登录电信商用服务器,上传profile文件 2. 上传编解码插件在,注意的是,上传编解码插件是电信测试用服务器平台(不同的网址),反正不明白电信搞啥幺蛾子,得两个地方去上传 3. ...

  8. 自学stm32就要记住入了这个“大坑”要耐得住寂寞

    在现在的MCU使用量中,STM32绝对是翘楚!因为现在使用STM32开发产品的公司非常多,这主要得益于ST公司对自家MCU的大力推广,而且ST对自己MCU也配套了一系列开发软件,也有相应的硬件开发板供 ...

  9. 学习STM32单片机,从菜鸟到牛人就是这样简单(配视频资料)

    我想说,为了学习单片机而去学习单片机的思路不对. 你问,如何系统地入门学习stm32? 本身就是一个错误的问题.假如你会使用8051 , 会写C语言,那么STM32本身并不需要刻意的学习. 你要考虑的 ...

随机推荐

  1. 《DSP using MATLAB》Problem 5.22

    代码: %% ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ %% O ...

  2. 【mybatis源码学习】mybtias扩展点

    [1]org.apache.ibatis.reflection.ReflectorFactory 该扩展点,主要是对javaBean对象,进行反射操作. org.apache.ibatis.refle ...

  3. doubleclick adx note

    1, cid . is billing_id from  Main.html#PRETARGETING otherwise creative id will not upload to  creati ...

  4. 几张简单的terraform flow 图——可以快速了解terraform的使用

    以下是一个简单额terraform flow 我们快速的了解terraform 的使用,基于流程 参考图 参考架构 简单使用流程 说明 从上图我们可以看出terraform 的使用 tf 内容编写 定 ...

  5. DOM Access and Manipulation JS 操纵DOM

    JS 操纵DOM 有两种很简单的方式: 如果知道ID 的情况下. 我们可以使用 document.getElementById 我们还可以使用 document.getElementById(&quo ...

  6. Day 38 HTML

    HTML文档结构 <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset=&qu ...

  7. python + opencv + pycharm +语音生成

    安装puthon 2.7.14(内置pip) pip install numpy pip install opencv-python 安装opencv 3.3.0 进入opencv example目录 ...

  8. 单页面应用(SPA)重新部署后,正在浏览的页面如何更新缓存?

    当单页面的系统在重新部署更新时,此时正在浏览网页,并且已经在网页内的用户,始终会使用老的js与css文件,一直在使用已经缓存了的静态资源. 所有的缓存问题焦点都在index.html上,只要index ...

  9. 通过script src引入ElementUI时,使用语句:window.ELEMENT.MessageBox.alert(xxx) 调用弹出框

    通过script src引入ElementUI时,使用语句:window.ELEMENT.MessageBox.alert(xxx) 调用弹出框.

  10. ThinkPHP5与JQuery实现图片上传和预览效果

    内容正文 这篇文章主要为大家详细介绍了thinkphp上传图片功能,和jquery预览图片效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 先上效果图: html和js代码如下: <!DO ...