51静态数码管实验

一、实验目的
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.h
  21. #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"
    
  5.              0x06,  //"1"
    
  6.              0x5B,  //"2"
    
  7.              0x4F,  //"3"
    
  8.              0x66,  //"4"
    
  9.             0x6D,  //"5"
    
  10.             0x7D,  //"6"
    
  11.             0x07,  //"7"
    
  12.             0x7F,  //"8"
    
  13.             0x6F,  //"9"
    
  14.             0x77,  //"A"
    
  15.             0x7C,  //"B"
    
  16.             0x39,  //"C"
    
  17.             0x5E,  //"D"
    
  18.             0x79,  //"E"
    
  19.             0x71,  //"F"
    
  20.                      };
    
  21. void delay1(unsigned int z)
  22. {
  23. unsigned int x,y;
  24. for(x = z; x > 0; x–)
  25. for(y = 114; y > 0 ; y–);
  26. }
  27. void tube_all(void)
  28. {
  29. //段选
  30. P0=0xff;
  31. DU=1;
  32. delay1(1);
  33. DU=0;
  34. delay1(1);
  35. //位选
  36. P0=0x00;
  37. WE=1;
  38. delay1(1);
  39. WE=0;
  40. delay1(1);
  41. }

2、软件实验二:完成数码管显示数字每秒加一,八个数码管全亮。
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. }

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. {
  10. TMOD=0x11;//设定时器0和1为工作方式1(M1 M0为01),是向上计数
    
  11. TH0=(65536-50000)/256;//装初值12M晶振定时50ms数为50000,高位
    
  12. TL0=(65536-50000)%256;//低位
    
  13. EA=1;//开总中断
    
  14. ET0=1;//开定时器0中断
    
  15. TR0=1;//启动定时器0
    
  16. TH1=(65536-50000)/256;//装初值12M晶振定时50ms数为50000,高位
    
  17. TL1=(65536-50000)%256;//低位
    
  18. EA=1;//开总中断
    
  19. ET1=1;//开定时器1中断
    
  20. TR1=1;//启动定时器1
    
  21. }
  22. void T0_Handle() interrupt 1
  23. {
  24. static int num=0;
    
  25. //重装初值
  26. TH0=(65536-50000)/256;//高位
    
  27. TL0=(65536-50000)%256;//低位
  28. if(num<20)//每1000ms把timer_flag置位
  29. {
  30. num++;
  31. }
  32. else
  33. {
  34. num=0;
  35. timer_flag=~timer_flag;
  36. }
  37. }

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"
    
  6.              0x06,  //"1"
    
  7.              0x5B,  //"2"
    
  8.              0x4F,  //"3"
    
  9.             0x66,  //"4"
    
  10.             0x6D,  //"5"
    
  11.             0x7D,  //"6"
    
  12.             0x07,  //"7"
    
  13.             0x7F,  //"8"
    
  14.             0x6F,  //"9"
    
  15.             0x77,  //"A"
    
  16.             0x7C,  //"B"
    
  17.             0x39,  //"C"
    
  18.             0x5E,  //"D"
    
  19.             0x79,  //"E"
    
  20.             0x71,  //"F"
    
  21.             0x76,  //"H"
    
  22.             0x38,  //"L"
    
  23.             0x37,  //"n"
    
  24.             0x3E,  //"u"
    
  25.             0x73,  //"P"
    
  26.             0x5C,  //"o"
    
  27.             0x40,  //"-"
    
  28.             0x00,  //熄灭
    
  29.             0x00  //自定义
    
  30.                      };
    
  31. unsigned char code bitdata[]={
  32.             0xFE,  //"0"
    
  33.             0xFD,  //"1"
    
  34.             0xFB,  //"2"
    
  35.             0xF7,  //"3"
    
  36.             0xEF,  //"4"
    
  37.             0xDF,  //"5"
    
  38.             0xBF,  //"6"
    
  39.             0x7F,  //"7" 
    
  40.                      };
    
  41. void delay1(unsigned int z)
  42. {
  43. unsigned int x,y;
  44. for(x = z; x > 0; x–)
  45. for(y = 114; y > 0 ; y–);
  46. }
  47. void tube_init(void)
  48. {
  49. }
  50. void tube_static(void)
  51. {
  52. static int i=0;
  53. if(i>8)
  54. {
  55. i=0;
  56. }
  57. else
  58. {
  59. i++;
  60. }
  61. //段选
  62. P0=leddata[i];
  63. DU=1;
  64. delay1(1);
  65. DU=0;
  66. delay1(1);
  67. //位选
  68. P0=0x00;
  69. WE=1;
  70. delay1(1);
  71. WE=0;
  72. delay1(1);
  73. }

五、实验总结

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值