target11 发表于 2012-5-8 16:44:16

简单数字电压表、tlc549仿真程序加图

本帖最后由 target11 于 2012-5-8 17:15 编辑

以下是c代码,附件里也有:
#include <reg52.h>   
#include <intrins.h>    //_nop_()
#include <stdio.h>

#define uchar unsigned char   
#define uint unsigned int

//数码管查找显示
uchar code px={0x08,0x04,0x02,0x01};                                                       
uchar code sk={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

//引脚定义   
sbit    CLK=P3^4;   
sbit    DATA=P3^2;   
sbit    CS=P3^3;
static uintj=0;   //存十进制数据

void display(uint *q)//数码显示
{        uint r;
        for(r=0;r<4;r++)
        {
                P0=px;
                P2=sk[*(q+r)];
        }       
}
      
uchar tlc549_ad_read(void) //ad读取
{        uchar i,da1=0x00;
        CLK=0;
        CS=0;
        DATA=1;                      //置位准备读
        i=8;                   //读8位
        while(i!=0)
        {        i--;
                da1=da1<<1;
                _nop_();
                CLK=1;
                da1|=DATA;
                _nop_();
                CLK=0;       
        }
        P1=da1;          //读到的数据送显示
        CLK=1;
        CS=1;
        return(da1);
}

void timer1() interrupt 3 using 0       //定时采集
{                  uchar k,adc_data;
                adc_data=tlc549_ad_read();
                display(j);
                for(k=0;k<4;k++)   //转十进制存j【】中
                {
                        j=adc_data%10;
                        adc_data/=10;
                }
}

void main()   
{      
        TMOD|=0X10;
        TH1=(65536-50000)/256;
        TL1=(65536-50000)%256;
        ET1=1;
        TR1=1;
        EA=1;
        CS=1;
        CLK=1;
        while(1)
        {   
                display(j);       //显示
        }          
}

我想转十进制显示的,可是怎么会有a出现,电脑看太久,有些晕了
求帮助,求意见啊
前两天做了个电源,出了实验室就没地方测了
0.0手上有个1549,所以想着做个简单的电压表
tlc1549和549差别大吗?
先仿真下tlc549,真是想想容易动手难~~基础做起
{:sad:} 逛了很久,很喜欢这个论坛,第一次发帖,给个机会吧
附件里仿真电路图文件是proteus的,别的软件还不会用,0.0,不要嫌弃阿

target11 发表于 2012-5-8 16:47:00

哪位大侠空了,帮我看看吧{:3_44:}我转的十进制错了,怎么改好

target11 发表于 2012-5-8 19:19:35

给点点意见吧,我真心喜欢电子

target11 发表于 2012-5-9 19:04:04

咦~~一天了还没个回复,桑心类{:funk:}

liweiqiang668 发表于 2012-5-9 19:33:57

本帖最后由 liweiqiang668 于 2012-5-9 19:40 编辑

在我電腦上無法仿真,你這樣改試試,       
                      {
                        j=adc_data%10;
                        adc_data/=10;
                }
                               改為以下試試:
                      {
                        j=adc_data%10;//取個位
                        adc_data=adc_data/10%10;//取十位
                                                
                }
如果一個數為162,16位時就是A2,你用%10取個位得到2,用/=10得到的卻時A,所以顯示就會變成a,需再%10轉換為10進制.

target11 发表于 2012-5-9 21:02:27

本帖最后由 target11 于 2012-5-10 17:43 编辑

liweiqiang668 发表于 2012-5-9 19:33 static/image/common/back.gif
在我電腦上無法仿真,你這樣改試試,       
                      {
                        j=adc_data%10;


谢谢您呢,刚刚查出来了哦,不是转换的错,是每位显示前没清,所以和前一位数字串了,出现乱码

以下是刚改好的:
#include <reg52.h>   
#include <intrins.h>    //_nop_()
#include <stdio.h>

#define uchar unsigned char   
#define uint unsigned int

//数码管查找显示
uchar code px={0x08,0x04,0x02,0x01};                                                       
uchar code sk={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

//引脚定义   
sbit    CLK=P3^4;   
sbit    DATA=P3^2;   
sbit    CS=P3^3;
uintj={0,0,0,0};   //存十进制数据

void tlc549_ad_read(void) //ad读取
{        uint i,da1=0x00;
        CLK=0;
        CS=0;
        DATA=1;                      //置位准备读
        i=8;
        while(i>0)
        {        i--;
                da1<<=1;
                CLK=1;
                _nop_();
                if(DATA)da1++;
                CLK=0;
        }
        P1=da1;          //读到的数据送显示
        CLK=1;
        CS=1;
        for(i=0;i<4;i++)             //转十进制存j【】中
        {       
                j=da1%10;
                da1=da1/10;
        }
}

void display(uint *q)//数码显示
{        uint r;
                for(r=0;r<4;r++)
                {        P2=0xff;
                        P0=px;
                        P2=sk[*(q+r)];
                        _nop_();
                        _nop_();
                        _nop_();
                        _nop_();
                        _nop_();
                        _nop_();
                               
                }       
}

void timer1() interrupt 3 using 0       //定时采集
{        TH1=(65536-50000)/256;
        TL1=(65536-50000)%256;
        display(&j);
                tlc549_ad_read();       
}

void main()   
{      
        TMOD|=0X10;
        TH1=(65536-50000)/256;
        TL1=(65536-50000)%256;
        ET1=1;
        TR1=1;
        EA=1;
        CS=1;
        CLK=1;
        while(1)
        {   
                display(&j);       //显示
        }          
}
这次ok了,流畅显示,小东西也有技巧的。
页: [1]
查看完整版本: 简单数字电压表、tlc549仿真程序加图