標題:
STM32多路模擬輸入數(shù)字輸入源代碼
[打印本頁]
作者:
qsm0111
時間:
2018-9-21 22:59
標題:
STM32多路模擬輸入數(shù)字輸入源代碼
STM32多路模擬輸入,數(shù)字輸出代碼
單片機源程序如下:
#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 通道時鐘,各個管腳時鐘
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);//JTAG-DP 禁用+ SW-DP 使能
RCC_ADCCLKConfig(RCC_PCLK2_Div6); //72M/6=12,ADC 最大時間不能超過 14M
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); //使能 DMA 傳輸,ADC中用到
}
/*
data: 0000 1111B 低四位代表四路激光的開關
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時鐘
TIM_TimeBaseInitStructure.TIM_Period = arr-1; //自動重裝載值
TIM_TimeBaseInitStructure.TIM_Prescaler=psc-1; //定時器分頻
TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上計數(shù)模式
TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1; //1分頻
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure); //按配置設置TIM3
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE); //允許定時器3更新中斷
TIM_Cmd(TIM3,DISABLE); //使能定時器3
NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn; //定時器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); //按配置設置
}
//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外設
TIM_DeInit(TIM2); //復位時鐘TIM2,恢復到初始狀態(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時鐘分頻
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //計數(shù)方式
// 定時時間T計算公式:
// 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); //清除標志
// 中斷方式下,使能中斷源
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE); //使能中斷源
//TIM_Cmd(TIM2,ENABLE); //放MIAN里面 //使能TIM2
// 設置優(yōu)先分級組
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //0組,全副優(yōu)先級
NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn; //選擇中斷通道,庫P166頁,
// 選擇中斷通道。注意:固件庫中為XXX_IRQChannel,但該程序預定義為XXX_IRQn,所以要特別注意
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3; //搶占優(yōu)先級0
NVIC_InitStructure.NVIC_IRQChannelSubPriority=3; //響應優(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);//用定時器延時
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ù)名:定時器3中斷服務函數(shù) */
/*參 數(shù):無 */
/*返回值:無 */
/*-------------------------------------------------*/
void TIM3_IRQHandler(void)
{
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //檢查TIM3更新中斷發(fā)生與否
{
TIM_Cmd(TIM3, DISABLE); //關閉TIM3
TIM_ClearITPendingBit(TIM3, TIM_IT_Update); //清除TIMx更新中斷標志
}
}
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); //清標志
}
#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); //清標志
}
}
#endif
/*********************************END OF FILE**********************************/
復制代碼
所有資料51hei提供下載:
code.rar
(348.77 KB, 下載次數(shù): 7)
2018-9-22 00:20 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
admin
時間:
2018-9-22 00:21
補全原理圖或者詳細說明一下電路連接即可獲得100+黑幣
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1