找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机跑马灯控制系统仿真

[复制链接]
跳转到指定楼层
楼主
一、单片机基础知识
单片机又称单片微控制器它不是完成某一个逻辑功能的芯片而是把一个计算机系统集成到一个芯片上。概括的讲一块芯片就成了一台计算机。
单片机具有体积小、功能强、应用面广等优点目前正以前所未见的速度取代着传统电子线路构成的经典系统蚕食着传统数字电路与模拟电路固有的领地。它的体积小、质量轻、价格便宜、为学习、应用和开发提供了便利条件。同时学习使用单片机了解计算机原理与结构的最佳选择。
   现在这种单片机的使用领域已十分广泛。彩电、冰箱、空调、录像机、VCD、遥控器、
游戏机、电饭煲等无处不见单片机的影子单片机早已深深地融入我们每个人的生活之中。  单片机能大大地提高这些产品的智能性易用性及节能性等主要性能指标给我们的生活带来舒适和方便的同时在工农业生产上也极大地提高了生产效率和产品质量。单片机按用途大体上可分为两类一种是通用型单片机另一种是专用型单片机。
  MCS-51 单片机是美国 INTEL 公司于 1980 年推出的产品与 MCS- 48 单片机相比它的
结构更先进功能更强在原来的基础上增加了更多的电路单元和指令指令数达111 条 MCS-51 单片机可以算是相当成功的产品一直到现在MCS-51 系列或其兼容的单片机仍是
应用的主流产品各高校及专业学校的培训教材仍与 MSC-51 单片机作为代表进行理论基础学习。MCS-51 系列单片机主要包括 8031、8051 和 8751 等通用产品。
2 单片机的发展趋势
   单片机现在可以说是百花齐放百家争鸣的时期世界上各大芯片制造公司都推出了自己的单片机从 8 位、16 位到 32 位数不胜数应有尽有有与主流 C51 系列兼容的也
有不兼容的但它们各具特色互成互补为单片机的应用提供了广阔的天地。现在常规的单片机普遍都是将中央处理器CPU、随机存取数据存储RAM、只读程序存储器ROM、
并行和串行通信接口中断系统、定时电路、时钟电路集成在一块单一的芯片上增强型的单片机集成了如 A/D 转换器、PMW脉宽调制电路、WDT看门狗、有些单片机将 LCD
液晶驱动电路都集成在单一的芯片上这样单片机包含的单元电路就更多功能就越强大。甚至单片机厂商还可以根据用户的要求量身定做制造出具有自己特色的单片机芯片。  此外现在的产品普遍要求体积小、重量轻这就要求单片机除了功能强和功耗低外还要求其体积要小。现在的许多单片机都具有多种封装形式其中 SMD表面封装越来越受欢迎使得由单片机构成的系统正朝微型化方向发展。现在虽然单片机的品种繁多各具特色但仍以 89C51 为核心的单片机占主流。
2.1 框图设计




2.4软件设计
要求用 AT89S52 芯片控制跑马灯流水灯整个系统有 8 种跑马灯模式可以选择K1 是选择模式键同时将相应的模式在 LED 七段数码管中显示出来K2 可以对跑马灯
的速度进行加速K3 可以对跑马灯的速度进行减速。整个系统可以实现对跑马灯模式的多层控制还有加减速。

  本课程设计是采用80C51单片机设计的可以调控的跑马灯通过keil进行c语言编程 通过protues进行软件硬件仿真。本设计成果主要通过按键开关对跑马灯进行控制包括跑马灯模式的选择、跑马灯模式的显示、跑马灯速度变化控制。
