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

2020-02-05 09:26发布

本帖最后由 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[4]={0x08,0x04,0x02,0x01};                                                       
uchar code sk[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

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

void display(uint *q)  //数码显示
{        uint r;
        for(r=0;r<4;r++)
        {
                P0=px[r];
                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[k]=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,真是想想容易动手难~~基础做起
逛了很久,很喜欢这个论坛,第一次发帖,给个机会吧
附件里仿真电路图文件是proteus的,别的软件还不会用,0.0,不要嫌弃阿
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
target11
1楼-- · 2020-02-05 12:55
哪位大侠空了,帮我看看吧我转的十进制错了,怎么改好
target11
2楼-- · 2020-02-05 18:52
 精彩回答 2  元偷偷看……
target11
3楼-- · 2020-02-06 00:28
咦~~一天了还没个回复,桑心类
liweiqiang668
4楼-- · 2020-02-06 02:59
本帖最后由 liweiqiang668 于 2012-5-9 19:40 编辑

在我電腦上無法仿真,你這樣改試試,       
                        {
                        j[k]=adc_data%10;
                        adc_data/=10;
                }
                               改為以下試試:
                        {
                        j[k]=adc_data%10;//取個位
                        adc_data=adc_data/10%10;//取十位
                                                
                }
如果一個數為162,16位時就是A2,你用%10取個位得到2,用/=10得到的卻時A,所以顯示就會變成a,需再%10轉換為10進制.
target11
5楼-- · 2020-02-06 06:37
本帖最后由 target11 于 2012-5-10 17:43 编辑
liweiqiang668 发表于 2012-5-9 19:33
在我電腦上無法仿真,你這樣改試試,       
                        {
                        j[k]=adc_data%10;


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

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

#define uchar unsigned char   
#define uint unsigned int

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

//引脚定义   
sbit    CLK=P3^4;   
sbit    DATA=P3^2;   
sbit    CS=P3^3;
uint  j[4]={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[r];
                        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了,流畅显示,小东西也有技巧的。

一周热门 更多>