嵌入式代码汇总资料

资料如附件所示

实验一
#include "stm32f10x.h"     //定义头文件//
int msCounter = 0;         //初始化中断函数所需要的变量//
void SysTick_Handler(void)//--- systick中断函数 ---
{
	msCounter++;            //
}
void DelaymS(int t)     //延时函数//
{
	int ta,tb;
	ta = tb = msCounter;
	while((tb - ta) < t){tb = msCounter;}
}
unsigned char const LEDTAB[] =                 //流水灯数组//
{
	0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,     //低电平点亮LED//
};

int main(void)                   //主函数,程序运行从主函数开始//
{
	int i;            //定义整型变量,用于循环显示LEDTAB[]中的灯状态//
	GPIO_InitTypeDef MyGPIO;      //GPIO结构体//
	
	if(SysTick_Config(SystemCoreClock / 1000)){while(1);}
	
	//---GPIOA---
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);      //允许GPIOA时钟//
	MyGPIO.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 |
						GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;    //定义对应的管脚//
	MyGPIO.GPIO_Speed = GPIO_Speed_10MHz;     //选择GPIOA速度//
	MyGPIO.GPIO_Mode = GPIO_Mode_Out_PP;      //选择GPIOA模式,通用推挽输出//
	GPIO_Init(GPIOA,&MyGPIO);               //GPIOA初始化//
	
	while(1)
	{
		for(i=0;i<sizeof(LEDTAB);i++)      //循环读取数组中的数据//
		{
			GPIO_Write(GPIOA,LEDTAB[i]<<5);//在GPIOA端口写输出数据//
			DelaymS(100);          //延时一段时间,即让LED亮一段时间//
		}
	}
}
2、实验提高一
#include "stm32f10x.h"     //定义头文件//
int msCounter = 0;         //初始化中断函数所需要的变量//
void SysTick_Handler(void)//--- systick中断函数 ---
{
	msCounter++;            //
}
void DelaymS(int t)     //延时函数//
{
	int ta,tb;
	ta = tb = msCounter;
	while((tb - ta) < t){tb = msCounter;}
}
unsigned char const LEDTAB[] =                 //流水灯数组//
{
	0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,     //低电平点亮LED//
};
int main(void)                   //主函数,程序运行从主函数开始//
{
	int i;            //定义整型变量,用于循环显示LEDTAB[]中的灯状态//
	GPIO_InitTypeDef MyGPIO;      //GPIO结构体//
	
	if(SysTick_Config(SystemCoreClock / 1000)){while(1);
}
	//---GPIOB---
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);      //允许GPIOB时钟//
	MyGPIO.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 |
						GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12;    //定义对应的管脚//
	MyGPIO.GPIO_Speed = GPIO_Speed_10MHz;     //选择GPIO速度//
	MyGPIO.GPIO_Mode = GPIO_Mode_Out_PP;      //选择GPIO模式,通用推挽输出//
	GPIO_Init(GPIOB,&MyGPIO);               //GPIO初始化//
	
	while(1)
	{
		for(i=0;i<sizeof(LEDTAB);i++)      //循环读取数组中的数据//
		{
			GPIO_Write(GPIOB,LEDTAB[i]<<5);//将数组数据左移5位,即从第5脚开始,在GPIOB端口写输出数据//
			DelaymS(100);          //延时一段时间,即让LED亮一段时间//
		}
	}
}
 
实验二:
#include "stm32f10x.h"
unsigned char  LEDSEG[] = 
{
		0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F
}; 
void Init_SEGLED_Pin(void) ) 
{
	GPIO_InitTypeDef MyGPIO; 
	//---GPIOA ---
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC,ENABLE); 
	MyGPIO.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 |
						GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
	MyGPIO.GPIO_Speed = GPIO_Speed_50MHz; 
	MyGPIO.GPIO_Mode = GPIO_Mode_Out_PP; 
	GPIO_Init(GPIOC,&MyGPIO);
	//GPIOC
	GPIO_Init(GPIOC,&MyGPIO);
	MyGPIO.GPIO_Pin = GPIO_Pin_0| GPIO_Pin_1;-;
	MyGPIO.GPIO_Mode = GPIO_Mode_IN_FLOATING; 
	
}

