找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1004|回复: 5
收起左侧

单片机定时器求助

[复制链接]
ID:437615 发表于 2019-9-30 19:20 | 显示全部楼层 |阅读模式
50黑币
用hx711和STC8a8k单片机,做一个称重,我并不是要做电子秤,就自己写了一个程序,写完了以后调试了一整天,但就是用不了,请求各位大神帮我看看,这个程序哪里问题,这些乱码在keil上好像是可以重新显示出字,


#include<stc8.h>
#define u8 unsigned char
#define u16 unsigned int
         

sbit scl=P1^0;         
sbit sda=P1^1;


sbit DUAN5=P0^5;      
sbit DUAN4=P0^4;
sbit DUAN3=P0^3;
sbit DUAN2=P0^2;
sbit DUAN1=P0^1;
sbit DUAN0=P0^0;

void Init_Timer0();   
unsigned long HX711_Read(void);
void xianshi(u16 ,u16 );
void delay(u16);   
void Delay10us();

u16 flag = 0;
unsigned int ds ;
u16 di[6];


void main(void)
{
        
        delay(300);
        Init_Timer0();
        
        while(1)
        {
                if(flag==500)
                {
                        ds = (unsigned int)((float)HX711_Read()/445);
                        flag=0;
                }        
        /**¡¡2e·ÖóÃóúêyÂë1üÏÔê¾**/
               
                di[5]=ds/100000;
                di[4]=ds/10000%10;
                di[3]=ds/1000%10;
                di[2]=ds/100%10;
                di[1]=ds/10%10;
                di[0]=ds%10;

               
                xianshi(di[5] ,5 );
                delay(2);
                xianshi(di[4] ,4 );
                delay(2);
                xianshi(di[3] ,3 );
                delay(2);
                xianshi(di[2] ,2 );
                delay(2);
                xianshi(di[1] ,1 );
                delay(2);
                xianshi(di[0] ,0 );
                delay(2);

               

               
        }               

}

void Init_Timer0()
{
        AUXR |= 0x80;               
        TMOD &= 0xF0;               
        TMOD |= 0x01;               
        TL0 = 0xcd;                //1ms        
        TH0 = 0xd4;
        TF0 = 0;
        ET0 = 1;                           
        EA = 1;        
        TR0 = 1;
}

void Timer0() interrupt 1
{

        TL0 = 0xcd;               
        TH0 = 0xd4;
        flag++;

}

unsigned long HX711_Read(void)   
{
        unsigned long count;
        unsigned char i;
          sda=1;
        Delay10us();
          scl=0;
          count=0;
        EA = 1;
          while(sda);
        EA = 0;
          for(i=0;i<24;i++)
        {
                  scl=1;
                  count=count<<1;
                scl=0;
                  if(sda)
                        count++;
        }
         scl=1;
    count=count^0x800000;//μú25¸öÂö3åϽμÑØà′ê±£¬×a»»êy¾Y
        Delay10us();
        scl=0;  
        return(count);
}

void Delay10us()               
{
        unsigned char i;

        
        i = 25;
        while (--i);
}

void delay(u16 a)
{
        u16 i, j;

        
        for(i=0;i<a;i++)
                {
                        for(j=1000;j>0;j--);
                }
}

void xianshi(u16 dat,u16 duan)
{
               
                DUAN0=1;
                DUAN5=1;
                DUAN4=1;
                DUAN3=1;
                DUAN2=1;
                DUAN1=1;
               
         switch (duan)
                {
                        case 0:
                                        DUAN0=0;
                                        P2=dat;
                                        break;
                        case 1:
                                        DUAN1=0;
                                        P2=dat;
                                        break;
                        case 2:
                                        DUAN2=0;
                                        P2=dat;
                                        break;
                        case 3:
                                        DUAN3=0;
                                        P2=dat;
                                        break;
                        case 4:
                                        DUAN4=0;
                                        P2=dat;
                                        break;
                        case 5:
                                        DUAN5=0;
                                        P2=dat;
                                        break;
                }

}

最佳答案

查看完整内容

不是定时器出了问题,而是中断出来问题。楼主在HX711_Read(void)程序中只短暂打开总中断,T0中断怎么能正常工作? EA = 1; while(sda); EA = 0; 楼主用的什么显示器?看程序像是用的数码管。难道这个数码管自带译码器?常见的数码管是不能直接显示0~9的数字,而是要译成“8”字段码显示。
回复

使用道具 举报

ID:213173 发表于 2019-9-30 19:20 | 显示全部楼层
不是定时器出了问题,而是中断出来问题。楼主在HX711_Read(void)程序中只短暂打开总中断,T0中断怎么能正常工作?
        EA = 1;
        while(sda);
        EA = 0;

楼主用的什么显示器?看程序像是用的数码管。难道这个数码管自带译码器?常见的数码管是不能直接显示0~9的数字,而是要译成“8”字段码显示。
回复

使用道具 举报

ID:123289 发表于 2019-10-1 16:32 | 显示全部楼层
不知道你想求助什么?说是定时器,是定时器的什么呢?建议先看书中关于定时器的章节。
回复

使用道具 举报

ID:437615 发表于 2019-10-2 08:31 来自手机 | 显示全部楼层
yzwzfyz 发表于 2019-10-1 16:32
不知道你想求助什么?说是定时器,是定时器的什么呢?建议先看书中关于定时器的章节。

我这个是用cd4511驱动的数码管。如果在主函数里面直接计算重量的话。数码管会闪烁的非常厉害,显示不出字来。如果用定时器中断来控制重量计算的时间,开机后数码管上只显示一次数字,然后这个数字就固定住,不会再变了。改变重量也不变。
回复

使用道具 举报

ID:437615 发表于 2019-10-2 09:33 来自手机 | 显示全部楼层
wulin 发表于 2019-10-2 07:17
不是定时器出了问题,而是中断出来问题。楼主在HX711_Read(void)程序中只短暂打开总中断,T0中断怎么能正常 ...

谢谢指教,我回去查一下看看。我是用cd4511驱动的数码管,我在主函数里面计算重量的时候呢,数码管闪烁的非常厉害。就最后一位会亮。如果我用中断计时来计算重量。数码管可以全亮,但是数值没有变化了。传感器上面放不放东西都一样。
回复

使用道具 举报

ID:437615 发表于 2019-10-4 17:32 | 显示全部楼层
wulin 发表于 2019-9-30 19:20
不是定时器出了问题,而是中断出来问题。楼主在HX711_Read(void)程序中只短暂打开总中断,T0中断怎么能正常 ...

谢谢大神,果然,按照您说的问题解决,
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表