51单片机电子秤资料分享给51hei的朋友们
3具体要求
(1)能用简易键盘设置单价,加重后能同时显示重量、金额和单价;
(2)重量显示:单位为公斤;最大称重为9.999公斤,重量误差不大于±0.005公斤;
(3)单价金额及总价金额显示:单价金额和总价金额的单位为元,最大金额数值为9999.99元,总价金额误差不大于0.01元;
(4)具有去皮功能和总额累加计算功能。
设计步骤:拟定设计方案,写出必要的设计步骤和参数计算,画出逻辑电路图,仿真与分析、写出课程设计说明书。
4完成后应上交的材料
1.一张整体电路原理图。
2.课程设计说明书。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
原理图(工程文件可在本帖附件中下载):
实用电子称单片机源程序如下:
- #include<reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- extern void ADC();
- extern uint qian,bai,shi,ge;
- uchar table[]="P:000.00";
- uchar code table1[]="$:0000.00RMB";
- uchar code table2[]="W:0.000kg";
- uchar tab[]="welcome to use!" ;
- sbit lcden=P3^3; //LCD1602的en引脚段
- sbit lcdrs=P3^4;// rs引脚端
- sbit cs=P3^2; //ADC0804的片选信号
- uchar num;
- uint a,b,c,d,e;
- double weight,price,comulation,total,scale;
- uchar bt=0,key,clear,complete,sum,pot,temp,delete,flag,clean;
- void delay(uint z) //延时函数
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- void write_com(uchar com)//写指令的地址
- {
- lcdrs=0;//写指令
- P0=com;
- delay(5);
- lcden=1;
- delay(5);
- lcden=0;
- }
- void write_data(uchar date) //写数据
- {
- lcdrs=1;
- P0=date;
- delay(5);
- lcden=1;
- delay(5);
- lcden=0;
- }
- void init() //LCD1602的初始化
- {
- lcden=0;
- write_com(0x38);//显示模式设置
- write_com(0x0c); //开显示,不显示光标,光标不闪烁
- write_com(0x06);//当读或写一个字符后地址指针加1,且光标加1,整屏显示不移动
- write_com(0x01); //清屏
- }
- void display(double a) //显示价格 两个变量分别为单价和重量
- {
- long tep; //定义中间变量
- uint a1,a2,a3,a4,a5,a6; //中间变量
- tep=(long)(a*100); //temp=temp*b相当于价格乘上重量
- a1=tep/100000; //千位上的值
- a2=tep%100000/10000; //百位上的值
- a3=tep%100000%10000/1000; //十位上的值
- a4=tep%100000%10000%1000/100; //个位上的值
- a5=tep%100000%10000%1000%100/10; //小数点后一位
- a6=tep%100000%10000%1000%100%10; //小数点后两位
- write_com(0xc2); //写入地址第二行第三个开始
- write_data(0x30+a1); //写入数据由于LED的情况
- write_com(0xc3); //第四个开始
- write_data(0x30+a2);
- write_com(0xc4);
- write_data(0x30+a3);
- write_com(0xc5);
- write_data(0x30+a4);
- write_com(0xc6);
- write_data('.');
- write_com(0xc7);
- write_data(0x30+a5);
- write_com(0xc8);
- write_data(0x30+a6);
- }
- void keyscan() //键盘扫描
- {
- P2=0xfe;
- temp=P2;
- temp=temp&0xf0;
- if(temp!=0xf0) //第一次确认
- {
- delay(10);
- if(temp!=0xf0) //第二次确认
- {
- temp=P2;
- switch(temp)
- {
- case 0xee:
- key=1;
- bt++;
- break;
- case 0xde:
- key=2;
- bt++;
- break;
- case 0xbe:
- key=3;
- bt++;
- break;
- }
- while(temp!=0xf0)
- {
- temp=P2;
- temp=temp&0xf0;
- }
- }
- }
- P2=0xfd;
- temp=P2;
- temp=temp&0xf0;
- if(temp!=0xf0)
- {
- delay(10);
- if(temp!=0xf0)
- {
- temp=P2;
- switch(temp)
- {
- case 0xed:
- key=4;
- bt++;
- break;
- case 0xdd:
- key=5;
- bt++;
- break;
- case 0xbd:
- key=6;
- bt++;
- break;
- case 0x7d:
- pot=1;
- break;
- }
- while(temp!=0xf0)
- {
- temp=P2;
- temp=temp&0xf0;
- }
- }
- }
- P2=0xfb;
- temp=P2;
- temp=temp&0xf0;
- if(temp!=0xf0)
- {
- delay(10);
- if(temp!=0xf0)
- {
- temp=P2;
- switch(temp)
- {
- case 0xeb:
- key=7;
- bt++;
- break;
- case 0xdb:
- key=8;
- bt++;
- break;
- case 0xbb:
- key=9;
- bt++;
- break;
- case 0x7b: //去皮
- delete=1;
- break;
- }
- while(temp!=0xf0)
- {
- temp=P2;
- temp=temp&0xf0;
- }
- }
- }
- P2=0xf7;
- temp=P2;
- temp=temp&0xf0;
- if(temp!=0xf0)
- {
- delay(10);
- if(temp!=0xf0)
- {
- temp=P2;
- switch(temp)
- {
- case 0xe7: //计算
- complete=1;
- break;
- case 0xd7:
- key=0;
- bt++;
- break;
- case 0xb7: //清0
- clear=1;
- break;
- case 0x77: //累加
- sum=1;
- break;
- }
- while(temp!=0xf0)
- {
- temp=P2;
- temp=temp&0xf0;
- }
- }
- }
- }
- void getprice()
- {
- if(bt<=5)
- {
- switch(bt)
- {
- case 1:
- a=key;
- break;
- case 2:
- b=key;
- break;
- case 3:
- c=key;
- break;
- case 4:
- d=key;
- break;
- case 5:
- e=key;
- break;
- }
- }
- price=a*100+b*10+c+d*0.1+e*0.01;//获得价格
- }
- void showprice(double b)
- {
- long j;
- uint o,p,q,r,s;
- j=(long)(b*100);
- o=j/10000;
- p=j%10000/1000;
- q=j%10000%1000/100;
- r=j%10000%1000%100/10;
- s=j%10000%1000%100%10;
- if(bt<=5)
- {
- switch(bt)
- {
- case 1:
- write_com(0x80+2);
- write_data(0x30+o);
- break;
- case 2:
- write_com(0x80+3);
- write_data(0x30+p);
- break;
- case 3:
- write_com(0x80+4);
- write_data(0x30+q);
- break;
- case 4:
- write_com(0x80+6);
- write_data(0x30+r);
- break;
- case 5:
- write_com(0x80+7);
- write_data(0x30+s);
- break;
- }
- }
- }
- void getweight()
- {
- ADC(); //通过ADC获得个十百的大小
- weight=qian+bai*0.1+shi*0.01+ge*0.001-0.625;
- }
- void showweight(double a)
- {
- long i;
- i=(long)(a*1000);
- write_com(0x80+10);
- write_data(0x30+i/1000);
- write_com(0x80+12); //显示重量的地方从第一行第十一个开始
- write_data(0x30+(i%1000)/100);
- write_com(0x80+13);
- write_data(0x30+((i%1000)%100)/10);
- write_com(0x80+14);
- write_data(0x30+((i%1000)%100)%10);
- }
- void main()
- {
- init(); //初始化
- write_com(0x80);
- for(num=0;num<16;num++)
- {
- write_data(tab[num]);
- }
- delay(1000);
- write_com(0x80); //地址为第一行第一个
- for(num=0;num<8;num++) //在num为0到8的范围内调用写函数写下字符
- {
- write_data(table[num]);
- delay(20);
- }
- write_com(0x80+8); //在第一行的第九个地址处写下十个长度的字符
- for(num=0;num<9;num++)
- {
- write_data(table2[num]);
- delay(20);
- }
- write_com(0x80+0x40); //地址为第二行第一个
- for(num=0;num<13;num++) //在num为0~12时写下字符
- {
- write_data(table1[num]);
- delay(20);
- }
- while(1) //程序运行时调keyscan函数进行显示以及其他判断
- {
- keyscan();
- getprice();
- getweight();
- if(clear==1)
- {
- write_com(0x80); //地址为第一行第一个
- for(num=0;num<8;num++) //在num为0到8的范围内调用写函数写下字符
- {
- write_data(table[num]);
- delay(10);
- }
- write_com(0x80+8); //在第一行的第九个地址处写下十个长度的字符
- for(num=0;num<9;num++)
- {
- write_data(table2[num]);
- delay(10);
- }
- write_com(0x80+0x40); //地址为第二行第一个
- for(num=0;num<13;num++) //在num为0~12时写下字符
- {
- write_data(table1[num]);
- delay(10);
- }
- bt=0;
- key=0;
- price=0;
- weight=0;
- delete=0;
- sum=0;
- complete=0;
- comulation=0;
- total=0;
- scale=0;
- flag=0;
- pot=0;
- clean=1;
- clear=0;
- }
- if(pot==1)
- {
- write_com(0x80+5);
- write_data('.');
- pot=0;
- }
- if(sum==1)
- {
- write_com(0x80); //地址为第一行第一个
- for(num=0;num<8;num++) //在num为0到8的范围内调用写函数写下字符
- {
- write_data(table[num]);
- delay(10);
- }
- write_com(0x80+8); //在第一行的第九个地址处写下十个长度的字符
- for(num=0;num<9;num++)
- {
- write_data(table2[num]);
- delay(10);
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
电子秤.zip
(207.97 KB, 下载次数: 156)
|