找回密码
 立即注册

QQ登录

只需一步,快速开始

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

acs712和TLC549检测电流在LCD上显示 单片机程序哪儿出问题?

[复制链接]
回帖奖励 5 黑币 回复本帖可获得 5 黑币奖励! 每人限 1 次
跳转到指定楼层
楼主


单片机源程序如下:
  1. #include<reg52.h>
  2. #include<intrins.h>

  3. #define uchar unsigned char
  4. #define uint unsigned int

  5. void delay(uchar ms);    //延时函数
  6. void wr_com(unsigned char com);    //写入指令数据到LCD
  7. void wr_dat(unsigned char dat);    //写入字符显示数据到LCD
  8. void xianshi(uchar dizhi, uchar suzi);   //单独写数到液晶函数 ( 地址  数据 )
  9. //uchar TLC549_ADC(void);   //TLC549模数转换
  10. //uchar get_cur(void);
  11. void uart_init();         //串口初始化函数

  12. sbit rs = P2^0;
  13. sbit rw = P2^1;
  14. sbit e = P2^2;

  15. sbit DI  = P1^0;
  16. sbit CS  = P1^1;
  17. sbit CLK = P1^2;

  18. uchar ad_0;
  19. uint AD;


  20. ////-------------------------------------
  21. ////                    主函数
  22. ////-------------------------------------
  23. //void main()
  24. //{
  25. //        uart_init();
  26. //        wr_com(0x01);    //显示清屏
  27. //        wr_com(0x38);   //显示模式设置
  28. //                wr_com(0x0c);     //光标设置
  29. //        while(1)
  30. //         {
  31. //          delay(100);
  32. //          ad_0=TLC549_ADC();
  33. //    AD=ad_0*1.97
  34. //          xianshi(0x80+2,'A');
  35. //          xianshi(0x80+3,'=');
  36. //          xianshi(0x80+5,0x30+AD%1000/100);
  37. //          xianshi(0x80+6,'.');
  38. //          xianshi(0x80+7,0x30+AD%100/10);
  39. //          xianshi(0x80+8,0x30+AD%10);
  40. //          xianshi(0x80+9,'A');
  41. //        }
  42. //}

  43. //----------------------------------
  44. //               延时子程序
  45. //----------------------------------
  46. void delay(uchar ms)   
  47. {      
  48.          uchar i ;
  49.          while(ms--)
  50.          {
  51.                   for(i = 0 ; i<250;i++) ;
  52.          }
  53. }

  54. //-------------------------------------
  55. //         写入指令数据到LCD
  56. //-------------------------------------
  57. void wr_com(unsigned char com)   
  58. {      

  59.          rs = 0 ;
  60.           rw = 0 ;
  61.           e = 0 ;
  62.           P0 = com ; //P0=D0-D7
  63.         delay(1);
  64.           e = 1 ;//清屏 上升沿写入命令
  65.         delay(1);
  66.           e = 0 ;
  67. }               
  68.            
  69. //-------------------------------------------------
  70. //             写入字符显示数据到LCD
  71. //--------------------------------------------------
  72. void wr_dat(unsigned char dat)
  73. {      

  74.          rs = 1 ;
  75.           rw = 0 ;
  76.           e = 0 ;
  77.           P0 = dat ;
  78.                 delay(1);
  79.           e = 1 ;  //E上升沿写入数据
  80.         delay(1);
  81.           e = 0 ;
  82. }

  83. //------------------------------------------------------
  84. //     单独写数到液晶函数 ( 地址  数据 )
  85. //------------------------------------------------------
  86. void xianshi(uchar dizhi, uchar suzi)
  87. {
  88.                  wr_com(dizhi);
  89.          wr_dat(suzi);
  90. }

  91. //-----------------------------------------
  92. //            TLC549模数转换
  93. //-----------------------------------------
  94. uchar TLC549_ADC(uchar ain)
  95. {
  96.            uchar n, tmp;

  97.         CS  = 1;                     //CS置高,片选无效
  98.         CLK = 0;

  99.         CS  = 0;                     //CS置低,片选有效,同时DO输出高位
  100.         _nop_();
  101.         _nop_();                     //适当延迟时间1.4us Setup Time

  102.         for(n = 0; n < 8; n++) //串行数据移位输入
  103.         {
  104.                 tmp <<= 1;//每个高电平时钟读取1个bit,8个时钟可以读取1个byte的转换结果,数据高位先读取
  105.                 tmp |=  DI;//程序中用八次循环,可以读出一个字节的转换结果

  106.                 CLK = 1;        //0.4us
  107.                 _nop_();        //延迟0.1us
  108.                 CLK = 0;        //0.4us
  109.         }
  110.         CS = 1;            //CS置高,片选无效
  111.         for(n = 17; n != 0; n--) _nop_();  //下一次转换需要延迟17us   n不等于0
  112.         return (tmp);

  113. }
  114. uint get_cur()
  115. {
  116.         uint vol,cur_1;
  117.         vol = TLC549_ADC(0) * 0.49; //输入adc电压的100倍。4.9=5(参照电压)*/1024(10位)*100(用于显示)
  118.         cur_1 = 5*vol-1250; //实际电流的100倍用于显示,cur_real=(vol_real-2.5)*5
  119.         return cur_1;
  120. }
  121. //------------------------------------------
  122. //              串口初始化函数 一样
  123. //------------------------------------------
  124. void uart_init()
  125. {
  126.         TMOD=0x20;                //9600bps
  127.         SCON=0x50;
  128.         TH1=0xFD;
  129.         TL1=0xFD;
  130.         TR1=1;
  131.         EA=1;
  132. }
  133. //-------------------------------------
  134. //                    主函数
  135. //-------------------------------------
  136. void main()
  137. {
  138.         uart_init();
  139.         wr_com(0x01);    //显示清屏
  140.         wr_com(0x38);   //显示模式设置
  141.     wr_com(0x0c);     //光标设置
  142.         while(1)
  143.          {
  144.           delay(100);
  145.           AD=get_cur();
  146.           //AD=5*ad_0-1250;
  147.           xianshi(0x80+2,'A');
  148.           xianshi(0x80+3,'=');
  149.           xianshi(0x80+5,0x30+AD%1000/100);
  150.           xianshi(0x80+6,'.');
  151.           xianshi(0x80+7,0x30+AD%100/10);
  152.           xianshi(0x80+8,0x30+AD%10);
  153.           xianshi(0x80+9,'A');
  154.         }
  155. }
复制代码


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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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