一、实验目的

1、了解数码管共阴极和共阳极接法。

2、了解数码管的段选和位选方式。

3、了解定时器初始化设置的方法。

二、实验内容

1、完成数码管显示数字每秒加一,八个数码管全亮;完成数码管八段全亮,八个数码管全亮。

1)实验要求:完成数码管八段全亮,八个数码管全亮,以此检验数码管是否正常。

2)实验目的:了解数码管共阴极和共阳极接法;了解数码管的段选和位选方式。

3)实验说明:通过本实验,可以了解了解数码管共阴极和共阳极接法;了解数码管的段选和位选方式,同时也可以了解单片机编程,调试方法。

4)、程序框图 2、完成数码管显示数字每秒加一,八个数码管全亮。

三、实验原理

51静态数码管实验_初始化

四、实验电路与程序

1、软件实验一:完成数码管八段全亮,八个数码管全亮。

1)实验要求:完成数码管八段全亮,八个数码管全亮,以此检验数码管是否正常。

2)实验目的:了解数码管共阴极和共阳极接法;了解数码管的段选和位选方式。

3)实验说明:通过本实验,可以了解了解数码管共阴极和共阳极接法;了解数码管的段选和位选方式,同时也可以了解单片机编程,调试方法。

4)、程序框图

51静态数码管实验_数码管_02

5)、代码
main.c
1. #include <reg52.h>
2. #include <key.h>
3. #include <tube.h>
4. #include <interrupt.h>
5. int task_flag;
6. int timer_flag;
7. int timer_flag_2;
8. void main()
9. {

10. Config_EXTI();//初始化外部中断
11. Config_Timer();//初始化定时器
12. while(1)//任务调度器
13. {

14. if(timer_flag)//每1000ms执行一次任务
15. {

16. timer_flag=0;
17. tube_static();
18. }
19. }
20. }
 tube.h21. #ifndef _TUBE_H
22. #define _TUBE_H
23. #include <reg52.h>
24. sbit WE = P2^7; //位定义数码管位选锁存器接口
25. sbit DU = P2^6; //位定义数码管段选锁存器接口
26. void delay1(unsigned int z);
27. void tube_all(void);
28. extern int timer_flag;
29. #endif
tube.c
1. #include <tube.h>
2. //共阴极数码管码表
3. unsigned char code leddata[]={

4. 
0x3F,  //"0"0x06,  //"1"0x5B,  //"2"0x4F,  //"3"0x66,  //"4"0x6D,  //"5"0x7D,  //"6"0x07,  //"7"0x7F,  //"8"0x6F,  //"9"0x77,  //"A"0x7C,  //"B"0x39,  //"C"0x5E,  //"D"0x79,  //"E"0x71,  //"F"1. 
};1. 
2. void delay1(unsigned int z)
3. {

4. unsigned int x,y;
5. for(x = z; x > 0; x–)
6. for(y = 114; y > 0 ; y–);
7. }
8. 
9. void tube_all(void)
10. {

11. //段选
12. P0=0xff;
13. DU=1;
14. delay1(1);
15. DU=0;
16. delay1(1);
17. 
18. //位选
19. P0=0x00;
20. WE=1;
21. delay1(1);
22. WE=0;
23. delay1(1);
24. }

2、软件实验二:完成数码管显示数字每秒加一,八个数码管全亮。

1)实验要求:成数码管显示数字每秒加一,八个数码管全亮,以此检验数码管是否正常。

2)实验目的:了解数码管共阴极和共阳极接法;了解数码管的段选和位选方式;了解定时器用法。

3)实验说明:通过本实验,可以了解了解数码管共阴极和共阳极接法;了解数码管的段选和位选方式;了解定时器用法;同时也可以了解单片机编程,调试方法。

4)、程序框图

51静态数码管实验_初始化_03

5)、代码
main.c

