简单电路:点击按键循环计数(0~9)

 

这个功能分了两种实现方式, 第一种是我自己琢磨着实现的, 第二种是看了《爱上Arduino》后悟到了些什么,有把电路和程序修改了一下。


在“实现2”中有一点点问题,在《爱上Arduino》中给按钮串接了一个10K的电阻,而后又接到了GND端,这个的作用是什么呢?

实现1
使用模拟信息输入,导致按钮传达的信息不准确(好像是变成了感应开关似的),有时手还没有碰到按钮数字就飞速的变化起来了。小小的修改了一下程序,现在好些了,但还是不理想,还是用第二种实现方式效果比较好。


电路:

 

演示视频:

http://v.youku.com/v_show/id_XNDU0OTA5NDU2.html


程序:

 

/*
  a  b  c  d  e  f  g  dp
  7  6  5  10 11 8  9  4
*/
int map_led [8] = {
  7, 6, 5, 10, 11, 8, 9, 4
};
int map_table [10][8] = {
  {0, 0, 0, 0, 0, 0, 1, 1},   // 0
  {1, 0, 0, 1, 1, 1, 1, 1},   // 1
  {0, 0, 1, 0, 0, 1, 0, 1},   // 2
  {0, 0, 0, 0, 1, 1, 0, 1},   // 3
  {1, 0, 0, 1, 1, 0, 0, 1},   // 4
  {0, 1, 0, 0, 1, 0, 0, 1},   // 5
  {0, 1, 0, 0, 0, 0, 0, 1},   // 6
  {0, 0, 0, 1, 1, 1, 1, 1},   // 7
  {0, 0, 0, 0, 0, 0, 0, 1},   // 8
  {0, 0, 0, 0, 1, 0, 0, 1}    // 9
};
 
 
int num = 0;
int down;
int up;
int stat;
 
void setup() {
  int j;
  for (j = 4; j <=11; j++) {
    pinMode(j, OUTPUT);
  }
  for (j = 4; j <=11; j++) {
    digitalWrite(j, HIGH);
  }
  num = 0;
}
 
/**
 * 显示函数
 */
void display() {
  int i;
  for (i = 0; i < 8; i++) {
    digitalWrite(map_led[i], map_table[num][i] ? HIGH : LOW);
  }
}
 
void loop() {
/*** 自己做的计数程序 ***/
  int j;
  while (analogRead(0) > 1000) { //当按钮按下时,模拟端口0会获得连续的高电位
    down = 1; //此时将按下状态置为“真”
  }
  for (j = 0; j < 500; j++) { //此处循环500次,作用是吸收模拟端口0杂波
    analogRead(0);
  }
  if (down) { //判断按钮按下状态,如果按下过就显示数字并累加
    down = 0;
    display();  //调用显示函数
    if (++num == 10) {
      num = 0; //判断从0到9
    }
  }
}

 

实现2

我真的是看了《爱上Arduino》后悟到了. 
电路在按钮部分稍稍有些变化,主要是把按钮的一端接到5V,一端接到数字端口13上。
这里还有一点点问题,在《爱上Arduino》中给按钮串接了一个10K的电阻,而后又接到了GND端,这个的作用是什么呢?
程序也是稍稍有些变化,主要是loop函数。


电路:

演示视频:

http://v.youku.com/v_show/id_XNDU0OTEwMjg0.html


程序:

/*
  a  b  c  d  e  f  g  dp
  7  6  5  10 11 8  9  4
*/
int map_led [8] = {
  7, 6, 5, 10, 11, 8, 9, 4
};
int map_table [10][8] = {
  {0, 0, 0, 0, 0, 0, 1, 1},   // 0
  {1, 0, 0, 1, 1, 1, 1, 1},   // 1
  {0, 0, 1, 0, 0, 1, 0, 1},   // 2
  {0, 0, 0, 0, 1, 1, 0, 1},   // 3
  {1, 0, 0, 1, 1, 0, 0, 1},   // 4
  {0, 1, 0, 0, 1, 0, 0, 1},   // 5
  {0, 1, 0, 0, 0, 0, 0, 1},   // 6
  {0, 0, 0, 1, 1, 1, 1, 1},   // 7
  {0, 0, 0, 0, 0, 0, 0, 1},   // 8
  {0, 0, 0, 0, 1, 0, 0, 1}    // 9
};
 
 
int num = 0;
int val = 0;
int old_val = 0;
int stat = 0;
 
void setup() {
  int j;
  for (j = 4; j <=11; j++) {
    pinMode(j, OUTPUT);
  }
  for (j = 4; j <=11; j++) {
    digitalWrite(j, HIGH);
  }
  num = 0;
}
 
void display() {
  int i;
  for (i = 0; i < 8; i++) {
    digitalWrite(map_led[i], map_table[num][i] ? HIGH : LOW);
  }
}
 
