版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
PAGEPAGE19《单片机产品设计与制作》项目报告项目3、利用按键查询实现参数设定及显示姓名:学号:
一、任务要求理解开关量/数字量信号的沿采集方法;理解数码管数值显示原理;会编写和调试按键查询与去抖程序;能设计数码管静态和动态显示电路并编写和调试相应程序;初步理解STM32内部存储器结构及启动方式。二、要点记录及成果检验任务3.1方案设计姓名学号日期分数(一)要点记录1、请画出系统方框图。任务3.2电路设计与测试姓名学号日期分数(一)术语记录英文中文翻译Segment段Direction(DIR)方向OutputEnable(OE)输出允许LatchEnable(LE)锁存允许Common(COM)公共(二)自主设计1、请画出直联的两位数码管静态显示电路,已知数码管为共阳极。要求使用PB15~PB0连接数码管。并写出显示数字“25”的操作过程。将“2”(十位)的段码0xa4(参见表3.2.1)送到PB15~PB8;将“5”(个位)的段码0x92(参见表3.2.1)送到PCB7~PB0。GPIO_Write(GPIOB,0xa492); //向PB15~PB0输出“25”的段码2、用74LVC245驱动的共阴极数码管静态显示电路,要求使用PD15~PD0连接数码管。并写出显示数字“25”的操作过程。将“2”(十位)的段码0x5B(参见表3.2.2)送到PD15~PD8;将“5”(个位)的段码0x6D(参见表3.2.2)送到PDB7~PD0。GPIO_Write(GPIOD,0x5B6D); //向PD15~PD0输出“25”的段码3、请上网查找使用三极管做驱动的数码管静态或动态显示电路,并分析其工作原理。4、请上网查找使用7407驱动的数码管静态或动态显示电路,并分析其工作原理。。静态动态5、请画出用74LVC573驱动的两位数码管动态显示电路,如果数码管采用共阴极,使用PB7~PB0连接数码管,PB8和PB9做位选,请大家画电路,写出显示数字“68”的操作过程。禁止两个数码管(PBout(8)=0;PBout(9)=0;)输出“6”的段码到PB7~PB0,同时输出0xfc(11111100)到PB8~PB15(GPIO_Write(GPIOB,0xfc7d);)选通个十位数码管(PBout(8)=1;)延时10ms禁止十位数码管(PBout(8)=0;)输出“8”的段码到PB7~PB0,同时输出0xfc(11111100)到PB8~PB15(GPIO_Write(GPIOB,0xfc7f);)选通个位数码管(PBout(9)=1;)延时10ms禁止个位数码管(PBout(9)=0;)重复步骤2~9。步骤1通常在初始化程序中做。步骤5和9可省略。6、请画出用74LVC573驱动的两位数码管动态显示电路,如果数码管采用共阳极,使用PB7~PB0连接数码管,PB8和PB9做位选,请大家写出显示数字“68”的操作过程。第5题电路中,将两个数码管的com接3.3V,其余相同。操作过程同第5题,但应使用共阳极段码。7、请画出用用74LVC245驱动的两位数码管动态显示电路,如果数码管采用共阴极,请大家写出显示数字“68”的操作过程操作过程与题5类似,但(1)选通信号为0,禁止信号为1;(2)段码输出口为GPIOC,位选信号为PCout(0)和PCout(1)。任务3.3程序设计与调试姓名学号日期分数(一)术语记录英文中文翻译Segment段Display显示Set_value设定值Key_Scan按键扫描(二)自主设计1、用开发板上的K_UP做加1键,K_DOWN做减1键,用PD7~PD0控制十位数码管,PC7~PC0控制个位数码管,两个数码管都是共阴极,用74LVC245做驱动器,画出电路,编写程序。Main.c#include"seg.h" //数码管定义头文件#include"sys.h" #include"SysTick.h"#include"key.h" //按键定义头文件intmain(){ u8Set_value; //定义变量,用于存储设定值 HAL_Init(); KEY_Init(); //初始化按键 Seg_Init(); //初始化数码管 Stm32_Clock_Init(RCC_PLL_MUL9); SysTick_Init(72); while(1) { Set_value=Key_Scan(); //进行按键采集,结果存在Set_value Seg_Disp(Set_value); //将Set_value送数码管进行数值显示 }}Key.c#include"key.h"staticu8Key_Up_Last; //存储Key_Upt按键上一次的值staticu8Key_Down_Last; //存储Key_Down按键上一次的值staticu8Key_value; //存储设定值(范围0~99)/****按键初始化函数***************************************/voidKey_Init(){ GPIO_InitTypeDefGPIO_Initure;__HAL_RCC_GPIOA_CLK_ENABLE();//开启GPIOA时钟__HAL_RCC_GPIOE_CLK_ENABLE();//开启GPIOE时钟GPIO_Initure.Pin=GPIO_PIN_0;//PA0GPIO_Initure.Mode=GPIO_MODE_INPUT;//输入GPIO_Initure.Pull=GPIO_PULLDOWN;//下拉GPIO_Initure.Speed=GPIO_SPEED_HIGH;//高速HAL_GPIO_Init(GPIOA,&GPIO_Initure); GPIO_Initure.Pin=GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4;//PE2,3,4GPIO_Initure.Mode=GPIO_MODE_INPUT;//输入GPIO_Initure.Pull=GPIO_PULLUP;//上拉GPIO_Initure.Speed=GPIO_SPEED_HIGH;//高速HAL_GPIO_Init(GPIOE,&GPIO_Initure); Key_Up_Last=0x01;Key_Down_Last=0x01; Key_value=0;}/***************按键采集程序***********************功能:采集K_Up和K_Down按键,每按下1次,结果+1;*每按下1次,结果-1;*输入:无*输出:按键加减1的结果,u8类型***************按键采集程序***********************/u8Key_Scan(void){ if(K_Up!=Key_Up_Last) //如果K_Up当前值和上一次不相等,说明按键状态发生改变 { if(K_Up==1) {Key_value+=1;}//如果是上升沿,则键值+1 Key_Up_Last=K_Up; //无论是下降沿还是上升沿,将Key_Up_Last刷新为当前值 delay_ms(10); //延时去抖 } if(K_Down!=Key_Down_Last) //如果K_Downt当前值和上一次不相等,说明按键状态发生改变 { if(K_Down==0) {Key_value-=1;}//如果是下降沿,则键值-1 Key_Down_Last=K_Down; //无论是下降沿还是上升沿,将Key_Right_Last刷新为当前值 delay_ms(10); //延时去抖 } if(Key_value>99)Key_value=0; //限制Key_value在0~99范围 return(Key_value); //返回Key_value的值}Key.h#ifndef_KEY_H #define_KEY_H #include"stm32f1xx.h" #include"sys.h" #include"SysTick.h" #defineK_Up PAin(0) #defineK_Left PEin(2) #defineK_Down PEin(3) #defineK_Right PEin(4) voidKey_Init(void); u8Key_Scan(void);#endifSeg.c#include"seg.h"//u8smg_table[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//0~9共阳极数码管段码表u8smg_table[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0~9共阴极数码管段码表voidSeg_Init(){ GPIO_InitTypeDefGPIO_InitStructure; //定义变量,用于存储GPIO初始化参数 __HAL_RCC_GPIOC_CLK_ENABLE(); __HAL_RCC_GPIOD_CLK_ENABLE(); //开启GPIOC和GPIOD时钟 /**********GPIOC_Pin_0~Pin_7初始化********/ GPIO_InitStructure.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; //是Pin_0~Pin_7 GPIO_InitStructure.Speed=GPIO_SPEED_FREQ_HIGH;//输出速度50MHz GPIO_InitStructure.Mode=GPIO_MODE_OUTPUT_PP; //推挽输出Out_PP HAL_GPIO_Init(GPIOC,&GPIO_InitStructure); //按照以上设置初始化段码线 GPIO_InitStructure.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_InitStructure.Speed=GPIO_SPEED_FREQ_HIGH; //输出速度为高 GPIO_InitStructure.Mode=GPIO_MODE_OUTPUT_PP; //推挽输出Out_PP HAL_GPIO_Init(GPIOD,&GPIO_InitStructure); }/****************数码管显示程序*********************功能:00~99数码管显示*输入:Data——待显示数字,u8类型,范围0~99*输出:无***************************************************/voidSeg_Disp(u8Data){ u8Tens,Ones, Seg_Tens,Seg_Ones; u16Disp_Data; Tens=Data/10; //求待显示数字的十位数 Ones=Data%10; //求待显示数字的个位数 Seg_Tens=smg_table[Tens]; //求十位数的段码 Seg_Ones=smg_table[Ones]; //求个位数的段码 Disp_Data=0xff00+Seg_Tens; //将十位段码整合成16位数据 GPIOC->ODR=Disp_Data; //将整合后的十位数段码送十位显示端口 Disp_Data=0xff00+Seg_Ones; //将个位段码整合成16位数据 GPIOC->ODR=Disp_Data; //将整合后的个位数段码送十位显示端口}Seg.h#ifndef_SEG_H#define_SEG_H#include"stm32f10x.h" #defineSEG_Port_Tens GPIOD #defineSEG_Port_Ones GPIOC voidSeg_Init(void); voidSeg_Disp(u8data);#endif2、用开发板上的K_UP做加1键,K_DOWN做减1键,用PC7~PC0控制两个数码管,用PC8做十位选通信号,用PC9做个位选通信号,两个数码管都是共阴极,用74LVC245做驱动器,画出电路,编写程序。Main.c\key.c\key.h同题1Seg.c#include"seg.h"//u8smg_table[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//0~9共阳极数码管段码表u8smg_table[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0~9共阴极数码管段码表voidSeg_Init() //数码管初始化函数{ GPIO_InitTypeDef GPIO_InitStructure; //定义GPIO初始化变量 __HAL_RCC_GPIOC_CLK_ENABLE(); //开启GPIOC时钟 //__HAL_RCC_GPIOD_CLK_ENABLE(); //开启GPIOD时钟 GPIO_InitStructure.Pin=SEG_Pin; //段码引脚 GPIO_InitStructure.Speed=GPIO_SPEED_FREQ_HIGH; //输出速度为高 GPIO_InitStructure.Mode=GPIO_MODE_OUTPUT_PP; //推挽输出Out_PP HAL_GPIO_Init(SEG_Port,&GPIO_InitStructure); //按照以上设置初始化段码线 HAL_GPIO_WritePin(SEG_Port,SEG_Pin,GPIO_PIN_SET); //段码线全部输出1 GPIO_InitStructure.Pin=BS_Pin; //位选引脚 GPIO_InitStructure.Speed=GPIO_SPEED_FREQ_HIGH; //输出速度为高 GPIO_InitStructure.Mode=GPIO_MODE_OUTPUT_PP; //推挽输出Out_PP HAL_GPIO_Init(BS_Port,&GPIO_InitStructure); //按照以上设置初始化位选线 Tens_S=1;Ones_S=1;//禁止十位和个位数码管}/****************数码管显示程序*********************功能:00~99数码管显示*输入:Data——待显示数字,u8类型,范围0~99*输出:无***************************************************/voidSeg_Disp(u8Data){ u8Tens,Ones, Seg_Tens,Seg_Ones; u16Disp_Data; Tens=Data/10; //求待显示数字的十位数 Ones=Data%10; //求待显示数字的个位数 Seg_Tens=smg_table[Tens]; //求十位数的段码 Seg_Ones=smg_table[Ones]; //求个位数的段码 Disp_Data=0xff00+Seg_Tens; //将十位段码整合成16位数据 GPIOC->ODR=Disp_Data; //将整合后的十位数段码送显示端口Tens_S=0;//选通十位,十位数码管显示delay_ms(20);//延时Tens_S=1;//禁止十位Disp_Data=0xff00+Seg_Ones; //将个位段码整合成16位数据 GPIOC->ODR=Disp_Data;; //将整合后的个位数段码送显示端口Ones_S=0;//选通个位,个位数码管显示delay_ms(20);//延时Ones_S=1;//禁止个位,个位数码管显示}Seg.h#ifndef_SEG_H#define_SEG_H#include"stm32f10x.h" #defineSEG_Port GPIOC #defineOnes_S PCout(8)#defineTens_S PCout(9) voidSeg_Init(void); voidSeg_Disp(u8data);#endif任务3.4S
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- (部编版八年级《政治》课件)第四单元检测卷
- 《种子藏在哪里》课件
- 家具企业律师聘请合同范本
- 玩具企业会计岗位聘用合同
- 生态园区物业员工录用合同
- 《产业主体》课件
- 办公区日常清洁服务合同范本
- 水上乐园景观游园施工合同
- 医药电商合作协议模板
- 长沙二手房中介合同模板
- 2024年度工程咨询三人合伙协议书3篇
- 屋面板的拆除与更换施工方案
- 中药水飞蓟简介
- 生命不是游戏拒绝死亡挑战主题班会
- 8《我们受特殊保护》说课稿-2023-2024学年道德与法治六年级上册统编版
- 2024智能配电房技术导则
- 2024秋国家开放大学网课思政课《毛概》大作业+2024春+试题C
- 2024年初中历史九年级下册教学设计第14课 法西斯国家的侵略扩张
- 导游社团工作计划
- 新教科版小学1-6年级科学需做实验目录
- 保健艾灸师职业技能竞赛理论考试题库及答案
评论
0/150
提交评论