void Init_NVIC(void) 
{
	NVIC_InitTypeDef MyNVIC; 
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); 
MyNVIC.NVIC_IRQChannel = EXTI0_IRQn; 
	MyNVIC.NVIC_IRQChannelPreemptionPriority = 0; 
	MyNVIC.NVIC_IRQChannelSubPriority = 0; 
	MyNVIC.NVIC_IRQChannelCmd = ENABLE; 
	NVIC_Init(&MyNVIC);
	
	MyNVIC.NVIC_IRQChannel = EXTI1_IRQn; 
	MyNVIC.NVIC_IRQChannelPreemptionPriority = 1; 
	MyNVIC.NVIC_IRQChannelSubPriority = 1; 
	MyNVIC.NVIC_IRQChannelCmd = ENABLE; 
	NVIC_Init(&MyNVIC);
}
void Init_EXTI0(void) 
{
EXTI_InitTypeDef MyEXTI; 
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); 
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0); 
	MyEXTI.EXTI_Line = EXTI_Line0; 
	MyEXTI.EXTI_Mode = EXTI_Mode_Interrupt; 
	MyEXTI.EXTI_Trigger = EXTI_Trigger_Falling; 
	EXTI_Init(&MyEXTI);
}
void Init_EXTI1(void) 
{
	EXTI_InitTypeDef MyEXTI; 
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); 
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource1); 
	MyEXTI.EXTI_Line = EXTI_Line1; 
	MyEXTI.EXTI_Mode = EXTI_Mode_Interrupt; 
	MyEXTI.EXTI_Trigger = EXTI_Trigger_Falling; 
	EXTI_Init(&MyEXTI);
}
int KeyCnt = 0;
void EXTI0_IRQHandler(void) 
{
	KeyCnt ++; 
	if(KeyCnt > 9)KeyCnt = 0; 
	GPIO_Write(GPIOC,~LEDSEG[KeyCnt]); 
EXTI_ClearITPendingBit(EXTI_Line0); 
}
void EXTI1_IRQHandler(void) 
{
	KeyCnt --; 
	if(KeyCnt < 0)KeyCnt = 9; 
	GPIO_Write(GPIOC,~LEDSEG[KeyCnt]); 
	EXTI_ClearITPendingBit(EXTI_Line1); 
}
int main(void) 
{	 
	Init_SEGLED_Pin();
	Init_NVIC();
	Init_EXTI0();
	Init_EXTI1();
	while(1)
	{
		GPIO_Write(GPIOC,~LEDSEG[KeyCnt]);
	}
}
 