1、C语言编程 1定义
#include<reg52.h>
#define uchar unsigned char                                                                 
#define uint unsigned int  uchar ModeNo; uint Speed;
uchar TCount=0;  uchar Idx; uchar mb_Count=0;  bit Dirtect=1;
2段码表
uchar code DSY_CODE[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
3调速表
uint codesTable[]={0,1,3,5,7,9,15,100,200,230,300,350};
4延时
void Delay(uint x)   {   uchar i;  while(x--) for(i=0;i<120;i++);
}
5检测按键
uchar GetKey()
{
   .............    return K;  }
616支LED显示
void Led_Demo(uint Led16)
{
.................
P0=(uchar)(Led16>>8);
}
7定时器2
void T0_INT() interrupt 1
{
...................
mb_Count=(mb_Count+1)%16;
}
8键盘处理
void KeyProcess(uchar Key)
{  switch(Key)   {
     ....................
     if(Idx<15) Speed=sTable[++Idx];
  }  
}
  9主程序
     void main()
{     uchar Key;
   P0=P1=P2=P3=0xFF;
    ModeNo=0;Idx=4;     P3=DSY_CODE[ModeNo];
    IE=0x82;    TMOD=0x00;     TR0=1;     while(1)
   {
      Key=GetKey();       if(Key!=0) KeyProcess(Key);
   }
}

2、软件硬件仿真      软件调试是通过对程序的汇编、连接、执行来发现程序中存在的语法错误与逻辑错误并加以排除纠正的过程。本设计通过protues进行软件硬件仿真设计的原理图            




六、附录
本课程设计的源程序
  1. #include<reg52.h>
  2. #define uchar unsigned char                                                                        
  3. #define uint unsigned int ucharModeNo; uint Speed; uchar TCount=0; uchar Idx; uchar mb_Count=0;
  4. bit Dirtect=1;                                                                                                  
  5.       
  6. uchar code DSY_CODE[]={0xC0,0XF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; uint codesTable[]={0,1,3,5,7,9,15,100,200,230,300,350};
  7.       
  8.       
  9. void Delay(uint x)                                                                                            
  10. { uchar i; while(x--)for(i=0;i<120;i++);
  11. }                                                                                                                     
  12.       
  13. uchar GetKey() { uchar K;if(P2==0xFF) return 0;
  14. Delay(10);
  15. switch(P2)
  16. {                                                                                                                       
  17. case 0xFE: K=1;break;         case 0xFD: K=2;break;     case0xFB: K=3;break;         
  18. default:   K=0;
  19. }                                                                                                                       
  20. while (P2!=0xFF);                                                                                             
  21. return K; }  void Led_Demo(uint Led16) {
  22. P1=(uchar)(Led16&0x00FF);
  23. P0=(uchar)(Led16>>8);
  24. }
  25.       
  26. void T0_INT() interrupt 1
  27. {if(++TCount<Speed) return; TCount=0; switch(ModeNo) { case0:Led_Demo(0x0001<<mb_Count);break; case1:Led_Demo(0x8000>>mb_Count);break; case2:if(Dirtect)Led_Demo(0x000F<<mb_Count);
  28. Else
  29. Led_Demo(0xF000>>mb_Count);if(mb_Count==15) Dirtect=!Dirtect;break; case3:if(Dirtect)Led_Demo(~(0x000F<<mb_Count)); else         
  30. Led_Demo(~(0xF000>>mb_Count));if(mb_Count==15) Dirtect=!Dirtect; break; case4:if(Dirtect)Led_Demo(0x003F<<mb_Count);
  31. else                                                                                                                  
  32. Led_Demo(0xFC00>>mb_Count);if(mb_Count==15) Dirtect=!Dirtect;break; case5:if(Dirtect)Led_Demo(0x0001<<mb_Count);
  33. else                                                                                                                  
  34. Led_Demo(0x8000>>mb_Count);if(mb_Count==15) Dirtect=!Dirtect; break; case6:if(Dirtect)Led_Demo(~(0x0001<<mb_Count));
  35. else                                                                                                                  
  36. Led_Demo(~(0x8000>>mb_Count));if(mb_Count==15) Dirtect=!Dirtect;break; case7:if(Dirtect)Led_Demo(0xFFFE<<mb_Count);
  37. else                                                                                                                  
  38. Led_Demo(0x7FFF>>mb_Count);if(mb_Count==15) Dirtect=!Dirtect;break; default:break; }mb_Count=(mb_Count+1)%16;
  39. }
  40.   void KeyProcess(uchar Key)
  41. { switch(Key) {     
  42. case 1:
  43. Dirtect=1;mb_Count=0;
  44. ModeNo=(ModeNo+1)%8;
  45. P3=DSY_CODE[ModeNo];break;                                                                     
  46. case 2:
  47. if(Idx>1)Speed=sTable[--Idx];break;                                                               
  48. case 3:
  49. if(Idx<15) Speed=sTable[++Idx];
  50. }
  51. }
  52.   void main() { uchar Key;
  53. P0=P1=P2=P3=0xFF;
  54. ModeNo=0;Idx=4;
  55. P3=DSY_CODE[ModeNo];
  56. IE=0x82;
  57. TMOD=0x00; TR0=1;while(1) { Key=GetKey(); if(Key!=0) KeyProcess(Key);
  58. }
  59. }
复制代码

全部资料51hei下载地址:
基于单片机的跑马灯控制系统设计.zip (566.11 KB, 下载次数: 15)


评分

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

查看全部评分

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

使用道具 举报

沙发
ID:243748 发表于 2017-12-28 18:35 来自触屏版 | 只看该作者
很受用的资料
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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