找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机课程设计~主要是led和点阵显示方面的东西(附源码)~

[复制链接]
跳转到指定楼层
楼主
51单片机的C语言源码~
显示效果秀~
大家来一起玩耍吖~
基础部分最终版

实现功能:
按下独立按键后,分别显示四种显示效果,并在静态数码管显示效果编号:
(1)按下k1:乒乓球回弹
(2)按下k2:  LED灯1357位和0246位交替亮灭
(3)按下k3: 中心波浪向两侧推出
(4)按下k4:点阵显示桃心笑脸
接线:
静态数码管JP3------P0
数码管段选J12------P2
点阵J17------P595_A,J18------P595_B
独立按键k1------P1^1
        K2------P1^2
        K3------P1^3
        K4------P1^4
注意:595跳帽要接上,165和JP1302的跳帽要摘去


单片机源程序如下:
  1. #include "reg52.h"                         //此文件中定义了单片机的一些特殊功能寄存器
  2. #include "intrins.h"               

  3. typedef unsigned int u16;          //对数据类型进行声明定义
  4. typedef unsigned char u8;

  5. #define GPIO_DIG P0

  6. sbit k1=P1^1;
  7. sbit k2=P1^2;
  8. sbit k3=P1^3;
  9. sbit k4=P1^4;

  10. #define led P2   //将P2口定义为led 后面就可以使用led代替P2口


  11. u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  12.                                         0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值

  13. //--定义使用的IO口--//
  14. sbit SRCLK=P3^6;
  15. sbit R_CLK=P3^5;
  16. sbit SER=P3^4;

  17. //定义LED点阵的位选,也就是类似于数码管的位选,因为要对其动态扫描操作
  18. //数组前16位和后16位数据正好是相反的,也就是说先让第3个595输出低电平,然后再让第4个595输出低电平

  19. u8 code ledwei[]=
  20. {
  21. 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  22. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80,
  23. };

  24. u8 code ledduan1[]=
  25. {
  26. /*--  表情:  桃心笑脸 --*/
  27. /*--  宋体12;  此表情下对应的点阵为:宽x高=16x16   --*/
  28. 0x00,0x08,0x1C,0x3E,0x7C,0x7C,0x3E,0x1C,
  29. 0x08,0x00,0x20,0x70,0xE0,0xE0,0x70,0x20,
  30. 0x00,0x04,0x08,0x10,0x20,0x20,0x40,0x41,
  31. 0x42,0x41,0x20,0x20,0x10,0x08,0x04,0x00
  32. };


  33. /*******************************************************************************
  34. * 函 数 名         : delay
  35. * 函数功能                   : 延时函数,i=1时,大约延时10us
  36. *******************************************************************************/
  37. void delay(u16 i)
  38. {
  39.         while(i--);       
  40. }
  41. /******************************************************************************
  42. 函数功能:第一种LED运行效果        :乒乓球回弹
  43. ******************************************************************************/
  44. void firstLedDisplay()
  45. {
  46.     u8 i;
  47.            led=0x01;
  48.     {       
  49.                 for(i=0;i<7;i++)         //将led左移一位
  50.                 {
  51.                         led=_crol_(led,1);
  52.                 delay(30000); //大约延时450ms       
  53.                 }
  54.                 for(i=0;i<7;i++)        //将led右移一位
  55.                 {
  56.                         led=_cror_(led,1);
  57.                         delay(30000); //大约延时450ms       
  58.                 }
  59.         }               
  60. }

  61. /**********************************************
  62. 函数功能:LED运行第二种效果:0,2,4,6和1,3,5,7交替亮灭
  63. **********************************************/

  64. void secondLedDisplay()
  65. {
  66.     led=0x55;
  67.         delay(50000); //大约延时450ms       
  68.         led=~led;
  69.         delay(50000);       
  70. }

  71. /*****************************************************
  72. 函数功能:LED运行第三种效果:中心波浪向两侧推出
  73. *****************************************************/
  74. void thirdLedDisplay()
  75. {
  76.         led=0x18;
  77.     delay(50000);
  78.     led=0x24;
  79.     delay(50000);
  80.     led=0x42;
  81.     delay(50000);
  82.     led=0x81;
  83.         delay(50000);
  84. }

  85. /*******************************************************************************
  86. * 函 数 名         : Hc595SendByte(u8 dat1,u8 dat2,u8 dat3,u8 dat4)
  87. * 函数功能                   : 通过595发送四个字节的数据
  88. * 输    入         : dat1:第4个595输出数值
  89. *                  * dat2: 第3个595输出数值
  90. *                  * dat3:第2个595输出数值
  91. *                  * dat4:第1个595输出数值
  92. * 输    出         : 无
  93. *******************************************************************************/
  94. void Hc595SendByte(u8 dat1,u8 dat2,u8 dat3,u8 dat4)
  95. {
  96.         u8 a;

  97.         SRCLK = 1;
  98.         R_CLK = 1;

  99.         for(a=0;a<8;a++)                 //发送8位数
  100.         {
  101.                 SER = dat1 >> 7;                 //从最高位开始发送
  102.                 dat1 <<= 1;

  103.                 SRCLK = 0;                         //发送时序
  104.                 _nop_();
  105.                 _nop_();
  106.                 SRCLK = 1;       
  107.         }
  108.    
  109. for(a=0;a<8;a++)                 //发送8位数
  110.         {
  111.                 SER = dat2 >> 7;                 //从最高位开始发送
  112.                 dat2 <<= 1;

  113.                 SRCLK = 0;                         //发送时序
  114.                 _nop_();
  115.                 _nop_();
  116.                 SRCLK = 1;       
  117.         }

  118.         for(a=0;a<8;a++)                 //发送8位数
  119.         {
  120.                 SER = dat3 >> 7;                 //从最高位开始发送
  121.                 dat3 <<= 1;

  122.                 SRCLK = 0;                         //发送时序
  123.                 _nop_();
  124.                 _nop_();
  125.                 SRCLK = 1;       
  126.         }

  127.         for(a=0;a<8;a++)                 //发送8位数
  128.         {
  129.                 SER = dat4 >> 7;                 //从最高位开始发送
  130.                 dat4 <<= 1;

  131.                 SRCLK = 0;                         //发送时序
  132.                 _nop_();
  133.                 _nop_();
  134.                 SRCLK = 1;       
  135.         }

  136.         R_CLK = 0;
  137.         _nop_();
  138.         _nop_();
  139.         R_CLK = 1;
  140. }

  141. void dianZhenDisplay()
  142. {
  143.    u8 i;
  144.    for(i=0;i<16;i++)
  145.    {
  146.                 Hc595SendByte(~ledwei[i+16],~ledwei[i],ledduan1[16+i],ledduan1[i]);
  147.                 delay(10);
  148.         }               
  149. }


  150. /*******************************************************************************
  151. * 函 数 名         : BreakInit()
  152. * 函数功能                   : 设置中断
  153. * 输    入         : 无
  154. * 输    出         : 无
  155. *******************************************************************************/
  156. void BreakInit()
  157. {
  158.     EA=0;
  159.         TMOD=0x01;
  160.         TH0=0XFC;        //给定时器赋初值,定时1ms
  161.     TL0=0X18;
  162.         IE=0x82;
  163.         TR0=1;//打开定时器
  164. }

  165.   
  166. /*main()*/


  167. u8 flag = 0 ;
  168. void main()
  169. {
  170.     BreakInit();
  171.         while(1)
  172.         {
  173.                 switch (flag)          {
  174.                 case 1 :
  175.                         GPIO_DIG=~smgduan[1];
  176.                         firstLedDisplay() ;
  177.                         break ;
  178.                 case 2 :
  179.                         GPIO_DIG=~smgduan[2];
  180.                         secondLedDisplay() ;
  181.                         break ;
  182.                 case 3 :
  183.                         GPIO_DIG=~smgduan[3];
  184.                         thirdLedDisplay() ;
  185.                         break ;
  186.                 case 4 :
  187.                         GPIO_DIG=~smgduan[4];
  188.                         dianZhenDisplay() ;
  189.                         break ;       
  190.                 default :
  191.                         break ;
  192.                         }
  193.         }
  194. }  

  195. /*******************************************************************************
  196. * 函 数 名         : void Timer0() interrupt 1
  197. * 函数功能                   : 定时器0中断函数
  198. * 输    入         : 无
  199. * 输    出         : 无
  200. *******************************************************************************/
  201. void Timer0() interrupt 1
  202. {
  203.           static u16 i;
  204.         TH0=0XFC;        //给定时器赋初值,定时1ms
  205.         TL0=0X18;
  206.         i++;
  207.         if(i==100)
  208.         {
  209.                 i=0;
  210.             if(k1==0)
  211.                 {
  212.                     flag=1;
  213.                 }
  214.                 if(k2==0)
  215.                 {
  216.                     flag=2;
  217.                 }
  218.                 if(k3==0)
  219.                 {
  220.                         flag = 3 ;
  221.                 }
  222.                 if(k4==0)
  223.                 {
  224.                     flag=4;
  225.                 }
  226.         }       
  227. }
复制代码

所有资料51hei提供下载:
基础部分最终版.docx (163.52 KB, 下载次数: 14)



评分

参与人数 3黑币 +14 收起 理由
jdjdje + 4 赞一个!
yz3210 + 5 赞一个!
zqy181818 + 5 赞一个!

查看全部评分

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

使用道具 举报

沙发
ID:352052 发表于 2018-6-15 00:42 | 只看该作者
你好,我想问一下led那附近接线的情况是怎么样的,怎么我接出来的样式跟你的不一样
回复

使用道具 举报

板凳
ID:355644 发表于 2018-6-22 23:44 | 只看该作者

你好,我想问一下led那附近接线的情况是怎么样的,怎么我接出来的样式跟你的不一样
回复

使用道具 举报

地板
ID:355644 发表于 2018-6-22 23:47 | 只看该作者
点阵不亮
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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