找回密码
 立即注册

QQ登录

只需一步,快速开始

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

tlc2543AD转换的实现

[复制链接]
跳转到指定楼层
楼主
代码如下
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. sbit CLOCK=P1^6; /*2543时钟*/
  4. sbit D_IN=P1^4 ;/*2543输入*/
  5. sbit D_OUT=P1^3; /*2543输出*/
  6. sbit _CS=P1^5; /*2543片选*/
  7. #define uint unsigned int
  8. #define uchar unsigned char
  9. uchar code string[16]={"value of v"};
  10. uchar code DispStr[16]={"TLM2543"};
  11. sbit lcden=P3^4;
  12. sbit lcdrs=P3^5;
  13. sbit dula=P2^6;
  14. sbit wela=P2^7;
  15. void display(); //待显温度值转换
  16. void delay(uchar n)
  17. {
  18.         uchar i;
  19.         for(i=0;i<n;i++)
  20.         {
  21.            _nop_();
  22.         }
  23. }
  24. uint read2543(uchar port)
  25. {
  26.         uint ad=0,i;
  27.         CLOCK=0;
  28.         _CS=0;
  29.         port<<=4;
  30.         for(i=0;i<12;i++)
  31.         {
  32.           if(D_OUT) ad|=0x01;
  33.           D_IN=(bit)(port&0x80);
  34.           CLOCK=1;
  35.           delay(3);
  36.           CLOCK=0;
  37.           delay(3);
  38.           port<<=1;
  39.           ad<<=1;
  40.         }
  41.         _CS=1;
  42.         ad>>=1;
  43.         return(ad);
  44. }
  45. void DelayMs(uint z)
  46. {
  47.         uint x,y;
  48.         for(x=z;x>0;x--)
  49.                 for(y=110;y>0;y--);               
  50. }
  51. void write_com(uchar com)//write common
  52. {
  53.         lcdrs=0;
  54.         P0=com;
  55.         DelayMs(5);
  56.         lcden=1;
  57.         DelayMs(5);
  58.         lcden=0;       
  59. }
  60. void write_data(uchar date)        //write data
  61. {
  62.         lcdrs=1;
  63.         P0=date;
  64.         DelayMs(5);
  65.         lcden=1;
  66.         DelayMs(5);
  67.         lcden=0;       
  68. }
  69. void LCDInit()
  70. {
  71.         dula=0;
  72.         wela=0;
  73.         lcden=0;
  74.         write_com(0x38);//dispaly mode
  75.         write_com(0x0c);// guanbiaoshanshuo
  76.         write_com(0x06);
  77.         write_com(0x01);//clear displayer
  78.         write_com(0x80);//*p
  79. }
  80. DisplayChar(uchar X, uchar Y, uchar DData)
  81. {
  82.         Y &= 0x1;
  83.         X &= 0xF; //限制X不能大于15,Y不能大于1
  84.         if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;
  85.         X |= 0x80; // 算出指令码
  86.         write_com(X); //这里不检测忙信号,发送地址码
  87.         write_data(DData);
  88.         return X;
  89. }
  90. DisplayStr(uchar X,uchar Y,uchar code *DData)
  91. {
  92.         uchar ListLength;
  93.         ListLength = 0;
  94.         Y &= 0x1;
  95.         X &= 0xF; //限制X不能大于15,Y不能大于1
  96.         while (DData[ListLength]>0x20) //若到达字
  97.         {
  98.                 if (X <= 0xF) //X坐标应小于0xF
  99.                            {
  100.                                  DisplayChar(X, Y, DData[ListLength]); //显示单个字符
  101.                                   ListLength++;
  102.                                  X++;
  103.                          }

  104.         }
  105.         return X ;
  106. }

  107. void main()
  108. {
  109.         uint ad,ad1,ad_val,ad_val1;
  110.         DelayMs(255);//等待电源稳定,液晶复位完成
  111.         LCDInit(); //1602 液晶初始化
  112.         DisplayStr(0,0,string);//显示"温度:"
  113.         DisplayStr(0,1,DispStr);//显示"系列号"
  114.         DelayMs(250);
  115.         DelayMs(250);
  116.         DelayMs(250);
  117.         DelayMs(250);
  118.         DelayMs(250);
  119.         write_com(0x01); // 清屏
  120.         DelayMs(50);
  121.         ad=read2543(0);
  122.         DelayMs(50);
  123.         ad1=read2543(1);
  124.         ad_val = (uint)(((ad*5.0)/4096.0)*10000);
  125.         ad_val1 = (uint)(((ad1*5.0)/4096.0)*10000);
  126.         while(1)
  127.         {
  128.            display();
  129.         }
  130. }
  131. void display()
  132. {
  133.         uint ad_val,ad_val1;
  134.         uint ge,x1,x2,x3,x4,ge1,x11,x21,x31,x41;
  135.     ge = ad_val/10000;        
  136.     x1 = ad_val%10000/1000;
  137.     x2 = ad_val%1000/100;
  138.     x3 = ad_val%100/10;
  139.     x4 = ad_val%10;
  140.         ge1 = ad_val1/10000;        
  141.     x11 = ad_val1%10000/1000;
  142.     x21 = ad_val1%1000/100;
  143.     x31 = ad_val1%100/10;
  144.     x41 = ad_val1%10;
  145.         DisplayChar(4,0,ge+0x30);//个位
  146.         DisplayChar(5,0,0x2e); //小数点 .
  147.         DisplayChar(6,0,x1+0x30);
  148.         DisplayChar(7,0,x2+0x30);
  149.         DisplayChar(8,0,x3+0x30);
  150.         DisplayChar(9,0,x4+0x30);
  151.     DisplayChar(10,0,'V');  
  152.         DisplayChar(4,1,ge1+0x30);//个位
  153.         DisplayChar(5,1,0x2e); //小数点 .
  154.         DisplayChar(6,1,x11+0x30);
  155.         DisplayChar(7,1,x21+0x30);
  156.         DisplayChar(8,1,x31+0x30);
  157.         DisplayChar(9,1,x41+0x30);
  158.     DisplayChar(10,1,'V');            
  159.     ad_val = (uint)(((read2543(0)*5.0)/4096.0)*10000);//不断扫描
  160.         ad_val1 = (uint)(((read2543(1)*5.0)/4096.0)*10000);//不断扫描         
  161. }
复制代码


仿真结果.png (33.43 KB, 下载次数: 34)

仿真结果.png

原理图.png (53.52 KB, 下载次数: 43)

原理图.png
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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