当前位置:文档之家› 飞控代码

飞控代码

飞控代码
飞控代码

TIM_PWM_IN.c

#include "TIM_PWM_IN.h"

T_RC_DATA Rc_Data;//1000~2000

void TIM4_Cap_Init(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

TIM_ICInitTypeDef TIM4_ICInitStructure;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //使能TIM4时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE); //使能GPIOB时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //使能AFIO功能的时钟

GPIO_PinRemapConfig(GPIO_Remap_TIM4, ENABLE); //进行重映射

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;

GPIO_Init(GPIOD, &GPIO_InitStructure);

GPIO_ResetBits(GPIOD,GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15);

//初始化定时器4 TIM4

TIM_TimeBaseStructure.TIM_Period = 0XFFFF; //设定计数器自动重装值

TIM_TimeBaseStructure.TIM_Prescaler =71; //预分频器

TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim

TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式

TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位

//初始化TIM4输入捕获参数

TIM4_ICInitStructure.TIM_Channel = TIM_Channel_1; //CC1S=01 选择输入端IC1映射到TI1上TIM4_ICInitStructure.TIM_ICPolarity =TIM_ICPolarity_Rising; //上升沿捕获

TIM4_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到TI1上

TIM4_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置输入分频,不分频

TIM4_ICInitStructure.TIM_ICFilter = 0x00; //IC1F=0000 配置输入滤波器不滤波

TIM_ICInit(TIM4, &TIM4_ICInitStructure);

TIM4_ICInitStructure.TIM_Channel = TIM_Channel_2; //CC1S=01 选择输入端IC1映射到TI1上TIM4_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿捕获

TIM4_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到TI1上

TIM4_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置输入分频,不分频

TIM4_ICInitStructure.TIM_ICFilter = 0x00; //IC1F=0000 配置输入滤波器不滤波

TIM_ICInit(TIM4, &TIM4_ICInitStructure);

TIM4_ICInitStructure.TIM_Channel = TIM_Channel_3; //CC1S=01 选择输入端IC1映射到TI1上TIM4_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿捕获

TIM4_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到TI1上

TIM4_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置输入分频,不分频TIM4_ICInitStructure.TIM_ICFilter = 0x00; //IC1F=0000 配置输入滤波器不滤波TIM_ICInit(TIM4, &TIM4_ICInitStructure);

TIM4_ICInitStructure.TIM_Channel = TIM_Channel_4;//CC1S=01 选择输入端IC1映射到TI1上TIM4_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿捕获

TIM4_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到TI1上

TIM4_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置输入分频,不分频TIM4_ICInitStructure.TIM_ICFilter = 0x00; //IC1F=0000 配置输入滤波器不滤波TIM_ICInit(TIM4, &TIM4_ICInitStructure);

TIM_Cmd(TIM4,ENABLE );

TIM_ITConfig(TIM4, TIM_IT_CC1, ENABLE); //允许更新中断,允许CC1IE捕获中断

TIM_ITConfig(TIM4, TIM_IT_CC2, ENABLE);

TIM_ITConfig(TIM4, TIM_IT_CC3, ENABLE);

TIM_ITConfig(TIM4, TIM_IT_CC4, ENABLE);

}

u8 TIM4CH1_CAPTURE_STA=0; //输入捕获状态

u16 TIM4CH1_CAPTURE_V AL; //输入捕获值

u8 TIM4CH2_CAPTURE_STA=0; //输入捕获状态

u16 TIM4CH2_CAPTURE_V AL; //输入捕获值

u8 TIM4CH3_CAPTURE_STA=0; //输入捕获状态

u16 TIM4CH3_CAPTURE_V AL; //输入捕获值

u8 TIM4CH4_CAPTURE_STA=0; //输入捕获状态

u16 TIM4CH4_CAPTURE_V AL; //输入捕获值

//定时器4中断服务程序

void TIM4_IRQHandler(void)

{

if (TIM_GetITStatus(TIM4, TIM_IT_CC1) != RESET) //捕获1发生捕获事件{

TIM_ClearITPendingBit(TIM4, TIM_IT_CC1); //清除中断标志位

if(TIM4CH1_CAPTURE_STA&0X40) //捕获到一个下降沿

{

TIM4CH1_CAPTURE_STA|=0X80; //标记成功捕获到一次上升沿

TIM4CH1_CAPTURE_V AL=TIM_GetCapture1(TIM4);

TIM_OC1PolarityConfig(TIM4,TIM_ICPolarity_Rising); //CC1P=0 设置为上升沿捕获

}

else //还未开始,第一次捕获上升沿

{

TIM4CH1_CAPTURE_STA=0; //清空

TIM4CH1_CAPTURE_V AL=0;

TIM_SetCounter(TIM4,0);

TIM4CH1_CAPTURE_STA|=0X40; //标记捕获到了上升沿TIM_OC1PolarityConfig(TIM4,TIM_ICPolarity_Falling); //CC1P=1 设置为下降沿捕获

}

}

if (TIM_GetITStatus(TIM4, TIM_IT_CC2) != RESET) //捕获1发生捕获事件

{

TIM_ClearITPendingBit(TIM4, TIM_IT_CC2); //清除中断标志位

if(TIM4CH2_CAPTURE_STA&0X40) //捕获到一个下降沿

{

TIM4CH2_CAPTURE_STA|=0X80; //标记成功捕获到一次上升沿

TIM4CH2_CAPTURE_V AL=TIM_GetCapture2(TIM4);

TIM_OC2PolarityConfig(TIM4,TIM_ICPolarity_Rising); //CC1P=0 设置为上升沿捕获

}

else //还未开始,第一次捕获上升沿

{

TIM4CH2_CAPTURE_STA=0; //清空

TIM4CH2_CAPTURE_V AL=0;

TIM_SetCounter(TIM4,0);

TIM4CH2_CAPTURE_STA|=0X40; //标记捕获到了上升沿TIM_OC2PolarityConfig(TIM4,TIM_ICPolarity_Falling); //CC1P=1 设置为下降沿捕获

}

}

if (TIM_GetITStatus(TIM4, TIM_IT_CC3) != RESET) //捕获1发生捕获事件{

TIM_ClearITPendingBit(TIM4, TIM_IT_CC3); //清除中断标志位

if(TIM4CH3_CAPTURE_STA&0X40) //捕获到一个下降沿

{

TIM4CH3_CAPTURE_STA|=0X80; //标记成功捕获到一次上升沿

TIM4CH3_CAPTURE_V AL=TIM_GetCapture3(TIM4);

TIM_OC3PolarityConfig(TIM4,TIM_ICPolarity_Rising); //CC1P=0 设置为上升沿捕获

}

else //还未开始,第一次捕获上升沿

