一、实验目的
1、了解数码管共阴极和共阳极接法。
2、了解数码管的段选和位选方式。
3、了解定时器初始化设置的方法。
二、实验内容
1、完成数码管显示数字每秒加一,八个数码管全亮;完成数码管八段全亮,八个数码管全亮。
1)实验要求:完成数码管八段全亮,八个数码管全亮,以此检验数码管是否正常。
2)实验目的:了解数码管共阴极和共阳极接法;了解数码管的段选和位选方式。
3)实验说明:通过本实验,可以了解了解数码管共阴极和共阳极接法;了解数码管的段选和位选方式,同时也可以了解单片机编程,调试方法。
4)、程序框图 2、完成数码管显示数字每秒加一,八个数码管全亮。
三、实验原理
四、实验电路与程序
1、软件实验一:完成数码管八段全亮,八个数码管全亮。
1)实验要求:完成数码管八段全亮,八个数码管全亮,以此检验数码管是否正常。
2)实验目的:了解数码管共阴极和共阳极接法;了解数码管的段选和位选方式。
3)实验说明:通过本实验,可以了解了解数码管共阴极和共阳极接法;了解数码管的段选和位选方式,同时也可以了解单片机编程,调试方法。
4)、程序框图
5)、代码
main.c
- #include <reg52.h>
- #include <key.h>
- #include <tube.h>
- #include <interrupt.h>
- int task_flag;
- int timer_flag;
- int timer_flag_2;
- void main()
- {
- Config_EXTI();//初始化外部中断
- Config_Timer();//初始化定时器
- while(1)//任务调度器
- {
- if(timer_flag)//每1000ms执行一次任务
- {
- timer_flag=0;
- tube_static();
- }
- }
- }
tube.h - #ifndef _TUBE_H
- #define _TUBE_H
- #include <reg52.h>
- sbit WE = P2^7; //位定义数码管位选锁存器接口
- sbit DU = P2^6; //位定义数码管段选锁存器接口
- void delay1(unsigned int z);
- void tube_all(void);
- extern int timer_flag;
- #endif
tube.c
- #include <tube.h>
- //共阴极数码管码表
- unsigned char code leddata[]={
-
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"
-
};
- void delay1(unsigned int z)
- {
- unsigned int x,y;
- for(x = z; x > 0; x–)
- for(y = 114; y > 0 ; y–);
- }
- void tube_all(void)
- {
- //段选
- P0=0xff;
- DU=1;
- delay1(1);
- DU=0;
- delay1(1);
- //位选
- P0=0x00;
- WE=1;
- delay1(1);
- WE=0;
- delay1(1);
- }
2、软件实验二:完成数码管显示数字每秒加一,八个数码管全亮。
1)实验要求:成数码管显示数字每秒加一,八个数码管全亮,以此检验数码管是否正常。
2)实验目的:了解数码管共阴极和共阳极接法;了解数码管的段选和位选方式;了解定时器用法。
3)实验说明:通过本实验,可以了解了解数码管共阴极和共阳极接法;了解数码管的段选和位选方式;了解定时器用法;同时也可以了解单片机编程,调试方法。
4)、程序框图
5)、代码
main.c
-
#include <reg52.h>
- #include <key.h>
- #include <tube.h>
- #include <interrupt.h>
- int task_flag;
- int timer_flag;
- int timer_flag_2;
- void main()
- {
- Config_EXTI();//初始化外部中断
- Config_Timer();//初始化定时器
- while(1)//任务调度器
- {
- if(timer_flag)//每1000ms执行一次任务
- {
- timer_flag=0;
- tube_static();
- }
- }
- }
interrupt.h
- #ifndef _INTERRUPT_H
- #define _INTERRUPT_H
- #include <reg52.h>
- #include <key.h>
- void delay(unsigned int z);
- void Config_EXTI(void);
- void Config_Timer(void);
- extern int task_flag;
- extern int timer_flag;
- extern int timer_flag_2;
- #endif
interrupt.c
- #include <interrupt.h>
- void delay(unsigned int z)//延时ms
- {
- unsigned int x,y;
- for(x = z; x > 0; x–)
- for(y = 114; y > 0 ; y–);
- }
- void Config_Timer(void)
- {
-
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;//启动定时器0
-
TH1=(65536-50000)/256;//装初值12M晶振定时50ms数为50000,高位
-
TL1=(65536-50000)%256;//低位
-
EA=1;//开总中断
-
ET1=1;//开定时器1中断
-
TR1=1;//启动定时器1
- }
- void T0_Handle() interrupt 1
- {
-
static int num=0;
- //重装初值
-
TH0=(65536-50000)/256;//高位
- TL0=(65536-50000)%256;//低位
- if(num<20)//每1000ms把timer_flag置位
- {
- num++;
- }
- else
- {
- num=0;
- timer_flag=~timer_flag;
- }
- }
tube.h
- #ifndef _TUBE_H
- #define _TUBE_H
- #include <reg52.h>
- sbit WE = P2^7; //位定义数码管位选锁存器接口
- sbit DU = P2^6; //位定义数码管段选锁存器接口
- void tube_init(void);
- void tube_forward(void);
- void delay1(unsigned int z);
- extern int timer_flag;
- #endif
tube.c
- #include <tube.h>
- //共阴极数码管
- int wei_val[7]=0;//每一位要存的数
- unsigned char code leddata[]={
-
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 //自定义
-
};
- unsigned char code bitdata[]={
-
0xFE, //"0"
-
0xFD, //"1"
-
0xFB, //"2"
-
0xF7, //"3"
-
0xEF, //"4"
-
0xDF, //"5"
-
0xBF, //"6"
-
0x7F, //"7"
-
};
- void delay1(unsigned int z)
- {
- unsigned int x,y;
- for(x = z; x > 0; x–)
- for(y = 114; y > 0 ; y–);
- }
- void tube_init(void)
- {
- }
- void tube_static(void)
- {
- static int i=0;
- if(i>8)
- {
- i=0;
- }
- else
- {
- i++;
- }
- //段选
- P0=leddata[i];
- DU=1;
- delay1(1);
- DU=0;
- delay1(1);
- //位选
- P0=0x00;
- WE=1;
- delay1(1);
- WE=0;
- delay1(1);
- }
五、实验总结
- 因为是共阴极数码管,因此要点亮对应的段,应使用高电平。片选信号为低电平。
2.P0口要输出高电平,应该接上拉电阻,不然proteus仿真会出错。
3.由于是静态显示,因此先段选还是先位选没有影响。如果是动态显示,应该先段选为0消影,再位选,再段选赋值。