(资料图片)
一、设计说明电子秤是利用应变电阻,将压力信号转变成模拟电压信号,再利用A/D转换,将电信号转换成压力信号进行压力测量,测量最大值,10Kg,将测量到的数据通过MODBUS通信协议传送到上位机。二、设计要求1.能测量10Kg重物的压力,并用数码管显示输入及译码结果。在选择器件时,应考虑成本。2.采用MODBUS串口调试助手显示压力测量值。3.可选元件:(1)自带A/D功能的单片机;(2)LCD1602等。三、实验要求1.根据技术指标制定实验方案;验证所设计的电路。2.进行实验数据处理和分析。
#include #define uchar unsigned char#define uint unsigned int#define ulong unsigned longulong volt;//测量的电压值#define LCD1602_DATAPINS P0#define TIME 5sbit LCD1602_E=P2^2;sbit LCD1602_RW=P2^1;sbit LCD1602_RS=P2^0;sbit CLK=P3^7;//定义时钟信号口sbit DIN=P3^5;//定义2543数据写入口sbit DOUT=P3^4;//定义2543数据读取口sbit CS=P3^6;//定义2543片选信号口uchar datt;uint ALL_num;uint Result;uint Dis_num;void read2543(uchar addr){uint ad=0;uchar i;CLK=0;CS=0;//片选段,启动2543addr<<=4;//对地址位预处理for(i=0;i<12;i++) //12个时钟走完,完成一次读取测量{if(DOUT==1)ad=ad|0x01;//单片机读取ad数据DIN=addr&0x80;//2543读取测量地址位CLK=1;;;;//很短的延时CLK=0;//产生下降沿,产生时钟信号;;;addr<<=1;ad<<=1;//将数据移位准备下一位的读写}CS=1;//关2543ad>>=1;volt=ad;//取走转换结果volt=volt*2444;//例子的满量程为5V,转换分辩率为12位(2的12次方=4096) 。即最大值是255,5/4096=1221mV,即例子中的1V代表实际1221mV }/******************************************************************************** 函 数 名 : Lcd1602_Delay1ms* 函数功能 : 延时函数,延时1ms* 输 入 : c* 输 出 : 无* 说 名 : 该函数是在12MHZ晶振下,12分频单片机的延时。*******************************************************************************/void Lcd1602_Delay1ms(uint c) //误差 0us{ uchar a,b;for (; c>0; c--){ for (b=199;b>0;b--) { for(a=1;a>0;a--); } } }/******************************************************************************** 函 数 名 : LcdWriteCom* 函数功能 : 向LCD写入一个字节的命令* 输 入 : com* 输 出 : 无*******************************************************************************/void LcdWriteCom(uchar com) //写入命令{LCD1602_E = 0; //使能LCD1602_RS = 0; //选择发送命令LCD1602_RW = 0; //选择写入LCD1602_DATAPINS = com; //放入命令Lcd1602_Delay1ms(1);//等待数据稳定LCD1602_E = 1; //写入时序Lcd1602_Delay1ms(5); //保持时间LCD1602_E = 0;}/******************************************************************************** 函 数 名 : LcdWriteData* 函数功能 : 向LCD写入一个字节的数据* 输 入 : dat* 输 出 : 无*******************************************************************************/ void LcdWriteData(uchar dat)//写入数据{LCD1602_E = 0;//使能清零LCD1602_RS = 1;//选择输入数据LCD1602_RW = 0;//选择写入LCD1602_DATAPINS = dat; //写入数据Lcd1602_Delay1ms(1);LCD1602_E = 1; //写入时序Lcd1602_Delay1ms(5); //保持时间LCD1602_E = 0;}/******************************************************************************** 函 数 名 : LcdInit()* 函数功能 : 初始化LCD屏* 输 入 : 无* 输 出 : 无*******************************************************************************/ void LcdInit() //LCD初始化子程序{ LcdWriteCom(0x38); //开显示LcdWriteCom(0x0c); //开显示不显示光标LcdWriteCom(0x06); //写一个指针加1LcdWriteCom(0x01); //清屏LcdWriteCom(0x80); //设置数据指针起点}//按指定位置显示一个字符void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData){ Y &= 0x1; X &= 0xF; //限制X不能大于15,Y不能大于1 if (Y) X |= 0x40; //当要显示第二行时地址码+0x40; X |= 0x80; // 算出指令码 LcdWriteCom(X); //这里不检测忙信号,发送地址码 LcdWriteData(DData);}//按指定位置显示一串字符void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData){ unsigned char ListLength; ListLength = 0; Y &= 0x1; X &= 0xF; //限制X不能大于15,Y不能大于1 while (DData[ListLength]>=0x20) //若到达字串尾则退出 { if (X <= 0xF) //X坐标应小于0xF { DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符 ListLength++; X++; } }}void UsartInit(){ TMOD=0x20; //设T1为方式2(8位自动重装载) T0为方式1(16位) TH1=0xf3; //定时器1定时12us TL1=0xf3; TR1=1; //开定时器1 SCON=0x50; //SCON 是一个特殊功能寄存器,用以设定串行口的工作方式、接收/发送控制以及设置状态标志 PCON=0x80; //串口波特率加倍 ES=1; //串口中断允许位 EA=1; //开启总中断}void Uart1Send(uchar c){SBUF=c;while(!TI);TI=0;}void Uart1Sends(uchar *str){while(*str!="�"){SBUF=*str;while(!TI);TI=0;str++;}}void main(void){UsartInit();LcdInit();EX0=1; //外部中断0开() EX1 为外部中断1 (P3^3)IT0=1; //低电平触发 IT1为中断1DisplayListChar(1,0,"Measure System");DisplayOneChar(2,1,".");DisplayOneChar(5,1,"K");DisplayOneChar(6,1,"g");while(1){read2543();DisplayOneChar(0,1,(char)(volt/10000000)+"0");DisplayOneChar(1,1,(char)(volt/1000000%10)+"0");DisplayOneChar(3,1,(char)(volt/100000%10)+"0");DisplayOneChar(4,1,(char)(volt/10000%10)+"0");Lcd1602_Delay1ms(200);}}void Key_INT( ) interrupt 0 // 这里0对应下表{uchar buff[8],datt1;Uart1Sends("NOW WIGHT:"); buff[0] = (char)(volt/10000000)+"0";buff[1] = (char)(volt/1000000%10)+"0";buff[2] = ".";buff[3] = (char)(volt/100000%10)+"0";buff[4] = (char)(volt/10000%10)+"0";buff[5] = "K";buff[6] = "g";for(datt1=0;datt1<7;datt1++){Uart1Send(buff[datt1]);}Uart1Sends("rn");}
审核编辑:汤梓红
标签: