写了个秒表的程序,有些困惑

2020-01-30 14:16发布

00 :00 . 00
分   秒  分秒

代码:
  1. /***************************************************************
  2. 文件名:秒表.c
  3. 晶振频率:12MHz
  4. ****************************************************************/
  5. #include<reg52.h>
  6. #define uchar unsigned char
  7. #define uint unsigned int
  8. #define dataport P0

  9. uchar code weima[]={
  10. 0xfe,0xfd,0xfb,0xf7,
  11. 0xef,0xdf,0xbf,0x7f};
  12. uchar code duanma[]={
  13. 0x3f,0x06,0x5b,0x4f,0x66,
  14. 0x6d,0x7d,0x07,0x7f,0x6f};
  15. uchar tempdata[8];
  16. uchar tt0,tt1,tt2;

  17. sbit wela=P2^2;
  18. sbit dula=P2^3;

  19. void display(uchar,uchar);
  20. void Init_Timer0(void);
  21. void delayms(uint);

  22. void main(void)
  23. {
  24.         Init_Timer0();
  25.         while(1)
  26.                 display(0,6);
  27. }

  28. void Init_Timer0(void)
  29. {
  30.         TMOD=0x01;
  31.         TH0=(65536-10000)/256;
  32.         TL0=(65536-10000)%256;

  33.         IE=0x82;
  34.         //EA=1;
  35.         //ET0=1;
  36.         TR0=1;
  37. }

  38. void T0_isr(void)interrupt 1
  39. {
  40.         TH0=(65536-10000)/256;
  41.         TL0=(65536-10000)%256;
  42.         tt0++;
  43.         if(tt0==100)                //1秒
  44.         {
  45.                 tt0=0;
  46.                 tt1++;
  47.                 if(tt1==60)
  48.                 {
  49.                         tt1=0;
  50.                         tt2++;
  51.                         if(tt2==60)
  52.                                 tt2=0;
  53.                 }
  54.         }
  55.         tempdata[0]=duanma[tt2/10];                                //分前一位
  56.         tempdata[1]=duanma[tt2%10];                                //分后一位
  57.         tempdata[2]=duanma[tt1/10];                                //秒前一位
  58.         tempdata[3]=duanma[tt1%10];                                //秒后一位
  59.         tempdata[4]=duanma[tt0/10];                                //分秒前一位
  60.         tempdata[5]=duanma[tt0%10];                                //分秒后一位
  61. }

  62. void display(uchar firstbit,uchar num)
  63. {
  64.         uchar i;
  65.         for(i=0;i<num;i++)
  66.         {
  67.                 dataport=0;
  68.                 dula=1;
  69.                 dula=0;

  70.                 dataport=weima[i+firstbit];
  71.                 wela=1;
  72.                 wela=0;

  73.                 dataport=tempdata[i];
  74.                 dula=1;
  75.                 dula=0;

  76.                 delayms(2);
  77.         }
  78. }

  79. void delayms(uint ms)
  80. {
  81.         uint i;
  82.         while(ms--)
  83.                 for(i=110;i>0;i--);
  84. }

复制代码不知道问题出现在哪,数码管显示不对,高手指点下
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
28条回答
一匹狼
1楼-- · 2020-02-03 02:34
不知道程序在哪出现差错了。。。。
i55x
2楼-- · 2020-02-03 06:29
 精彩回答 2  元偷偷看……
william_rain
3楼-- · 2020-02-03 07:41
一匹狼 发表于 2013-2-14 15:33
数码管显示很乱,根本就没法读数,
我设计本意是显示6位,而数码管显示了8位


楼主,我写了个。在我的实验板上调试通了。

你把位选、段选定义改一下就好了。
  1. /*
  2. *板极调试成功
  3. *6位数码管显示
  4. *
  5. */

  6. #include <reg52.h>

  7. sbit DuCs = P2^6;
  8. sbit WeCs = P2^7;

  9. #define DATA P0

  10. unsigned char Second = 0;
  11. unsigned char Minute =0;
  12. unsigned char Hour = 0;

  13. unsigned char Count = 0;
  14. unsigned char Scan = 0;

  15. unsigned char SMG_Buffer[8] = {0};

  16. unsigned char code TAB[] = {
  17. 0x3f,0x06,0x5b,0x4f,0x66,0x6d,
  18. 0x7d,0x07,0x7f,0x6f,0x77,0x7c,
  19. 0x39,0x5e,0x79,0x71
  20. };
  21. unsigned char code WEI[]={
  22. 0xfe,0xfd,0xfb,0xf7,
  23. 0xef,0xdf,0xbf,0x7f};

  24. void Timer0_Init(void){
  25.         TMOD=0x01;
  26.         TH0=(65536-10000)/256;
  27.         TL0=(65536-10000)%256;

  28.         ET0 = 1;
  29.         TR0 = 1;
  30. }

  31. void Timer1_Init(void)        {
  32.         TMOD = 0x21;                                               
  33.         TH1 = (256 - 250);
  34.         TL1 = (256 - 250);
  35.        
  36.         ET1 = 1;                        //打开定时器中断
  37.         TR1 = 1;                        //开启定时器
  38. }

  39. void main(){
  40.         Timer0_Init();
  41.         Timer1_Init();

  42.         EA = 1;

  43.         while (1){

  44.                  SMG_Buffer[4] = Second /10;       
  45.                 SMG_Buffer[5] = Second % 10;       
  46.        
  47.        
  48.                 SMG_Buffer[2] = Minute / 10;       
  49.                 SMG_Buffer[3] = Minute % 10;

  50.                 SMG_Buffer[0] = Hour / 10;
  51.                 SMG_Buffer[1] = Hour % 10;



  52.         }               
  53. }


  54. void Timer0_SRV(void) interrupt 1{
  55.         TH0=(65536-10000)/256;
  56.         TL0=(65536-10000)%256;

  57.         Second ++;

  58.         if (100 == Second) {
  59.                 Second = 0;
  60.                 Minute ++;
  61.                 if (Minute == 60) {
  62.                         Minute = 0;
  63.                         Hour ++;
  64.                         if (Hour == 60){
  65.                                 Hour =0;
  66.                         }
  67.                 }
  68.        
  69.         }       
  70. }

  71. void Timer1_Service(void) interrupt 3{
  72.         TH1 = (256 - 250);
  73.         TL1 = (256 - 250);       

  74.         P0 = ~ (1 << Scan);
  75.         WeCs = 1;
  76.         WeCs = 0;
  77.        

  78.         P0 = TAB[SMG_Buffer[Scan]];
  79.         DuCs = 1;
  80.         DuCs = 0;

  81.         Scan ++;
  82.         if (Scan > 7){
  83.                 Scan = 0;
  84.         }
  85. }
复制代码
daicp
4楼-- · 2020-02-03 12:23
要写一行,调一行,对码编程.这样写完就调完了

一周热门 更多>