找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1550|回复: 0
打印 上一主题 下一主题
收起左侧

动态数码管计数+串口+计数控制

[复制链接]
跳转到指定楼层
楼主
ID:262845 发表于 2017-12-20 14:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这是我上个月做的代码,
内有源代码,
请多多指导。
  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. #define GPIO_DIG P0
  9. #define GPIO_TRAFFIC P1

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

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

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

  24. /*******************************************************************************
  25. * 函数名         :UsartInit()
  26. * 函数功能                   :设置串口
  27. * 输入           : 无
  28. * 输出                  : 无
  29. *******************************************************************************/
  30. //void Usart()
  31. //{
  32. //        SCON=0X50;                        //设置为工作方式1,sm0=0,sm1=1,sm2=0,ren=1,高位0101=0X5,低位0X00,224页
  33. //        TMOD=0X20;                        //设置计数器工作方式2  0010         178页
  34. //        PCON=0X80;                        //波特率加倍 1000 0000        SMOD=1 225页
  35. //        TH1=0XF3;                                //计数器初始值设置,注意波特率是4800的,51波特率计算
  36. //        TL1=0XF3;
  37. //        ES=1;                                                //打开接收中断 149页ES串口中断允许位
  38. //        EA=1;                                                //打开总中断 149页 EA : CPU的总中断允许控制位,EA=1
  39. //        TR1=1;                                        //打开计数器 177页 TR1: 定时器T1的运行控制位
  40. //  
  41. //}

  42. void delay(u16 i)
  43. {
  44.         while(i--);       
  45. }

  46.   void DigDisplay()
  47. {
  48.          u8 j;
  49.          for(j=0;j<8;j++)
  50.          {
  51.                            switch(j)         //位选,选择点亮的数码管,
  52.                 {
  53.                         case(0):
  54.                                 LSA=0;LSB=0;LSC=0; break;//显示第0位
  55.                         case(1):
  56.                                 LSA=1;LSB=0;LSC=0; break;//显示第1位
  57.                         case(2):
  58.                                 LSA=0;LSB=1;LSC=0; break;//显示第2位
  59.                         case(3):
  60.                                 LSA=1;LSB=1;LSC=0; break;//显示第3位
  61.                         case(4):
  62.                                 LSA=0;LSB=0;LSC=1; break;//显示第4位
  63.                         case(5):
  64.                                 LSA=1;LSB=0;LSC=1; break;//显示第5位
  65.                         case(6):
  66.                                 LSA=0;LSB=1;LSC=1; break;//显示第6位
  67.                         case(7):
  68.                                 LSA=1;LSB=1;LSC=1; break;//显示第7位       
  69.                 }
  70.                 GPIO_DIG=DisplayData[j];//发送段码
  71.                 delay(100); //间隔一段时间扫描       
  72.                 GPIO_DIG=0x00;//消隐
  73.          
  74.          }
  75.    
  76. }
  77. void Int0Init()
  78. {
  79.         //设置INT0
  80.         IT0=1;//跳变沿出发方式(下降沿)
  81.         EX0=1;//打开INT0的中断允许。       
  82.         EA=1;//打开总中断       
  83. }


  84. /*******************************************************************************
  85. * 函 数 名         : datapros()
  86. * 函数功能                   : 数据处理转换函数
  87. * 输    入         : 无
  88. * 输    出         : 无
  89. *******************************************************************************/

  90. void datapros()          
  91. {
  92.         static u16 i=0;
  93.         i++;
  94.         if(i==5)  //改变i的数值可调节跳的快慢
  95.         {
  96.                 i=0;
  97.                 TIME ++;       
  98.         }

  99.         DisplayData[0] = 0x00;                               
  100.         DisplayData[1] = smgduan[TIME/1000000];                 
  101.         DisplayData[2] = smgduan[TIME%1000000/100000];
  102.         DisplayData[3] = smgduan[TIME%100000/10000];                               
  103.         DisplayData[4] = smgduan[TIME%10000/1000];       
  104.         DisplayData[5] = smgduan[TIME%1000/100];
  105.         DisplayData[6] = smgduan[TIME%100/10]|0x80;                               
  106.         DisplayData[7] = smgduan[TIME%10];
  107.         if(TIME==2000) TIME=0;          //TIME的数值,计到2000,回0从新开始
  108.        
  109. }
  110. void main()
  111. {

  112.         Int0Init();  //        设置外部中断0
  113. //        Usart();  //        串口初始化
  114.         while (1)
  115.   {
  116.                     datapros();         //数据处理函数
  117.                            DigDisplay(); //数码管显示函数
  118. //                           RI=0;
  119. //                    SBUF=TIME;

  120.         if(TIME>1000)
  121.         {
  122.                       GPIO_TRAFFIC = 0xFF;  //将所有的灯熄灭
  123.                         RED00 = 1;
  124.                         GREEN00 = 1;

  125.                         GREEN11 = 0;    //宝田路绿灯亮                       
  126.                         GREEN10        = 0;    //宝田路人行道绿灯亮

  127.                         RED01 = 0;      //前进路红灯亮
  128.                         RED00 = 0;      //前进路人行道红灯亮
  129.         }
  130.         else
  131.         {
  132.                       GPIO_TRAFFIC = 0xFF;  //将所有的灯熄灭
  133.                         RED00 = 1;
  134.                         GREEN00 = 1;

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

  137.                         YELLOW01 = 0;    //前进路红灯亮
  138.                         RED00 = 0;       //前进路人行道红灯亮
  139.         }
  140.   }
  141.          
  142.                        
  143. }
  144. void Int0()        interrupt 0                //外部中断0的中断函数
  145. {
  146.         delay(1000);         //延时消抖
  147.         if(k3==0)
  148.         {
  149.                 TIME=520;
  150.         }
  151. }
复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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