3937|6

77

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

悬殊10分:52的T2计数器问题 [复制链接]

我有下面这段程序,send()子程序单独工作的时候是正常的,但是加入到主程序中时就出现问题,
我的主程序是一个频率计。主要问题是频率计的数码管显示不正常,串口能输出数据,但是数据是错误的。
#include
unsigned char code dispbit[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,
                               0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40};
unsigned char dispbuf[8]={0,0,0,0,0,0,10,10};
unsigned char temp[8];
unsigned char dispcount;
unsigned char T0count;
unsigned char timecount;
bit flag;
unsigned long x;
void send()
{
TCLK=1;
TH2=0xFF;  //9600bps  12MHz的时钟频率
TL2=0xD9;
RCAP2H=0xFF;  //方式1和方式3的波特率=fosc/(32-(65535-(RCAP2H,RCAP2L))
RCAP2L=0xD9;
SCON=0x50; //SM0  SM1  SM2  REN  TB8 RB8  TI RI
TR2=1;
SBUF=x;                    //这儿只发送0,用十六进制则显示30,用串口调
while(TI==0);
TI=0;
}
void main(void)
{
  unsigned char i;

  TMOD=0x15;
  TH0=0;
  TL0=0;
  TH1=(65536-4000)/256;
  TL1=(65536-4000)%256;
  TR1=1;
  TR0=1;
  ET0=1;
  ET1=1;
  EA=1;
  
  while(1)
   {
     if(flag==1)
       {
         flag=0;
         x=T0count*65536+TH0*256+TL0;
                  
         for(i=0;i<8;i++)
           {
             temp=0;
           }
         i=0;
         while(x/10)
           {
             temp=x%10;
             x=x/10;
             i++;
           }
         temp=x;
         for(i=0;i<6;i++)
           {
             dispbuf=temp;
           }
         timecount=0;
         T0count=0;
         TH0=0;
         TL0=0;
         TR0=1;
       }
   }
}

void t0(void) interrupt 1 using 0
{
  T0count++;
}

void t1(void) interrupt 3 using 0
{
  TH1=(65536-4000)/256;
  TL1=(65536-4000)%256;
  timecount++;
  if(timecount==250)
    {
      TR0=0;
      timecount=0;
      flag=1;
    }
  P0=dispcode[dispbuf[dispcount]];
  P2=dispbit[dispcount];
  dispcount++;
  if(dispcount==8)
    {
      dispcount=0;
    }
}

最新回复

我现在做的程序跟你的是一样的,我用到了T0作为频率计数器,T1作为定时器,T2用作串口发送,同时可以在数码管显示测出来的频率. #include #include #define uchar unsigned char #define uint unsigned int unsigned char senddata_hun=5; unsigned char senddata_ten; unsigned char senddata_low; unsigned char senddata_dot; unsigned char data display_buffer[5]; code unsigned char seg8code[]={0x3f,0x06,0x5b,0x4f,0x66,                                                                 0x6d,0x7d,0x07,0x7f,0x6f,0x00};//不带小数点的段显示 code unsigned char seg8code_dot[]={0xbf,0x86,0xdb,0xcf,0xe6,                                                                 0xed,0xfd,0x87,0xff,0xef,0x00};//带小数点的段显示 uint counter,sub; int temp,temp1; bit flag; void delay1(unsigned char m)                //延时程序 {         char j,k;         for(j=0;j0;k--); } void send(unsigned char dat) {     SBUF=dat;                    //这儿只发送0,用十六进制则显示30,用串口调     while(TI==0);     TI=0; } void dis_data(unsigned char *d)          //显示程序,P1作为片选,P2作为数码管八个段位驱动显示,共阳极接法 {    P1=0xFE;    P2=d[4];    delay1(10);    P1=0xfd;    P2=d[3];    delay1(10);    P1=0xfb;    P2=d[2];    delay1(10);    P1=0xf7;    P2=d[1];    delay1(10); } void data_process(int dat) {        int tho_wei,hun_wei,ten_wei,low_wei;                 tho_wei=dat/1000;         dat=dat%1000;                   hun_wei=dat/100;         dat=dat%100;         ten_wei=dat/10;         low_wei=dat%10;         display_buffer[1]=seg8code[tho_wei];         display_buffer[2]=seg8code[hun_wei];         display_buffer[3]=seg8code[ten_wei];         display_buffer[4]=seg8code[low_wei]; } void initial() {         TMOD=0x16;//设定T0和T1模式         ////////初始化标志位         temp=0;     counter=60;         flag=0;         //////////T1参数设定,每定时50MS 中断一次///         TH1=0x4C;         TL1=0x00;                          TR1=1;         ET1=1;         ///////////T0参数设定,每计数200次中断一下/////         TH0=0x38;         TL0=0x38;         TR0=1;         ET0=1;         ///////////串口通讯使用T2作为波特率发生器/////////////          TCLK=1;      TH2=0xFF;  //9600bps波特率      TL2=0xD9;      RCAP2H=0xFF;      RCAP2L=0xD9;      SCON=0x40;      TR2=1;         //////////////////////////         EA=1; } void main() {         initial();         while(1)         {        data_process(temp1);  //测出来的数据处理程序                 dis_data(display_buffer); //显示程序                 delay1(5);                 //延时                 if(flag)                 {                    send(senddata_hun);                  send(senddata_ten);                  send(senddata_low);                  send(senddata_dot);                                //分别发送四个字节的数据,分别是数码管显示器上的百位,十位,个位,和小数位                  initial();                 }         } } void time0_int(void) interrupt 1 {         temp++;                }                        void counter1_cou(void) interrupt 3 {         counter--;         if(!counter)         {             sub=TL0-56;                 flag=1;                 temp=temp*200+sub;                 temp1=temp;                 temp=0;                 EA=0;         }         TH1=0x4C;         TL1=0x00; } 复制代码   详情 回复 发表于 2008-9-11 22:20
点赞 关注

