找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3643|回复: 1
收起左侧

基于51单片机的TCL1865电压测量仿真程序

[复制链接]
ID:222878 发表于 2017-7-27 21:53 | 显示全部楼层 |阅读模式
基于51单片机的TCL1865电压测量仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0.png
0.png

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

  3. #define uchar unsigned char
  4. #define uint  unsigned int
  5. #define ulong unsigned long

  6. #define disp_dot 0x2e
  7. #define disp_V   0x56



  8. #define data1602 P0                // 定义LCD1602数据接口

  9. uchar code disp_code[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};

  10. ulong voltage_data;

  11. sbit rs1602 = P2^4;                  
  12. sbit rw1602 = P2^5;
  13. sbit e1602  = P2^6;


  14. sbit CONV=P1^0;
  15. sbit SCK=P1^1;
  16. sbit SDO=P1^2;
  17. sbit SDI =P1^3;

  18. void delay (uint ms)
  19. {
  20.         uint i,j;
  21.         for(i=ms;i>0;i--)
  22.                 for(j=110;j>0;j--);
  23. }


  24. /*        LCD1602写入数据        */
  25. void write_1602(uchar wdata)
  26. {
  27. data1602 = wdata;
  28. rs1602   = 1;
  29. rw1602   = 0;
  30. e1602    = 1;
  31. delay(4);
  32. e1602    = 0;
  33. }


  34.        
  35. /*LCD1602写命令*/
  36. void write_order(uchar odata)//
  37. {
  38. data1602 = odata;
  39. rs1602   = 0;
  40. rw1602   = 0;
  41. e1602    = 1;
  42. delay(4);
  43. e1602    = 0;
  44. }

  45. /*LCD1602初始化*/
  46. void init_1602(void)//
  47. {
  48. write_order(0x01);                                            // 清屏幕
  49. write_order(0x38);                                                // 数据长度为8位,双行显示,5*7字符
  50. write_order(0x0c);                                                // 打开显示开关,光标不闪烁
  51. write_order(0x06);                                                // 地址计数递增,显示屏不移动
  52. }

  53. /*LCD1602写位置*/
  54. void position(uchar row,uchar colum)
  55. {
  56. uchar pos;
  57. if(row==1)
  58.    {
  59.          pos=0x80+colum;
  60.    }
  61. else
  62.    {
  63.      pos=0xC0+colum;   
  64.      
  65.    }
  66.         write_order(pos);
  67. }
  68. /*LCD1602字符串*/
  69. void write_byte(uchar *s)//
  70. {
  71. for(;*s!='\0';s++)
  72.    {
  73.      write_1602(*s);
  74.    }
  75. }
  76.   /*读LTC1865通道0的AD值*/
  77. void read_adc_ch0(void)
  78. {
  79. uchar j;
  80. voltage_data = 0;
  81. SDO = 1;
  82. CONV = 1;                                       // 开启AD转换
  83. SCK  = 1;
  84. CONV = 0;
  85. SCK  = 0;
  86. for(j=15;j>0;j--)
  87.    {
  88.     SCK = 0;
  89.         if(j == 15)
  90.           {
  91.             SDI = 1;
  92.           }
  93.         if(j == 14)
  94.           {
  95.             SDI = 0;
  96.           }
  97.         if(SDO==1)
  98.           {
  99.             voltage_data = voltage_data + 1;
  100.           }   
  101.         voltage_data <<= 1;
  102.         SCK = 1;
  103.    }
  104.   CONV = 1;
  105.   SCK  = 1;

  106. }

  107.   /*读LTC1865通道1的AD值*/
  108. void read_adc_ch1(void)
  109. {
  110. uchar j;
  111. voltage_data = 0;
  112. SDO = 1;
  113. CONV = 1;                                       // 开启AD转换
  114. SCK  = 1;
  115. CONV = 0;
  116. SCK  = 0;
  117. for(j=15;j>0;j--)
  118.    {
  119.     SCK = 0;
  120.         if(j == 15)
  121.           {
  122.             SDI = 1;
  123.           }
  124.         if(j == 14)
  125.           {
  126.             SDI = 1;
  127.           }
  128.         if(SDO==1)
  129.           {
  130.             voltage_data = voltage_data + 1;
  131.           }   
  132.         voltage_data <<= 1;
  133.         SCK = 1;
  134.    }
  135.   CONV = 1;
  136.   SCK  = 1;

  137. }
  138. /* 显示通道电压*/
  139. void disp_voltage(uchar i)
  140. {
  141.         switch(i)
  142.         {
  143.                  case 0:
  144.                         read_adc_ch0();
  145.                         position(1,0);
  146.                         write_byte("CHANNEL0=");       
  147.                         break;
  148.                 case 1:
  149.                         read_adc_ch1();       
  150.                         position(1,0);
  151.                         write_byte("CHANNEL1=");
  152.                         break;
  153.          }
  154.         voltage_data = (voltage_data*5000)/65536;                 // AD采样值处理
  155.         write_order(0x89);
  156.         write_1602(disp_code[voltage_data/1000]);
  157.         write_order(0x8b);
  158.         write_1602(disp_code[voltage_data%1000/100]);
  159.         write_order(0x8c);
  160.         write_1602(disp_code[voltage_data%1000%100/10]);
  161.         write_order(0x8d);
  162.         write_1602(disp_code[voltage_data%1000%100%10]);
  163. }
  164.         /* 发送通道电压*/
  165. void send_voltage(uchar i)
  166. {
  167.         switch(i)
  168.         {
  169.                  case 0:
  170.                         SBUF=67;while(!TI);TI=0;
  171.                         SBUF=72;while(!TI);TI=0;
  172.                         SBUF=65;while(!TI);TI=0;
  173.                         SBUF=78;while(!TI);TI=0;
  174.                         SBUF=78;while(!TI);TI=0;
  175.                         SBUF=69;while(!TI);TI=0;
  176.                         SBUF=76;while(!TI);TI=0;
  177.                         SBUF=48;while(!TI);TI=0;
  178.                         SBUF=61;while(!TI);TI=0;
  179.                         read_adc_ch0();       
  180.                         break;
  181.                 case 1:
  182.                         SBUF=67;while(!TI);TI=0;
  183.                         SBUF=72;while(!TI);TI=0;
  184.                         SBUF=65;while(!TI);TI=0;
  185.                         SBUF=78;while(!TI);TI=0;
  186.                         SBUF=78;while(!TI);TI=0;
  187.                         SBUF=69;while(!TI);TI=0;
  188.                         SBUF=76;while(!TI);TI=0;
  189.                         SBUF=49;while(!TI);TI=0;
  190.                         SBUF=61;while(!TI);TI=0;
  191.                         read_adc_ch1();       
  192.                         break;
  193.          }
  194.         voltage_data = (voltage_data*5000)/65536;                 // AD采样值处理
  195.         SBUF=voltage_data/1000+48;while(!TI);TI=0;
  196.     SBUF=46;while(!TI);TI=0;
  197.         SBUF=voltage_data%1000/100+48;while(!TI);TI=0;
  198.         SBUF=voltage_data%1000%100/10+48;while(!TI);TI=0;
  199.         SBUF=voltage_data%1000%100%10+48;while(!TI);TI=0;
  200.         SBUF=86;while(!TI);TI=0;
  201.         SBUF=32;while(!TI);TI=0;
  202.         SBUF=32;while(!TI);TI=0;
  203. }
  204. /*写入小数点和电压单位符号*/
  205. void disp_symbol(void)
  206. {

  207.         position(1,10);
  208.         write_1602(disp_dot);
  209.         position(1,15);
  210.         write_1602(disp_V);
  211.   
  212. }
  213. void disp_logo()
  214. {
  215.         unsigned char i;
  216.         unsigned char *p;
  217.         p="VOLTAGE MEASURE";
  218.         delay(10);
  219.         position(1,0);
  220.         write_byte("  HELLO WORLD ");       
  221.         for(i=0;i<15;i++)
  222.                 {
  223.                         position(2,i);
  224.                         write_1602(*p);
  225.                         p++;
  226.                     delay(250);
  227.                 }
  228.                 delay(250);
  229.                 i=0;  
  230. }
  231. void uart_init(void)
  232. {
  233.         TMOD=0x20;
  234.         SM0=0;
  235. ……………………

  236. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
电压测量系统.rar (66.47 KB, 下载次数: 76)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:944275 发表于 2021-6-25 08:56 | 显示全部楼层
谢谢铁子的分享,学到了很多
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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