找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机电子秤程序 惠斯特电桥接四个应变片的仿真原理图

[复制链接]
跳转到指定楼层
楼主
本设计是采用的惠斯特电桥接四个应变片的仿真,实例代码和仿真原理图如下



仿真通过改变滑动变阻器阻值实现

单片机源程序如下:
  1. #define#include<reg52.h>
  2. #include<intrins.h>
  3. #include <absacc.h>
  4. #include <math.h>
  5. #include<stdio.h>
  6. #define uchar unsigned char
  7. #define unit unsigned int
  8. #define DATA P0        
  9. sbit lcden=P2^5;
  10. sbit lcdrw=P2^6;
  11. sbit lcdrs=P2^7;

  12. sbit feng=P3^4;

  13. sbit BYTE=P2^1;
  14. sbit BUSY=P2^2;
  15. //sbit CS=P2^2;
  16. sbit RC=P2^0;

  17. void init();
  18. void write_com(uchar com);
  19. void write_data(uchar date);
  20. void write_word(unsigned char *s);

  21. void DelayMS(unsigned int y)           //延迟程序
  22. {
  23.         unsigned int x;
  24.         for(y;y>0;y--)
  25.                 for(x=110;x>0;x--);
  26. }


  27. void init(void)                        //LCD初始化程序
  28. {         
  29.         write_com(0x02);
  30.     write_com(0x38);//显示模式设置
  31.     write_com(0x0c); //开显示,不显示光标,光标不闪烁
  32.     write_com(0x06);//当读或写一个字符后地址指针加1,且光标加1,整屏显示不移动
  33.         write_com(0x01); //清屏
  34.         DelayMS(50);
  35. }


  36. void write_com(uchar com)
  37. {
  38.     lcdrs=0;//写指令
  39.         lcdrw=0;
  40.     DATA=com;         
  41.         lcden=1;
  42.     DelayMS(5);
  43.     lcden=1;
  44.     DelayMS(5);
  45.         lcden=0;
  46. }

  47. void write_data(uchar date)
  48. {
  49.         lcdrs=1;
  50.     DATA=date;
  51.     DelayMS(5);
  52.     lcden=1;
  53.     DelayMS(5);
  54.         lcden=0;
  55. }
  56. void write_word(unsigned char *s)
  57. {
  58.         while(*s>0)
  59.         {
  60.                 write_data(*s);
  61.                 s++;
  62.         }
  63. }

  64. void Display(int weight)
  65. {
  66.         int bw,sw,gw,yw,ew;
  67.         unit dat;
  68.         dat=weight*100;

  69.         bw=dat/10000; //取得百位数字
  70.         sw=dat%10000/1000;//取得十位数字
  71.         gw=dat%10000%1000/100;//取得个位数字
  72.         yw=dat%10000%1000%100/10; //小数点后一位
  73.         ew=dat%10000%1000%100%10; //小数点后二位


  74. //        bw=dat/10000; //取得百位数字
  75. //        sw=dat%10000/1000;//取得十位数字
  76. //        gw=dat/100%10;//取得个位数字
  77. //        yw=dat/10%10; //小数点后一位
  78. //        ew=dat%10000; //小数点后二位

  79.         write_com(0x89);
  80.         write_data(0x30+bw);
  81.         write_com(0x8a);
  82.         write_data(0x30+sw);//数字+30得到该数字的LCD1602显示码
  83.         write_com(0x8b);
  84.         write_data(0x30+gw);//数字+30得到该数字的LCD1602显示码
  85.         write_com(0x8c);
  86.         write_data('.');
  87.         write_com(0x8d);
  88.         write_data(0x30+yw);//数字+30得到该数字的LCD1602显示码
  89.         write_com(0x8e);
  90.         write_data(0x30+ew);//数字+30得到该数字的LCD1602显示码
  91.         write_com(0x8f);
  92.           write_data(0x67);        //显示"g"符号,                 
  93. }

  94. void Display2(int weight)
  95. {
  96.         int ww,qw,bw,sw,gw;
  97.         unit dat;
  98.         dat=weight;
  99.         ww=dat/10000; //取得wan位数字
  100.         qw=dat%10000/1000;//取得qian位数字
  101.         bw=dat%10000%1000/100;//取得bai位数字
  102.         sw=dat%10000%1000%100/10; //shi位
  103.         gw=dat%10000%1000%100%10; //ge位

  104.         write_com(0xC1);
  105.         write_data(0x30+ww);
  106.         write_com(0xC2);
  107.         write_data(0x30+qw);//数字+30得到该数字的LCD1602显示码
  108.         write_com(0xC3);
  109.         write_data(0x30+bw);//数字+30得到该数字的LCD1602显示码
  110.         write_com(0xC4);
  111.         write_data(0x30+sw);//数字+30得到该数字的LCD1602显示码
  112.         write_com(0xC5);
  113.         write_data(0x30+gw);//数字+30得到该数字的LCD1602显示码
  114.                  
  115. }
  116. int ADS7825_Convert()
  117. {
  118.         unit temp;
  119.         uchar temp1,temp2;
  120. //        CS=0;
  121.         RC=1;
  122.         RC=0;
  123.         DelayMS(1);
  124.         RC=1;
  125.         while(BUSY==0);
  126.         RC=1;
  127.         BYTE=0;
  128.         DelayMS(1);
  129.         temp1=P1;          //高八位
  130.         BYTE=1;
  131.         DelayMS(1);
  132.         temp2=P1;           //低八位
  133. //        CS=1;
  134. //        temp=temp1;
  135.     temp=(temp1<<8)+temp2;
  136.         return temp;

  137. }

  138. int DataProcess(result)
  139. {
  140.         /*计算电压值*/
  141.         double voltage_value,weight_value;
  142.                 voltage_value = (unsigned long)(((double)result * 10 / 32767) * 1000 + 0.5);  
  143.         voltage_value = (unsigned long)(((double)result*0.0457-59.486));
  144. //        weight_value = voltage_value/0.04;
  145. //        return weight_value;
  146.         return voltage_value;
  147. }

  148.                                                                                                                                    
  149. void main(void)
  150. {
  151.         int result,weight,result1,result2,result3,result4,result5,result6,result7,result8,result9,result10;
  152.         //unsigned char str[8]={0};
  153.         //DelayMS(500);
  154.         lcdrs=0;
  155.         lcdrw=0;
  156.         lcden=0;
  157.         feng=1;
  158.         init();

  159.         while(1)
  160.         {
  161.                 result1=ADS7825_Convert();
  162.                 DelayMS(5);
  163.                 result2=ADS7825_Convert();
  164.                 DelayMS(5);
  165.                 result=(result1+result2)/2;
  166.                 result3=ADS7825_Convert();
  167.                 DelayMS(5);
  168.                 result=(result+result3)/2;
  169.                 result4=ADS7825_Convert();
  170.                 DelayMS(5);
  171.                 result=(result+result4)/2;
  172.                 result5=ADS7825_Convert();
  173.                 DelayMS(5);
  174.                 result=(result+result5)/2;
  175.                 result6=ADS7825_Convert();
  176.                 DelayMS(5);
  177.                 result=(result+result6)/2;
  178.                 result7=ADS7825_Convert();
  179.                 DelayMS(5);
  180.                 result=(result+result7)/2;
  181.                 result8=ADS7825_Convert();
  182.                 DelayMS(5);
  183.                 result=(result+result8)/2;
  184.                 result9=ADS7825_Convert();
  185.                 DelayMS(5);
  186.                 result=(result+result9)/2;
  187.                 result10=ADS7825_Convert();
  188.                 DelayMS(5);
  189.                 result=(result+result10)/2;
  190.                 DelayMS(100);

  191.                 Display2(result);
  192. result=(result1+result2+result3+result4+result5+result6+result7+result8+result9+result10)/10;

  193.                 weight=DataProcess(result);
  194.                 if(weight>=300)
  195.                 {
  196.                         feng=0;
  197.                 }
  198.                 else
  199.                 {
  200.                         feng=1;
  201.                 }

  202.                 write_com(0x80);
  203.                 write_word("  ");                                
  204.                 write_word("Weight:");
  205.                 Display(weight);
  206.                 DelayMS(500);
  207.         }
  208. }
复制代码



评分

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

查看全部评分

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

使用道具 举报

沙发
ID:1077503 发表于 2023-5-14 23:00 | 只看该作者
能上传一下仿真吗?
回复

使用道具 举报

板凳
ID:1140248 发表于 2024-12-18 09:20 | 只看该作者
@1t 发表于 2023-5-14 23:00
能上传一下仿真吗?

能发一下仿真图吗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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