标题:
单片机电子秤设计(源程序+lcd12864显示)
[打印本页]
作者:
daxiao
时间:
2015-3-22 02:28
标题:
单片机电子秤设计(源程序+lcd12864显示)
本帖最后由 daxiao 于 2015-3-22 02:31 编辑
//按键接P2口
//LCD数据口接P0口
//DOUT=P3^0;
//PD_SCK=P3^1;
//RS=P1^1; VOUT 空接 RST 空接 NC PSB 接VCC
//RW=P1^2;
//E=P1^3;
//FMQ=P1^0; 蜂鸣器
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit ADDO=P3^0; //51CPU 准双向I/0 输入使能(DOUT) / 串行数据输出
sbit ADSK=P3^1; // 使能AD(PD_SCK) / 串行时钟输入
sbit RS=P1^1; //寄存器选择引脚,搞电平选择数据寄存器,低电平选择指令寄存器
sbit RW=P1^2; //读写操作使能引脚,高电平使能读操作,低电平使能写操作
sbit E=P1^3; //总使能引脚
sbit FMQ=P1^0; //蜂鸣器
//----------------------AD转换程序--//
unsigned long ReadCount(void) //无参数,返回长整形变量
{
unsigned long Count; //声明长整形变量Count
unsigned char i; //声明字符型变量i
ADSK=0; //串行输入拉低
Count=0; //变量Count置零
while(ADDO); //等待串行输出拉高
for(i=0;i<24;i++) //接收24个数据和发送24个脉冲
{
ADSK=1; //发送脉冲
Count=Count<<1; //变量左移
ADSK=0; //拉低
if(ADDO)Count++; //读入数据(高>>低)
}
ADSK=1; //发送第25个脉冲(选择A通道、128增益。)
Count=Count^0x800000; //按位相异或
ADSK=0; //串行拉低
return Count; //返回
}
//--------------------延时子函数--------//
void delay(unsigned char delayata)
{
uchar i,j;
for(i=0;i<delayata;i++)
{
for(j=0;j<121;j++)
{;}
}
}
//-------------------------------------单键扫描子函数-----//
unsigned char JP()
{
unsigned char x=0x00;
bit i=0;
x=P2; //扫描Y坐标
FMQ=0; //响起蜂鸣器
delay(125); //延时去抖动
P2=0x0f;
delay(2);
x+=P2; //扫描X坐标
switch(x)
{
case 0xee:x=0x30;break; //按下0
case 0xed:x=0x31;break; //按下1
case 0xeb:x=0x34;break; //按下4
case 0xe7:x=0x37;break; //按下7
case 0xde:x=0x46;break; //按下F/.
case 0xdd:x=0x32;break; //按下2
case 0xdb:x=0x35;break; //按下5
case 0xd7:x=0x38;break; //按下8
case 0xbe:x=0x45;break; //按下E
case 0xbd:x=0x33;break; //按下3
case 0xbb:x=0x36;break; //按下6
case 0xb7:x=0x39;break; //按下9
case 0x7e:x=0x44;break; //按下D
case 0x7d:x=0x43;break; //按下C
case 0x7b:x=0x42;break; //按下B
case 0x77:x=0x41;break; //按下A
default:x=0xff;break;
}
FMQ=1; //关闭蜂鸣器
while(i==0) //等待按键松开
{
P2=0xf0;
delay(150);
if(P2==0xf0)
{
i=1;
}
else{i=0;}
}
return x; //返回x(ASCII码)
}
//------------------12864写指令子函数-----//
void write_12864com(unsigned char com)
{
RS=0;
RW=0;
delay(1);
E=1;
P0=com;
delay(2);
E=0;
delay(1);
}
//------------------12864写数据子函数-----//
void write_12864dat(unsigned char dat)
{
RS=1;
RW=0;
delay(1);
E=1;
P0=dat;
delay(2);
E=0;
delay(1);
}
//------------------------------LCD初始化-----//
void initinal(void)
{
delay(100);
write_12864com(0x30); //8位并行通信
delay(1);
write_12864com(0x30); //8位并行通信
delay(1);
write_12864com(0x02);
delay(2);
write_12864com(0x06);
delay(2);
write_12864com(0x0c);
delay(2);
write_12864com(0x01);
delay(2);
write_12864com(0x80);
delay(2);
}
//--------------------主函数-------------//
void main(void)
{
uchar LCD[16]={"0123456789ABCDEF"};
code uchar JM1[]={0xb5,0xda,0xc8,0xfd,0xd7,0xe9,0xb5,0xe7,0xd7,0xd3,0xb3,0xc6};
code uchar JM2[]={"单价: 00.0元 "};
code uchar JM3[]={"重量: 00.000KG "};
code uchar JM4[]={"总价: 0000.0元 "};
uchar DJ[3]; //单价
uchar ZL[5]; //重量
uchar QPZL[5]; //去皮时的重量
uchar ZJ[5]; //总价
unsigned long J1;
uint J2,J3,J6=0;
bit J5=1;
uint J7;
uchar i;
uchar JM5[]={5679};
initinal(); //初始化
for(i=0;i<3;i++) //填值
{
DJ[i]=0;
}
for(i=0;i<5;i++) //填值
{
ZL[i]=0;
}
for(i=0;i<5;i++) //填值
{
QPZL[i]=0;
}
for(i=0;i<5;i++) //填值
{
ZJ[i]=0;
}
write_12864com(0x81); //定位
for(i=0;i<12;i++)
{
write_12864dat(JM1[i]); //显示 第三组电子称
}
write_12864com(0x90); //定位
for(i=0;JM2[i]!='\0';i++)
{
write_12864dat(JM2[i]); //显示 单价:00.0元
}
write_12864com(0x88); //定位
for(i=0;JM3[i]!='\0';i++)
{
write_12864dat(JM3[i]); //显示 重量: 00.000KG
}
write_12864com(0x98); //定位
for(i=0;JM4[i]!='\0';i++)
{
write_12864dat(JM4[i]); //显示 总价: 0000.0元
}
P2=0xf0;
while(1)
{
while(P2==0xf0) //但没有按键按下的时候进入,有按键按下的时候跳出来
{
J1=ReadCount(); //读AD值
J3=((J1-8388608)/150)-11; //取值
ZL[0]=(J3/10000)%10; //重量十位
if(ZL[0]>3){FMQ=0;} //超重报警
else{FMQ=1;}
ZL[1]=(J3/1000)%10; //重量个位
ZL[2]=(J3/100)%10; //计算位
ZL[3]=(J3/10)%10;
ZL[4]=J3%10;
J7=ZL[4];
J7+=ZL[3]*10;
J7+=ZL[2]*100;
J7+=ZL[1]*1000;
J7+=ZL[0]*10000;
J3=QPZL[4];
J3+=QPZL[3]*10;
J3+=QPZL[2]*100;
J3+=QPZL[1]*1000;
J3+=QPZL[0]*10000;
J7-=J3;
ZL[0]=J7/10000;
J7%=10000;
ZL[1]=J7/1000;
J7%=1000;
ZL[2]=J7/100;
J7%=100;
ZL[3]=J7/10;
J7%=10;
ZL[4]=J7;
write_12864com(0x8b); //定位
write_12864dat(LCD[ZL[0]]); //送显示
write_12864dat(LCD[ZL[1]]); //送显示
write_12864dat(0x2e); //送显示
write_12864dat(LCD[ZL[2]]); //送显示
write_12864dat(LCD[ZL[3]]); //送显示
write_12864dat(LCD[ZL[4]]); //送显示
J7=DJ[2]*ZL[3];
J7+=DJ[2]*ZL[2]*10;
J7+=DJ[2]*ZL[1]*100;
J7+=DJ[2]*ZL[0]*1000;
J7/=10;
J7+=DJ[1]*ZL[3];
J7+=DJ[1]*ZL[2]*10;
J7+=DJ[1]*ZL[1]*100;
J7+=DJ[1]*ZL[0]*1000;
J7/=10;
J7+=DJ[0]*ZL[3];
J7+=DJ[0]*ZL[2]*10;
J7+=DJ[0]*ZL[1]*100;
J7+=DJ[0]*ZL[0]*1000;
ZJ[0]=J7/10000;
J7%=10000;
ZJ[1]=J7/1000;
J7%=1000;
ZJ[2]=J7/100;
J7%=100;
ZJ[3]=J7/10;
J7%=10;
ZJ[4]=J7;
write_12864com(0x9b); //定位
i=ZJ[0];
i=LCD[i];
write_12864dat(i); //送显示
i=ZJ[1];
i=LCD[i];
write_12864dat(i); //送显示
i=ZJ[2];
i=LCD[i];
write_12864dat(i); //送显示
i=ZJ[3];
i=LCD[i];
write_12864dat(i); //送显示
write_12864dat(0x2e); //显示点
i=ZJ[4];
i=LCD[i];
write_12864dat(i); //送显示
P2=0xf0;
delay(1);
}
J2=JP();
if(J6>2){J6=0;}
if(J2<0x40)
{
J2-=0x30;
DJ[J6]=J2;
J2=0xff;
J6++;
}
else
{
switch(J2)
{
case 0x41:P2=0xf0;while(P2==0xf0);J2=0xff;break; //按下A锁定界面
case 0x42:J2=0xff;break; //解除锁定
case 0x43:J1=ReadCount(); //去皮
J3=((J1-8388608)/150)-11;
QPZL[0]=(J3/10000)%10;
QPZL[1]=(J3/1000)%10;
QPZL[2]=(J3/100)%10;
QPZL[3]=(J3/10)%10;
QPZL[4]=J3%10;
J2=0xff;
break;
case 0x44:DJ[0]=0;DJ[1]=0;DJ[2]=0;J6=0;J2=0xff;break; //单价 复位
case 0x45:QPZL[0]=0;QPZL[1]=0;QPZL[2]=0;QPZL[3]=0;QPZL[4]=0;J2=0xff;break; //重量复位
case 0x46:DJ[0]=0;DJ[1]=0;DJ[2]=0;J6=0;QPZL[0]=0;QPZL[1]=0;QPZL[2]=0;QPZL[3]=0;QPZL[4]=0;J2=0xff;break; //单价 重量 复位
default:break;
}
}
write_12864com(0x93);
i=DJ[0];
i=LCD[i];
write_12864dat(i);
i=DJ[1];
i=LCD[i];
write_12864dat(i);
write_12864dat(0x2e);
i=DJ[2];
i=LCD[i];
write_12864dat(i);
}
}
复制代码
作者:
龙道科技
时间:
2015-3-25 08:58
不错啊,谢谢分享
作者:
酷爷IQ
时间:
2015-5-10 21:58
LZ 有没有电路图,有点路途就更好了
作者:
wang215322
时间:
2015-5-12 18:59
很好的学习资料,谢谢分享
作者:
shusy41
时间:
2015-5-29 16:28
楼主ad转换程序是不是有点问题啊 刚开始不是0 哦
作者:
weiliang
时间:
2015-7-12 00:53
有仿真的图么???求资源,谢谢你。
作者:
weiliang
时间:
2015-7-12 01:14
楼主有没有仿真的电路图,
作者:
panamatw
时间:
2015-7-24 09:10
很好的参考资料,谢谢分享,如有电路图更好
作者:
stewart_leung
时间:
2015-8-9 18:34
楼主,放教程啊
作者:
mhx321
时间:
2015-10-29 01:31
太好了,一直想弄个电子称,谢谢楼主
作者:
abc15236617243
时间:
2016-1-9 17:29
谁有量清杯的程序啊
作者:
紫罂粟
时间:
2016-3-17 14:23
LZ,有没有图啊?方便给下吗?
作者:
weekend
时间:
2016-3-20 10:56
楼主,我在做相关的毕业设计,能放教程出来么
作者:
czq18942434756
时间:
2016-3-22 20:30
有仿真图吗?
作者:
harly2200
时间:
2016-3-27 01:12
学习了,顶起
作者:
xuliling
时间:
2016-4-18 15:05
楼主厉害哦!学习了!谢谢分享!
作者:
fbzsn
时间:
2016-6-12 12:28
“case 0x41:P2=0xf0;while(P2==0xf0);J2=0xff;break; //按下A锁定界面
case 0x42:J2=0xff;break; //解除锁定” 怎样锁定界面?请介绍下原理,谢谢!
作者:
哒哒帅
时间:
2016-7-25 16:58
楼主方便给一下仿真图吗
作者:
清风服两岸
时间:
2016-7-27 21:49
刚学习,用HX711做的
作者:
我爱小朋
时间:
2016-7-27 22:13
lz 有没有原理图啊 给一个 拜谢
作者:
清风服两岸
时间:
2016-7-27 23:42
不是1602显示的吗??
作者:
我爱小朋
时间:
2016-7-28 00:35
请问你的A/D模块是HX711吗?还是别的
作者:
hxlywl
时间:
2016-7-28 07:22
很好,值得学习
作者:
pppaz
时间:
2016-7-28 07:57
谢谢楼主大人的分享
作者:
jinzhe
时间:
2016-9-19 15:16
感谢 感谢 感谢 非常感谢
作者:
lszmin
时间:
2016-10-11 13:01
很好的参考资料,谢谢分享,如有电路图更好
作者:
2gy88yhs
时间:
2016-10-11 17:46
很好的学习资料,谢谢分享
作者:
5551
时间:
2016-10-13 19:48
兄弟有电路图吗
作者:
sffhhjkku
时间:
2016-11-24 10:52
可以帮助哈我吗 楼主
作者:
bbkk
时间:
2016-11-28 18:31
楼主再好把电路图也上传, 大家也学习一下。
作者:
秋雨VS寂寞
时间:
2016-11-29 23:44
厉害理解啊
作者:
sxdz86
时间:
2016-12-7 08:11
有原理图吗
作者:
hangmw
时间:
2016-12-7 10:16
LZ 有电路图吗?
作者:
xiaowu123
时间:
2016-12-15 15:22
好棒的设计,很清晰
作者:
lehigh
时间:
2016-12-20 13:08
感谢分享,学习了
作者:
小51hei56565
时间:
2017-4-1 14:54
感谢分享
作者:
极地之光
时间:
2017-4-12 17:43
有原理图吗?我想参考一下。
作者:
519762768
时间:
2017-4-12 22:00
值得学习一段时间了,感谢楼主的分享
作者:
WE1866
时间:
2017-4-13 14:13
不错啊,谢谢分享
作者:
WE1866
时间:
2017-4-13 20:00
谢谢真不错
作者:
1401070065
时间:
2017-4-25 00:26
赞。。。。。。。。。。。。。
作者:
黑boy
时间:
2017-4-26 15:14
挺好 对于做这个电子秤的有帮助
作者:
linnyshow
时间:
2017-4-26 19:05
有没有电路图
作者:
fefen0
时间:
2017-5-2 14:12
给个原理图啊。
作者:
zs3945
时间:
2017-5-22 00:47
为什么我一接上传感器就显示乱码了
作者:
w515748522
时间:
2017-5-26 17:20
不错不错,谢谢分享
作者:
adls
时间:
2017-5-27 08:31
很好的参考资料,谢谢分享,如有电路图更好
作者:
fjc1979
时间:
2017-6-16 12:36
mhx321 发表于 2015-10-29 01:31
太好了,一直想弄个电子称,谢谢楼主
太好了,一直想弄个电子称,谢谢楼主
作者:
WangYM68
时间:
2017-6-30 11:08
很好的学习资料,谢谢分享
作者:
晴枫
时间:
2017-7-26 13:03
刚好需要
作者:
18829298431
时间:
2017-7-31 17:27
真心不错
作者:
lesson18
时间:
2017-9-2 21:14
好利害啊,程序大吗/
作者:
华南摩尔
时间:
2017-9-4 20:09
学习了
作者:
柚子哟哟哟
时间:
2017-9-7 15:04
楼主,有没有仿真图啊?谢谢楼主啊
作者:
返还击
时间:
2018-2-1 16:31
没有读数稳定的判断吗,想探讨下用什么滤波合适啊
作者:
xbalsknx
时间:
2018-5-5 17:55
很不错
作者:
菊次郎的夏天
时间:
2018-5-6 11:51
额,参考一下,谢谢
作者:
zhaoy
时间:
2018-5-18 15:27
有仿真图吗
作者:
碧海涛声
时间:
2018-5-29 08:38
高手,谢谢分享
作者:
碧海涛声
时间:
2018-5-29 08:40
高手,谢谢分享
作者:
mtk1625
时间:
2018-6-29 17:16
有完整程序吗?
作者:
hei0
时间:
2018-7-3 17:26
还是12864的好
作者:
王文文
时间:
2019-4-23 16:48
哪位大神有原理图啊
作者:
smile小宝
时间:
2019-5-24 22:14
正好要学习一下,谢谢分享
作者:
星星之火可以燎
时间:
2019-6-27 11:53
支持,有学习意义
作者:
星星之火可以燎
时间:
2019-6-27 11:53
学习一下
作者:
cgg547100632
时间:
2019-6-28 08:36
很好很好多交流
作者:
hellowC8051
时间:
2019-7-18 11:28
不错啊,谢谢分享
作者:
lijihong_2018
时间:
2019-11-13 11:20
不错,学习一下
作者:
rayin
时间:
2020-11-15 16:20
不错,值得学习。51hei有你更精彩!!
作者:
51giao
时间:
2020-12-28 21:17
LZ 有没有电路原理图 小白上路刚好要用到电子秤设计 谢谢啦
作者:
刘工程
时间:
2021-1-12 15:33
称重组件用啥?准确度如何?
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1