找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 444|回复: 1
打印 上一主题 下一主题
收起左侧

基于51单片机的TCL2543源程序

[复制链接]
跳转到指定楼层
楼主
ID:1034876 发表于 2023-5-13 21:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
#define ulong unsigned long
ulong volt;//测量的电压值
uchar code led[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//7段数码管显示0-9的对应电平码
uint vtime;        // 用来控制测量地址位的改变
uchar addr;//测量地址位,指示测量的是哪一个模拟值 (其实就是TLC2543的控制字)
uchar xu[5];
float a;
sbit LW1=P2^3;//数码管电压显示值的第1个                比如四个数码管显示4.885值中,对应显示4这个数码管
sbit LW2=P2^2;//数码管电压显示值的第2个
sbit LW3=P2^1;//数码管电压显示值的第3个
sbit LW4=P2^0;//数码管电压显示值的第4个

sbit CLK=P1^7;//定义时钟信号口
sbit DIN=P1^6;//定义2543数据写入口
sbit DOUT=P1^5;//定义2543数据读取口
sbit CS=P1^4;//定义2543片选信号口
sbit beep=P3^6;

/**********************************************************/
//函数名:delay(uint x)
//功能:延时程序 改变测量地址         
//调用函数:
//输入参数:x
//输出参数:
//说明:
/**********************************************************/
void delay(uint x)
{
        uchar y,z;
        for(y=x;y>0;y--)
                for(z=250;z>0;z--);//该步运行时间约为0.5ms
                vtime++;
                if(vtime==1000)
                {
                        vtime=0;
//                        addr++;
//                        if(addr==3)
//                                addr=0;//以上语句实现测量地址位的改变               
                }        
}
/**********************************************************/
//函数名:read2543(uchar addr)
//功能:2543驱动程序
//调用函数:
//输入参数:addr
//输出参数:
//说明:进行ad转换将结果存于volt变量中 addr为测量位地址
/**********************************************************/
void read2543(uchar addr)
{
        uint ad=0;
        uchar i;
        CLK=0;
        CS=0;//片选段,启动2543
        addr<<=4;//对地址位预处理
        for(i=0;i<12;i++) //12个时钟走完,完成一次读取测量
        {
                if(DOUT==1)
                        ad=ad|0x01;//单片机读取ad数据
                DIN=addr&0x80;//2543读取测量地址位
                CLK=1;
                ;;;//很短的延时
                CLK=0;//产生下降沿,产生时钟信号
                ;;;
                addr<<=1;
                ad<<=1;//将数据移位准备下一位的读写
        }
        CS=1;//关2543
        ad>>=1;
        volt=ad;//取走转换结果
        volt=volt*1221;//例子的满量程为5V,转换分辩率为12位(2的12次方=4096) 。即最大值是255,5/4096=1221mV,即例子中的1V代表实际1221mV      
    xu[0] = (volt/1000000);   //1
    xu[1] = (volt/100000)%10;   //0.001
    xu[2] = (volt/10000)%10;     //0.01
    xu[3] =(volt/1000)%10;      //0.1
          a=(xu[0]+xu[1]*0.001+xu[2]*0.01+xu[3]*0.1);
}
/**********************************************************/
//函数名:display()
//功能:5位数码管显示
//调用函数:delay(uint x)
//输入参数:
//输出参数:
//说明:将处理后的电压值与测量位值显示在5位数码管上
/**********************************************************/
void display()
{

        P0=0xff;//消隐,因为不断进行循环显示,以防上次显示有残留电平的影响
        LW1=1;        //选中第1个数码管进行显示
        P0=~led[volt/1000000]&0x7f;//带小数点1伏显示位
        delay(2);  //延时
        P0=0xff;  //消隐
        LW1=0;        //取消选中第1个数码管进行显示
        LW2=1;        //选中第2个数码管进行显示
        P0=~led[(volt/100000)%10];//100毫伏显示位
        delay(2);
        P0=0xff;
        LW2=0;
        LW3=1;
        P0=~led[(volt/10000)%10];//10毫伏显示位
        delay(2);
        P0=0xff;
        LW3=0;
        LW4=1;
        P0=~led[(volt/1000)%10];//1毫伏显示位
        delay(2);
        P0=0xff;
        LW4=0;                        
}

void key()
{

if(a>=4.096)
{
beep=0;

}
if(a<4.096){
beep=1;
display();

}



}

/**********************************************************/
//主程序
/**********************************************************/
void main()
{
//beep=0;
read2543(0);
        while(1)
        {

    key();
                read2543(0);//调用2543驱动程序测量地址为0

               
               
        }
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1034876 发表于 2023-5-13 22:00 | 只看该作者
第一次
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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