22563浏览
查看: 22563|回复: 9

[项目] 遥控数码管显示数字

[复制链接]
【简介】本项目中我们使用红外遥控器,通过Arduino程序控制数码管显示不同的数字。最后完成图如下
遥控数码管显示数字图1

【器材】Arduino Nano,一位数码管,蜂鸣器,红外遥控器,红外接收头,电阻,面包板,导线若干。
【原理】电路原理图如下
遥控数码管显示数字图2

【接线】接线示意图如下
遥控数码管显示数字图3

【程序】代码程序如下
  1. /*
  2. YOCO 红外遥控数字显示器
  3. 功能:用红外遥控模块控制数码管显示0-9十个数字;每按动一次,数码管闪灭一次,同时蜂鸣器叫一声
  4. 红外接受头输出端接到Arduino的数字口D8。
  5. 遙控器功能键的键值:
  6. 紅色电源开关 0xba45
  7. MODE 0xb946
  8. 静音 0xb847
  9. ←← 0xbb44
  10. →→ 0xbf40
  11. ‖   0xbc43
  12. VOL- 0xf807
  13. VOL+ 0xba15
  14. EQ 0xf609
  15. 100+ e609
  16. return 0xf200
  17. */
  18. /********************************设置变量********************************/
  19. #define IR_IN  8  //红外接收:D8
  20. int Pulse_Width=0;//存储脉宽
  21. int ir_code=0x00;//命令值,十六进制值
  22. //设置控制各段的数字I/O脚
  23. int a=16;//模拟口的A2,以下同
  24. int b=17;
  25. int c=4;
  26. int d=3;
  27. int e=2;
  28. int f=15;
  29. int g=14;
  30. int dp=5;
  31. //以下用数组给数码管管脚、0-9十个数字赋值,简洁
  32. byte segs[7] = { a, b, c, d, e, f, g };//除了小数点的7笔划段
  33. byte seven_seg_digits[10][7] = { { 1,1,1,1,1,1,0 },  // = 0
  34.                                  { 0,1,1,0,0,0,0 },  // = 1
  35.                                  { 1,1,0,1,1,0,1 },  // = 2
  36.                                  { 1,1,1,1,0,0,1 },  // = 3
  37.                                  { 0,1,1,0,0,1,1 },  // = 4
  38.                                  { 1,0,1,1,0,1,1 },  // = 5
  39.                                  { 1,0,1,1,1,1,1 },  // = 6
  40.                                  { 1,1,1,0,0,0,0 },  // = 7
  41.                                  { 1,1,1,1,1,1,1 },  // = 8
  42.                                  { 1,1,1,1,0,1,1 }   // = 9
  43.                              };
  44. /***************************定时器初始化函数*****************************/
  45. void timer1_init(void)
  46. {
  47.   TCCR1A = 0X00;
  48.   TCCR1B = 0X05;//给定时器时钟源  
  49.   TCCR1C = 0X00;
  50.   TCNT1 = 0X00;
  51.   TIMSK1 = 0X00;//禁止定时器溢出中断
  52. }
  53. /**************************译码输出子函数******************************/
  54. //执行译码结果函数,输出用灯光、数码管显示,必要可以加蜂鸣器
  55. void remote_deal(void)
  56. {
  57.   switch(ir_code)
  58.   {
  59.     case 0xba45: //左上角的电源开关按键
  60.     init_wire();//数码管熄灭
  61.     buzzer_led();//蜂鸣器鸣叫
  62.     break;
  63. //以下显示所按的数字
  64.    case 0xE916://显示0
  65.      lightSegments(0);
  66.    break;
  67.    case 0xF30C://1
  68.     lightSegments(1);
  69.    break;
  70.    case 0xE718://2
  71.     lightSegments(2);
  72.    break;
  73.    case 0xA15E://3
  74.     lightSegments(3);
  75.    break;
  76.    case 0xF708://4
  77.     lightSegments(4);
  78.    break;
  79.    case 0xE31C://5
  80.     lightSegments(5);
  81.    break;
  82.    case 0xA55A://6
  83.     lightSegments(6);
  84.    break;
  85.    case 0xBD42://7
  86.     lightSegments(7);
  87.    break;
  88.    case 0xAD52://8
  89.     lightSegments(8);
  90.    break;
  91.    case 0xB54A://显示9
  92.     lightSegments(9);
  93.    break;
  94.   }
  95. }
  96. /************************逻辑值“0”和“1”子函数****************************/
  97. char logic_value()
  98. {
  99.   while(!(digitalRead(8))); //低等待
  100.   Pulse_Width=TCNT1;
  101.   TCNT1=0;
  102.   if(Pulse_Width>=5&&Pulse_Width<=11)//低电平560us——放宽了原来的条件:6-10
  103.   {
  104.    while(digitalRead(8));//红外接收管输出的是负脉冲,无信号保持高,高就等待
  105.    Pulse_Width=TCNT1;
  106.    TCNT1=0;
  107.    if(Pulse_Width>=5&&Pulse_Width<=11)//如果Pulse_Width满足该条件,则脉冲持续高电平560us
  108.     return 0;
  109.     else if(Pulse_Width>=19&&Pulse_Width<=30) //如果Pulse_Width满足该条件,则脉冲持续高电平1.7ms
  110.     return 1;
  111.   }
  112.     return -1;
  113. }
  114. /*********************接收地址码和命令码脉冲子函数***********************/
  115. void pulse_deal()
  116. {
  117.   int i;
  118.   //执行8个0
  119.   for(i=0; i<8; i++)
  120.   {
  121.     if(logic_value() != 0) //不是0
  122.     return;
  123.   }
  124.    for(i=0; i<8; i++)
  125.   {
  126.     if(logic_value() != 1) //不是1
  127.     return;
  128.   }
  129.   //解析遥控器编码中的command指令
  130.   ir_code=0x00;//清零
  131.   for(i=0; i<16;i++ )
  132.   {
  133.     if(logic_value() == 1)
  134.     {
  135.       ir_code |=(1<<i);//从i的值写出键码值,十六进制
  136.     }
  137.   }
  138. }
  139. /***************************译码子函数******************************/
  140. void remote_decode(void)
  141. {
  142.   TCNT1=0X00;      
  143.   while(digitalRead(8))//是高就等待
  144.   {
  145.    if(TCNT1>=1563)  //当高电平持续时间超过100ms,表明此时没有按键按下
  146.     {
  147.       ir_code = 0xff00;
  148.       return;
  149.      }  
  150.   }
  151.   //如果高电平持续时间不超过100ms
  152.   TCNT1=0X00;
  153.   while(!(digitalRead(8))); //低等待
  154.   Pulse_Width=TCNT1;
  155.   TCNT1=0;
  156.   if(Pulse_Width>=130&&Pulse_Width<=150)//9ms——修改了原来的条件:140-141
  157.   {
  158.     while(digitalRead(8));//是高电平就等待
  159.     Pulse_Width=TCNT1;
  160.     TCNT1=0;
  161.     if(Pulse_Width>=60&&Pulse_Width<=79)//4.5ms——放宽了原来的条件
  162.     {
  163.       pulse_deal();
  164.       return;
  165.      }
  166.     else if(Pulse_Width>=28&&Pulse_Width<=40)//2.25ms
  167.     {
  168.       while(!(digitalRead(8)));//低电平等待
  169.       Pulse_Width=TCNT1;
  170.       TCNT1=0;
  171.       if(Pulse_Width>=5&&Pulse_Width<=12)//560us
  172.       {
  173.         return;
  174.        }
  175.      }
  176.    }
  177. }
  178. /***************************初始化设置函数******************************/
  179. void setup()
  180. {
  181.    unsigned char i;
  182.    for(i=2;i<=19;i++)
  183. {
  184.     pinMode(i,OUTPUT);//设置2~19引脚为输出模式
  185.    }
  186. //pinMode(LED_RED,OUTPUT);//设置与红灯连接的引脚为输出模式
  187.   pinMode(IR_IN,INPUT);//设置红外接收引脚为输入
  188.   digitalWrite(9,LOW);//为红外接收头的接地端,节省连接的导线
  189.   digitalWrite(10,HIGH);//为红外接收头的+端,节省连接的导线
  190.   digitalWrite(18,HIGH);//A4,为蜂鸣器-
  191.   digitalWrite(19,HIGH);//A5,为蜂鸣器-,蜂鸣器可接在A4、A5中的任何一个
  192. Serial.begin(9600);//在计算机的串口窗口里面观察键码值,需要打开串口窗口
  193. }
  194. /***************************主函数(循环)******************************/
  195. void loop()
  196. {  
  197.   timer1_init();//定时器初始化
  198.   while(1)
  199.    {
  200.     remote_decode();  //译码
  201.     remote_deal();   //执行译码结果
  202. //以下是观察键码值的程序:
  203.   Serial.println("ir_code");
  204.   Serial.println(ir_code, DEC);//显示十进制
  205. }  
  206. }
  207. /***********************熄灭数码管全部笔画子函数************************/
  208. void init_wire()
  209. {
  210.   for (int i=0;i<7;i++)
  211. {
  212.     digitalWrite(segs[i], HIGH);
  213.     }
  214.   digitalWrite(dp,HIGH);
  215. }
  216. /************************点亮对应数字的数码管0-9*************************/
  217. void lightSegments(int x)
  218. {
  219.   for (int i=0;i<7;i++)
  220. {
  221.   digitalWrite(segs[i], 1-seven_seg_digits[x][i]);
  222.    }
  223.   buzzer_led();//蜂鸣器函数,数码管眨眼
  224.   for (int i=0;i<7;i++)
  225. {
  226.     digitalWrite(segs[i], 1-seven_seg_digits[x][i]);
  227.   }
  228. }
  229. /********************蜂鸣器函数,同时数码管眨眼**********************/
  230. void buzzer_led()
  231. {
  232.   delay(20);//数码管亮
  233.   init_wire();//数码管熄灭
  234.   digitalWrite(18,LOW);//蜂鸣器响
  235.   digitalWrite(19,LOW);//蜂鸣器响
  236.   delay(80);//响持续时间
  237.   digitalWrite(18,HIGH);//蜂鸣器停
  238.   digitalWrite(19,HIGH);
  239. }
