本设计是采用的惠斯特电桥接四个应变片的仿真,实例代码和仿真原理图如下
仿真通过改变滑动变阻器阻值实现
单片机源程序如下:
- #define#include<reg52.h>
- #include<intrins.h>
- #include <absacc.h>
- #include <math.h>
- #include<stdio.h>
- #define uchar unsigned char
- #define unit unsigned int
- #define DATA P0
- sbit lcden=P2^5;
- sbit lcdrw=P2^6;
- sbit lcdrs=P2^7;
- sbit feng=P3^4;
- sbit BYTE=P2^1;
- sbit BUSY=P2^2;
- //sbit CS=P2^2;
- sbit RC=P2^0;
- void init();
- void write_com(uchar com);
- void write_data(uchar date);
- void write_word(unsigned char *s);
-
- void DelayMS(unsigned int y) //延迟程序
- {
- unsigned int x;
- for(y;y>0;y--)
- for(x=110;x>0;x--);
- }
- void init(void) //LCD初始化程序
- {
- write_com(0x02);
- write_com(0x38);//显示模式设置
- write_com(0x0c); //开显示,不显示光标,光标不闪烁
- write_com(0x06);//当读或写一个字符后地址指针加1,且光标加1,整屏显示不移动
- write_com(0x01); //清屏
- DelayMS(50);
- }
- void write_com(uchar com)
- {
- lcdrs=0;//写指令
- lcdrw=0;
- DATA=com;
- lcden=1;
- DelayMS(5);
- lcden=1;
- DelayMS(5);
- lcden=0;
- }
- void write_data(uchar date)
- {
- lcdrs=1;
- DATA=date;
- DelayMS(5);
- lcden=1;
- DelayMS(5);
- lcden=0;
- }
- void write_word(unsigned char *s)
- {
- while(*s>0)
- {
- write_data(*s);
- s++;
- }
- }
- void Display(int weight)
- {
- int bw,sw,gw,yw,ew;
- unit dat;
- dat=weight*100;
- bw=dat/10000; //取得百位数字
- sw=dat%10000/1000;//取得十位数字
- gw=dat%10000%1000/100;//取得个位数字
- yw=dat%10000%1000%100/10; //小数点后一位
- ew=dat%10000%1000%100%10; //小数点后二位
- // bw=dat/10000; //取得百位数字
- // sw=dat%10000/1000;//取得十位数字
- // gw=dat/100%10;//取得个位数字
- // yw=dat/10%10; //小数点后一位
- // ew=dat%10000; //小数点后二位
- write_com(0x89);
- write_data(0x30+bw);
- write_com(0x8a);
- write_data(0x30+sw);//数字+30得到该数字的LCD1602显示码
- write_com(0x8b);
- write_data(0x30+gw);//数字+30得到该数字的LCD1602显示码
- write_com(0x8c);
- write_data('.');
- write_com(0x8d);
- write_data(0x30+yw);//数字+30得到该数字的LCD1602显示码
- write_com(0x8e);
- write_data(0x30+ew);//数字+30得到该数字的LCD1602显示码
- write_com(0x8f);
- write_data(0x67); //显示"g"符号,
- }
- void Display2(int weight)
- {
- int ww,qw,bw,sw,gw;
- unit dat;
- dat=weight;
- ww=dat/10000; //取得wan位数字
- qw=dat%10000/1000;//取得qian位数字
- bw=dat%10000%1000/100;//取得bai位数字
- sw=dat%10000%1000%100/10; //shi位
- gw=dat%10000%1000%100%10; //ge位
- write_com(0xC1);
- write_data(0x30+ww);
- write_com(0xC2);
- write_data(0x30+qw);//数字+30得到该数字的LCD1602显示码
- write_com(0xC3);
- write_data(0x30+bw);//数字+30得到该数字的LCD1602显示码
- write_com(0xC4);
- write_data(0x30+sw);//数字+30得到该数字的LCD1602显示码
- write_com(0xC5);
- write_data(0x30+gw);//数字+30得到该数字的LCD1602显示码
-
- }
- int ADS7825_Convert()
- {
- unit temp;
- uchar temp1,temp2;
- // CS=0;
- RC=1;
- RC=0;
- DelayMS(1);
- RC=1;
- while(BUSY==0);
- RC=1;
- BYTE=0;
- DelayMS(1);
- temp1=P1; //高八位
- BYTE=1;
- DelayMS(1);
- temp2=P1; //低八位
- // CS=1;
- // temp=temp1;
- temp=(temp1<<8)+temp2;
- return temp;
- }
- int DataProcess(result)
- {
- /*计算电压值*/
- double voltage_value,weight_value;
- voltage_value = (unsigned long)(((double)result * 10 / 32767) * 1000 + 0.5);
- voltage_value = (unsigned long)(((double)result*0.0457-59.486));
- // weight_value = voltage_value/0.04;
- // return weight_value;
- return voltage_value;
- }
-
- void main(void)
- {
- int result,weight,result1,result2,result3,result4,result5,result6,result7,result8,result9,result10;
- //unsigned char str[8]={0};
- //DelayMS(500);
- lcdrs=0;
- lcdrw=0;
- lcden=0;
- feng=1;
- init();
- while(1)
- {
- result1=ADS7825_Convert();
- DelayMS(5);
- result2=ADS7825_Convert();
- DelayMS(5);
- result=(result1+result2)/2;
- result3=ADS7825_Convert();
- DelayMS(5);
- result=(result+result3)/2;
- result4=ADS7825_Convert();
- DelayMS(5);
- result=(result+result4)/2;
- result5=ADS7825_Convert();
- DelayMS(5);
- result=(result+result5)/2;
- result6=ADS7825_Convert();
- DelayMS(5);
- result=(result+result6)/2;
- result7=ADS7825_Convert();
- DelayMS(5);
- result=(result+result7)/2;
- result8=ADS7825_Convert();
- DelayMS(5);
- result=(result+result8)/2;
- result9=ADS7825_Convert();
- DelayMS(5);
- result=(result+result9)/2;
- result10=ADS7825_Convert();
- DelayMS(5);
- result=(result+result10)/2;
- DelayMS(100);
- Display2(result);
- result=(result1+result2+result3+result4+result5+result6+result7+result8+result9+result10)/10;
- weight=DataProcess(result);
- if(weight>=300)
- {
- feng=0;
- }
- else
- {
- feng=1;
- }
- write_com(0x80);
- write_word(" ");
- write_word("Weight:");
- Display(weight);
- DelayMS(500);
- }
- }
复制代码
|