{

TIM4CH3_CAPTURE_STA=0; //清空

TIM4CH3_CAPTURE_V AL=0;

TIM_SetCounter(TIM4,0);

TIM4CH3_CAPTURE_STA|=0X40; //标记捕获到了上升沿TIM_OC3PolarityConfig(TIM4,TIM_ICPolarity_Falling); //CC1P=1 设置为下降沿捕获

}

}

if (TIM_GetITStatus(TIM4, TIM_IT_CC4) != RESET) //捕获1发生捕获事件

{

TIM_ClearITPendingBit(TIM4, TIM_IT_CC4); //清除中断标志位

if(TIM4CH4_CAPTURE_STA&0X40) //捕获到一个下降沿

{

TIM4CH4_CAPTURE_STA|=0X80; //标记成功捕获到一次上升沿

TIM4CH4_CAPTURE_V AL=TIM_GetCapture4(TIM4);

TIM_OC4PolarityConfig(TIM4,TIM_ICPolarity_Rising);//CC1P=0 设置为上升沿捕获

}else //还未开始,第一次捕获上升沿

{

TIM4CH4_CAPTURE_STA=0; //清空

TIM4CH4_CAPTURE_V AL=0;

TIM_SetCounter(TIM4,0);

TIM4CH4_CAPTURE_STA|=0X40; //标记捕获到了上升沿TIM_OC4PolarityConfig(TIM4,TIM_ICPolarity_Falling); //CC1P=1 设置为下降沿捕获

}

}

}

//获取4路PWM值

void GET_FOUR_PWM(void)

{

if(TIM4CH1_CAPTURE_STA&0X80) //成功捕获到了一次上升沿

{

Rc_Data.Y AW = TIM4CH1_CAPTURE_V AL; //得到总的高电平时

TIM4CH1_CAPTURE_STA=0; //开启下一次捕获}

if(TIM4CH2_CAPTURE_STA&0X80) //成功捕获到了一次上升沿

{

Rc_Data.THROTTLE = TIM4CH2_CAPTURE_V AL; //得到总的高电平时

TIM4CH2_CAPTURE_STA=0; //开启下一次捕获}

if(TIM4CH3_CAPTURE_STA&0X80) //成功捕获到了一次上升沿

{

Rc_Data.PITCH = TIM4CH3_CAPTURE_V AL; //得到总的高电平时

TIM4CH3_CAPTURE_STA=0; //开启下一次捕获}

if(TIM4CH4_CAPTURE_STA&0X80) //成功捕获到了一次上升沿

{

Rc_Data.ROLL = TIM4CH4_CAPTURE_V AL; //得到总的高电平时

TIM4CH4_CAPTURE_STA=0; //开启下一次捕获}

}

TIM_PWM_IN.h

#ifndef __TIM_PWM_IN_H_

#define __TIM_PWM_IN_H_

#include "stm32f10x.h"

typedef struct int16_rcget{

int16_t ROLL;

int16_t PITCH;

int16_t THROTTLE;

int16_t Y AW;

int16_t pitch_offset;

int16_t roll_offset;

int16_t yaw_offset;}T_RC_DATA;

extern T_RC_DATA Rc_Data;//1000~2000

void TIM4_Cap_Init(void);

void GET_FOUR_PWM(void);

#endif

Time.c

#include "time.h"

#include "stm32f10x.h"

/**************************实现函数******************************************** *函数原型:

*功能:1ms中断一次,计数器为1000

*******************************************************************************/

void TIM3_Init(u16 period_num)

{

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

//基础设置,时基和比较输出设置,由于这里只需定时,所以不用OC比较输出

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);

TIM_DeInit(TIM3);

TIM_TimeBaseStructure.TIM_Period=period_num;//装载值

//prescaler is 1200,that is 72000000/72/500=2000Hz;

TIM_TimeBaseStructure.TIM_Prescaler=72-1;//分频系数

//set clock division

TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; //or TIM_CKD_DIV2 or TIM_CKD_DIV4

//count up

TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;

TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);

//clear the TIM3 overflow interrupt flag

TIM_ClearFlag(TIM3,TIM_FLAG_Update);

//TIM3 overflow interrupt enable

TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);

//enable TIM3

TIM_Cmd(TIM3,DISABLE);

}

void Nvic_Init(void)

{

NVIC_InitTypeDef NVIC_InitStructure;

/* NVIC_PriorityGroup */

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);

NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn; //TIM4中断

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级1级

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //从优先级0级

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能

NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的

参数初始化外设NVIC寄存器

/* Enable the USARTy Interrupt */

NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);

}

Time.h

#ifndef __TIME_H__

#define __TIME_H__

#include "stm32f10x.h"

#define EnTIM3() TIM_Cmd(TIM3,ENABLE)

void Nvic_Init(void);

void TIM3_Init(u16 period_num);

#endif

Motor

#include "moto.h"

void Tim2_init(void)

{

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

TIM_OCInitTypeDef TIM_OCInitStructure;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

/**********************************************************

72 000 000/72=1M

1000 000/2500=400Hz

所以产生的PWM为400Hz

周期为2.5ms,对应2500的计算值,1ms~2ms对应的计算值为1000~2000;

**********************************************************/

TIM_TimeBaseStructure.TIM_Period = 2499; //计数上线

TIM_TimeBaseStructure.TIM_Prescaler = 71; //pwm时钟分频

TIM_TimeBaseStructure.TIM_ClockDivision = 0;

TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数

TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure);

TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;

TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;

TIM_OCInitStructure.TIM_Pulse = 0; //初始占空比为0

TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

TIM_OC1Init(TIM2, &TIM_OCInitStructure);

TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);

TIM_OC2Init(TIM2, &TIM_OCInitStructure);

TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable);

TIM_OC3Init(TIM2, &TIM_OCInitStructure);

TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Enable);

TIM_OC4Init(TIM2, &TIM_OCInitStructure);

TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Enable);

TIM_ARRPreloadConfig(TIM2, ENABLE);

TIM_Cmd(TIM2, ENABLE);

}

void Moto_Init(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

/* GPIOA and GPIOC clock enable */

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 复用推挽输出

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOA, &GPIO_InitStructure);

Tim2_init();

}

void Moto_PwmRflash(uint16_t MOTO1_PWM,uint16_t MOTO2_PWM,uint16_t MOTO3_PWM,uint16_t MOTO4_PWM)

{

if(MOTO1_PWM>Moto_PwmMax) MOTO1_PWM = Moto_PwmMax;

if(MOTO2_PWM>Moto_PwmMax) MOTO2_PWM = Moto_PwmMax;

if(MOTO3_PWM>Moto_PwmMax) MOTO3_PWM = Moto_PwmMax;

if(MOTO4_PWM>Moto_PwmMax) MOTO4_PWM = Moto_PwmMax;

TIM2->CCR1 = MOTO1_PWM+750;

TIM2->CCR2 = MOTO2_PWM+750;

TIM2->CCR3 = MOTO3_PWM+750;

TIM2->CCR4 = MOTO4_PWM+750;

}

