数码之家

 找回密码
 立即注册
搜索
查看: 1947|回复: 2

[C51] 求助!!!AD采集数码管显示闪烁问题?

[复制链接]
发表于 2019-5-20 11:51:15 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册

x
我在中断里面写的数码管显示程序,为什么AD采集数据在数码管显示会闪烁???求帮助!附代码:
#include<stc15f2k60s2.h>
#include "iic.h"
#include "ds1302.h"
#include "onewire.h"
#include "intrins.h"

extern uchar shijian[7];
       
uchar code tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0XBF,0XFF,0XC6,0X89};
uchar digcom,wendu,shidu,jiejin,light;
uchar digbuf[]={11,11,11,11,11,11,11,11};
uchar S4,S5,flag;

void delayms(int ms);
void keyscan(void);
void Timer0Init(void);
void display(void);

void main(void)
{
        P0=0XFF;P2=0X80;P0=0XFF;P2=0;
        P0=0X00;P2=0XA0;P0=0X00;P2=0;
        Tempget();
        delayms(750);
        Timer0Init();
        DS_init();

        while(1)
        {
                DS_get();
                keyscan();
                shidu=AD_read(0X03)/2.57;
                wendu=Tempget();
                       
       
                if(S5==0)
                {
                        digbuf[0]=wendu%100/10;digbuf[1]=wendu%10;digbuf[2]=12;digbuf[3]=11;digbuf[4]=11;digbuf[5]=shidu/10;digbuf[6]=shidu%10;digbuf[7]=13;
                }
                else if(S5==1)
                {
                        digbuf[0]=shijian[2]/10;digbuf[1]=shijian[2]%10;digbuf[3]=shijian[1]/10;digbuf[4]=shijian[1]%10;digbuf[6]=shijian[0]/10;digbuf[7]=shijian[0]%10;
                        if(shijian[0]%2==0)
                        {
                                digbuf[2]=10;digbuf[5]=10;
                        }
                        else
                        {
                                digbuf[2]=11;digbuf[5]=11;
                        }
                       
                }
                else if(S5==2)
                {
                        digbuf[0]=11;digbuf[1]=11;digbuf[2]=11;digbuf[3]=10;digbuf[4]=0;digbuf[5]=0;digbuf[6]=0;digbuf[7]=0;
                }
        }
}

void keyscan(void)
{
        if(P32==0)
        {
                delayms(5);
                if(P32==0)
                {
                        if(S5==0){S5=1;}
                        else if(S5==1){S5=2;}
                        else if(S5==2){S5=0;}
                }
                while(!P32);
        }
        if(P33==0)
        {
                delayms(5);
                if(P33==0)
                {
                        if(S4==0){S4=1;}
                        else if(S4==1){S4=0;}
                }
                while(!P33);
        }
}

void Timer0Init(void)                //1毫秒@11.0592MHz
{
        AUXR |= 0x80;                //定时器时钟1T模式
        TMOD &= 0xF0;                //设置定时器模式
        TL0 = 0x9A;                //设置定时初值
        TH0 = 0xA9;                //设置定时初值
        TF0 = 0;                //清除TF0标志
        TR0 = 1;                //定时器0开始计时
        EA=1;
        ET0=1;
}

void tm0_isr() interrupt 1
{
       
        display();
}

void display(void)
{
        P2=(P2&0X1F)|0XE0;
        P0=0XFF;
        P2&=0X1F;
       
        P2=(P2&0X1F)|0XC0;
        P0=1<<digcom;
        P2&=0X1F;
       
        P2=(P2&0X1F)|0XE0;
        P0=tab[digbuf[digcom]];
        P2&=0X1F;
       
        if(++digcom==8)digcom=0;
}

void delayms(int ms)
{
        int i,j;
        for(i=0;i<ms;i++)
                for(j=845;j>0;j--);
}

发表于 2019-5-20 17:21:44 | 显示全部楼层
AD采集数码管闪,其他代码都贴了,AD采集代码不贴,看啥:sleepy:
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-5-20 21:02:04 | 显示全部楼层
飞向狙沙 发表于 2019-5-20 17:21
AD采集数码管闪,其他代码都贴了,AD采集代码不贴,看啥

AD采集代码:
#include<stc15f2k60s2.h>
#include "iic.h"
#include "intrins.h"

#define DELAY_TIME 20

#define SlaveAddrW 0xA0
#define SlaveAddrR 0xA1

//总线引脚定义
sbit SDA = P2^1;  /* 数据线 */
sbit SCL = P2^0;  /* 时钟线 */

void IIC_Delay(unsigned char i)
{
    do{_nop_();}
    while(i--);        
}
//总线启动条件
void IIC_Start(void)
{
    SDA = 1;
    SCL = 1;
    IIC_Delay(DELAY_TIME);
    SDA = 0;
    IIC_Delay(DELAY_TIME);
    SCL = 0;       
}

//总线停止条件
void IIC_Stop(void)
{
    SDA = 0;
    SCL = 1;
    IIC_Delay(DELAY_TIME);
    SDA = 1;
    IIC_Delay(DELAY_TIME);
}

//等待应答
bit IIC_WaitAck(void)
{
    bit ackbit;
       
    SCL  = 1;
    IIC_Delay(DELAY_TIME);
    ackbit = SDA;
    SCL = 0;
    IIC_Delay(DELAY_TIME);
    return ackbit;
}

//通过I2C总线发送数据
void IIC_SendByte(unsigned char byt)
{
    unsigned char i;

    for(i=0; i<8; i++)
    {
        SCL  = 0;
        IIC_Delay(DELAY_TIME);
        if(byt & 0x80) SDA  = 1;
        else SDA  = 0;
        IIC_Delay(DELAY_TIME);
        SCL = 1;
        byt <<= 1;
        IIC_Delay(DELAY_TIME);
    }
    SCL  = 0;  
}

//从I2C总线上接收数据
unsigned char IIC_RecByte(void)
{
    unsigned char i, da;
    for(i=0; i<8; i++)
    {   
            SCL = 1;
        IIC_Delay(DELAY_TIME);
        da <<= 1;
        if(SDA) da |= 1;
        SCL = 0;
        IIC_Delay(DELAY_TIME);
    }
    return da;   
}

uchar AD_read(uchar add)
{
        uchar temp;
        EA=0;
        IIC_Start();
        IIC_SendByte(0X90);
        IIC_WaitAck();
        IIC_SendByte(add);
        IIC_WaitAck();
        IIC_Stop();
       
        IIC_Start();
        IIC_SendByte(0X91);
        IIC_WaitAck();
        temp=IIC_RecByte();
        IIC_Stop();
        EA=1;
        return temp;
}
回复 支持 反对

使用道具 举报

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

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2024-3-29 15:36 , Processed in 0.171600 second(s), 12 queries , Redis On.

Powered by Discuz!

© 2006-2023 smzj.net

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