当前位置: 主页 > 单片机开发 > 51 单片机 > 51单片机入门实验1-数码管的驱动
51单片机入门实验1-数码管的驱动
摘要
简介: 通过 74hc595串行译码,利用3根线实现对数码管7段的控制,同时采用74hc138进行位译码,节省了单片机宝贵的端口资源。 具体程序分析如下。 相关论文下载: 单片机从入门到精通
  

 简介:

通过 74hc595串行译码,利用3根线实现对数码管7段的控制,同时采用74hc138进行位译码,节省了单片机宝贵的端口资源。

具体程序分析如下。

相关论文下载:

 

单片机从入门到精通系列讲座——数码管驱动方法.pdf

 

  1 /*
  2     艾米电子工作室
  3 
  4 实验七 数码管驱动应用
  5 db :zliang 
  6 11/29/2007 8:00PM
  7 网站:http://www.amy-studio.com/
  8 */
  9 
 10 #include <reg51.h>
 11 
 12 sbit  RCLK = P2^5;
 13 sbit  SCLK = P2^6;
 14 sbit  SDAT = P2^7;
 15 
 16 sbit  A_SEL = P2^2;
 17 sbit  B_SEL = P2^3;
 18 sbit  C_SEL = P2^4;
 19 
 20 #define     SM0     A_SEL = 0;    B_SEL = 0; C_SEL = 0
 21 #define     SM1     A_SEL = 1;    B_SEL = 0; C_SEL = 0
 22 #define     SM2     A_SEL = 0;    B_SEL = 1; C_SEL = 0
 23 #define     SM3     A_SEL = 1;    B_SEL = 1; C_SEL = 0
 24 #define     SM4     A_SEL = 0;    B_SEL = 0; C_SEL = 1
 25 #define     SM5     A_SEL = 1;    B_SEL = 0; C_SEL = 1
 26 #define     SM6     A_SEL = 0;    B_SEL = 1; C_SEL = 1
 27 #define     SM7     A_SEL = 1;    B_SEL = 1; C_SEL = 1
 28 
 29 // 数码管显示 段码数组
 30 unsigned char leddata[]={
 31 
 32                 0x3F,  //"0"
 33                 0x06,  //"1"
 34                 0x5B,  //"2"
 35                 0x4F,  //"3"
 36                 0x66,  //"4"
 37                 0x6D,  //"5"
 38                 0x7D,  //"6"
 39                 0x07,  //"7"
 40                 0x7F,  //"8"
 41                 0x6F,  //"9"
 42                 0x77,  //"A"
 43                 0x7C,  //"B"
 44                 0x39,  //"C"
 45                 0x5E,  //"D"
 46                 0x79,  //"E"
 47                 0x71,  //"F"
 48                 0x76,  //"H"
 49                 0x38,  //"L"
 50                 0x37,  //"n"
 51                 0x3E,  //"u"
 52                 0x73,  //"P"
 53                 0x5C,  //"o"
 54                 0x40,  //"-"
 55                 0x00,  //熄灭
 56                 0x00  //自定义
 57 
 58                          };
 59 
 60 
 61 void send(unsigned char data_out)
 62 {
 63     unsigned char i;
 64     RCLK = 0;
 65 
 66     for(i=0;i<8;i++)
 67     {
 68         if( data_out & 0x80)
 69             SDAT = 1;
 70         else
 71             SDAT = 0;
 72         SCLK = 0;
 73 
 74         SCLK = 1;
 75 
 76         data_out =  data_out<<1;
 77     }
 78     RCLK = 1;
 79 }
 80 
 81 #define     delay       400
 82 void main(void)
 83 {
 84 
 85     while(1)
 86     {
 87         unsigned int i;
 88 
 89         SM0;
 90         send(leddata[0]);
 91         for(i = 0; i < delay; i++);
 92         send(0x00);
 93 
 94         SM1;
 95         send(leddata[1]);
 96         for(i = 0; i < delay; i++);
 97         send(0x00);
 98         SM2;
 99         send(leddata[2]);
100         for(i = 0; i < delay; i++);
101         send(0x00);
102         SM3;
103         send(leddata[3]);
104         for(i = 0; i < delay; i++);
105         send(0x00);
106 
107         SM4;
108         send(leddata[4]);
109         for(i = 0; i < delay; i++);
110         send(0x00);
111 
112         SM5;
113         send(leddata[5]);
114         for(i = 0; i < delay; i++);
115         send(0x00);
116         SM6;
117         send(leddata[6]);
118         for(i = 0; i < delay; i++);
119         send(0x00);
120         SM7;
121         send(leddata[7]);
122         for(i = 0; i < delay; i++);
123         send(0x00);
124 
125     }
126 }