单片机入门与实践课设-数码管显示+按键检测

  • 目的:实现数码管显示+按键检测(循环检测):实现按键控制数码管显示数字加减;

要求:熟练使用开发环境(keil)、工程建立、C源文件编写、添加、编译、链接、下载运行、简单程序修改等;

  • 思路:利用51单片机独立按键和静态数码管知识,通过对独立按键的操作,实现对变量值的加减,再将变量值输出到静态数码管上。首先定义变量关联独立按键的按键次数,将初始按键次数设置为零,通过if函数的循环,对按键次数进行累加,累加后赋值到定义变量中,再将其输出。

所需材料:

8pin线一根,三根杜邦线;静态数码管

元器件作用:8pin线:连接P0端口和静态数码管

杜邦线:端口与独立按键

静态数码管:显示编码中输出的值

  • 结构图

单片机的P0^0到P0^7端口用8pin线与静态数码管相连

P2-7与P2-6端口用两根杜邦线与独立按键K1和K2连接

  • 代码及其功能
#include <reg52.h>



typedef unsigned char u8;

typedef unsigned int u16;



sbit K1 = P2^7;

sbit K2 = P2^6;

u8 code smgduan[16] = { 0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,

 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E};

void delay();

定义变量u8 u16方便以后调用

定义P26 P27控制独立按键K1 K2.

定义共阳数码管将其存在smgduan数组中。



void main(){

bit add = 1; (用于K1,加)

bit reduce = 1;(用于K2,减)定义位变量,保存前一次的按键值

u8 count = 0; 定义初始化按键次数等于0



    while (1)

    {

if (K1 != add)     如果按键所输入当前值不等于前次值,说明按键有输入信息

 {

delay();

if (!add)   当add为否定时,add为0,则之前储存的值为0,说明是由0变1

{

count=count+1;   按键次数加一

if (count >= 10)   设定10之内循环显示,当次数达到十时,使次数重新等于0,归位

{

count = 0;

}

P0 = smgduan[count]; 将计数的数字显示到数码管上

}

add = K1; 更新文件中保存的值

 }

这是K1控制数码管数字增加的部分



 if (K2 != reduce)

 {

delay();

if (!reduce)

{

count=count-1; 按键次数减一

if (count <= 0)  如果count<0时,要重新进入循环,令count=9。

{

count = 9;

}

P0 = smgduan[count];

}

reduce = K2;

 }

}

}

这是K2控制数码管减的部分

K2与K1部分同理

遇到的问题1:如果令K2的count<=0时,count的值定义为10的话,则会在静态数码管上显示十六进制字母A,不满足题意数字加减的要求

void delay()

{

u16 i = 1000;

     while (i--);

}

对延时函数的定义

六.演示图

七.程序清单: 

#include <reg52.h>



typedef unsigned char u8;

typedef unsigned int u16;





sbit K1 = P2^7;

sbit K2 = P2^6;



u8 code smgduan[16] = { 0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,

 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E};



void delay();



void main(){

u8 count = 0;

bit add = 1;

bit reduce = 1;



   



    while (1)

    {

if (K1 != add)

 {

delay();

if (!add)

{

count=count+1;

if (count >= 10)

{

count = 0;

}

P0 = smgduan[count];

}

add = K1;

 }





 if (K2 != reduce)

 {

delay();

if (!reduce )

{

count=count-1;

if (count <= 0)

{

count = 9;

}

P0 = smgduan[count];

}

reduce = K2;

 }

}

}

void delay()

{

u16 i = 1000;

  while (i--);

}

八.反思与感悟

单片机是我这学期接触到的新内容,正式因为单片机的学习,让我感受到了电子世界的精彩。原来自己也可以通过编写程序来完成我之前认为很复杂的任务,当然,也让我明白,很多看似简单的功能,想要真正动手去编写程序实现它,也是非常有难度的。

完成了这次的大作业,我意识到了自己的能力还有很多的不足。首先,自己对c语言的掌握太不熟练,自己在动手编程的时候,经常出现程序编写错误的问题,而且自己还经常找不出来问题的所在。其次,自己接触到的单片机示例太少,无法把自己的想法转化成一个程序结构,面对一个问题时,无从下手。

虽然这一学期单片机的课程结束了,但作为电子信息类专业的一名学生,自己在单片机的学习上还有很长的路要走,51单片机只是学习的开始,自己还会弥补自己的不足,在以后的学习中不断的提升自己。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值