Motor.h

#ifndef _MOTO_H_

#define _MOTO_H_

#include "stm32f10x.h"

#define Moto_PwmMax 1300

void Moto_PwmRflash(uint16_t MOTO1_PWM,uint16_t MOTO2_PWM,uint16_t MOTO3_PWM,uint16_t MOTO4_PWM);

void Moto_Init(void);

#endif

LED.C

#include "led.h"

/*

* 函数名:LED_GPIO_Config

* 描述:配置LED用到的I/O口

* 输入:无

* 输出:无

*/

void LED_Init(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOC, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOB, &GPIO_InitStructure);

GPIO_SetBits(GPIOC,GPIO_Pin_4 | GPIO_Pin_5); // turn off all led GPIO_SetBits(GPIOB,GPIO_Pin_0 | GPIO_Pin_1); // turn off all led }

void LED_Sailing(int rate)

{

static u16 r,g;

switch(r)

{

case 1: LED1(ON); break;

case 2: LED1(OFF); break;

case 3: LED1(ON); break;

case 4: LED1(OFF); break;

default: LED1(OFF); break;

}

g++;

if(g > rate)

{

g=0;

r++;

}

if(r > 25) r = 0;

}

Led.h

#ifndef __LED_H

#define __LED_H

#include "stm32f10x.h"

/* the macro definition to trigger the led on or off

* 1 - off

- 0 - on

*/

#define ON 0

#define OFF 1

#define LED1(a) if (a) \

GPIO_SetBits(GPIOB,GPIO_Pin_1);\

else \

GPIO_ResetBits(GPIOB,GPIO_Pin_1)

#define LED2(a) if (a) \

GPIO_SetBits(GPIOB,GPIO_Pin_0);\

else \

GPIO_ResetBits(GPIOB,GPIO_Pin_0)

#define LED3(a) if (a) \

GPIO_SetBits(GPIOC,GPIO_Pin_5);\

else \

GPIO_ResetBits(GPIOC,GPIO_Pin_5)

#define LED4(a) if (a) \

GPIO_SetBits(GPIOC,GPIO_Pin_4);\

else \

GPIO_ResetBits(GPIOC,GPIO_Pin_4)

void LED_Init(void);

void LED_Sailing(int rate);

#endif /* __LED_H */

KEY.C

#include "stm32f10x_gpio.h"

#include "key.h"

/*

* 函数名:Delay

* 描述:不精确的延时

* 输入:延时参数,

* 输出:无

*/

void Delay(__IO u32 nCount)

{

for(; nCount != 0; nCount--);

}

void KEY_Init(void)

{

GPIO_InitTypeDef KEY_GPIO_InitStructure;

RCC_APB2PeriphClockCmd(KEY_RCCEN, ENABLE); //GPIO濮嬬粓浣胯兘

KEY_GPIO_InitStructure.GPIO_Pin = KEY1|KEY2|KEY3|KEY4|KEY5;

KEY_GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

KEY_GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;

GPIO_Init(KEY_GPIO, &KEY_GPIO_InitStructure); //閰嶇疆OLED绔彛

寮曡剼涓篏PIO杈撳嚭

}

/*

* 函数名:Key_Scan

* 描述:检测是否有按键按下

* 输入:GPIOx:x 可以是A,B,C,D或者E

* GPIO_Pin:待读取的端口位

* 输出:KEY_OFF(没按下按键)、KEY_ON(按下按键)

*/

uint8_t Key_Scan(void)

{

/*检测是否有按键按下*/

if(GPIO_ReadInputDataBit(KEY_GPIO,KEY1) == KEY_ON )

{

Delay(4000);

if(GPIO_ReadInputDataBit(KEY_GPIO,KEY1) == KEY_ON )

{

while(GPIO_ReadInputDataBit(KEY_GPIO,KEY1) == KEY_ON);

return KEY_ENTER;

}

}

else if(GPIO_ReadInputDataBit(KEY_GPIO,KEY2) == KEY_ON )

{

Delay(4000);

if(GPIO_ReadInputDataBit(KEY_GPIO,KEY2) == KEY_ON )

{

while(GPIO_ReadInputDataBit(KEY_GPIO,KEY2) == KEY_ON);

return KEY_UP;

}

}

else if(GPIO_ReadInputDataBit(KEY_GPIO,KEY3) == KEY_ON )

{

Delay(4000);

if(GPIO_ReadInputDataBit(KEY_GPIO,KEY3) == KEY_ON )

{

while(GPIO_ReadInputDataBit(KEY_GPIO,KEY3) == KEY_ON);

return KEY_DOWN;

}

}

else if(GPIO_ReadInputDataBit(KEY_GPIO,KEY4) == KEY_ON )

{

Delay(4000);

if(GPIO_ReadInputDataBit(KEY_GPIO,KEY4) == KEY_ON )

{

while(GPIO_ReadInputDataBit(KEY_GPIO,KEY4) == KEY_ON);

return KEY_LEFT;

}

}

else if(GPIO_ReadInputDataBit(KEY_GPIO,KEY5) == KEY_ON )

{

Delay(4000);

if(GPIO_ReadInputDataBit(KEY_GPIO,KEY5) == KEY_ON )

{

while(GPIO_ReadInputDataBit(KEY_GPIO,KEY5) == KEY_ON);

return KEY_RIGHT;

}

}

else return KEY_OFF;

}

KEY.H

#ifndef _KEY_H

#define _KEY_H

#include "stm32f10x.h"

#define KEY_GPIO GPIOE

#define KEY_RCCEN RCC_APB2Periph_GPIOE

#define KEY1 GPIO_Pin_15 //D0

#define KEY2 GPIO_Pin_12 //D1

#define KEY3 GPIO_Pin_10 //RST

#define KEY4 GPIO_Pin_8 //DC

#define KEY5 GPIO_Pin_7 //DC

/*******

*按键按下标置

KEY_ON 0

KEY_OFF 1

********/

#define KEY_OFF 0

#define KEY_ON 1

#define KEY_ENTER 2

#define KEY_UP 3

#define KEY_DOWN 4

#define KEY_LEFT 5

#define KEY_RIGHT 6

void KEY_Init(void);

uint8_t Key_Scan(void);

#endif

DELAY.C

#include "delay.h"

static u8 fac_us=0;//us延时倍乘数

static u16 fac_ms=0;//ms延时倍乘数

//初始化延迟函数

//SYSTICK的时钟固定为HCLK时钟的1/8

//SYSCLK:系统时钟

/**************************实现函数******************************************** *函数原型: void delay_init(u8 SYSCLK)

*功能: 初始化延迟系统,使延时程序进入可用状态

*******************************************************************************/ void delay_init(u8 SYSCLK)

