资料如附件所示
实验一
#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");
}
}
}
}
}