一、实验目的
1、了解数码管共阴极和共阳极接法。
2、了解数码管的段选和位选方式。
3、了解定时器初始化设置的方法。
二、实验内容
1、完成数码管显示数字每秒加一,八个数码管全亮;完成数码管八段全亮,八个数码管全亮。
1)实验要求:完成数码管八段全亮,八个数码管全亮,以此检验数码管是否正常。
2)实验目的:了解数码管共阴极和共阳极接法;了解数码管的段选和位选方式。
3)实验说明:通过本实验,可以了解了解数码管共阴极和共阳极接法;了解数码管的段选和位选方式,同时也可以了解单片机编程,调试方法。
4)、程序框图 2、完成数码管显示数字每秒加一,八个数码管全亮。
三、实验原理
四、实验电路与程序
1、软件实验一:完成数码管八段全亮,八个数码管全亮。
1)实验要求:完成数码管八段全亮,八个数码管全亮,以此检验数码管是否正常。
2)实验目的:了解数码管共阴极和共阳极接法;了解数码管的段选和位选方式。
3)实验说明:通过本实验,可以了解了解数码管共阴极和共阳极接法;了解数码管的段选和位选方式,同时也可以了解单片机编程,调试方法。
4)、程序框图
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)、程序框图
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. }
五、实验总结
- 因为是共阴极数码管,因此要点亮对应的段,应使用高电平。片选信号为低电平。
2.P0口要输出高电平,应该接上拉电阻,不然proteus仿真会出错。
3.由于是静态显示,因此先段选还是先位选没有影响。如果是动态显示,应该先段选为0消影,再位选,再段选赋值。