实验三:
#include "stm32f10x.h"
unsigned char LEDSEG[] ={0x3F,0x06,0x5B,0X4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//数码管显示
unsigned char LEDPointer=0;
unsigned char LEDBuffer[4]={1,4,2,4} ;  //显示自己的学号
unsigned char LEDDIG[]={0x01, 0x02, 0x04, 0x08}; //数码管位选
unsigned char a=1;  //定义变量a,用于翻转电平
void Init_SEGLED_Pin (void)   //配置数码管管脚
{
	GPIO_InitTypeDef MyGPIO;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC,ENABLE);//开启GPIOA和GPIOC时钟
	//设置PC0-PC11管脚
	MyGPIO.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 |
						        GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7| GPIO_Pin_8| GPIO_Pin_9| GPIO_Pin_10| GPIO_Pin_11;
	MyGPIO.GPIO_Speed = GPIO_Speed_50MHz;//最高输出速率50MHz
	MyGPIO.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
	GPIO_Init(GPIOC,&MyGPIO);//根据GPIO_InitStruct中指定的参数初始化外设GPIOC寄存器
	
  //设置PA10输出管脚
	MyGPIO.GPIO_Pin =GPIO_Pin_10;
	MyGPIO.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
	MyGPIO.GPIO_Speed = GPIO_Speed_50MHz;//最高输出速率50MHz
	GPIO_Init(GPIOA,&MyGPIO);//根据GPIO_InitStruct中指定的参数初始化外设GPIOA寄存器
}
void Init_NVIC(void)                             //初始化NVIC
{
	NVIC_InitTypeDef MyNVIC;                       //定义一个NVIC结构体
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  //分组为2
  MyNVIC.NVIC_IRQChannel = TIM3_IRQn;             //TIM3通道
	MyNVIC.NVIC_IRQChannelPreemptionPriority = 2;   //2抢占优先级
	MyNVIC.NVIC_IRQChannelSubPriority = 2;          //2响应优先级
	MyNVIC.NVIC_IRQChannelCmd = ENABLE;            //使能
	NVIC_Init(&MyNVIC);	                           //根据相应的设置进行NVIC的初始化
	
	MyNVIC.NVIC_IRQChannel = TIM2_IRQn;             //TIM2通道
	MyNVIC.NVIC_IRQChannelPreemptionPriority = 2;  //2抢占优先级
	MyNVIC.NVIC_IRQChannelSubPriority = 1;         //2响应优先级
	MyNVIC.NVIC_IRQChannelCmd = ENABLE;            //使能
	NVIC_Init(&MyNVIC);	                           //根据相应的设置进行NVIC的初始化
	
}
void Init_TIM3(void)                                
{	
	TIM_TimeBaseInitTypeDef   MyTIM3;                 
    
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); //使能TIM3的时钟
   MyTIM3.TIM_Period=10;      //定时器重装值为10
	 MyTIM3.TIM_Prescaler=800-1;  //分频系数为800
	 MyTIM3.TIM_ClockDivision =0; //设置时钟分频
	 MyTIM3.TIM_CounterMode =TIM_CounterMode_Up;//TIM向上计数模式
	 TIM_TimeBaseInit(TIM3,&MyTIM3);//根据配置初始化TIM3
	 TIM_Cmd(TIM3,ENABLE);         //使能TIM3
	 TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);//使能TIM3中断
}
void Init_TIM2(void)                                
{	
	TIM_TimeBaseInitTypeDef   MyTIM2;                   
	 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//使能TIM2的时钟
   MyTIM2.TIM_Period=500;   //定时器重装值为5000
	 MyTIM2.TIM_Prescaler=800-1; //分频系数为800
	 MyTIM2.TIM_ClockDivision =0; //设置时钟分频
	 MyTIM2.TIM_CounterMode =TIM_CounterMode_Up;//TIM向上计数模式
	 TIM_TimeBaseInit(TIM2,&MyTIM2);//根据配置初始化TIM3
	 TIM_Cmd(TIM2,ENABLE);//使能TIM3
	 TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//使能TIM3中断
}
void TIM3_IRQHandler(void) //定时中断           
{
		if(RESET!=TIM_GetITStatus(TIM3,TIM_IT_Update))
		{//如果定时器3发生中断
				TIM_ClearITPendingBit(TIM3,TIM_IT_Update);  //清除中断标志位
				GPIO_Write(GPIOC,(LEDDIG[LEDPointer]<<8)|   //进行位选
										(unsigned char)(~LEDSEG[LEDBuffer[LEDPointer]]));//输出相应数字对应的电平
			LEDPointer++;
			if(sizeof(LEDBuffer)==LEDPointer)
				LEDPointer=0;
		}
}
void TIM2_IRQHandler(void) //定时中断             
{
		if(RESET!=TIM_GetITStatus(TIM2,TIM_IT_Update))
		{  //如果定时器2发生中断
		  TIM_ClearITPendingBit(TIM2,TIM_IT_Update);//清除中断标志位
      if(a==1)
			{
			  GPIO_SetBits(GPIOA,GPIO_Pin_10);  //PA10=1,即使PA10管脚输出高电平
			}				
			else
			{
			  GPIO_ResetBits(GPIOA,GPIO_Pin_10);//PA10=0,即使PA10管脚输出低电平
			}				
		}
		a=!a;        //变量a取反,实现电平翻转
}
int main(void)
{
    Init_SEGLED_Pin(); //对与数码管相连的管脚进行初始化
    Init_NVIC(); //对NVIC进行初始化
    Init_TIM3(); //对TIM3进行初始化
    Init_TIM2(); //对TIM2进行初始化
    while(1)
    {
		}
}
  