{

SysTick->CTRL&=0xfffffffb;//bit2清空,选择外部时钟HCLK/8

fac_us=SYSCLK/8;

fac_ms=(u16)fac_us*1000;

}

//延时nms

//注意nms的范围

//SysTick->LOAD为24位寄存器,所以,最大延时为:

//nms<=0xffffff*8*1000/SYSCLK

//SYSCLK单位为Hz,nms单位为ms

/**************************实现函数******************************************** *函数原型: void delay_ms(u16 nms)

*功能: 毫秒级延时延时nms nms<=1864

*******************************************************************************/ void delay_ms(u16 nms)

{

u32 temp;

SysTick->LOAD=(u32)nms*fac_ms;//时间加载(SysTick->LOAD为24bit)

SysTick->V AL =0x00; //清空计数器

SysTick->CTRL=0x01 ; //开始倒数

do

{

temp=SysTick->CTRL;

}

while(temp&0x01&&!(temp&(1<<16)));//等待时间到达

SysTick->CTRL=0x00; //关闭计数器

SysTick->V AL =0X00; //清空计数器

}

//延时nus

//nus为要延时的us数.

/**************************实现函数******************************************** *函数原型: void delay_us(u32 nus)

*功能: 微秒级延时延时nus nms<=1864

*******************************************************************************/

void delay_us(u32 nus)

{

u32 temp;

SysTick->LOAD=nus*fac_us; //时间加载

SysTick->V AL=0x00; //清空计数器

SysTick->CTRL=0x01 ; //开始倒数

do

{

temp=SysTick->CTRL;

}

while(temp&0x01&&!(temp&(1<<16)));//等待时间到达

SysTick->CTRL=0x00; //关闭计数器

SysTick->V AL =0X00; //清空计数器

}

void delay(u32 x)

{

u32 i,j;

for(i=0;i

for(j=0;j<500;j++);

}

DELAY.H

#ifndef __DELAY_H

#define __DELAY_H

#include "stm32f10x.h"

void delay_init(u8 SYSCLK);

void delay_ms(u16 nms);

void delay_us(u32 nus);

void delay(u32 x);

#endif

ADC.C

#include "adc.h"

#define ADC1_DR_Address ((u32)0x40012400+0x4c)

__IO uint16_t ADC_ConvertedValue;

/*

* 函数名:ADC1_GPIO_Config

* 描述:使能ADC1和DMA1的时钟,初始化PA.04

* 输入: 无

* 输出:无

* 调用:内部调用

*/

static void ADC1_GPIO_Config(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

/* Enable DMA clock */

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);

/* Enable ADC1 and GPIOC clock */

RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOA, ENABLE);

/* Configure PA.04 as analog input */

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;

GPIO_Init(GPIOA, &GPIO_InitStructure); // PA5,输入时不用设置速率

}

/* 函数名:ADC1_Mode_Config

* 描述:配置ADC1的工作模式为MDA模式

* 输入: 无

* 输出:无

* 调用:内部调用

*/

static void ADC1_Mode_Config(void)

{

DMA_InitTypeDef DMA_InitStructure;

ADC_InitTypeDef ADC_InitStructure;

/* DMA channel1 configuration */

DMA_DeInit(DMA1_Channel1);

DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address; //ADC地址

DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_ConvertedValue;//内存地址

DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;

DMA_InitStructure.DMA_BufferSize = 1;

DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外设地址固定

DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable; //内存地址固定

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);

/* Enable DMA channel1 */

DMA_Cmd(DMA1_Channel1, ENABLE);

/* ADC1 configuration */

ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //独立ADC模式

ADC_InitStructure.ADC_ScanConvMode = DISABLE ; //禁止扫描模式,扫描模式用于多通道采集

ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; //开启连续转换模式,即不停地进行ADC转换

ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //不使用外部触发转换ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //采集数据右对齐

ADC_InitStructure.ADC_NbrOfChannel = 1; //要转换的通道数目1

ADC_Init(ADC1, &ADC_InitStructure);

/*配置ADC时钟,为PCLK2的8分频,即9Hz*/

RCC_ADCCLKConfig(RCC_PCLK2_Div8);

/*配置ADC1的通道11为55. 5个采样周期,序列为1 */

ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_55Cycles5);

/* Enable ADC1 DMA */

ADC_DMACmd(ADC1, ENABLE);

/* Enable ADC1 */

ADC_Cmd(ADC1, ENABLE);

/*复位校准寄存器*/

ADC_ResetCalibration(ADC1);

/*等待校准寄存器复位完成*/

while(ADC_GetResetCalibrationStatus(ADC1));

/* ADC校准*/

ADC_StartCalibration(ADC1);

/* 等待校准完成*/

while(ADC_GetCalibrationStatus(ADC1));

/* 由于没有采用外部触发,所以使用软件触发ADC转换*/ ADC_SoftwareStartConvCmd(ADC1, ENABLE);

}

/*

* 函数名:ADC1_Init

* 描述:无

* 输入:无

* 输出:无

* 调用:外部调用

*/

void ADC1_Init(void)

{

ADC1_GPIO_Config();

ADC1_Mode_Config();

}

ADC.H

#ifndef __ADC_H

#define __ADC_H

#include "stm32f10x.h"

// ADC1转换的电压值通过MDA方式传到SRAM

extern __IO uint16_t ADC_ConvertedValue;

void ADC1_Init(void);

#endif /* __ADC_H */

Usart.c

#include "usart.h"

#include

void usart1_config(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

USART_InitTypeDef USART_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOA, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

GPIO_Init(GPIOA, &GPIO_InitStructure);

USART_https://www.doczj.com/doc/f018625416.html,ART_BaudRate = 115200; /*设置波特率为115200*/ USART_https://www.doczj.com/doc/f018625416.html,ART_WordLength = USART_WordLength_8b; /*设置数据位为8位*/ USART_https://www.doczj.com/doc/f018625416.html,ART_StopBits = USART_StopBits_1; /*设置停止位为1位*/

USART_https://www.doczj.com/doc/f018625416.html,ART_Parity = USART_Parity_No; /*无奇偶校验*/

USART_https://www.doczj.com/doc/f018625416.html,ART_HardwareFlowControl = USART_HardwareFlowControl_None; /*没有硬件流控*/

USART_https://www.doczj.com/doc/f018625416.html,ART_Mode = USART_Mode_Rx | USART_Mode_Tx; /*发送与接收*/

/*完成串口COM1的时钟配置、GPIO配置,根据上述参数初始化并使能*/

USART_Init(USART1, &USART_InitStructure);

USART_Cmd(USART1, ENABLE);

}

/**************************实现函数********************************************

*函数原型: void UART1_Put_Char(unsigned char DataToSend)

*功能: RS232发送一个字节

输入参数:

unsigned char DataToSend 要发送的字节数据

输出参数:没有

*******************************************************************************/

uint8_t UART1_Put_Char(unsigned char DataToSend)

//将要发送的字节写到UART1的发送缓冲区

USART_SendData(USART1, (unsigned char) DataToSend);

//等待发送完成

while (!(USART1->SR & USART_FLAG_TXE));

return DataToSend;

}

/*

* 函数名:fputc

* 描述:重定向c库函数printf到USART1

* 输入:无

* 输出:无

* 调用:由printf调用

*/

int fputc(int ch, FILE *f)

{

/* 将Printf内容发往串口*/

USART_SendData(USART1, (unsigned char) ch);

while (!(USART1->SR & USART_FLAG_TXE));

return (ch);

}

/*

* 函数名:itoa

* 描述:将整形数据转换成字符串

* 输入:-radix =10 表示10进制,其他结果为0

* -value 要转换的整形数

* -buf 转换后的字符串

* -radix = 10

* 输出:无

* 返回:无

* 调用:被USART1_printf()调用

*/

static char *itoa(int value, char *string, int radix)

{

int i, d;

int flag = 0;

char *ptr = string;

/* This implementation only works for decimal numbers. */ if (radix != 10)

生产流程代码含义

DF:造型冻结 (2) LF:起步生产认可 (2) NF:后继车型 (2) 0S:零批量 (2) SOP:批量投产 (3) PEP:产品开发流程 (3) B-Freigabe:采购认可 (3) VFF:预批量认可整车 (4) PVS :批量试生产 (4) ME :上市 (4)

DF:造型冻结 德文全称:Design-Freeze 中文全称(建议):造型冻结 DF是PEP中紧随DE后的环节。 此环节意味着产品造型不能再更改,与造型相关的零件的规划认可和供应商定点也需要在此前一月完成,并在DMU样车上确定产品的可制造性,确定质量目标,提供项目财务状态等。 LF:起步生产认可 德文全称:Launchfreigabe 中文全称(建议):起步生产认可 LF是PEP中产品投产SOP一年前需要完成的重要环节。 它是项目批准流程中的一个重要节点,是在项目正式开始试生产之前进行的一项认可工作,以检查是否具备起步试生产的条件。 LF要求从市场、产品和生产方面都为起步生产做好准备。前提条件列举如下: - 市场方面要准备好产品介绍; - 造型方面需要通过“配色委员会Farbkommission”确定车型颜色、内饰面料等; - 产品方面要完成细节构造、采购认可B-Freigaben、申请起步生产认可的车辆清单等。 NF:后继车型 德文全称:Nachfolger 中文全称:后继车型,也指继任者 后继车型一般是一款将替代目前某现生产车型的新车型。从报批流程看,需在项目的各个里程碑节点(例如:KE, BF, LF)多次上报PSK,获得批准后才能开展下一阶段工作。 0S:零批量 德文全称:Null-Serie 中文全称:零批量 0S是PEP中批量投产SOP前的最后一次总演习。它按照计划的批量投产的速度和节拍进行生产,以发现批量投产条件下可能出现的问题。 启动0S的前提条件列举如下: - PVS中发现的问题和产品审核发现的缺陷的整改措施得到落实; - 完成特殊零件外的零件的工程样件认可BMG;

程序代码编写规范

程序编写规范及约定 (仅供内部使用) 文档作者:_______________ 日期:___/___/___ 开发/测试经理:_______________ 日期:___/___/___ 项目经理:_______________ 日期:___/___/___ 请在这里输入公司名称 版权所有不得复制

目录 程序编写规范及约定 (3) 1编写目的 (3) 2代码编写风格 (3) 2.1单元风格 (3) 2.2语句风格 (3) 3命名规则 (3) 3.1命名约定 (3) 3.1.1标志符 (3) 3.1.2类class (3) 3.1.3枚举类型enum (4) 3.1.4委托delegate (4) 3.1.5常量const (4) 3.1.6接口interface (4) 3.1.7方法function (4) 3.1.8命名空间namespace (4) 3.1.9参数 (4) 3.1.10局部变量 (5) 3.1.11数据成员 (5) 3.1.12自定义异常类 (5) 3.1.13命名缩写 (5) 3.1.14数据库命名 (5) 3.2代码编写命名规范 (6) 3.3界面常用控件命名约定 (6) 3.4文件命名规范 (7) 3.4.1文档文件命名 (7) 3.4.2配置文件命名 (7) 3.4.3程序文件命名 (7)

程序编写规范及约定 1编写目的 为了使编写代码具有可读性、可理解性、可维护性,对程序编写人员代码实行统一风格,使得程序代码能够以名称反映含义、以形式反映结构。此文档可供程序代码编写人员及代码维护人员使用。 2代码编写风格 2.1单元风格 2.2语句风格 3命名规则 3.1命名约定 Pascal和Camel命名约定: 编程的命名方式主要有Pascal和Camel两种(Pascal:每个单词的首字母大写,例如ProductType;Camel:首个单词的首字母小写,其余单词的首字母大写,例如productType) 3.1.1标志符 规则:Pascal、Camel 实例与描述:例子说明 3.1.2类class 规则:Pascal 实例与描述:Application

排队论经典程序MM1代码

修理店仿真报告 一.问题: ①修理店空闲的概率; ②店内有三个顾客的概率; ③店内至少有一个顾客的概率; ④在店内顾客的平均数; ⑤顾客在店内的平均逗留时间; ⑥顾客必须在店内消耗15分钟以上的概率。 二.求解问题的方法: ①修理店空闲的概率: (sim_time-area_server_status) / sim_time); ②店内有三个顾客的概率: area_3_in_q/sim_time); ③店内至少有一个顾客的概率: abv_1/sim_time); ④在店内顾客的平均数: area_num_in_h/sim_time); ⑤顾客在店内的平均逗留时间: (total_of_delays+total_of_server)/ num_custs_delayed ); ⑥顾客必须在店内消耗15分钟以上概率: abv_15/num_custs_delayed); 三。求解过程中计算统计量的方法: ①area_server_status += server_status * time_since_last_event;

②//店内有三个顾客的概率 if(server_status == BUSY) //服务台忙,则有队列中有两个顾客 if(num_in_q == 2) area_3_in_q += time_since_last_event; ③//店内至少有一个顾客的概率 if(server_status == BUSY) //服务台忙,则店内至少有一个顾客 abv_1 += time_since_last_event; ④//在店内顾客的平均数 if(server_status == BUSY) //服务台忙,总的顾客数为排队顾客数加一 area_num_in_h += (num_in_q+1) * time_since_last_event; ⑤total_of_server += time_next_event[2]-sim_time;//总的服务时间加一个服务时间为新的服务总时间 delay = sim_time - time_arrival[1];//排队时间=当前时间-这个人来的时间 total_of_delays += delay; ⑥//离开时总的消耗时间大于15,必须在店内消耗15分钟以上的顾客数加一 if((delay+time_next_event[2]-sim_time)>15)

