找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1763|回复: 0
打印 上一主题 下一主题
收起左侧

蓝桥杯嵌入式第七届省赛:模拟液位检测告警系统 STM32程序

[复制链接]
跳转到指定楼层
楼主
ID:440075 发表于 2020-3-4 17:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
```c
/*赛题:第七届:模拟液位检测告警系统”
**作者:*wj  
**时间:2021-2-13
**注意:设备通过串口发送给PC,思路和LCD动态显示一样(记得添加"stdio.h")
*/
**第一部分:逻辑功能实现**
  1. #include "stm32f10x.h"
  2. #include "lcd.h"
  3. #include "led.h"
  4. #include "key.h"
  5. #include "i2c.h"
  6. #include "stdio.h"
  7. #include "usart.h"
  8. #include "adc.h"
  9. u32 TimingDelay = 0;
  10. u8 text1[20];           //字符串数组1
  11. u8 text2[20];           //字符串数组2
  12. u8 RXBUF[20];           //串口接收数组
  13. u8 TXBUF[20];           //串口发送数组
  14. u8 RXOVER = 0;          //串口接收标志0:没有接收     1:接收
  15. u8 RXCOUNT = 0;         //串口数组计数变量      
  16. u8 ADC_Flag =1;         //ADC以1s间隔采集变量  1:采集(初始化为1,是让上电之后就进行一次电压采集)
  17. u8 K1_FLAG = 0;         //B1 按键: “设置”按键   0:液位检测界面    1://阈值设置界面
  18. u8 K2_FLAG = 0;         //B2 按键:切换选择 3 个待修改的阈值,被选中的阈值应突出显示
  19. u8 LED1_on = 0;         //控制LED1开变量
  20. u8 LED1_off = 0;        //控制LED1关变量
  21. u8 Threshold_1 = 30;    //液位范围1
  22. u8 Threshold_2 = 50;    //液位范围2
  23. u8 Threshold_3 = 70;    //液位范围3
  24. u8 Level_old = 0;       //上一次的水平值
  25. u8 Level_now= 0;        //新的水平值
  26. u8 Height = 0;          //液面高度变量
  27. float ADC_Value;        //ADC采集的值(浮点型)
  28. u8 i = 0;               //循环变量
  29. u8 j = 0;               //循环变量
  30. u8 k = 0;               //循环变量


  31. /************************函数引用**************************************/
  32. void Delay_Ms(u32 nTime);
  33. void RCC_Configuration(void);
  34. void LCD_Init(void);
  35. void KEY_Scan(void);
  36. void _24c02_Write(u16 addr, u16 data);
  37. u16 _24c02_Read(u16 addr);
  38. void LCD_Display(void);
  39. void Deal_Data(void);
  40. void LED_Blink(void);
  41. /************************Main Body函数**************************************/
  42. int main(void)
  43. {
  44.         i2c_init();             //IIC初始化
  45.     LCD_Init();             //LCD初始化
  46.         RCC_Configuration();    //所有外设时钟配置
  47.         LED_Configuration();    //LED配置
  48.         KEY_Configuration();    //KEY配置
  49.         USART2_Configuration(); //串口通信2配置
  50.         ADC_Configuration();    //ADC配置
  51.         while(1)
  52.         {
  53.             KEY_Scan();           //按键扫描函数
  54.                 Deal_Data();          //数据处理比较函数
  55.                 LCD_Display();        //LCD显示函数
  56.             LED_Blink();          //LED闪烁配置函数
  57.         }
  58. }
  59. /************************LCD_Init初始化函数**************************************/
  60. void LCD_Init(void)
  61. {
  62.         STM3210B_LCD_Init();
  63.         LCD_Clear(Blue);
  64.         LCD_SetBackColor(Blue);
  65.         LCD_SetTextColor(White);        
  66.         SysTick_Config(SystemCoreClock/1000);        
  67. //第一次给EEPROM写入数据
  68. //                _24c02_Write(0x01,30);
  69. //                Delay_Ms(10);
  70. //                _24c02_Write(0x02,50);
  71. //                Delay_Ms(10);
  72. //                _24c02_Write(0x03,70);
  73. //                Delay_Ms(10);               
  74. //上电之后读取之前存储的数据
  75.         Threshold_1 = _24c02_Read(0x01);
  76.         Delay_Ms(10);
  77.         Threshold_2 = _24c02_Read(0x02);
  78.         Delay_Ms(10);
  79.         Threshold_3 = _24c02_Read(0x03);
  80. }
  81. /************************LCD_Display显示函数**************************************/        
  82. void LCD_Display(void)
  83. {
  84.         if(K1_FLAG == 0)    // 液位检测界面
  85.         {
  86.                 LCD_DisplayStringLine(Line2 ,"    Liquid Level    ");
  87.                 sprintf((char*)text1,"  Height: %dcm ",Height);
  88.           LCD_DisplayStringLine(Line4,text1);               
  89.                 if(ADC_Flag == 1)
  90.                 {
  91.                         ADC_Flag =0;
  92.                         ADC_Value = Get_ADC(8) * 3.3 /0xfff;
  93.                         sprintf((char*)text2,"  ADC_VAL: %.2fV ",ADC_Value);  //保留俩位小数:.2f
  94.                         LCD_DisplayStringLine(Line6,text2);
  95.                 }                        
  96.                 sprintf((char*)text1,"  Level: %d ",Level_now);
  97.             LCD_DisplayStringLine(Line8,text1);        
  98.                 _24c02_Write(0x01,Threshold_1);
  99.                 Delay_Ms(10);
  100.                 _24c02_Write(0x02,Threshold_2);
  101.                 Delay_Ms(10);
  102.                 _24c02_Write(0x03,Threshold_3);
  103.                 Delay_Ms(10);                                       
  104.         }
  105.         else if(K1_FLAG == 1)  //阈值设置界面
  106.         {
  107.                 LCD_SetBackColor(Blue);      //第一行一直显示蓝色
  108.                 LCD_DisplayStringLine(Line2 ,"  Parameter Setup    ");        
  109.                 if(K2_FLAG == 1)
  110.                 {
  111.                   LCD_SetBackColor(Red);    //选中高亮显示
  112.                   sprintf((char*)text1,"  Threshold 1: %dcm   ",Threshold_1);               
  113.           LCD_DisplayStringLine(Line4,text1);                        
  114.                 }
  115.                 else
  116.                 {
  117.                   LCD_SetBackColor(Blue);
  118.                   sprintf((char*)text1,"  Threshold 1: %dcm   ",Threshold_1);               
  119.           LCD_DisplayStringLine(Line4,text1);        
  120.                 }
  121.                 if(K2_FLAG == 2)
  122.                 {
  123.                   LCD_SetBackColor(Red);
  124.                   sprintf((char*)text1,"  Threshold 2: %dcm   ",Threshold_2);               
  125.           LCD_DisplayStringLine(Line5,text1);                        
  126.                 }
  127.                 else
  128.                 {
  129.                   LCD_SetBackColor(Blue);
  130.                   sprintf((char*)text1,"  Threshold 2: %dcm   ",Threshold_2);               
  131.           LCD_DisplayStringLine(Line5,text1);        
  132.                 }               
  133.                 if(K2_FLAG == 3)
  134.                 {
  135.                   LCD_SetBackColor(Red);
  136.                   sprintf((char*)text1,"  Threshold 3: %dcm   ",Threshold_3);               
  137.           LCD_DisplayStringLine(Line6,text1);                        
  138.                 }
  139.                 else
  140.                 {
  141.                   LCD_SetBackColor(Blue);
  142.                   sprintf((char*)text1,"  Threshold 3: %dcm   ",Threshold_3);               
  143.           ![在这里插入图片描述]([img]https://img-blog.csdnimg.cn/20200225154220972.png[/img]?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDIzNjMwMg==,size_16,color_FFFFFF,t_70)LCD_DisplayStringLine(Line6,text1);        
  144.                 }
  145. //设置不要的行的颜色为背景颜色
  146.                 LCD_SetBackColor(Blue);
  147.                 LCD_DisplayStringLine(Line0 ,"                     ");   
  148.                 LCD_DisplayStringLine(Line1 ,"                     ");
  149.                 LCD_DisplayStringLine(Line3 ,"                     ");
  150.                 LCD_DisplayStringLine(Line7 ,"                     ");
  151.                 LCD_DisplayStringLine(Line8 ,"                     ");
  152.                 LCD_DisplayStringLine(Line9 ,"                     ");
  153.         }
  154. //串口部分               
  155.         if(RXOVER)
  156.         {               
  157.                 RXOVER = 0;
  158.                 if(RXBUF[0] == 'C')
  159.                 {
  160.             sprintf((char*)TXBUF,"C:H%d+L%d\r\n",Height,Level_now);     
  161.                         Send_String(TXBUF);                        
  162.                 }
  163.                 else if(RXBUF[0] == 'S')
  164.                 {
  165.             sprintf((char*)TXBUF,"S:TL%d+TM%d+TH%d\r\n",Threshold_1,Threshold_2,Threshold_3);     
  166.                         Send_String(TXBUF);                        
  167.                 }
  168.                 for(k=0;k<5;k++)
  169.                 {
  170.                         LED_Control(LED1,1);
  171.                         LED_Control(LED3,0);                                                        
  172.                         Delay_Ms(200);
  173.                         LED_Control(LED3,1);                                
  174.                         Delay_Ms(200);
  175.                 }
  176.                 for(i=0;i<20;i++)
  177.                 {
  178.                         RXBUF[i] = 0;                [/i][i]
  179.                 }
  180.           USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
  181.         }        
  182. }
  183. /************************液位水平比较函数**************************************/        
  184. void Deal_Data(void)
  185. {
  186.         Height = ADC_Value * 100 / 3.3;   //根据题目要求的关系
  187.         if(Height <= Threshold_1)
  188.         {
  189.                 Level_now = 0;        
  190.         }
  191.         else if((Threshold_1 < Height ) && (Height <=  Threshold_2))
  192.         {
  193.                 Level_now = 1;        
  194.         }
  195.         else if((Threshold_2 < Height ) && (Height <=  Threshold_3))
  196.         {
  197.                 Level_now = 2;        
  198.         }
  199.         else if(Threshold_3 < Height )
  200.         {
  201.                 Level_now = 3;        
  202.         }        
  203. }


  204. /************************LED闪烁函数**************************************/        
  205. void LED_Blink(void)
  206. {
  207. //LED1_配置
  208.         if(K1_FLAG == 0)        //运行状态下
  209.         {
  210.                 if(LED1_on == 1)
  211.                 {
  212.                         LED1_on =0;
  213.                   LED_Control(LED1,0);               
  214.                 }


  215.                 if(LED1_off == 1)
  216.                 {
  217.                         LED1_off=0;
  218.             LED_Control(LED1,1);               
  219.                 }        
  220.         }
  221.         else
  222.   {
  223.           LED_Control(LED1,1);
  224.         }
  225. //LED2_配置
  226.         if(Level_old != Level_now)
  227.         {
  228.                 if(Level_now > Level_old)
  229.                         {
  230.                                 sprintf((char*)TXBUF,"A:H%d+L%d+U\r\n",Height,Level_now);     
  231.                                 Send_String(TXBUF);                                                        
  232.                         }
  233.                 if(Level_now < Level_old)
  234.                         {
  235.                                 sprintf((char*)TXBUF,"A:H%d+L%d+D\r\n",Height,Level_now);     
  236.                                 Send_String(TXBUF);                                
  237.                         }
  238.                 for(j=0;j<5;j++)
  239.                 {
  240.                         LED_Control(LED1,1);
  241.                     LED_Control(LED2,0);                                                        
  242.             Delay_Ms(200);
  243.                     LED_Control(LED2,1);                                
  244.             Delay_Ms(200);               
  245.                 }  
  246.         }
  247.         Level_old = Level_now;       //加载上一次的液位等级
  248. }
  249. /************************外设时钟函数**************************************/        
  250. void RCC_Configuration(void)
  251. {
  252.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
  253.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE);
  254.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC , ENABLE);
  255.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD , ENABLE);
  256.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
  257.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
  258. }
  259. /************************外设时钟函数**************************************/        
  260. void KEY_Scan(void)
  261. {
  262.         if(K1 == 0)
  263.         {
  264.           Delay_Ms(10);
  265.                 if(K1 == 0)
  266.                 {
  267.                   if(K1_FLAG == 0)
  268.                         {
  269.                           K1_FLAG = 1;                        
  270.                         }
  271.                         else
  272.                         {
  273.                           K1_FLAG = 0;
  274.                         }        
  275.                 }
  276.                 while(K1 == 0)
  277.                 LCD_ClearLine(Line0);
  278.                 LCD_ClearLine(Line1);
  279.                 LCD_ClearLine(Line2);
  280.                 LCD_ClearLine(Line3);
  281.                 LCD_ClearLine(Line4);
  282.                 LCD_ClearLine(Line5);
  283.                 LCD_ClearLine(Line6);
  284.                 LCD_ClearLine(Line7);
  285.                 LCD_ClearLine(Line8);
  286.                 LCD_ClearLine(Line9);               
  287.         }


  288.         if(K2 == 0 && K1_FLAG == 1)
  289.         {
  290.           Delay_Ms(10);
  291.                 if(K2 == 0 && K1_FLAG == 1)
  292.                 {        
  293.                         if(K2_FLAG < 3)
  294.                         K2_FLAG++;               
  295.       else
  296.       K2_FLAG=1;                                
  297.                 }
  298.                 while(K2 == 0);
  299.         }        


  300.         if(K3 == 0)
  301.         {
  302.           Delay_Ms(10);
  303.                 if(K3 == 0)
  304.                 {
  305.                   if(K2_FLAG == 1)
  306.                         {
  307.                                 if(Threshold_1 < Threshold_2)
  308.                                 Threshold_1 +=5;
  309.               else
  310.                                 Threshold_1 = Threshold_2;
  311.                         }
  312.                   else if(K2_FLAG == 2)
  313.                         {
  314.                                 if(Threshold_2<Threshold_3)
  315.                                 Threshold_2 +=5;
  316.               else
  317.                                 Threshold_2 = Threshold_3;
  318.                         }
  319.                         else if(K2_FLAG == 3)
  320.                         {
  321.                                 if(Threshold_3<90)
  322.                                 Threshold_3 +=5;
  323.               else
  324.                                 Threshold_3 = 95;
  325.                         }        
  326.                 }
  327.                 while(K3 == 0);
  328.         }        


  329.         if(K4 == 0)
  330.         {
  331.           Delay_Ms(10);
  332.                 if(K4 == 0)
  333.                 {
  334.                   if(K2_FLAG == 1)
  335.                         {
  336.                                 if(Threshold_1>5)
  337.                                 Threshold_1 -=5;
  338.               else
  339.                                 Threshold_1 = 5;
  340.                         }
  341.                   else if(K2_FLAG == 2)
  342.                         {
  343.                                 if(Threshold_2 >Threshold_1)
  344.                                 Threshold_2 -=5;
  345.               else
  346.                                 Threshold_2 = Threshold_1;
  347.                         }
  348.                         else if(K2_FLAG == 3)
  349.                         {
  350.                                 if(Threshold_3>Threshold_2)
  351.                                 Threshold_3 -=5;
  352.               else
  353.                                 Threshold_3 = Threshold_2;
  354.                         }        
  355.                 }
  356.                 while(K4 == 0);
  357.         }        
  358. }




  359. void _24c02_Write(u16 addr, u16 data)
  360. {


  361.         I2CStart();
  362.         I2CSendByte(0xa0);
  363.         I2CSendAck();
  364.         I2CSendByte(addr);
  365.         I2CSendAck();
  366.         I2CSendByte(data);
  367.     I2CSendAck();
  368.         I2CStop();
  369. }




  370. u16 _24c02_Read(u16 addr)
  371. {
  372.     u16 temp;
  373.         I2CStart();
  374.         I2CSendByte(0xa0);
  375.         I2CSendAck();
  376.         I2CSendByte(addr);
  377.         I2CSendAck();
  378.         
  379.         I2CStart();
  380.         I2CSendByte(0xa1);
  381.         I2CSendAck();
  382.         temp = I2CReceiveByte();
  383.         I2CSendAck();
  384.         I2CStop();
  385.         return temp;
  386.         
  387. }


  388. void Delay_Ms(u32 nTime)
  389. {
  390.         TimingDelay = nTime;
  391.         while(TimingDelay != 0);        
  392. }
  393. ```
  394. **第二部分:初始化配置**


  395. ```bash
  396. #define LED1 GPIO_Pin_8
  397. #define LED2 GPIO_Pin_9
  398. #define LED3 GPIO_Pin_10
  399. #define LED4 GPIO_Pin_11
  400. #define LED5 GPIO_Pin_12
  401. #define LED6 GPIO_Pin_13
  402. #define LED7 GPIO_Pin_14
  403. #define LED8 GPIO_Pin_15
  404. #define LEDALL GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15


  405. ```


  406. ```c
  407. #include "led.h"


  408. /**
  409. 功能:初始化LED管脚
  410. 注意:为了防止LCD LED显示的冲突对LCD写函数进行了寄存器的操作
  411. **/        
  412. void LED_Configuration(void)
  413. {
  414.   GPIO_InitTypeDef GPIO_InitStructure;


  415.   GPIO_InitStructure.GPIO_Pin = LEDALL;
  416.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  417.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  418.   GPIO_Init(GPIOC, &GPIO_InitStructure);


  419.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
  420.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  421.   GPIO_Init(GPIOD, &GPIO_InitStructure);


  422.         GPIO_SetBits(GPIOD,GPIO_Pin_2);
  423.         GPIO_SetBits(GPIOC,LEDALL);
  424.         GPIO_ResetBits(GPIOD,GPIO_Pin_2);
  425.         
  426. }
  427. /**
  428. 功能:控制LED亮灭
  429. 入口参数ledx:LED1-LED8
  430. 入口参数led_sta:低电平点亮(根据原理图配置)
  431. **/        
  432. void LED_Control(u16 ledx,u16 led_sta)
  433. {
  434.         if(led_sta == 0)
  435.         {
  436.                 GPIO_SetBits(GPIOD,GPIO_Pin_2);
  437.                 GPIO_ResetBits(GPIOC,ledx);
  438.                 GPIO_ResetBits(GPIOD,GPIO_Pin_2);
  439.         }
  440.         else
  441.         {
  442.                 GPIO_SetBits(GPIOD,GPIO_Pin_2);
  443.                 GPIO_SetBits(GPIOC,ledx);
  444.                 GPIO_ResetBits(GPIOD,GPIO_Pin_2);        
  445.         }
  446. }
  447. ```






  448. ```bash
  449. #define K1 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)
  450. #define K2 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_8)
  451. #define K3 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)
  452. #define K4 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_2)
  453. ```


  454. ```c
  455. #include "key.h"
  456. void KEY_Configuration(void)
  457. {
  458.   GPIO_InitTypeDef GPIO_InitStructure;


  459.   /* Configure TIM1_CH1 (PA8) as alternate function push-pull */
  460.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_8;
  461.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  462.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  463.   GPIO_Init(GPIOA, &GPIO_InitStructure);


  464.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;
  465.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  466.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  467.   GPIO_Init(GPIOB, &GPIO_InitStructure);
  468. }
  469. ```


  470. ```c
  471. #include "usart.h"
  472. void USART2_Configuration(void)
  473. {
  474.   USART_InitTypeDef USART_InitStructure;
  475.   GPIO_InitTypeDef GPIO_InitStructure;
  476.   NVIC_InitTypeDef NVIC_InitStructure;
  477.         
  478.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 ;
  479.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  480.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  481.   GPIO_Init(GPIOA, &GPIO_InitStructure);


  482.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
  483.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  484.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  485.   GPIO_Init(GPIOA, &GPIO_InitStructure);
  486.         
  487.   USART_InitStructure.USART_BaudRate = 9600;
  488.   USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  489.   USART_InitStructure.USART_StopBits = USART_StopBits_1;
  490.   USART_InitStructure.USART_Parity = USART_Parity_No;
  491.   USART_InitStructure.USART_HardwareFlowControl =    USART_HardwareFlowControl_None;
  492.   USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;        


  493.   NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
  494.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  495.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  496.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  497.   NVIC_Init(&NVIC_InitStructure);


  498.   USART_Init(USART2, &USART_InitStructure);
  499.   USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
  500.   /* Enable the USART2 */
  501.   USART_Cmd(USART2, ENABLE);
  502. }


  503. /**
  504. 功能:发送字符串
  505. 入口参数:发送内容
  506. **/        
  507. void Send_String(u8 *str)
  508. {
  509.         u8 index = 0;
  510.         do
  511.         {
  512.                 USART_SendData(USART2, str[index]);
  513.                 while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);
  514.                 index++;
  515.         }
  516.         while(str[index] != 0);
  517. }
  518. ```


  519. ```c
  520. #include "adc.h"
  521. void ADC_Configuration(void)
  522. {
  523.         GPIO_InitTypeDef GPIO_InitStructure;
  524.   ADC_InitTypeDef  ADC_InitStructure;
  525.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
  526.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  527.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;   //模拟输入
  528.   GPIO_Init(GPIOB, &GPIO_InitStructure);


  529.         RCC_ADCCLKConfig(RCC_PCLK2_Div6);   //ADC时钟分频,不能超过14M,所以72/6=12M
  530.   /* ADC1 configuration ------------------------------------------------------*/
  531.   ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
  532.   ADC_InitStructure.ADC_ScanConvMode = DISABLE;
  533.   ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
  534.   ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
  535.   ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  536.   ADC_InitStructure.ADC_NbrOfChannel = 1;
  537.   ADC_Init(ADC1, &ADC_InitStructure);
  538.   ADC_Cmd(ADC1, ENABLE);
  539.         
  540.   /* Enable ADC1 reset calibration register */   
  541.   ADC_ResetCalibration(ADC1);
  542.   /* Check the end of ADC1 reset calibration register */
  543.   while(ADC_GetResetCalibrationStatus(ADC1));


  544.   /* Start ADC1 calibration */
  545.   ADC_StartCalibration(ADC1);
  546.   /* Check the end of ADC1 calibration */
  547.   while(ADC_GetCalibrationStatus(ADC1));
  548.         
  549. }
  550. /**
  551. 功能:获取模拟输入变量
  552. 入口参数:ADC的通道(因为板上配置ADC_Channel_8)
  553. 局部变量:u16 temp保存读取的模拟量
  554. 返回值:temp保存读取的模拟量
  555. **/        
  556. u16 Get_ADC(u8 channel)
  557. {
  558.         u16 temp;
  559.   /* ADC1 regular channel14 configuration */
  560.   ADC_RegularChannelConfig(ADC1, channel, 1, ADC_SampleTime_239Cycles5);        
  561.         ADC_SoftwareStartConvCmd(ADC1,ENABLE);
  562.         while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC) == 0);  //转换结束标志ADC_FLAG_EOC
  563.         temp = ADC_GetConversionValue(ADC1);
  564.         ADC_SoftwareStartConvCmd(ADC1,DISABLE);
  565.   return temp;
  566. }
  567. ```
  568. **第三部分:中断处理**


  569. ```bash
  570. extern u32 TimingDelay;
  571. extern u8 RXBUF[20];
  572. extern u8 RXOVER;
  573. extern u8 RXCOUNT;
  574. extern u8 LED1_on;
  575. extern u8 LED1_off;
  576. extern u8 ADC_Flag;
  577. ```


  578. ```c
  579. void SysTick_Handler(void)
  580. {
  581.         static u16 count1 = 0 ,count2 =0;
  582.         TimingDelay--;
  583.         if(++count1 == 1000)
  584.         {
  585.                 count1 = 0;
  586.           LED1_on        = 1;
  587.                 ADC_Flag = 1;
  588.         }
  589.   if(++count2 == 2000)
  590.         {
  591.                 count2 = 0;
  592.           LED1_off = 1;
  593.         }
  594. }




  595. void USART2_IRQHandler(void)
  596. {
  597.         u8 temp;
  598.   if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
  599.   {
  600.           USART_ClearITPendingBit(USART2,USART_IT_RXNE);
  601.                 temp = USART_ReceiveData(USART2);
  602.                 if(temp == '\n' || RXCOUNT ==20)
  603.                 {
  604. //                        RXBUF[RXCOUNT - 1] = 0;         //防止最后出现乱码\r
  605.                         RXOVER = 1;                        
  606.                   RXCOUNT=0;
  607.                         USART_ITConfig(USART2, USART_IT_RXNE, DISABLE);
  608.                 }
  609.                 else
  610.                 {
  611.                         RXBUF[RXCOUNT] = temp;
  612.                   RXCOUNT++;
  613.                 }               
  614.         }
  615. }
复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表