新手入门
- 积分
- 17
- 金钱
- 17
- 注册时间
- 2019-11-26
- 在线时间
- 7 小时
|
2金钱
#include "stm32f10x.h"
#include"stm32f10x_tim.h"
void bxl_Delay(u32 bxl_nCount);//延时函数
u32 bxl_Count;//无符号字符型 32 位
u8 bxl_time=0;//无符号字符型 8 位
#define bxl_START GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0)//宏定义开始建
#define bxl_RST GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)//宏定义清零键
void bxl_Timer(void)//TIM 配置
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; //配置 TIM0.01 秒
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //使能 TIM2
TIM_DeInit(TIM2); //复位 TIM2 定时器,使之进入初始状态
TIM_TimeBaseStructure.TIM_Period=(100-1);//自动重装载寄存器的值
TIM_TimeBaseStructure.TIM_Prescaler=(7200-1);//时钟预分频数
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; //采样分频
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; // 向 上
计数
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);
TIM_ClearFlag(TIM2,TIM_FLAG_Update); //清除溢出中断标志
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE); //溢出中断使能
TIM_Cmd(TIM2,ENABLE); //计时器使能
}
void bxl_EXTI(void)//按键中断
{
EXTI_InitTypeDef EXTI_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);//复用时钟使能
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource1);//中断引脚
EXTI_InitStructure.EXTI_Line=EXTI_Line1;//中断线 1
EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;//中断事件选择
EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;//中断触发方式
EXTI_InitStructure.EXTI_LineCmd=ENABLE;//使能
EXTI_Init(&EXTI_InitStructure);常州大学本科生课程设计
第 24 页 共 37 页
}
void bxl_NVIC(void)//中断配置函数
{
NVIC_InitTypeDef NVIC_InitStructure;//TIM+ret 按键 NVIC 配置
NVIC_SetPriorityGrouping(NVIC_PriorityGroup_1); //采用第一组
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; //通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //占先优先级 1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //副优先级零
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能
NVIC_Init(&NVIC_InitStructure);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);//采用第一组
NVIC_InitStructure.NVIC_IRQChannel=EXTI1_IRQn;//通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;//占先优先级 1
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;//副优先级零
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//使能
NVIC_Init(&NVIC_InitStructure);
}
void bxl_GPIO(void)//按键端口
{
GPIO_InitTypeDef GPIO_InitStructure;//配置按键
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//端口时钟使能
GPIO_InitStructure.GPIO_Pin= GPIO_Pin_0|GPIO_Pin_1;//配置引脚
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;//上拉输入
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_2MHz;// 端 口 最 高 响 应 频 率
2MHZ
GPIO_Init(GPIOB,&GPIO_InitStructure);
}
void bxl_SPI1_Init(void) //串口配置
{
SPI_InitTypeDef SPI1_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;常州大学本科生课程设计
第 25 页 共 37 页
//配置 SPI1 管脚
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOA,
ENABLE);//使能串口所需引脚
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1,ENABLE);//使能串口
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3;//配置引脚
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;// 端 口 最 高 响 应 频 率
50MHZ
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//推挽输出
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_7;// 配 置 引
脚
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;// 端 口 最 高 响 应 频 率
50MHZ
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽输出
GPIO_Init(GPIOA,&GPIO_InitStructure);
SPI1_InitStructure.SPI_Direction=SPI_Direction_2Lines_FullDuplex;//设置 SPI 单
向或者双向的数据模式:SPI 设置为双线模式
SPI1_InitStructure.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_64;;// 定 义
波特率预分频的值:波特率预分频值为 64
SPI1_InitStructure.SPI_DataSize=SPI_DataSize_8b; //设置 SPI 的数据大小:SPI 发
送接收 8 位帧结构
SPI1_InitStructure.SPI_Mode=SPI_Mode_Master;//设置 SPI 工作模式,设置为
主模式
SPI1_InitStructure.SPI_FirstBit=SPI_FirstBit_MSB; //指定数据传输从 MSB 位还
是 LSB 位开始:数据传输从 MSB 位开始
SPI1_InitStructure.SPI_CPOL = SPI_CPOL_High; //高位在前
SPI1_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;//串行同步时钟的第二个跳变
沿(上升或下降)数据被采样
SPI1_InitStructure.SPI_NSS = SPI_NSS_Hard; // 使用硬件模式,PA4 需要接高
电平
SPI1_InitStructure.SPI_CRCPolynomial = 7; //CRC 值计算的多项式
SPI_I2S_DeInit(SPI1);//复位串口进入初始状态
SPI_Init(SPI1, &SPI1_InitStructure);常州大学本科生课程设计
第 26 页 共 37 页
SPI_Cmd(SPI1, ENABLE); //使能
}
void bxl_Write_Max7219(u8 bxl_address,u8 blx_dat)//写入数据
{
GPIO_ResetBits(GPIOA, GPIO_Pin_3); //重置端口
SPI_I2S_SendData(SPI1, bxl_address); //写入地址,即数码管编号
bxl_Delay(1);//延时
SPI_I2S_SendData(SPI1, blx_dat); //写入数据,即数码管显示数字
bxl_Delay(1);//延迟
GPIO_SetBits(GPIOA, GPIO_Pin_3);//载入数据
}
void bxl_Init_MAX7219(void)//显示方式配置
{
bxl_Write_Max7219(0x09, 0xff); //译码方式:BCD 码
bxl_Write_Max7219(0x0a, 0x09); //亮度
bxl_Write_Max7219(0x0b, 0x02); //扫描界限;2 个数码管显示
bxl_Write_Max7219(0x0c, 0x01); //掉电模式:0,普通模式:1
bxl_Write_Max7219(0x0f, 0x00); //显示测试:1;测试结束,正常显示:
0
}
void bxl_GE()//个位显示
{
if(bxl_time%10==0) {bxl_Write_Max7219(0x01, 0x00);}//计时变量除以 10 余数为 0
显示 0
if(bxl_time%10==1) {bxl_Write_Max7219(0x01, 0x01);}//计时变量除以 10 余数为 1
显示 1
if(bxl_time%10==2) {bxl_Write_Max7219(0x01, 0x02);}//计时变量除以 10 余数为 2
显示 2
if(bxl_time%10==3) {bxl_Write_Max7219(0x01, 0x03);}//计时变量除以 10 余数为 3
显示 3
if(bxl_time%10==4) {bxl_Write_Max7219(0x01, 0x04);}//计时变量除以 10 余数为 4
显示 4
if(bxl_time%10==5) {bxl_Write_Max7219(0x01, 0x05);}//计时变量除以 10 余数为 5
显示 5
if(bxl_time%10==6) {bxl_Write_Max7219(0x01, 0x06);}//计时变量除以 10 余数为 6
显示 6常州大学本科生课程设计
第 27 页 共 37 页
if(bxl_time%10==7) {bxl_Write_Max7219(0x01, 0x07);}//计时变量除以 10 余数为 7
显示 7
if(bxl_time%10==8) {bxl_Write_Max7219(0x01, 0x08);}//计时变量除以 10 余数为 8
显示 8
if(bxl_time%10==9) {bxl_Write_Max7219(0x01, 0x09);}//计时变量除以 10 余数为 9
显示 9
}
void bxl_SHI()//十位显示
{
if(bxl_time/10==0) {bxl_Write_Max7219(0x02, 0x00);}//计时变量除以 10 取整部分
为 0 显示 0
if(bxl_time/10==1) {bxl_Write_Max7219(0x02, 0x01);}//计时变量除以 10 取整部分
为 1 显示 1
if(bxl_time/10==2) {bxl_Write_Max7219(0x02, 0x02);}//计时变量除以 10 取整部分
为 2 显示 2
if(bxl_time/10==3) {bxl_Write_Max7219(0x02, 0x03);}//计时变量除以 10 取整部分
为 3 显示 3
if(bxl_time/10==4) {bxl_Write_Max7219(0x02, 0x04);}//计时变量除以 10 取整部分
为 4 显示 4
if(bxl_time/10==5) {bxl_Write_Max7219(0x02, 0x05);}//计时变量除以 10 取整部分
为 5 显示 5
if(bxl_time/10==6) {bxl_Write_Max7219(0x02, 0x06);}//计时变量除以 10 取整部分
为 6 显示 6
if(bxl_time/10==7) {bxl_Write_Max7219(0x02, 0x07);}//计时变量除以 10 取整部分
为 7 显示 7
if(bxl_time/10==8) {bxl_Write_Max7219(0x02, 0x08);}//计时变量除以 10 取整部分
为 8 显示 8
if(bxl_time/10==9) {bxl_Write_Max7219(0x02, 0x09);}//计时变量除以 10 取整部分
为 9 显示 9
}
int main(void)
{
bxl_Timer();//TIM 配置
bxl_EXTI();//按键中断
bxl_NVIC();//中断配置函数
bxl_GPIO();//按键端口常州大学本科生课程设计
第 28 页 共 37 页
bxl_SPI1_Init();//串口配置
bxl_Init_MAX7219();//显示方式配置
bxl_Write_Max7219(0x01, 0x00); //初始清零
bxl_Write_Max7219(0x02, 0x00);//初始清零
while(1)
{
if(bxl_START==0){
while(1)//记时
{
bxl_GE();//个位显示
bxl_SHI();//十位显示
bxl_Delay(100);//延时 1 秒
bxl_time=bxl_time+1;//加一秒
if(bxl_time==100)//到达 100 时重新计时
{
bxl_time=0;//归零
}
}
}
}
}
void bxl_Delay(u32 bxl_nCount)//延时一个数字为 0.01S
{
bxl_Count=bxl_nCount;//赋值
while(bxl_Count);//当值为 0 跳出
}
void TIM2_IRQHandler(void) //时钟中断子函数
{
if(TIM_GetITStatus(TIM2,TIM_IT_Update)!=RESET)//计时到来
{
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);//清楚中断
bxl_Count--;//一直递减每减一次计时 0.01 秒
}
}常州大学本科生课程设计
第 29 页 共 37 页
void EXTI0_IRQHandler(void)//归零中断子函数
{if(EXTI_GetITStatus(EXTI_Line1)==SET)//中断是否到来
{
EXTI_ClearITPendingBit(EXTI_Line1);//清除中断
EXTI_ClearFlag( EXTI_Line1); //清除
{
bxl_Write_Max7219(0x01, 0x00);//清零
bxl_Write_Max7219(0x02, 0x00);//清零
bxl_Write_Max7219(0x04, 0x00);//清零
bxl_time=0;//归零
}
}
}
|
|