|
STM32多路模擬輸入,數(shù)字輸出代碼
單片機(jī)源程序如下:
- #include "main.h"
- #include "usart.h"
- #include "delay.h"
- #include "hw_config.h"
- #include "flash.h"
- #include "stm32f10x_conf.h"
- #include "esp8266.h"
- #include <stdio.h>
- #include <string.h>
- #include "adc.h"
- #include "flash.h"
- #define RS232_version
- //#define yunnan_version
- #define RS485_version
- #define key_lenght 512
- #define LED2_L GPIO_SetBits(GPIOA, GPIO_Pin_15)
- #define LED2_H GPIO_ResetBits(GPIOA, GPIO_Pin_15)
- #define LED1_L GPIO_SetBits(GPIOB, GPIO_Pin_3)
- #define LED1_H GPIO_ResetBits(GPIOB, GPIO_Pin_3)
- #define RS485_H GPIO_SetBits(GPIOA, GPIO_Pin_12)
- #define RS485_L GPIO_ResetBits(GPIOA, GPIO_Pin_12)
- /*-----------------------------------------------------------------------------*/
- u32 TimeTick=0;
- u16 Runtime=0;
- //u8 Time_100msFlg=0;
- //u8 Time_500msFlg=0;
- //u8 Time_1000msFlg=0;
- u8 SendDataFlg=0;
- u8 CurrentIn = 255;
- u8 PreviousIn = 255;
- u8 ConnectCounter=0;
- u8 BoardSate[4]={0,0,0,10};
- u16 ADC_Maxbuf[8]={0};
- //_BoardStatus BoardStatus;
- u16 Encrypt_index=0;
- u8 encrypt_indexbuf[2];
- const unsigned char key[key_lenght]={
- 220,96,251,121,225,130,202,49,163,169,217,146,102,164,27,95,
- 192,170,88,83,115,172,175,109,86,24,145,224,238,130,88,78,
- 216,88,57,212,7,200,109,66,145,193,151,71,235,87,9,55,
- 133,133,84,108,56,112,17,47,176,142,35,200,240,232,65,32,
- 81,139,185,13,106,70,88,247,61,21,193,176,20,103,128,254,
- 14,89,90,104,46,234,22,103,71,10,35,119,165,163,81,167,
- 127,119,244,96,157,250,204,63,45,92,46,34,173,95,26,72,
- 14,35,186,151,141,216,240,101,117,81,197,96,34,223,81,153,
- 195,25,49,156,113,32,96,18,140,27,59,209,188,242,185,230,
- 238,218,105,129,232,185,26,165,133,143,234,76,53,107,29,77,
- 10,147,94,147,45,125,213,237,194,167,10,114,157,31,168,129,
- 150,221,112,70,117,207,176,9,254,138,23,225,52,20,220,32,
- 252,237,199,40,147,37,185,113,4,123,190,64,174,167,8,101,
- 229,104,180,86,250,213,214,58,225,85,148,162,101,242,184,173,
- 201,233,116,175,87,128,237,113,36,254,65,249,17,111,89,87,
- 130,176,251,203,94,134,36,38,22,140,69,62,143,22,11,17,
- 194,16,118,195,50,88,14,101,122,67,50,251,147,219,41,113,
- 250,61,32,180,246,235,78,67,196,77,152,201,58,174,224,13,
- 242,48,55,0,248,149,37,41,161,150,81,27,84,40,146,58,
- 99,210,67,82,245,85,25,213,192,51,253,227,190,68,42,202,
- 97,36,8,98,164,40,120,101,23,245,18,95,154,50,238,156,
- 186,94,101,103,107,141,22,156,22,96,62,197,150,64,106,93,
- 108,133,185,47,32,47,148,59,89,220,58,0,67,185,59,141,
- 67,97,40,96,221,193,95,210,13,106,75,67,232,178,205,214,
- 139,180,242,20,120,190,123,139,200,42,13,141,82,22,89,92,
- 37,175,129,52,24,9,127,169,38,229,33,180,226,81,81,166,
- 15,99,116,141,197,38,21,131,228,155,151,178,180,208,128,246,
- 17,238,30,56,48,152,189,129,52,73,237,146,156,198,168,119,
- 216,101,126,237,160,202,150,254,154,252,79,123,113,204,243,84,
- 101,42,163,243,50,24,118,117,164,241,89,123,55,130,230,30,
- 241,32,216,79,82,145,86,69,87,31,157,50,73,66,16,103,
- 84,153,45,114,35,180,68,192,237,9,72,173,113,26,198,24
- };
- u8 encrypt_piont(u8 piont,u16 index)
- {
- u8 tmp;
- tmp = key[index % key_lenght] ^ piont;
- return tmp;
- }
- void encrypt_index(u16 index, u8* Index_bytes)
- {
- unsigned char data_H, tmp1, tmp2, tmp3;
- unsigned char data_L;
- //counter++;
- data_H = index>>8;
- data_L = index & 0xff;
- tmp1 = data_H & 0xaa;
- tmp2 = data_H & 0x55;
- tmp1 = tmp1 >> 1;
- tmp2 = tmp2 << 1;
- data_H = tmp1 | tmp2;
- tmp1 = data_H & 0x01;
- tmp2 = data_H & 0x80;
- tmp3 = data_H & 0x7E;
- tmp1 = tmp1 << 7;
- tmp2 = tmp2 >> 7;
- //data_H = tmp1 | tmp2 | tmp3;
- Index_bytes[0]= tmp1 | tmp2 | tmp3;
- tmp1 = data_L & 0xaa;
- tmp2 = data_L & 0x55;
- tmp1 = tmp1 >> 1;
- tmp2 = tmp2 << 1;
- data_L = tmp1 | tmp2;
- tmp1 = data_L & 0x01;
- tmp2 = data_L & 0x80;
- tmp3 = data_L & 0x7E;
- tmp1 = tmp1 << 7;
- tmp2 = tmp2 >> 7;
- //data_L = tmp1 | tmp2 | tmp3;
- Index_bytes[1]= tmp1 | tmp2 | tmp3;
- //int tmp4 = data_H * 256 + data_L;
-
- }
- void RemapGPIO_AndRCCini(void)
- {
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1|RCC_APB2Periph_AFIO,ENABLE ); //使能 ADC1 通道時(shí)鐘,各個管腳時(shí)鐘
- GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);//JTAG-DP 禁用+ SW-DP 使能
- RCC_ADCCLKConfig(RCC_PCLK2_Div6); //72M/6=12,ADC 最大時(shí)間不能超過 14M
- RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); //使能 DMA 傳輸,ADC中用到
- }
- /*
- data: 0000 1111B 低四位代表四路激光的開關(guān)
- GPIO PB5 PB6 PB7 PB8
- 0000 0001 1110 0000B
- */
- void WriteLaser(u8 data)
- {
- unsigned short temp;
- temp=(data&0x000f)<<5;
- GPIOB->BSRR = temp&0x1e0;
- GPIOB->BRR = ~temp&0x1e0;
- }
- void GPIO_Configuration(void)
- {
- GPIO_InitTypeDef GPIO_InitStruct;
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE);
- GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;//in10-16
- GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14;//Digital input
- GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOB, &GPIO_InitStruct);
-
- GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
- GPIO_InitStruct.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_11;////Digital input
- GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOA, &GPIO_InitStruct);
- GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8;//LED,Laser
- GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOB, &GPIO_InitStruct);
- GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_InitStruct.GPIO_Pin = GPIO_Pin_15|GPIO_Pin_12;//LED RS485DIR
- GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOA, &GPIO_InitStruct);
- GPIO_ResetBits(GPIOA, GPIO_Pin_15);
- GPIO_ResetBits(GPIOB, GPIO_Pin_3);
-
- }
- u8 ReadInput (void)
- {
- u8 tmp=0;
- u16 GPIOin;
- GPIOin=GPIO_ReadInputData(GPIOB);//0 1 12 13 14 15
- tmp|=(u8)((GPIOin>>10)&0x3c);
- tmp|=(u8)(GPIOin&0x03);
- GPIOin=GPIO_ReadInputData(GPIOA);//8 11
- tmp|=(u8)((GPIOin>>2)&0x40);
- tmp|=(u8)((GPIOin>>4)&0x80);
- return tmp;
- }
- //ESP8266使用
- void TIM3_Init(u16 arr,u16 psc)
- {
- TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
- NVIC_InitTypeDef NVIC_InitStructure;
-
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); //使能TIM3時(shí)鐘
- TIM_TimeBaseInitStructure.TIM_Period = arr-1; //自動重裝載值
- TIM_TimeBaseInitStructure.TIM_Prescaler=psc-1; //定時(shí)器分頻
- TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上計(jì)數(shù)模式
- TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1; //1分頻
- TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure); //按配置設(shè)置TIM3
-
- TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE); //允許定時(shí)器3更新中斷
- TIM_Cmd(TIM3,DISABLE); //使能定時(shí)器3
- NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn; //定時(shí)器3中斷
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x01; //搶占優(yōu)先級1
- NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x03; //子優(yōu)先級3
- NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; //使能中斷
- NVIC_Init(&NVIC_InitStructure); //按配置設(shè)置
- }
- //IO查詢使用
- void Timer_Config(void)//5ms中斷
- {
- TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; //定義TIM結(jié)構(gòu)體變量
- NVIC_InitTypeDef NVIC_InitStructure;
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); //使能TIM2外設(shè)
- TIM_DeInit(TIM2); //復(fù)位時(shí)鐘TIM2,恢復(fù)到初始狀態(tài)
- TIM_TimeBaseStructure.TIM_Period=3599; //35999和1999剛好1s,4499為1/8S
- TIM_TimeBaseStructure.TIM_Prescaler=99;
- TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; //TIM2時(shí)鐘分頻
- TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //計(jì)數(shù)方式
- // 定時(shí)時(shí)間T計(jì)算公式:
- // T=(TIM_Period+1)*(TIM_Prescaler+1)/TIMxCLK=(35999+1)*(1999+1)/72MHz=1s
- TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure); //初始化
- TIM_ClearFlag(TIM2,TIM_FLAG_Update); //清除標(biāo)志
- // 中斷方式下,使能中斷源
- TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE); //使能中斷源
- //TIM_Cmd(TIM2,ENABLE); //放MIAN里面 //使能TIM2
- // 設(shè)置優(yōu)先分級組
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //0組,全副優(yōu)先級
- NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn; //選擇中斷通道,庫P166頁,
- // 選擇中斷通道。注意:固件庫中為XXX_IRQChannel,但該程序預(yù)定義為XXX_IRQn,所以要特別注意
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3; //搶占優(yōu)先級0
- NVIC_InitStructure.NVIC_IRQChannelSubPriority=3; //響應(yīng)優(yōu)先級0
- NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; //啟動此通道的中斷
- NVIC_Init(&NVIC_InitStructure);
- }
- void Delay_Ms(unsigned int time)
- {
- unsigned int i,j;
- for(i=0;i<time;i++)
- for(j=0;j<10260;j++);
- }
- void IntToChar(u16 data,u8 *buf)
- {
- buf[0]=data/10000;
- buf[1]=data/1000%10;
- buf[2]=data/100%10;
- buf[3]=data/10%10;
- buf[4]=data%10;
- }
- void ADCprocess(void)
- {
- u8 i;
- Average_Cal();
- for(i=0;i<8;i++)
- {
- if(ADC_Maxbuf[i]<After_Average[i])
- ADC_Maxbuf[i]=After_Average[i];
- }
- }
- int main(void)
- {
- Delay_Ms(200);
- RemapGPIO_AndRCCini();
- Delay_Init(72);//用定時(shí)器延時(shí)
- GPIO_Configuration();//LED,ADC
- RS485_H;
- LED2_L;
- usart3_init(115200);
- usart1_init(9600);
- Timer_Config();
- Delay_Ms(2000);
- TIM_Cmd(TIM2,ENABLE);
- LED2_H;
- while(1)
- {
- Delay_Ms(200);
- }
- }
- /*-------------------------------------------------*/
- /*函數(shù)名:定時(shí)器3中斷服務(wù)函數(shù) */
- /*參 數(shù):無 */
- /*返回值:無 */
- /*-------------------------------------------------*/
- void TIM3_IRQHandler(void)
- {
- if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //檢查TIM3更新中斷發(fā)生與否
- {
- TIM_Cmd(TIM3, DISABLE); //關(guān)閉TIM3
- TIM_ClearITPendingBit(TIM3, TIM_IT_Update); //清除TIMx更新中斷標(biāo)志
- }
- }
- void TIM2_IRQHandler(void) //5ms
- {
- u8 Piont=0,ReadInputbuf;
- u8 EdgeSignal_up;
- u8 EdgeSignal_down;
- if(TIM_GetFlagStatus(TIM2,TIM_FLAG_Update)!=RESET)
- {
- ReadInputbuf=ReadInput();
- PreviousIn = CurrentIn;
- CurrentIn = ReadInputbuf;
- EdgeSignal_down=(~CurrentIn) & PreviousIn;
- EdgeSignal_up=CurrentIn & (~PreviousIn);
- if(EdgeSignal_down)
- {
- switch(EdgeSignal_down)
- {
- case 0x01:
- Piont=1;
- LED1_H;
- break;
- case 0x02:
- Piont=2;
- LED1_H;
- break;
- case 0x03:
- Piont=03;
- break;
- case 0x08:
- Piont=4;
- LED1_H;
- break;
- case 0x10:
- Piont=5;
- LED1_H;
- break;
- case 0x20:
- Piont=6;
- LED1_H;
- break;
- case 0x40:
- Piont=7;
- LED1_H;
- break;
- case 0x80:
- Piont=8;
- LED1_H;
- break;
- }
- WriteLaser(15);
- }
- else if(EdgeSignal_up)
- {
- switch(EdgeSignal_up)
- {
- case 0x01:
- Piont=11;
- LED1_L;
- break;
- case 0x02:
- Piont=12;
- LED1_L;
- break;
- case 0x03:
- Piont=13;
- break;
- case 0x08:
- Piont=14;
- LED1_L;
- break;
- case 0x10:
- Piont=15;
- LED1_L;
- break;
- case 0x20:
- Piont=16;
- LED1_L;
- break;
- case 0x40:
- Piont=17;
- LED1_L;
- break;
- case 0x80:
- Piont=18;
- LED1_L;
- break;
- }
- WriteLaser(0);
- }
- if(Piont)
- {
- #ifdef yunnan_version
- if(Piont==1||Piont==2)
- {
- while (USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET);
- USART_SendData(USART3,0x31);
- while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
- USART_SendData(USART1,0x31);
- }
- #endif
- #ifdef RS485_version
- while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
- USART_SendData(USART1,0xff);
- while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
- USART_SendData(USART1,0xfe);
- Encrypt_index++;
- Piont = encrypt_piont(Piont,Encrypt_index);
- encrypt_index(Encrypt_index,encrypt_indexbuf);
- while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
- USART_SendData(USART1,encrypt_indexbuf[0]);
- while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
- USART_SendData(USART1,Piont);
- while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
- USART_SendData(USART1,encrypt_indexbuf[1]);
- Piont=Piont+encrypt_indexbuf[0]+encrypt_indexbuf[1];
- while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
- USART_SendData(USART1,Piont);
- #endif
- #ifdef RS232_version
- while (USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET);
- USART_SendData(USART3,0xff);
- while (USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET);
- USART_SendData(USART3,0xfe);
- Encrypt_index++;
- Piont = encrypt_piont(Piont,Encrypt_index);
- encrypt_index(Encrypt_index,encrypt_indexbuf);
- while (USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET);
- USART_SendData(USART3,encrypt_indexbuf[0]);
- while (USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET);
- USART_SendData(USART3,Piont);
- while (USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET);
- USART_SendData(USART3,encrypt_indexbuf[1]);
- Piont=Piont+encrypt_indexbuf[0]+encrypt_indexbuf[1];
- while (USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET);
- USART_SendData(USART3,Piont);
- #endif
- //printf("\r\n%d ",Piont);
- }
- Piont=0;
- }
- TIM_ClearFlag(TIM2,TIM_FLAG_Update); //清標(biāo)志
- }
- #if 0
- void TIM2_IRQHandler(void) //5ms
- {
- u8 EdgeSignal_up,EdgeSignal_down,ReadInputbuf;
- if(TIM_GetFlagStatus(TIM2,TIM_FLAG_Update)!=RESET)
- {
- ADCprocess();
- TimeTick++;
- if(TimeTick%BoardStatus.SendDataFre==0)
- {
- SendDataFlg=1;
- }
- if(TimeTick%200==0)
- {
- //Time_1000msFlg=1;
- Runtime++;
- ConnectCounter++;
- printf("Connect %d \r\n",ConnectCounter);
- }
- if(BoardStatus.DigitalInputEnable==1)
- {
- ReadInputbuf=ReadInput();
- PreviousIn = CurrentIn;
- CurrentIn = ReadInputbuf;
- EdgeSignal_down=(~CurrentIn) & PreviousIn;
- EdgeSignal_up=CurrentIn & (~PreviousIn);
- if(EdgeSignal_down)
- {
- BoardStatus.FallEdge=EdgeSignal_down;
- }
- else if(EdgeSignal_up)
- {
- BoardStatus.RiseEdge=EdgeSignal_up;
- }
- }
- TIM_ClearFlag(TIM2,TIM_FLAG_Update); //清標(biāo)志
- }
- }
- #endif
- /*********************************END OF FILE**********************************/
復(fù)制代碼
所有資料51hei提供下載:
code.rar
(348.77 KB, 下載次數(shù): 7)
2018-9-22 00:20 上傳
點(diǎn)擊文件名下載附件
|
|