实验四:
#include "stm32f10x.h"
void Init_LCD_Pin(void) 
{ 
	GPIO_InitTypeDef MyGPIO;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC,ENABLE);
	MyGPIO.GPIO_Pin =GPIO_Pin_0|GPIO_Pin_1| GPIO_Pin_2|GPIO_Pin_4|GPIO_Pin_3|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;
	MyGPIO.GPIO_Mode =GPIO_Mode_Out_PP;
	MyGPIO.GPIO_Speed=  GPIO_Speed_50MHz;
	GPIO_Init(GPIOC, &MyGPIO);
}
void Init_NVIC(void)
{   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitTypeDef MyNVIC;
	MyNVIC.NVIC_IRQChannel =USART1_IRQn;		
	MyNVIC.NVIC_IRQChannelPreemptionPriority = 2;
	MyNVIC.NVIC_IRQChannelSubPriority =2;			
	MyNVIC.NVIC_IRQChannelCmd = ENABLE;						
	NVIC_Init(&MyNVIC); 
}
void Init_USART(void)
{
	USART_InitTypeDef MyUSART;
	GPIO_InitTypeDef MyGPIO;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
	MyGPIO.GPIO_Pin=GPIO_Pin_9;
	MyGPIO.GPIO_Mode=GPIO_Mode_AF_PP;
	GPIO_Init(GPIOA,&MyGPIO);
	MyGPIO.GPIO_Pin=GPIO_Pin_10;
	MyGPIO.GPIO_Mode=GPIO_Mode_IN_FLOATING;
	GPIO_Init(GPIOA,&MyGPIO);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
	MyUSART.USART_BaudRate=10800;
	MyUSART.USART_WordLength=USART_WordLength_8b;
	MyUSART.USART_StopBits=USART_StopBits_1;
	MyUSART.USART_Parity=USART_Parity_No;
	MyUSART.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
	MyUSART.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;
	USART_Init(USART1,&MyUSART);
	USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
	USART_Cmd(USART1,ENABLE);
}
void Usart1_PutChar(unsigned char ch)
{
 USART_SendData(USART1,(unsigned char)ch);
while(RESET==USART_GetFlagStatus(USART1,USART_FLAG_TXE));
}
void Usart1_PutString(unsigned char *buf,unsigned char len)
{
 while(len--)Usart1_PutChar(*buf++);
}
void USART1_IRQHandler(void)
{
	unsigned char Res;
  if(RESET!=USART_GetITStatus(USART1,USART_IT_RXNE))
	{
		Res=USART_ReceiveData(USART1);
		USART_SendData(USART1,Res);
	}
}
int main(void)
{
	Init_LCD_Pin();
  Init_NVIC();
	Init_USART();
	Usart1_PutString("1800201424\r\n\luolinsheng\r\n",30);
    while(1)
   {
   }
}
 
实验五:
1、基础加提高1部分:
#include "stm32f10x.h"
//初始化LCD
void Init_LCD_Pin(void)
{
    GPIO_InitTypeDef MyGPIO;
    
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
    MyGPIO.GPIO_Pin =   GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | 
                        GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 |
                        GPIO_Pin_8 | GPIO_Pin_9;
    MyGPIO.GPIO_Speed = GPIO_Speed_50MHz;
    MyGPIO.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init(GPIOC,&MyGPIO);
}

#define RS_CLR  GPIO_ResetBits(GPIOC,GPIO_Pin_9)
#define RS_SET  GPIO_SetBits(GPIOC,GPIO_Pin_9)
#define EN_CLR  GPIO_ResetBits(GPIOC,GPIO_Pin_8)
#define EN_SET  GPIO_SetBits(GPIOC,GPIO_Pin_8)

void LCD_Write_Com(unsigned char com) 
{
    int i;
    for(i=0;i<1000;i++);
    GPIO_Write(GPIOC,com);
    RS_CLR; EN_SET; EN_CLR;
}
void LCD_Write_Data(unsigned char Data) 
{
    int i;
    for(i=0;i<1000;i++);
    GPIO_Write(GPIOC,Data);
    RS_SET; EN_SET; EN_CLR;
}
void LCD_Init(void) 
{
    int i;
    LCD_Write_Com(0x38);
    LCD_Write_Com(0x08);
    LCD_Write_Com(0x01);
    for(i=0;i<100000;i++);
    LCD_Write_Com(0x06);
    LCD_Write_Com(0x0C);
}

void LCD_Write_Char(char x,char y,char Data) 
{
    if (0 == x)LCD_Write_Com(0x80 + y);
    else LCD_Write_Com(0xC0 + y);
    LCD_Write_Data(Data);  
}

void Init_ADC1(void)
{
    GPIO_InitTypeDef MyGPIO;
    ADC_InitTypeDef  MyADC;
    
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); 
    MyGPIO.GPIO_Pin = GPIO_Pin_0; 
    MyGPIO.GPIO_Mode = GPIO_Mode_AIN; 
    GPIO_Init(GPIOA,&MyGPIO);
	
	  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
    MyGPIO.GPIO_Pin = GPIO_Pin_0; 
    MyGPIO.GPIO_Mode = GPIO_Mode_AIN; 
    GPIO_Init(GPIOB,&MyGPIO);
    
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_ADC1,ENABLE);
    RCC_ADCCLKConfig(RCC_PCLK2_Div6);
    MyADC.ADC_Mode = ADC_Mode_Independent;
    MyADC.ADC_ScanConvMode = DISABLE;
    MyADC.ADC_ContinuousConvMode = DISABLE;
    MyADC.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
    MyADC.ADC_DataAlign = ADC_DataAlign_Right;
    MyADC.ADC_NbrOfChannel = 1;
    ADC_Init(ADC1,&MyADC); 
  	ADC_Cmd(ADC1,ENABLE);