#include <reg52.h>1. #include <key.h>
2. #include <tube.h>
3. #include <interrupt.h>
4. int task_flag;
5. int timer_flag;
6. int timer_flag_2;
7. void main()
8. {

9. Config_EXTI();//初始化外部中断
10. Config_Timer();//初始化定时器
11. while(1)//任务调度器
12. {

13. if(timer_flag)//每1000ms执行一次任务
14. {

15. timer_flag=0;
16. tube_static();
17. }
18. }
19. }
interrupt.h
1. #ifndef _INTERRUPT_H
2. #define _INTERRUPT_H
3. #include <reg52.h>
4. #include <key.h>
5. void delay(unsigned int z);
6. void Config_EXTI(void);
7. void Config_Timer(void);
8. extern int task_flag;
9. extern int timer_flag;
10. extern int timer_flag_2;
11. #endif
interrupt.c
1. #include <interrupt.h>
2. void delay(unsigned int z)//延时ms
3. {

4. unsigned int x,y;
5. for(x = z; x > 0; x–)
6. for(y = 114; y > 0 ; y–);
7. }
8. void Config_Timer(void)
9. {

TMOD=0x11;//设定时器0和1为工作方式1(M1 M0为01),是向上计数TH0=(65536-50000)/256;//装初值12M晶振定时50ms数为50000,高位TL0=(65536-50000)%256;//低位EA=1;//开总中断ET0=1;//开定时器0中断TR0=1;//启动定时器01. 
TH1=(65536-50000)/256;//装初值12M晶振定时50ms数为50000,高位TL1=(65536-50000)%256;//低位EA=1;//开总中断ET1=1;//开定时器1中断TR1=1;//启动定时器11. }
2. 
3. 
4. void T0_Handle() interrupt 1
5. {

static int num=0;1. //重装初值
TH0=(65536-50000)/256;//高位1. TL0=(65536-50000)%256;//低位
2. 
3. if(num<20)//每1000ms把timer_flag置位
4. {

5. num++;
6. }
7. else
8. {

9. num=0;
10. timer_flag=~timer_flag;
11. }
12. }
tube.h
1. #ifndef _TUBE_H
2. #define _TUBE_H
3. #include <reg52.h>
4. sbit WE = P2^7; //位定义数码管位选锁存器接口
5. sbit DU = P2^6; //位定义数码管段选锁存器接口
6. void tube_init(void);
7. void tube_forward(void);
8. void delay1(unsigned int z);
9. extern int timer_flag;
10. #endif
tube.c
1. #include <tube.h>
2. //共阴极数码管
3. int wei_val[7]=0;//每一位要存的数
4. unsigned char code leddata[]={

5. 
0x3F,  //"0"0x06,  //"1"0x5B,  //"2"0x4F,  //"3"0x66,  //"4"0x6D,  //"5"0x7D,  //"6"0x07,  //"7"0x7F,  //"8"0x6F,  //"9"0x77,  //"A"0x7C,  //"B"0x39,  //"C"0x5E,  //"D"0x79,  //"E"0x71,  //"F"0x76,  //"H"0x38,  //"L"0x37,  //"n"0x3E,  //"u"0x73,  //"P"0x5C,  //"o"0x40,  //"-"0x00,  //熄灭0x00  //自定义1. 
};1. unsigned char code bitdata[]={

2. 
0xFE,  //"0"0xFD,  //"1"0xFB,  //"2"0xF7,  //"3"0xEF,  //"4"0xDF,  //"5"0xBF,  //"6"0x7F,  //"7"};1. void delay1(unsigned int z)
2. {

3. unsigned int x,y;
4. for(x = z; x > 0; x–)
5. for(y = 114; y > 0 ; y–);
6. }
7. void tube_init(void)
8. {

9. 
10. }
11. 
12. 
13. 
14. void tube_static(void)
15. {

16. static int i=0;
17. if(i>8)
18. {

19. i=0;
20. }
21. else
22. {

23. i++;
24. }
25. //段选
26. P0=leddata[i];
27. DU=1;
28. delay1(1);
29. DU=0;
30. delay1(1);
31. 
32. //位选
33. P0=0x00;
34. WE=1;
35. delay1(1);
36. WE=0;
37. delay1(1);
38. }

五、实验总结

  1. 因为是共阴极数码管,因此要点亮对应的段,应使用高电平。片选信号为低电平。
    2.P0口要输出高电平,应该接上拉电阻,不然proteus仿真会出错。
    3.由于是静态显示,因此先段选还是先位选没有影响。如果是动态显示,应该先段选为0消影,再位选,再段选赋值。