复制代码

【效果】最终效果图如下

遥控数码管显示数字图5


遥控数码管显示数字图4



hnyzcj  版主

发表于 2015-8-31 16:05:36

张禄挺喜欢NANO板子的,我看你写的帖子都是用NANO。
回复

使用道具 举报

丄帝De咗臂  高级技匠
 楼主|

发表于 2015-8-31 16:21:37

hnyzcj 发表于 2015-8-31 16:05
张禄挺喜欢NANO板子的,我看你写的帖子都是用NANO。

个头小,买着便宜,因为俺没钱:'(
回复

使用道具 举报

hnyzcj  版主

发表于 2015-8-31 16:26:02

丄帝De咗臂 发表于 2015-8-31 16:21
个头小,买着便宜,因为俺没钱:'(

装,接着装,无锡一中的老师。
回复

使用道具 举报

hnyzcj  版主

发表于 2015-8-31 16:26:48

丄帝De咗臂 发表于 2015-8-31 16:21
个头小,买着便宜,因为俺没钱:'(

刘正云就是别你带坏的。哈哈
回复

使用道具 举报

丄帝De咗臂  高级技匠
 楼主|

发表于 2015-8-31 16:27:46

hnyzcj 发表于 2015-8-31 16:26
刘正云就是别你带坏的。哈哈

真没钱啊,刘正云跟我没有半毛钱关系
回复

使用道具 举报

hnyzcj  版主

发表于 2015-8-31 17:23:41

丄帝De咗臂 发表于 2015-8-31 16:27
真没钱啊,刘正云跟我没有半毛钱关系

房子解决了吗
回复

使用道具 举报

大连林海  初级技神

发表于 2015-8-31 18:13:31


他是和nano好上了 本期都是数码管
回复

使用道具 举报

1973742214  高级技师

发表于 2017-5-6 20:12:43

呵呵,我只是笑笑不说话
回复

使用道具 举报

20060606  高级技匠

发表于 2020-8-13 06:30:56

好创意,赞一个
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail