找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2637|回复: 0
收起左侧

单片机动态数码管 显示+计数+控制

[复制链接]
ID:262845 发表于 2018-1-15 11:24 | 显示全部楼层 |阅读模式
动态数码管 显示+计数+控制

单片机源程序如下:
  1. #include "reg52.h"
  2. #include "intrins.h"

  3. typedef unsigned int u16;         
  4. typedef unsigned char u8;

  5. sbit LSA=P2^2;
  6. sbit LSB=P2^3;
  7. sbit LSC=P2^4;
  8. sbit beep = P2^5;
  9. sbit k1=P3^0;
  10. sbit k2=P3^1;

  11. #define GPIO_DIG P0
  12. #define GPIO_TRAFFIC P1

  13. sbit RED10   = P1^0;   //上人行道红灯
  14. sbit GREEN10 = P1^1;   //上人行道绿灯
  15. sbit RED11   = P1^2;
  16. sbit YELLOW11= P1^3;
  17. sbit GREEN11 = P1^4;

  18. //sbit RED00   = P3^0;        //右人行道红灯
  19. //sbit GREEN00 = P3^1;        //右人行道绿灯
  20. sbit RED01   = P1^5;
  21. sbit YELLOW01= P1^6;
  22. sbit GREEN01 = P1^7;
  23. sbit k3=P3^2;  //定义按键K3

  24. int TIME=0;
  25. u8 code smgduan[ ]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};  //共阴 code 代码 编码
  26. u8 DisplayData[8];//8个以上的(显示0~F的值 一个8段的数码管)
  27. u8   start=0;

  28. void delay(u16 i)
  29. {
  30.         while(i--);       
  31. }

  32. void sound()         //        蜂鸣器
  33. {
  34.     u8 i=100;
  35.         while(i--)
  36.         {
  37.                 beep=~beep;
  38.                 delay(100);       
  39.         }
  40. }
  41. void keypros()
  42. {
  43.    u8 i=100;
  44.         if(k1==0)                         //开始
  45.         {
  46.                 delay(1000);
  47.                 if(k1==0)
  48.                 {
  49.                         start=1;        //保持       
  50.                 }
  51.                 while(!k1);
  52.         }
  53.         if(k2==0)                          //停止
  54.         {
  55.                 delay(1000);
  56.                 if(k2==0)
  57.                 {
  58.                         start=0;        //停止       
  59.                 }
  60.                 while(!k2);
  61.         }
  62.                 if(start==1)
  63.                 {
  64.                     sound();       
  65.                 }
  66.                 else
  67.                 {
  68.                         beep=1;
  69.                 }               

  70. }



  71.   void DigDisplay()
  72. {
  73.          u8 j;
  74.          for(j=0;j<8;j++)
  75.          {
  76.                            switch(j)         //位选,选择点亮的数码管,
  77.                 {
  78.                         case(0):
  79.                                 LSA=0;LSB=0;LSC=0; break;//显示第0位
  80.                         case(1):
  81.                                 LSA=1;LSB=0;LSC=0; break;//显示第1位
  82.                         case(2):
  83.                                 LSA=0;LSB=1;LSC=0; break;//显示第2位
  84.                         case(3):
  85.                                 LSA=1;LSB=1;LSC=0; break;//显示第3位
  86.                         case(4):
  87.                                 LSA=0;LSB=0;LSC=1; break;//显示第4位
  88.                         case(5):
  89.                                 LSA=1;LSB=0;LSC=1; break;//显示第5位
  90.                         case(6):
  91.                                 LSA=0;LSB=1;LSC=1; break;//显示第6位
  92.                         case(7):
  93.                                 LSA=1;LSB=1;LSC=1; break;//显示第7位       
  94.                 }
  95.                 GPIO_DIG=DisplayData[j];//发送段码
  96.                 delay(100); //间隔一段时间扫描       
  97.                 GPIO_DIG=0x00;//消隐
  98.          
  99.          }
  100.    
  101. }
  102. void Int0Init()
  103. {
  104.         //设置INT0
  105.         IT0=1;//跳变沿出发方式(下降沿)
  106.         EX0=1;//打开INT0的中断允许。       
  107.         EA=1;//打开总中断       
  108. }


  109. /*******************************************************************************
  110. * 函 数 名         : datapros()
  111. * 函数功能                   : 数据处理转换函数
  112. * 输    入         : 无
  113. * 输    出         : 无
  114. *******************************************************************************/

  115. void datapros()          
  116. {
  117.         static u16 i=0;
  118.         i++;
  119.         if(i==5)  //改变i的数值可调节跳的快慢
  120.         {
  121.                 i=0;
  122.                 TIME ++;       
  123.         }

  124.         DisplayData[0] = 0x00;                               
  125.         DisplayData[1] = smgduan[TIME/1000000];                 
  126.         DisplayData[2] = smgduan[TIME%1000000/100000];
  127.         DisplayData[3] = smgduan[TIME%100000/10000];                               
  128.         DisplayData[4] = smgduan[TIME%10000/1000];       
  129.         DisplayData[5] = smgduan[TIME%1000/100];
  130.         DisplayData[6] = smgduan[TIME%100/10]|0x80;                               
  131.         DisplayData[7] = smgduan[TIME%10];
  132.         if(TIME==2000) TIME=0;          //TIME的数值,计到2000,回0从新开始

  133.         if(TIME>1000)
  134.         {
  135.                       GPIO_TRAFFIC = 0xFF;  //将所有的灯熄灭
  136.                         GREEN11 = 0;    //宝田路绿灯亮                       
  137.                         GREEN10        = 0;    //宝田路人行道绿灯亮
  138.                   
  139.                         RED01 = 0;      //前进路红灯亮
  140.         }
  141.         else
  142.         {
  143.                       GPIO_TRAFFIC = 0xFF;  //将所有的灯熄灭

  144.                         YELLOW11 = 0;    //宝田路黄灯亮                       
  145.                         RED10        = 0;     //宝田路人行道红灯亮

  146.                         YELLOW01 = 0;    //前进路红灯亮
  147.         }
  148.        
  149. }
  150. ……………………

  151. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
动态数码管 4.zip (30.74 KB, 下载次数: 16)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表