//    ADC_ITConfig(ADC1,ADC_IT_EOC,ENABLE);
    ADC_SoftwareStartConvCmd(ADC1,ENABLE); 
}

int Get_Adc(char ch) 
{
    ADC_RegularChannelConfig(ADC1,ch,1,ADC_SampleTime_239Cycles5);
    ADC_SoftwareStartConvCmd(ADC1,ENABLE); 
    while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)); 
    return ADC_GetConversionValue(ADC1); 
}
unsigned char LCDBuffer[16] = {"D:0000  V:0000mV"};
int main(void)
{
    int i,j,adc,adc2;
    Init_LCD_Pin();
    LCD_Init();
    Init_ADC1();
    
    LCD_Write_Char(0,0,'D');LCD_Write_Char(0,1,':');
    LCD_Write_Char(0,6,' ');LCD_Write_Char(0,7,' ');
    LCD_Write_Char(0,8,'V');LCD_Write_Char(0,9,':');
    LCD_Write_Char(0,14,'m');LCD_Write_Char(0,15,'V');
	  LCD_Write_Char(1,0,'D');LCD_Write_Char(0,1,':');
    LCD_Write_Char(1,6,' ');LCD_Write_Char(0,7,' ');
    LCD_Write_Char(1,8,'V');LCD_Write_Char(0,9,':');
    LCD_Write_Char(1,14,'m');LCD_Write_Char(0,15,'V');
    while(1)
    {
            adc=Get_Adc(0);
            i = adc;
            LCDBuffer[2] = (i / 1000) % 10 + '0';
            LCDBuffer[3] = (i / 100) % 10 + '0';
            LCDBuffer[4] = (i / 10) % 10 + '0';
            LCDBuffer[5] = (i / 1) % 10 + '0';
            for(i=2;i<6;i++)LCD_Write_Char(0,i,LCDBuffer[i]);
            i = adc;
            i = i * 3300 / 4095; 
            LCDBuffer[10] = (i / 1000) % 10 + '0';
            LCDBuffer[11] = (i / 100) % 10 + '0';
            LCDBuffer[12] = (i / 10) % 10 + '0';
            LCDBuffer[13] = (i / 1) % 10 + '0';
            for(i=9;i<14;i++)LCD_Write_Char(0,i,LCDBuffer[i]); 
adc2=Get_Adc(8);
            j = adc2;
            LCDBuffer[2] = (j / 1000) % 10 + '0';
            LCDBuffer[3] = (j / 100) % 10 + '0';
            LCDBuffer[4] = (j / 10) % 10 + '0';
            LCDBuffer[5] = (j / 1) % 10 + '0';
            for(j=2;j<6;j++)LCD_Write_Char(1,j,LCDBuffer[j]);
            j = adc2;
            j = j * 3300 / 4095; 
            LCDBuffer[10] = (j / 1000) % 10 + '0';
            LCDBuffer[11] = (j / 100) % 10 + '0';
            LCDBuffer[12] = (j / 10) % 10 + '0';
            LCDBuffer[13] = (j / 1) % 10 + '0';
            for(j=9;j<14;j++)LCD_Write_Char(1,j,LCDBuffer[j]); 
    }
}
2、提高2部分
#include "stm32f10x.h"
void Init_LCD_Pin(void)
{
    GPIO_InitTypeDef MyGPIO;
    
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
    MyGPIO.GPIO_Pin =   GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | 
                        GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 |
                        GPIO_Pin_8 | GPIO_Pin_9;
    MyGPIO.GPIO_Speed = GPIO_Speed_50MHz;
    MyGPIO.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init(GPIOC,&MyGPIO);
}
#define RS_CLR  GPIO_ResetBits(GPIOC,GPIO_Pin_9)
#define RS_SET  GPIO_SetBits(GPIOC,GPIO_Pin_9)
#define EN_CLR  GPIO_ResetBits(GPIOC,GPIO_Pin_8)
#define EN_SET  GPIO_SetBits(GPIOC,GPIO_Pin_8)
void LCD_Write_Com(unsigned char com) 
{
    int i;
    for(i=0;i<1000;i++);
    GPIO_Write(GPIOC,com);
    RS_CLR; EN_SET; EN_CLR;
}
void LCD_Write_Data(unsigned char Data) 
{
    int i;
    for(i=0;i<1000;i++);
    GPIO_Write(GPIOC,Data);
    RS_SET; EN_SET; EN_CLR;
}
void LCD_Init(void) 
{
    int i;
    LCD_Write_Com(0x38);
    LCD_Write_Com(0x08);
    LCD_Write_Com(0x01);
    for(i=0;i<100000;i++);
    LCD_Write_Com(0x06);
    LCD_Write_Com(0x0C);
}
void LCD_Write_Char(char x,char y,char Data) 
{
    if (0 == x)LCD_Write_Com(0x80 + y);
    else LCD_Write_Com(0xC0 + y);
    LCD_Write_Data(Data);  
}
void Init_ADC1(void)
{
    GPIO_InitTypeDef MyGPIO;
    ADC_InitTypeDef  MyADC;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    MyGPIO.GPIO_Pin = GPIO_Pin_0;
    MyGPIO.GPIO_Mode = GPIO_Mode_AIN;
    GPIO_Init(GPIOA,&MyGPIO);
    
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_ADC1,ENABLE);
    RCC_ADCCLKConfig(RCC_PCLK2_Div6);
    MyADC.ADC_Mode = ADC_Mode_Independent;
    MyADC.ADC_ScanConvMode = DISABLE;
    MyADC.ADC_ContinuousConvMode = DISABLE;
    MyADC.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
    MyADC.ADC_DataAlign = ADC_DataAlign_Right;
    MyADC.ADC_NbrOfChannel = 1;
    ADC_Init(ADC1,&MyADC);
    ADC_ITConfig(ADC1,ADC_IT_EOC,ENABLE);
    ADC_Cmd(ADC1,ENABLE);
    ADC_SoftwareStartConvCmd(ADC1,ENABLE);
}
int Get_Adc(char ch)   
{
    ADC_RegularChannelConfig(ADC1,ch,1,ADC_SampleTime_239Cycles5);
    ADC_SoftwareStartConvCmd(ADC1,ENABLE);
    while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC));
    return ADC_GetConversionValue(ADC1);
}
void Init_NVIC(void)
{
    NVIC_InitTypeDef MyNVIC;
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    MyNVIC.NVIC_IRQChannel = ADC1_2_IRQn;
    MyNVIC.NVIC_IRQChannelPreemptionPriority = 2;
    MyNVIC.NVIC_IRQChannelSubPriority = 2;
    MyNVIC.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&MyNVIC);
}
int ADCValue,ADCFlag;
int ch = 0;
void ADC1_2_IRQHandler(void)
{
    if(0 != (ADC_GetITStatus(ADC1,ADC_IT_EOC)))
    {
        ADC_ClearITPendingBit(ADC1,ADC_IT_EOC);
        ADCValue = ADC_GetConversionValue(ADC1);
        ADC_RegularChannelConfig(ADC1,ch,1,ADC_SampleTime_239Cycles5);
        ADC_SoftwareStartConvCmd(ADC1,ENABLE);
        ADCFlag = 1;
    }
}
unsigned char LCDBuffer[16] = {"D:0000  V:0000mV"};
int main(void)
{
    int i;
    Init_LCD_Pin();
    LCD_Init();
    Init_NVIC();
    Init_ADC1();
    LCD_Write_Char(0,0,'D');LCD_Write_Char(0,1,':');
    LCD_Write_Char(0,6,' ');LCD_Write_Char(0,7,' ');
    LCD_Write_Char(0,8,'V');LCD_Write_Char(0,9,':');
    LCD_Write_Char(0,14,'m');LCD_Write_Char(0,15,'V');
    while(1)
    {
        if(0 != ADCFlag)
        {
            ADCFlag = 0;
            i = ADCValue;
            LCDBuffer[2] = (i / 1000) % 10 + '0';
            LCDBuffer[3] = (i / 100) % 10 + '0';
            LCDBuffer[4] = (i / 10) % 10 + '0';
            LCDBuffer[5] = (i / 1) % 10 + '0';
            for(i=2;i<6;i++)LCD_Write_Char(0,i,LCDBuffer[i]);
            i = ADCValue;
            i = i * 3300 / 4095;
            LCDBuffer[10] = (i / 1000) % 10 + '0';
            LCDBuffer[11] = (i / 100) % 10 + '0';
            LCDBuffer[12] = (i / 10) % 10 + '0';
            LCDBuffer[13] = (i / 1) % 10 + '0';
            for(i=9;i<14;i++)LCD_Write_Char(0,i,LCDBuffer[i]);
        }
    }
}
 
