给51黑电子论坛的朋友们分享一个可切换价格计算总价的电子秤仿真,下面是原理图:
所有资料下载:
电子秤仿真.zip
(77.93 KB, 下载次数: 53)
源程序:
- #include<reg51.h>
- #include<intrins.h>
- #include <ZM.h>
- #define LCD P0
- unsigned char a,i,j,k,ad_data;
- float press=0.0;
- int b;
- int num=1,num_t=0;
- sbit EXCHANGE=P1^0;
- sbit MENU=P1^1;
- sbit ADD=P1^2;
- sbit SUB=P1^3;
- sbit OK=P1^4;
- sbit EN=P2^0;
- sbit RW=P2^1;
- sbit RS=P2^2;
- sbit CS1=P2^3;
- sbit CS2=P2^4;
- sbit BUSY=P0^0;
- sbit ADCS =P3^5;
- sbit ADDI =P3^7;
- sbit ADDO =P3^7;
- sbit ADCLK =P3^6;
- float f_price[5]={10.5,11.5,12.5,13.5,14.5};
- float sum=0;
- void delay(unsigned char a)
- {
- unsigned char i,j;
- for(i=0;i<a;i++)
- for(j=0;j<100;j++)
- ;
- }
- void temer1() interrupt 2
- {
- EX1=0;
- delay(10);
- if(EXCHANGE==0)
- {
- num++;
- if(num>=5)
- {
- num=0;
- }
- }
-
- EX1=1;
- }
- //采集并返回
- unsigned char Adc0832(unsigned char channel) //AD转换,返回结果
- {
- unsigned char j,i=0,ndat=0;
- unsigned int dat=0;
- if(channel==0)channel=2;
- if(channel==1)channel=3;
- ADDI=1;
- _nop_();
- _nop_();
- ADCS=0;//拉低CS端
- _nop_();
- _nop_();
- ADCLK=1;//拉高CLK端
- _nop_();
- _nop_();
- ADCLK=0;//拉低CLK端,形成下降沿1
- _nop_();
- _nop_();
- ADCLK=1;//拉高CLK端
- ADDI=channel&0x1;
- _nop_();
- _nop_();
- ADCLK=0;//拉低CLK端,形成下降沿2
- _nop_();
- _nop_();
- ADCLK=1;//拉高CLK端
- ADDI=(channel>>1)&0x1;
- _nop_();
- _nop_();
- ADCLK=0;//拉低CLK端,形成下降沿3
- ADDI=1;//控制命令结束
- _nop_();
- _nop_();
- dat=0;
- for(i=0;i<8;i++)
- {
- dat|=ADDO;//收数据
- ADCLK=1;
- _nop_();
- _nop_();
- ADCLK=0;//形成一次时钟脉冲
- _nop_();
- _nop_();
- dat<<=1;
- if(i==7)dat|=ADDO;
- }
- for(i=0;i<8;i++)
- {
- j=0;
- j=j|ADDO;//收数据
- ADCLK=1;
- _nop_();
- _nop_();
- ADCLK=0;//形成一次时钟脉冲
- _nop_();
- _nop_();
- j=j<<7;
- ndat=ndat|j;
- if(i<7)ndat>>=1;
- }
- ADCS=1;//拉低CS端
- ADCLK=0;//拉低CLK端
- ADDO=1;//拉高数据端,回到初始状态
- dat<<=8;
- dat|=ndat;
- return(dat); //return ad k
- }
- void data_pro(void)
- {
- if(0<ad_data<256)
- {
- int vary=ad_data;
- press=(0.019531*vary);
- }
- }
- void total(float w,float p)
- {
- sum=w*p;
- }
- unsigned char t1[6]={"000.00"};
- void turn(float t_float)
- {
- int temp=(int)t_float;
- t1[0]=temp/100+0X30;
- t1[1]=(temp%100)/10+0X30;
- t1[2]=temp%10+0X30;
- temp=(int)(t_float*100);
- t1[4]=(temp%100)/10+0X30;
- t1[5]=temp%10+0X30;
- }
- checkbusy()
- {
- EN=1;
- RW=1;
- RS=0;
- LCD=0XFF;
- if(BUSY);
- }
- writecode(unsigned char dat) //写命令
- {
- checkbusy();
- EN=1;
- RW=0;
- RS=0;
- LCD=dat;
- EN=1;
- EN=0;
- }
- writedata(unsigned char dat) //写数据
- {
- checkbusy();
- EN=1;
- RW=0;
- RS=1;
- LCD=dat;
- EN=1;
- EN=0;
- }
- void displayzifu(unsigned char page,unsigned char lineaddress,int n, unsigned char table[])
- {
- unsigned char temp[16];
- if(lineaddress<0X80)
- {
- CS1=1;
- CS2=0;
- }
- for(j=0;j<n;j++)
- {
- if(lineaddress>=0X80)
- {
- CS1=0;
- CS2=1;
- lineaddress=lineaddress-0X40;
- }
- b=table[j]-0X20;
- for(k=0;k<16;k++)
- {
- temp[k]=ch2[b][k];
- }
- writecode(page);
- writecode(lineaddress);
- for(i=0;i<8;i++)
- {
- writedata(temp[i]);
- }
- writecode(page+1);
- writecode(lineaddress);
- for(i=8;i<16;i++)
- {
- writedata(temp[i]);
- }
- lineaddress+=8;
- }
- }
- void clear(unsigned char page,unsigned char lineaddress,int n, unsigned char table[])
- {
- unsigned char temp[16];
- if(lineaddress<0X80)
- {CS1=1;
- CS2=0;}
-
-
- for(j=0;j<n;j++)
- {
- if(lineaddress>=0X80)
- {
- CS1=0;
- CS2=1;
- lineaddress=lineaddress-0X40;
- }
- b=table[j]-0X20;
- for(k=0;k<16;k++)
- {temp[k]=ch2[b][k];}
- writecode(page);
- writecode(lineaddress);
- for(i=0;i<8;i++)
- { writedata(temp[i]);}
- writecode(page+1);
- writecode(lineaddress);
- for(i=8;i<16;i++)
- { writedata(temp[i]);}
- lineaddress+=8;
- }
- }
- void displayhanzi(unsigned char page,unsigned char lineaddress,int n, unsigned char table[][16])
- {
- unsigned char temp[32];
- if(lineaddress<0X80)
- {
- CS1=1; //left
- CS2=0;
- }
- for(j=0;j<n;j++)
- {
- if(lineaddress>=0X80)
- {
- CS1=0; //right
- CS2=1;
- lineaddress=lineaddress-0X40;
- }
- for(k=0;k<16;k++)
- {
- temp[k]=table[j][k];
- }
- j+=1;
- for(k=0;k<16;k++)
- {
- temp[16+k]=table[j][k];
- }
- writecode(page);
- writecode(lineaddress);
- for(i=0;i<16;i++)
- {
- writedata(temp[i]);
- }
- writecode(page+1);
- writecode(lineaddress);
- for(i=16;i<32;i++)
- {
- writedata(temp[i]);
- }
- lineaddress+=16;
- }
- }
- void lcdinti()
- {
- writecode(0X3f);//显示开关关
- writecode(0XC0);//修改显示起始行
- writecode(0XB8);//修改页地址,x地址
- writecode(0X40);//修改列地址,y地址
-
- }
- main()
- {
-
- unsigned char t[3]={'/','K','G'};
- char m=':';
- EA=1;
- EX1=1;
- lcdinti();
- clear(0XB8,0X40,16,&table2);
- clear(0XBa,0X40,16,&table2);
- clear(0XBc,0X40,16,&table2);
- clear(0XBe,0X40,16,&table2);
- displayhanzi(0XB8,0X40,16,&TITLE);
- displayhanzi(0XBa,0X40,4,&WEIGHT);
- displayzifu(0XBa,0X60,1,&m);
- displayhanzi(0XBc,0X40,4,&PRICE);
- displayzifu(0XBc,0X60,1,&m);
- displayhanzi(0XBE,0X40,4,&TOTAL);
- displayzifu(0XBe,0X60,1,&m);
- while(1)
- {
- ad_data =Adc0832(0); //采样值存储单元初始化为0
- data_pro();
- turn(press);
- displayzifu(0XBa,0X68,5,&t1[1]);
- displayzifu(0xba,0xB0,2,&t[1]);
- delay(100);
- turn(f_price[num]);
- displayzifu(0XBc,0X68,6,&t1[0]);
- displayhanzi(0xbc,0x98,2,&YUAN);
- displayzifu(0XBc,0XA8,3,&t);
- delay(100);
- total(press,f_price[num]);
- turn(sum);
- displayzifu(0XBe,0X68,6,&t1);
- displayhanzi(0xbe,0xB0,2,&YUAN);
- delay(100);
- }
- }
复制代码
|