完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
1、题目要求
2、初始化 void init(void) { GPIO_InitTypeDef GPIO_InitStructure; ADC_InitTypeDef ADC_InitStructure; DMA_InitTypeDef DMA_InitStructure; USART_InitTypeDef USART_InitStructure; /*********************RCC********************/ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO|RCC_APB2Periph_ADC1|RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC |RCC_APB2Periph_GPIOD, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); /*********************LED********************/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All; //初始化LED引脚 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOC, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //初始化锁存器引脚 GPIO_Init(GPIOD, &GPIO_InitStructure); GPIO_SetBits(GPIOC, GPIO_Pin_All); //关闭LED GPIO_SetBits(GPIOD, GPIO_Pin_2); //锁存器下降沿 GPIO_ResetBits(GPIOD, GPIO_Pin_2); /*********************ADC********************/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5;//初始化PA4引脚 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_Init(GPIOA, &GPIO_InitStructure); //DMA初始化 DMA_DeInit(DMA1_Channel1); DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address; DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&ADCValue; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; DMA_InitStructure.DMA_BufferSize = 2; //数组大小为2 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //开启内存地址自增 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_Init(DMA1_Channel1, &DMA_InitStructure); DMA_Cmd(DMA1_Channel1, ENABLE); //ADC初始化 ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMode = ENABLE; ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel = 2; //转换两个通道 ADC_Init(ADC1, &ADC_InitStructure); ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 1, ADC_SampleTime_55Cycles5); ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 2, ADC_SampleTime_55Cycles5); ADC_DMACmd(ADC1, ENABLE); ADC_Cmd(ADC1, ENABLE); ADC_ResetCalibration(ADC1); while(ADC_GetResetCalibrationStatus(ADC1)); ADC_StartCalibration(ADC1); while(ADC_GetCalibrationStatus(ADC1)); ADC_SoftwareStartConvCmd(ADC1, ENABLE); /*********************USART********************/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOA, &GPIO_InitStructure); USART_InitStructure.USART_BaudRate = 9600; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Tx; //仅用到发送模式 USART_Init(USART2, &USART_InitStructure); USART_Cmd(USART2, ENABLE); } 初始化函数主要做了以下几个功能: -初始化LED以及锁存器的GPIO(只用到了LED1仅需配置PC8即可) -初始化ADC及DMA(ADC按键以及电位器双通道) -初始化USART2(只用到了发送功能) 3、串口操作函数 在串口这部分只用到了发送功能,所以首先写出一个发送字符串的函数。在发送函数的基础上写出两个满足题目要求的发送参数以及价格的函数。这部分比较简单,仅需要注意到题目要求每次发送的是三行记得加换行符就好。 4、按键操作 按键这部分用到的是ADC按键,根据下面的电路图可以看出初始ADC采集到0V,根据不同的按键按下就采取了不同的电阻进行分压,根据采集到的电压不同即可判断出是哪个按键被按下。需要注意的是不同的板子可能会有差别,所以在判断时应该给一个较宽范围。 ADC按键电路图 /*****************KEY**********************/ void KeyScan(void) { u16 i=0; //111111111111111 if(ADCValue[1] < 100) { Delay_Ms(2); if(ADCValue[1] < 100) { while(ADCValue[1] < 4000); LCD_Clear(Blue); if(jiemian == 1) { hw[1] = 1;//切换界面时高亮指向第一行 jiemian=2; } else { jiemian=1; sprintf((char *)str," Tot : 0.00 R ");//切换界面时计费清空 LCD_DisplayStringLine(Line6, str); IICWrite(0x01,((u16)(Price[0]*100)/0xff)); IICWrite(0x02,((u16)(Price[0]*100)%0xff)); IICWrite(0x03,((u16)(Price[1]*100)/0xff)); IICWrite(0x04,((u16)(Price[1]*100)%0xff)); IICWrite(0x05,((u16)(Price[2]*100)/0xff)); IICWrite(0x06,((u16)(Price[2]*100)%0xff)); Set_Send(); } } } //2222222222222222 else if(ADCValue[1] > 350 && ADCValue[1] < 650) { Delay_Ms(2); if(ADCValue[1] > 350 && ADCValue[1] < 650) { if(jiemian == 2) //确认是在setting界面 { while(ADCValue[1] < 4000) //实现长短按 { Delay_Ms(1); i++; if(i>800) //长按 { Price[hw[1]-1] += 0.01; if(Price[hw[1]-1]>10)//上限 Price[hw[1]-1]=10; DisPlay(); //刷新显示 } } if(i<800) //短按 Price[hw[1]-1] += 0.01; if(Price[hw[1]-1]>10) //上限 Price[hw[1]-1]=10; } } } //3333333333333333 else if(ADCValue[1] > 1000 && ADCValue[1] < 1300) { Delay_Ms(2); if(ADCValue[1] > 1000 && ADCValue[1] < 1300) { if(jiemian == 2) //确认是在setting界面 { while(ADCValue[1] < 4000) //实现长短按 { Delay_Ms(1); i++; if(i>800) //长按 { Price[hw[1]-1] -= 0.01; if(Price[hw[1]-1]<0) Price[hw[1]-1]=0; DisPlay(); } } if(i<800) //短按 Price[hw[1]-1] -= 0.01; if(Price[hw[1]-1]<0) Price[hw[1]-1]=0; } } } //4444444444444 else if(ADCValue[1] > 1700 && ADCValue[1] < 2000) { Delay_Ms(2); if(ADCValue[1] > 1700 && ADCValue[1] < 2000) { while(ADCValue[1] < 4000); if(jiemian == 2) //确认是在setting界面 { hw[1]++; //切换高亮显示行 if(hw[1] >3) hw[1] = 1; } } } //55555555555555 else if(ADCValue[1] > 2200 && ADCValue[1] < 2400) { Delay_Ms(2); if(ADCValue[1] > 2200 && ADCValue[1] < 2400) { while(ADCValue[1] < 4000); hw[0]=1;//选择货物1 } } //66666666666666 else if(ADCValue[1] > 2620 && ADCValue[1] < 2850) { Delay_Ms(2); if(ADCValue[1] > 2620 && ADCValue[1] < 2850) { while(ADCValue[1] < 4000); hw[0]=2;//选择货物2 } } //777777777777777 else if(ADCValue[1] > 3000 && ADCValue[1] < 3300) { Delay_Ms(2); if(ADCValue[1] > 3000 && ADCValue[1] < 3300) { while(ADCValue[1] < 4000); hw[0]=3;//选择货物3 } } //888888888888888 else if(ADCValue[1] > 3400 && ADCValue[1] < 3600) { Delay_Ms(2); if(ADCValue[1] > 3400 && ADCValue[1] < 3600) { while(ADCValue[1] < 4000); if(jiemian == 1) { sprintf((char *)str," Tot : %.02f R ",(Price[hw[0]-1]*weight)); LCD_DisplayStringLine(Line6, str); Total_Send(); } } } } 5、注意事项 题目还有代码链接上都有了,失效了可以留言分享。 距离决赛还有半个月,假期四天是初赛完第一次练习,做完这套就不打算在练习,听天由命了~哈哈! 需要注意的是有很多细节没有处理好:
|
|
|
|
只有小组成员才能发言,加入小组>>
793 浏览 0 评论
1152 浏览 1 评论
2528 浏览 5 评论
2861 浏览 9 评论
移植了freeRTOS到STMf103之后显示没有定义的原因?
2711 浏览 6 评论
keil5中manage run-time environment怎么是灰色,不可以操作吗?
1071浏览 3评论
194浏览 2评论
456浏览 2评论
369浏览 2评论
M0518 PWM的电压输出只有2V左右,没有3.3V是怎么回事?
454浏览 1评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 21:37 , Processed in 1.115468 second(s), Total 79, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号