void loop() {
/*** 《爱上Arduino》中的计数程序 ***/
    val = digitalRead(13);  //读取数字端口13,看按钮是否按下
    if (val == HIGH && old_val == LOW) {  //判断按钮由抬起到按下则说明按钮是按下了
      stat = 1 - stat;
      delay(10);  
    }
    old_val = val;  //把当前值赋给old_val,以备下一个循环使用
    if (stat == 1) {  //判断按钮是按下了,显示数字并累加
      stat = 1 - stat;
      display();
      if (++num == 10) {
        num = 0;
      }
    }
}
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
介绍一下项目的需求: 供电要求:系统要求使用DC-5V供电,继电器闭合状态下,功耗不大于500mA; 控制要求:设备使用两个按键进行控制,可分别设计数模式与工作周期,设置方式为循环设置; 输出要求:要求设备可控制220V/50Hz用电设备,输出电流10A; 计数模式:要求系统可设置三种计数模式,最大值分别为10000、50000、99999,当设备计数到最大值后,设备停止工作; 控制周期:要求系统可设置四种控制周期,分别是20s、40s、60s、80s,每个周期中,开关状态保持的时间相同。 1、整体方案介绍 系统核心控制器采用STC89C52RC-DIP40,系统时钟11.0592MHz;显示器采用LCD1602液晶屏(蓝光白字); 按键使用6*6轻触按键;输出控制开关使用5V直流继电器,控制参数为220V/10A,自带开关状态指示灯,提供接线座; 2、控制器引脚分配 P1 ——LCD1602 DATA 液晶屏数据端口 P2_0 ——LCD1602 EN 液晶屏使能端口 P2_1 ——LCD1602 RW 液晶屏读写端口 P2_2 ——LCD1602 RS 液晶屏指令端口 P2_3 ——KEY_MODE 系统模式控制 P2_4 ——KEY_TIME 开关周期控制 P2_5 ——RELAY 继电器开关控制 3、系统资源分配 系统启用看门狗,意外状态下70ms自动复位; 定时器T0用作对控制周期计时,每50ms中断一次,每周期内开关通关各一次; 定时器T1用作对空换件进行检测,并对看门狗进行置位操作,每1ms中断一次; 串口用作输出信息提示,可输出系统状态、计数次数、以及用户的按键操作; 4、显示器内容规划 显示器使用LCD1602液晶屏,每行可显示16个字符,可显示两行; 本控制系统,能够周期性控制外围电路通断,可手动调节工作模式、工作周期,显示器能显示系统工作模式,并能同步显示记录开关通断次数。 1、系统供电:本系统电源使用220V/50Hz标准电源适配器,为设备提供DC-5V供电,继电器闭合状态下,功耗不大于500mA; 2、按键控制:本涉笔使用两个按键进行系统控制,可分别调节数模式与工作周期,设置方式为循环设置; 3、输出参数:本设备可控制220V/50Hz用电设备,最大输出电流10A,无过流保护; 4、计数模式:本系统内置三种计数模式,计数最大值分别为10000、50000、99999,当设备计数到最大值后,设备停止工作,同时按下模式、周期按键,可复位系统,此时系统工作模式不变,计数清零; 5、控制周期:本系统内置四种控制周期,分别是20s、40s、60s、80s,每个周期中,开关通关状态保持时间相同。 演示视频: https://player.youku.com/player.php/sid/XMTYwMDE4NTQ2OA==/v.swf
很抱歉,我无法提供Vivado仿真程序的课程设定。但是,我可以向您解释这个问题的解决方案。 首先,我们需要使用一个计数器计数从0到9的数字,并使用两个7段数码管来显示这些数字。在这个例子中,我们将使用两个7段数码管来显示四个数字。 下一步是编写一个状态机,使计数器从0开始计数,然后递增,直到达到9,然后重置为0。我们还需要一些逻辑来控制在两个7段数码管之间切换。 最后,我们需要添加一个按键输入,使用户能够控制循环并在两个7段数码管之间切换。 以下是该电路的VHDL代码示例: ```vhdl library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity dual_7segment_counter is Port ( clk : in STD_LOGIC; reset : in STD_LOGIC; en : in STD_LOGIC; button : in STD_LOGIC; anodes : out STD_LOGIC_VECTOR (1 downto 0); segments : out STD_LOGIC_VECTOR (6 downto 0)); end dual_7segment_counter; architecture Behavioral of dual_7segment_counter is signal count : integer range 0 to 9 := 0; signal anode_mux : integer range 0 to 1 := 0; begin process (clk, reset) begin if reset = '1' then count <= 0; anode_mux <= 0; elsif rising_edge(clk) then if en = '1' then if count >= 9 then count <= 0; else count <= count + 1; end if; end if; end if; end process; process (button) begin if button = '1' then if anode_mux = 0 then anode_mux <= 1; else anode_mux <= 0; count <= count + 1; end if; end if; end process; process (count, anode_mux) begin case anode_mux is when 0 => anodes <= "11"; case count is when 0 => segments <= "0000001"; when 1 => segments <= "1001111"; when 2 => segments <= "0010010"; when 3 => segments <= "0000110"; when 4 => segments <= "1001100"; when 5 => segments <= "0100100"; when 6 => segments <= "0100000"; when 7 => segments <= "0001111"; when 8 => segments <= "0000000"; when 9 => segments <= "0000100"; when others => segments <= "1111111"; end case; when 1 => anodes <= "10"; case count is when 0 => segments <= "0000001"; when 1 => segments <= "0000000"; when 2 => segments <= "1001111"; when 3 => segments <= "0001111"; when 4 => segments <= "0000110"; when 5 => segments <= "0100100"; when 6 => segments <= "0100000"; when 7 => segments <= "0000001"; when 8 => segments <= "0000000"; when 9 => segments <= "0000110"; when others => segments <= "1111111"; end case; when others => null; end case; end process; end Behavioral; ``` 请注意,此代码未经过测试,因此可能需要一些修改才能正常工作。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值