实验六:
#include "stm32f10x.h"
int KeyCnt=24;
#define Key1 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_13)
int msCounter = 0;
void SysTick_Handler(void)//--- systick中断函数 ---
{
	msCounter++;
}
void DelaymS(int t)//延时函数
{
	int ta,tb;
	ta = tb = msCounter;
	while((tb - ta) < t){tb = msCounter;}
}
void SPI1_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	SPI_InitTypeDef SPI_InitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_SPI1,ENABLE);//使能SPI1和GPIOA的时钟
	//PA5、PA7复用
	GPIO_InitStructure.GPIO_Pin =   GPIO_Pin_5 | GPIO_Pin_6 |GPIO_Pin_7;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//输出频率为50MHz
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽输出
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	GPIO_SetBits(GPIOA,GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7);	//将PA5、PA7三个管脚置为高电平
	
	//配置PA13输入管脚
	GPIO_InitStructure.GPIO_Pin =   GPIO_Pin_13;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;//双线双向全双工
	SPI_InitStructure.SPI_Mode = SPI_Mode_Master;//设置为主SPI
	SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;//SPI发送接收8位帧结构
	SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;//时钟悬空高
	SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;//数据捕获与第二个时钟沿
	SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;//内部SSI信号由SSI位控制
	SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;//波特率预分频值为2
	SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;//数据传输从MSB位开始
	SPI_InitStructure.SPI_CRCPolynomial = 7;//CRC值计算的多项式
	SPI_Init(SPI1,&SPI_InitStructure);//初始化SPI1
	SPI_Cmd(SPI1,ENABLE);//使能SPI1
	//将PA4设置为输出管脚
	GPIO_InitStructure.GPIO_Pin =GPIO_Pin_4;
	GPIO_InitStructure.GPIO_Mode =GPIO_Mode_Out_PP;//推挽输出
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	GPIO_ResetBits(GPIOA,GPIO_Pin_4);
}
unsigned char SPI1_ReadWriteByte(unsigned char TxData)
{
	while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE)==RESET);//等待数据完全传入到发送缓冲器中
	SPI_I2S_SendData(SPI1,TxData);//发送数据
	while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_RXNE)==RESET);//等待数据完全传入到接收缓冲器中
	return SPI_I2S_ReceiveData(SPI1);//接收数据
}
unsigned char const SEGLED[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsigned char LEDBuffer[2]={0,1};
void LEDDisplay(int val)
{
	LEDBuffer[0]=(val/10)%10;
	LEDBuffer[1]=(val/1)%10;
	SPI1_ReadWriteByte(SEGLED[LEDBuffer[1]]);
	SPI1_ReadWriteByte(SEGLED[LEDBuffer[0]]);
  GPIO_SetBits(GPIOA,GPIO_Pin_4);//将PA4管脚置为高电平
	GPIO_ResetBits(GPIOA,GPIO_Pin_4);//将PA4管脚置为低电平
}
int main(void)
{
	int i,j;
	SPI1_Init();
  LEDDisplay(KeyCnt);
  if(SysTick_Config(SystemCoreClock / 1000)){while(1);}
	
	while(1)
	{
		if(Key1==0)//如果按键按下
		{
			//延迟一段时间进行判断,达到消抖作用
			DelaymS(5);
			if(Key1==0)
			{
				DelaymS(3);//延迟一段时间进行判断,达到消抖作用
				if(Key1==0)
				{
					KeyCnt++;					
          while(!Key1);//松手按键检测
				}
			  if(KeyCnt>=99)//使i不断的在0到99间循环
			  {
				  KeyCnt=0;
				}
			}
		}		
		LEDDisplay(KeyCnt);
	}
}
 
综合实验—温度计(基础部分)
#include "stm32f10x.h"
#include "usart.h"
#include "delay.h"
#define RS_CLR GPIO_ResetBits(GPIOC,GPIO_Pin_9)
#define RS_SET GPIO_SetBits(GPIOC,GPIO_Pin_9)
#define EN_CLR GPIO_ResetBits(GPIOC,GPIO_Pin_8)
#define EN_SET GPIO_SetBits(GPIOC,GPIO_Pin_8)
#define BTN1 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_12)
float temp;
int TEMPH[5];
//==========================================================
int msCounter = 0;
void SysTick_Handler(void)//--- systick中断函数 ---
{
	msCounter++;
}
void DelaymS(int t)
{
while(t--);
}
void GPIO_INIT(void)
{		//GPIO初始化
	GPIO_InitTypeDef MyGPIO;
	
	RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC,ENABLE);
	MyGPIO.GPIO_Mode=GPIO_Mode_Out_PP;
	MyGPIO.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|
					        GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|
					        GPIO_Pin_8|GPIO_Pin_9;
	MyGPIO.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOC,&MyGPIO);
}
void LCD_Write_Com(unsigned char com)
{
	int i;
	for(i=0;i<1000;i++)
	GPIO_Write(GPIOC,com);
	RS_CLR;
	EN_SET;
	EN_CLR;
}
void LCD_Write_Data(unsigned char Data)
{
	int i;
	for(i=0;i<1000;i++)
	GPIO_Write(GPIOC,Data);
	RS_SET;
	EN_SET;
	EN_CLR;
}
void LCD_Init()
{
	int i;
	LCD_Write_Com(0x38);
	for(i=0;i<100000;i++);
	LCD_Write_Com(0x38);
	for(i=0;i<100000;i++);
	LCD_Write_Com(0x38);
	for(i=0;i<100000;i++);
	LCD_Write_Com(0x38);
	LCD_Write_Com(0x0D);
	LCD_Write_Com(0x01);
	LCD_Write_Com(0x06);
	for(i=0;i<100000;i++);
	//LCD_Write_Com(0x0C);
}
void LCD_Write_Char(char x,char y,char Data)
{
	if(0 == x)LCD_Write_Com(0x80 + y);
	else LCD_Write_Com(0xC0 + y);
	LCD_Write_Data(Data);
}
void Init_ADC1()
{
	ADC_InitTypeDef MyADC;
	GPIO_InitTypeDef MyGPIO;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	MyGPIO.GPIO_Mode=GPIO_Mode_AIN;
	MyGPIO.GPIO_Pin=GPIO_Pin_0;
	GPIO_Init(GPIOA,&MyGPIO);
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO|RCC_APB2Periph_ADC1,ENABLE);
	RCC_ADCCLKConfig(RCC_PCLK2_Div6);
	MyADC.ADC_Mode=   ADC_Mode_Independent;
	MyADC.ADC_ContinuousConvMode=DISABLE;MyADC.ADC_ScanConvMode=DISABLE;
	MyADC.ADC_DataAlign=ADC_DataAlign_Right;
	MyADC.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;
	MyADC.ADC_NbrOfChannel=1;
	
	ADC_Init(ADC1,&MyADC);
	ADC_Cmd(ADC1,ENABLE);
	ADC_SoftwareStartConvCmd(ADC1,ENABLE);
}
int Get_Adc(char ch)
{
	ADC_RegularChannelConfig(ADC1,ch,1,ADC_SampleTime_239Cycles5);
	ADC_SoftwareStartConvCmd(ADC1,ENABLE);
	while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC));
	return ADC_GetConversionValue(ADC1);
}
void Usart_PutChar(unsigned char ch)
{
	USART_SendData(USART1,(unsigned char)ch);
	while(RESET == USART_GetFlagStatus(USART1,USART_FLAG_TXE));//发送完成
}
void Usart_PutString(unsigned char *buf,unsigned char len)
{
	while(len--) Usart_PutChar(*buf++);
}
unsigned char LCDBuffer[8] = {"V1:00.0C"};
int main(void)
{
	GPIO_INIT();
	LCD_Init();
	Init_ADC1();
	delay_init();
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	uart_init(9600);
	LCD_Write_Char(0,0,'V');LCD_Write_Char(0,1,'1');LCD_Write_Char(0,2,':');
	LCD_Write_Char(0,5,'.');LCD_Write_Char(0,7,'C');
	printf("按下BTN1显示当前温度\r\n");
	while(1)
	{
		ADC_ClearFlag(ADC1,ADC_FLAG_EOC);
		temp=(float)Get_Adc(ADC_Channel_0);
		temp=temp*5000 / 4095 ;//12.5638
		//printf("1为%f",temp);
		TEMPH[0]=((int)temp);//TEMPH=125
		LCDBuffer[3] = (TEMPH[0]/100) % 10 +'0';
		LCDBuffer[4] = (TEMPH[0]/10) % 10 +'0';
		LCDBuffer[6] = TEMPH[0] % 10 +'0';
		LCD_Write_Char(0,3,LCDBuffer[3]);LCD_Write_Char(0,4,LCDBuffer[4]);LCD_Write_Char(0,6,LCDBuffer[6]);
	
		if( BTN1 ==0 )
		{
			DelaymS(5);
			if(BTN1==0)
			{
				DelaymS(3);//延迟一段时间进行判断,达到消抖作用
				if(BTN1==0)
				{
					while(!BTN1);//松手按键检测
			    printf(" V1 is = %c%c.%c°C\n",LCDBuffer[3],LCDBuffer[4],LCDBuffer[6]);
		      Usart_PutString("\r\r\n",2);
			    printf("按下BTN1显示当前温度\r\n");
				}
		  }
		}
	}
}
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值