回复
举报

79

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
12M 用9600波特率误差很大,要用11.XXX的
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
那应该不影响频率计的程序啊?
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

4
 
12M 用9600波特率误差很大,要用11.0592MHZ的
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

5
 
你串口用中断方式就好了 ,呵呵软件死等的方法当然影响屏幕的显示了
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

6
 
呵呵,真是鱼和熊掌啊,改为中断方式后还是不行啊,要不就是不能传输数据,要不就是数码管没有数据显示,全0.
我把下面的频率计的程序屏蔽掉,能正常进入中断子程序啊,但是我一加上下面的程序之后,就只有数码管显示了。
我把发送子程序设为4号中断,这应该没有问题吧?
是否需要在发送的时候把其他两个中断屏蔽掉,或是干脆把0、1两个计数器关掉。
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

7
 
我现在做的程序跟你的是一样的,我用到了T0作为频率计数器,T1作为定时器,T2用作串口发送,同时可以在数码管显示测出来的频率.




  1. #include
  2. #include

  3. #define uchar unsigned char
  4. #define uint unsigned int


  5. unsigned char senddata_hun=5;
  6. unsigned char senddata_ten;
  7. unsigned char senddata_low;
  8. unsigned char senddata_dot;


  9. unsigned char data display_buffer[5];

  10. code unsigned char seg8code[]={0x3f,0x06,0x5b,0x4f,0x66,
  11.                                                                 0x6d,0x7d,0x07,0x7f,0x6f,0x00};//不带小数点的段显示
  12. code unsigned char seg8code_dot[]={0xbf,0x86,0xdb,0xcf,0xe6,
  13.                                                                 0xed,0xfd,0x87,0xff,0xef,0x00};//带小数点的段显示

  14. uint counter,sub;

  15. int temp,temp1;
  16. bit flag;

  17. void delay1(unsigned char m)                //延时程序
  18. {
  19.         char j,k;
  20.         for(j=0;j
  21.     for(k=125;k>0;k--);
  22. }


  23. void send(unsigned char dat)
  24. {
  25.     SBUF=dat;                    //这儿只发送0,用十六进制则显示30,用串口调
  26.     while(TI==0);
  27.     TI=0;
  28. }


  29. void dis_data(unsigned char *d)          //显示程序,P1作为片选,P2作为数码管八个段位驱动显示,共阳极接法
  30. {
  31.    P1=0xFE;
  32.    P2=d[4];
  33.    delay1(10);

  34.    P1=0xfd;
  35.    P2=d[3];
  36.    delay1(10);

  37.    P1=0xfb;
  38.    P2=d[2];
  39.    delay1(10);

  40.    P1=0xf7;
  41.    P2=d[1];
  42.    delay1(10);
  43. }

  44. void data_process(int dat)
  45. {        int tho_wei,hun_wei,ten_wei,low_wei;
  46.        
  47.         tho_wei=dat/1000;
  48.         dat=dat%1000;          

  49.         hun_wei=dat/100;
  50.         dat=dat%100;

  51.         ten_wei=dat/10;
  52.         low_wei=dat%10;

  53.         display_buffer[1]=seg8code[tho_wei];
  54.         display_buffer[2]=seg8code[hun_wei];
  55.         display_buffer[3]=seg8code[ten_wei];
  56.         display_buffer[4]=seg8code[low_wei];
  57. }

  58. void initial()
  59. {
  60.         TMOD=0x16;//设定T0和T1模式
  61.         ////////初始化标志位
  62.         temp=0;
  63.     counter=60;
  64.         flag=0;
  65.         //////////T1参数设定,每定时50MS 中断一次///
  66.         TH1=0x4C;
  67.         TL1=0x00;                 
  68.         TR1=1;
  69.         ET1=1;
  70.         ///////////T0参数设定,每计数200次中断一下/////
  71.         TH0=0x38;
  72.         TL0=0x38;
  73.         TR0=1;
  74.         ET0=1;
  75.         ///////////串口通讯使用T2作为波特率发生器/////////////
  76.          TCLK=1;
  77.      TH2=0xFF;  //9600bps波特率
  78.      TL2=0xD9;
  79.      RCAP2H=0xFF;
  80.      RCAP2L=0xD9;
  81.      SCON=0x40;
  82.      TR2=1;
  83.         //////////////////////////
  84.         EA=1;
  85. }


  86. void main()
  87. {
  88.         initial();
  89.         while(1)
  90.         {        data_process(temp1);  //测出来的数据处理程序
  91.                 dis_data(display_buffer); //显示程序
  92.                 delay1(5);                 //延时

  93.                 if(flag)
  94.                 {  
  95.                  send(senddata_hun);
  96.                  send(senddata_ten);
  97.                  send(senddata_low);
  98.                  send(senddata_dot);  
  99.                              //分别发送四个字节的数据,分别是数码管显示器上的百位,十位,个位,和小数位
  100.                  initial();
  101.                 }
  102.         }
  103. }


  104. void time0_int(void) interrupt 1
  105. {
  106.         temp++;               
  107. }               
  108.        
  109. void counter1_cou(void) interrupt 3
  110. {
  111.         counter--;
  112.         if(!counter)
  113.         {
  114.             sub=TL0-56;
  115.                 flag=1;
  116.                 temp=temp*200+sub;
  117.                 temp1=temp;
  118.                 temp=0;
  119.                 EA=0;

  120.         }
  121.         TH1=0x4C;
  122.         TL1=0x00;
  123. }


复制代码

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表