微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 新手关于消影的问题

新手关于消影的问题

时间:10-02 整理:3721RD 点击:
我是新手,正在学习51单片机,也正在做实验。关于消影还是不怎么理解。我用定时器中断做了个0至59秒的计时器,但是影子相对明显,我将硬件情况及程序附上,请各位指点。怎样才能较好地控制消影呢?还有最好能说明白消影的原理,看得比较多,但是还是没有透彻的理解。
1、硬件情况:STC89C52,P0口接三极管控制共阳数码管;
2、程序如下:

  1. #include<reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. uint num1,num2,shi,ge;
  5. void display(uint,uint);
  6. uchar code table[]=
  7. {
  8. 0xC0,0xF9,0xA4,//定义数码管的显示
  9. 0xB0,0x99,0x92,
  10. 0x82,0xF8,0x80,0x90,
  11. };
  12. uchar code shit[]=
  13. {
  14. 0x0E,0x0D,//定义位选WE1,WE2
  15. };
  16. void delay(uint);
  17. void main()
  18. {
  19. TMOD=0x10;
  20. EA=1;
  21. ET1=1;
  22. TR1=1;
  23. TH1=(65536-45872)/256;
  24. TL1=(65536-45872)%256;
  25. P2=0xFF;
  26. while(1)
  27. {
  28.   display(shi,ge);
  29. }
  30. }
  31. void display(uint shi,uint ge)
  32. {
  33. shi=num2/10; //十位数取整
  34. P2=0x0E; //位选第一个数码管
  35. P0=table[shi]; //输出十位数
  36. delay(1);

  37. P2=0xFF;
  38. ge=num2%10; //个位数取余
  39. P2=0x0D; //位选第二个数码管
  40. P0=table[ge]; //输出个位数
  41. delay(1);
  42. }
  43. void delay(uint ms)
  44. {
  45. uint i,j;
  46. for(i=ms;i>0;i--)
  47.   for(j=110;j>0;j--);
  48. }
  49. void T1_time() interrupt 3 //定时器1中断
  50. {
  51. TH1=(65536-45872)/256;
  52. TL1=(65536-45872)%256;
  53. num1++;
  54. if(num1==20) //20次50ms循环
  55. {
  56.   num1=0;
  57.   num2++;
  58.   if(num2==60) //数字到60后清零
  59.    num2=0;
  60. }
  61. }

复制代码


void display(uint shi,uint ge)
{
P0=0;//段码清0;数码管显示0
shi=num2/10; //十位数取整
P2=0x0E; //位选第一个数码管
P0=table[shi]; //输出十位数
delay(1);
P2=0xFF;
ge=num2%10; //个位数取余
P2=0x0D; //位选第二个数码管
P0=table[ge]; //输出个位数
delay(1);
}
你这个程序为什么不用段存和位存,因为你用了位选和段选

段存、位存用的是锁存器吗?我这个数码管是用三极管驱动的,也可以像锁存器那样操作?

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top