过程塑造(三)代码是最终目的

过程塑造: (三)代码是最终目的 2003 年 4 月 01 日林星 (iamlinx@https://www.doczj.com/doc/f018625416.html,) 项目经理 过程的最终目的是代码,开发过程中的所有活动都围绕着这一目的而展开。如果没有最后的用于交付的代码,软件就无法成为软件。因此,必须保证过程能够产出代码,而且是优秀的代码。意图 无论哪一种过程,其最终目的都是为了产生出可执行、并且可用的软件。因此软件过程中的各种活动应该围绕着快速、准确的实现这一目的而展开的。 示例 维力亚软件公司是一家合资公司,由于有外资背景,公司内部很早就引入了软件工程,并严格的对人员角色进行分工。包括领域建模人员、架构设计师、高级程序员、程序员、界面设计师等等多种角色。每个人各司其职,充分发挥出了分工的特点。但是随着公司开发项目的逐渐增多,这种方式也显露出其弊端来。每个人的主要目标都是为了通过评审,而有时候,就算是通过评审的工件,依然可能存在问题。但这时候扯皮就出现了。项目中存在的一些中空地带。以及交错地带,常常发生无人问津的情况。开发过程的效率开始下降,开发成本开始上升。问题虽然不是一下子出现的,但是已经逐渐变得严重起来了。 上下文 我们在进行过程设计,或引入一个过程理论的时候,有没有思考过该过程的每一个阶段、每一个活动的目的是什么,它们对生成最后的软件有什么样的帮助,这些帮助对于我们所在的组织有意义吗。很多情况下,我们并没有这么做,或者随着软件过程的定型,就不再思考这类的问题。一开始并没有什么了不起的,但是当软件过程演变成了一种政治体系的时候,那么问题就会慢慢严重起来。 问题 如何让过程围绕着产出软件的核心目标而不断演进? 方法 从上一篇介绍的内容中,我们知道软件过程的每一个阶段都是知识转换的过程,知识转换的终点就是软件。问题在于,我们如何保证这种转换的效率呢? 现代软件的发展的趋势是重用。我们开发一个软件已经很少会从最底层开始编写了。我们使用各种各样的技术和平台。包括数据库、分布式体系、UI机制、业务元素等等。因此现在的软件编写往

sql server存储过程详细代码(超赞!)

use jxgl --首先判断有没有已经建立up_getallstudents存储过程,有则先删除 if exists (select name from sysobjects where name='up_getallstudents'and type ='p') drop procedure up_getallstudents --编写存储过程up_getallstudents,用于获取学生表students的所有记录 create procedure up_getallstudents as select*from students --使用execute执行存储过程up_getallstudents exec up_getallstudents --也可写成 execute up_getallstudents --编写一个存储过程up_insertstudent,完成学生表students数据的插入 --1、不带默认值的参数 create procedure up_insertstudent @sid varchar(15),@sname varchar(30),@ssex char(10), @sbirth datetime,@sbirthplace varchar(300) as begin insert into students (stu_id,stu_name,stu_sex,stu_birth,stu_birthplace) values (@sid,@sname,@ssex,@sbirth,@sbirthplace) end exec up_insertstudent'200712110111','肖玉峰','男','1975-02-05','山东省滕州市木石镇' --等同于 exec up_insertstudent @sname='肖玉峰',@sid='200712110111',@ssex='男',@sbirth= '1975-02-05',@sbirthplace='山东省滕州市木石镇' drop procedure up_insertstudent delete students where stu_name='肖玉峰'

中间代码生成具体实验过程含代码

实验三中间代码生成 学号:1152185;姓名:马小军 实验目的 1.了解并掌握中间代码的生成过程和作用 2.了解并掌握四元式 3.体会属性文法在中间代码生成过程中的作用 。 实验环境 Windows7操作系统vs2010编程环境 实验内容 从文件中读入表达式,输出其四元式的结果序列 本程序只能生成赋值语句及算数表达式中间代码的四元式不能生成逻辑表达式及其他复杂语句中间代码的四元式 实验原理 三、以逆波兰式为例的实验设计思想及算法 (1)首先构造一个运算符栈,此运算符在栈内遵循越往栈顶优先级越高的原则。 (2)从左至右扫描该算术表达式,从第一个字符开始判断,如果该字符数字,则分析到该数字串的结束并将该数字存入数组。 (3)如果不是数字,该字符则是运算符,此时需比较优先关系。 做法如下:将该字符与运算符栈顶的运算符的优先关系相比较。如果,该字符优先关系高于此运算符栈顶的运算符,则将该运算符入栈。倘若不是的话,则将此运算符栈顶的运算符从栈中弹出,将该字符入栈。 (4)重复上述操作(2)-(3)直至扫描完整个简单算术表达式,确定所有字符都得到正确处理,我们便可以将中缀式表示的简单算术表达式转化为四元式。 下面给出算法流程图

实验步骤 打开并运行软件 根据提示输入要分析的源程序(文件目录下有写好的文件源文件1.txt输入即可) 运行输出结果 例如将以下源文件放入test.txt 运行结果 a:=b*c+b*d 思考 同样的思路对算法进行适当改动就可以生成其它形式的中间代码 【其他部分】 设计原理和算法思想参考 《程序设计语言编译原理》第三版国防工业出版社作者陈火旺等

oracle存储过程代码

/****************************存储过程*******************************/ //序列 create sequence id start with 1 increment by 1 nomaxvalue nocycle cache 10 / //后台添加文章信息 CREATE OR REPLACE PROCEDURE InsertArticle( title in varchar2, first_id in number, author in varchar2, img in varchar2, content in long ) AS BEGIN INSERT INTO article (id,title,first_id,author,img,ntime,content) V ALUES (id.nextval,title,first_id,author,img,sysdate,content); END InsertArticle; / //后台文章的修改 create or replace procedure updateArticle( tit in varchar2, firstid in number, aut in varchar2, im in varchar2, cont in long, idd in number ) is begin update article set title=tit,first_id=firstid,author=aut,img=im,content=cont where id=idd; end updateArticle; //后台文章删除 create or replace procedure deleteArticle(idd in number) is begin delete from article

MC过程的代码学习

添加到IE收藏夹| 只看楼主| 可打印版本| 推荐给朋友| 收藏主题| zyj8119 专家顾问(著名写手) 模拟EPI: 3 金币: 630.3 散金: 61 帖子: 1029 在线: 99.6小时 虫号: 664177 注册: 2008-11-29 来自: 上海 状态: 在线 性别: GG 专业: 物理化学 【讨论】一些简单的MC过程的代码学习已有2人参与 ★★★ 小木虫(金币+1):奖励一下,鼓励发有价值的话题 lei0736(金币+2):谢谢分享2010-09-08 19:38:26 CODE: [Copy to clipboard] -------------------------------------------------------------------------------- ljenergyMC: // -------------------- // File containing functions to implement the LJenergy // class. #include "ljenergyMC.h" // Method: setEnergy // Usage: setEnergy(); // -------------------- // The ljenergy method calculates the energy experieced // by all num atoms due to pairwise interatomic interaction. // The forces are calculated using the Lennard-Jones (6-12) // potential. The potential is truncated at a distance // rCut and long range corrections must be applied outside // the method to obtain the full contributions to the // energy.

地址转换过程的模拟实现 代码

#include #include #include using namespace std; ////////////////////////////////////////////// const int rand_len=100; const int M=20; const int k=1024; ////////////////////////////////////////////// ///////////////随机数发生程序///////////////// ////////////////////////////////////////////// void RND(const int n0,const int n,const int M,int*const RN) { int temp[rand_len]; srand((unsigned)time(NULL)); for(int i=0;i

什么软件给定代码生成流程图

在日常工作中,我们经常会需要画流程图,一般来说,大家都会选择使用PPT或者Word文档进行常规的流程图制作,虽然用这些办公软件也可以解一时之急,但终归不够专业方便,还非常费时,那要怎么才能方便快捷的解决问题呢?此时我们需要一个专业的软件来直接制作,这样才可以省时又省力,既方便又美观,分分钟让老板对你刮目相看。 当你对那些简洁美观的流程图感到羡慕不已,是否好奇它们是怎样做出来的,是否想知道需要什么样的专业技能。今天,这一切将变得非常简单,你只需要点击几下鼠标就能制作出属于自己的可视化流程图。而且一切操作都异常简洁。

流程图的基本符号 首先,设计流程图的难点在于对业务逻辑的清晰把握。熟悉整个流程的方方面面。这要求设计者自己对任何活动、事件的流程设计,都要事先对该活动、事件本身进行深入分析,研究内在的属性和规律,在此基础上把握流程设计的环节和时序,做出流程的科学设计。研究内在属性与规律,这是流程设计应该考虑的基本因素。也是设计一个好的流程图的前提条件。

然后再根据事物内在属性和规律进行具体分析,将流程的全过程,按每个阶段的作用、功能的不同,分解为若干小环节,每一个环节都可以用一个进程来表示。在流程图中进程使用方框符号来表达。 既然是流程,每个环节就会有先后顺序,按照每个环节应该经历的时间顺序,将各环节依次排开,并用箭头线连接起来。箭头线在流程图中表示各环节、步骤在顺序中的进展。 对某环节,按需要可在方框中或方框外,作简要注释,也可不作注释。 经常判断是非常重要的,用来表示过程中的一项判定或一个分岔点,判定或分岔的说明写在菱形内,常以问题的形式出现。对该问题的回答决定了判定符号之外引出的路线,每条路线标上相应的回答。 选择好的流程图制作工具 亿图发布第一款支持快捷操作的流程图制作工具从而极大的降低了专业流程设计的门槛,让大多数人可以在很短的时间里绘制出专业的流程图。

源代码及说明书修改步骤

一、源代码修改步骤 ?删除页眉和页脚; ?添加页眉:页眉要居左显示,不能出现拐行,如果没有下横线, 则要自行添加;添加页眉方式为:设计—页码—页面顶端—普通 设计3;页码页眉标准格式为:软件名称版本号,例如:网站内容 管理系统V1.0;页眉内容要与申请表内容一致; ?每页空行不能超过5个; ?代码的注释不能出现:公司名称,人名,日期,软件名称,网址, copyright,版权以及与本软件无关的内容。 ?源代码第1页为开始,第31页也是开始,最后一页为完整结束; ?申请表上源代码数高于3000行,则代码必须为60页;如果低于 3000行,修改完成代码要与申请表上的行数一致。 ?如果客户提供的源代码不足,则自行挑选代码片段进行补充,切 记选择整段代码进行粘贴复制;要保证无痕迹,不能被看出有复 制迹象; ?修改完成后重新检查整个文档出现的软件名称,版本号要与申请 表一致;确保整篇文档不存在一下内容:“公司名称,人名,日期, 网址,版权,copyright,技术支持,版权归属,权利归属”等字样。 二、说明书修改标准步骤 删除页眉和页脚; 添加页眉:页眉要居左显示,不能出现拐行,如果没有下横线,则要自行添加;添加页眉方式为:设计—页码—页面顶端—普通 设计3;页码页眉标准格式为:软件名称版本号,例如:网站内 容管理系统V1.0;页眉内容要与申请表内容一致; 字体大小为四号或小四号; 说明书文字内容不能出现:公司名称或国家相关部门有关的文字内容;不能出现:“网址,版权。”如果出现则需要删除。 图片要先复制到画图工具中去,然后放到作图工具上进行修改; 图片上面的软件名称及版本号要与申请表上一致;图片上面不能出现其他公司名称,版权归属,人名,日期;图片上面不能出现 网址;图片上面不能出现国家相关部门名称; PS过程要细致认真,确保不能被看出来; 如果有设计文档则要玉说明书整合,设计文档在前,说明书在后; 说明书不能超过60页,多余内容要从后删除; 说明书图片如果是网页截图,网页上的名称与申请表不一致,则要替换成“网页浏览器框”截图;修改后的图片要保持清晰像素; 修改完成以后,检查文字内容和图片内容以确保:名称版本号与申请表一致,无其他公司名称,人名,日期,相关国家部门,版 本归属等字样; 在开发完成日期前的日期均不能出现,开发完成后的日期可以保留; 不能出现logo标识等字样;出现个人照片时应删除。

中间代码生成具体实验过程含代码

实验三中间代码生成 学号:;姓名:马小军 实验目的 1.了解并掌握中间代码的生成过程和作用 2.了解并掌握四元式 3.体会属性文法在中间代码生成过程中的作用 。 实验环境 Windows7操作系统vs2010编程环境 实验内容 从文件中读入表达式,输出其四元式的结果序列 本程序只能生成赋值语句及算数表达式中间代码的四元式不能生成逻辑表达式及其他复杂语句中间代码的四元式 实验原理 三、以逆波兰式为例的实验设计思想及算法 (1)首先构造一个运算符栈,此运算符在栈内遵循越往栈顶优先级越高的原则。 (2)从左至右扫描该算术表达式,从第一个字符开始判断,如果该字符数字,则分析到该数字串的结束并将该数字存入数组。 (3)如果不是数字,该字符则是运算符,此时需比较优先关系。 做法如下:将该字符与运算符栈顶的运算符的优先关系相比较。如果,该字符优先关系高于此运算符栈顶的运算符,则将该运算符入栈。倘若不是的话,则将此运算符栈顶的运算符从栈中弹出,将该字符入栈。 (4)重复上述操作(2)-(3)直至扫描完整个简单算术表达式,确定所有字符都得到正确处理,我们便可以将中缀式表示的简单算术表达式转化为四元式。 下面给出算法流程图

实验步骤 打开并运行软件 根据提示输入要分析的源程序(文件目录下有写好的文件源文件1.txt输入即可) 运行输出结果 例如将以下源文件放入test.txt 运行结果 a:=b*c+b*d 思考 同样的思路对算法进行适当改动就可以生成其它形式的中间代码 【其他部分】 设计原理和算法思想参考 《程序设计语言编译原理》第三版国防工业出版社作者陈火旺等

附录代码 #include #include #include #include using namespace std; #define MAX 100 int m=0,sum=0;//sum用??于?¨2计?算?运?算?符¤?的ì?个?数oy //m用??于?¨2标à¨o记?输o?入¨?表à¨a达??式o?中D字á?符¤?的ì?个?数oy char JG='A'; char str[MAX];//用??于?¨2存??输o?入¨?表à¨a达??式o? int token=0;//左á¨?括¤?§号?的ì?标à¨o志? /***********用??于?¨2更¨1改?计?算?后¨?数oy组á¨|中D的ì?值|ì**************/ void change(int e) { int f=e+2; char ch=str[f]; if(ch>='A'&&ch<='Z') { for(int l=0;l='A'&&str[e]<='Z') { for(int i=0;i

手动执行存储过程-代码

<%-- * 该文件用于调用数据库存储过程 * new 2013-10-29 * author yangwentao * --%> <%@page contentType="text/html; charset=GBK"%> <%@page language="java"import="java.util.*"pageEncoding="GBK"%> <%@page import="com.sinosoft.sysframework.reference.DBManager"%> <%@page import="com.sinosoft.utility.SysConfig"%> <%@page import="java.sql.Connection"%> <%@page import="java.sql.CallableStatement"%> <%@page import="java.text.SimpleDateFormat"%> <%@page import="java.text.DateFormat"%> <%@page import="java.util.Calendar"%> <%@page import="java.util.Date"%> <%@page import="https://www.doczj.com/doc/f018625416.html,mon.datatype.DateTime"%> <%@page import="com.sinosoft.sysframework.reference.AppConfig"%> <% Calendar c = Calendar.getInstance(); c.set(Calendar.DATE, 1); java.sql.Date reinsFirstDay = new java.sql.Date((c.getTime()).getTime()); c.add(Calendar.MONTH, 1); c.set(Calendar.DAY_OF_MONTH, 0); java.sql.Date reinsLastDay = new java.sql.Date((c.getTime()).getTime()); String content = reinsFirstDay.toString().substring(0,4)+"年 "+reinsFirstDay.toString().substring(5,7)+"月 "; String msg = "message"; DBManager dbManager = new DBManager(); try { dbManager.open(SysConfig.getProperty("DDCCDATASOURCE")); dbManager.beginTransaction(); Connection connection = dbManager.getConnection(); CallableStatement callableStatement = connection.prepareCall("{call prc_prpdriskcodearticlebak}");//调用自动分入清单存储过程 callableStatement.execute(); content+="数据同步成功"; https://www.doczj.com/doc/f018625416.html,mitTransaction(); } catch (Exception e) { dbManager.rollbackTransaction(); content+="数据同步异常"; msg = "error"; e.printStackTrace(); } finally { dbManager.close(); } %>

oracle存储过程代码实例一

oracle存储过程代码实例一 1、用来插入大量测试数据的存储过程 CREATE OR REPLACE PROCEDURE INSERTAMOUNTTEST ( ST_NUM IN NUMBER, ED_NUM IN NUMBER ) IS BEGIN declare i number; begin FOR i IN ST_NUM..ED_NUM LOOP INSERT INTO tb values(i,i,'3','3','3',100,'0'); END LOOP; end; END; 运行: sql>execute INSERTAMOUNTTEST(1,45000) -- 一次插入45000条测试数据 2、从存储过程中返回值 create or replace procedure spaddflowdate ( varAppTypeId in varchar2, varFlowId in varchar2, DateLength in number, ReturnValue out number --返回值) is begin insert into td values(varAppTypeId,varFlowId,DateLength) returning 1 into ReturnValue; --返回值 commit; exception when others then

rollback; end; 存储过程的执行 sql>variable testvalue number; sql>execute spaddflowdate('v','v',2,:testvalue); sql>print 就可以看到执行结果 3、用包实现存储过程返回游标: create or replace package test_p as type outList is ref cursor; PROCEDURE getinfor(taxpayerList out outList); end test_p; / create or replace package body test_p as PROCEDURE get infor(taxpayerList out outList) is begin OPEN taxpayerList FOR select * from td where tag='0'; end getinfor; end test_p; / 运行:

存储过程代码样例

[dzh1] create or replace procedure sp_kr_ns_hn_mtv_dtal[dzh2] ( iv_date in varchar2, oi_return out integer ) /** head * @name masakr#sp_kr_ns_hn_mtv_dtal * @caption 河南手机电视专区日累计报表 * @type 日报表 * @parameter iv_date in varchar2[dzh3] 统计日期,格式:yyyymmdd * @parameter oi_return out integer 执行状态码,0 正常,其它出错 * @description 需求:267536,作用:河南手机电视专区日累计报表和日累计智能查询,运行时间:120秒[dzh4] * @target masakr#tb_kr_ns_hn_mtv_dtal 河南手机电视专区日累计报表* @target masakr#tb_kr_ns_hn_mtv_list_dtal 河南手机电视专区日累计智能查询 * @source masadw#tb_dw_su_stm_list_cur 手机电视清单表 * @source masamk#tb_mk_sc_user_dtal 用户日累计事实表 * @middle masakr#tb_kr_ns_hn_mtv_list_dt_tmp * @middle masakr#tb_kr_ns_hn_mtv_list_dt_tmp1 * @version 2.0 * @author 张三 * @create-date 2009-08-24 * @todo * @version * @mender * @modify_date * @modify_desc * @copyright **厂家河南移动 */ is /** @description 变量定义*/[dzh5] vi_task_id integer; -- 任务日志id vv_task_name varchar2(30); -- 任务名 vv_table_name varchar2(30); -- 表名 vv_task_sign varchar2(30); -- 任务标识 vv_task_pos varchar2(50); -- 任务位置 vi_err_code integer; -- 出错代码 vv_err_msg varchar2(200); -- 出错信息

相关主题
文本预览
相关文档 最新文档