标题: 单片机电子秤设计(源程序+lcd12864显示) [打印本页]

作者: daxiao    时间: 2015-3-22 02:28
标题: 单片机电子秤设计(源程序+lcd12864显示)
本帖最后由 daxiao 于 2015-3-22 02:31 编辑












  1.         //按键接P2口
  2.        //LCD数据口接P0口
  3.        //DOUT=P3^0;
  4.        //PD_SCK=P3^1;
  5.        //RS=P1^1;  VOUT 空接 RST 空接   NC  PSB 接VCC
  6.        //RW=P1^2;
  7.        //E=P1^3;
  8.        //FMQ=P1^0;   蜂鸣器
  9.          #include<reg52.h>
  10. #define uchar unsigned char
  11. #define uint unsigned int

  12. sbit ADDO=P3^0;    //51CPU 准双向I/0 输入使能(DOUT)  / 串行数据输出
  13. sbit ADSK=P3^1;    // 使能AD(PD_SCK)   /  串行时钟输入
  14.     sbit RS=P1^1;     //寄存器选择引脚,搞电平选择数据寄存器,低电平选择指令寄存器
  15.     sbit RW=P1^2;    //读写操作使能引脚,高电平使能读操作,低电平使能写操作
  16.     sbit E=P1^3;     //总使能引脚
  17. sbit FMQ=P1^0;           //蜂鸣器

  18. //----------------------AD转换程序--//
  19. unsigned long ReadCount(void)  //无参数,返回长整形变量
  20. {
  21.   unsigned long Count;      //声明长整形变量Count
  22.   unsigned char i;       //声明字符型变量i
  23.   ADSK=0;         //串行输入拉低
  24.   Count=0;       //变量Count置零
  25.   while(ADDO);      //等待串行输出拉高
  26.   for(i=0;i<24;i++)      //接收24个数据和发送24个脉冲
  27.   {         
  28.    ADSK=1;         //发送脉冲
  29.    Count=Count<<1;        //变量左移
  30.    ADSK=0;          //拉低
  31.    if(ADDO)Count++;       //读入数据(高>>低)
  32.   }
  33.   ADSK=1;          //发送第25个脉冲(选择A通道、128增益。)
  34.   Count=Count^0x800000;    //按位相异或
  35.   ADSK=0;       //串行拉低
  36.      return Count; //返回
  37. }  
  38. //--------------------延时子函数--------//
  39. void delay(unsigned char delayata)
  40. {
  41.   uchar i,j;
  42.   for(i=0;i<delayata;i++)
  43.   {
  44.    for(j=0;j<121;j++)
  45.    {;}
  46.   }
  47. }
  48. //-------------------------------------单键扫描子函数-----//
  49. unsigned char JP()
  50. {
  51. unsigned char x=0x00;
  52.   bit i=0;
  53.   x=P2;   //扫描Y坐标
  54.   FMQ=0;    //响起蜂鸣器
  55.   delay(125);  //延时去抖动
  56.   P2=0x0f;
  57.   delay(2);
  58.   x+=P2;    //扫描X坐标
  59.   switch(x)
  60.   {
  61.    case 0xee:x=0x30;break;    //按下0
  62.    case 0xed:x=0x31;break;    //按下1
  63.    case 0xeb:x=0x34;break;    //按下4
  64.    case 0xe7:x=0x37;break;    //按下7
  65.    case 0xde:x=0x46;break;       //按下F/.
  66.    case 0xdd:x=0x32;break;    //按下2
  67.       case 0xdb:x=0x35;break;    //按下5
  68.    case 0xd7:x=0x38;break;    //按下8
  69.    case 0xbe:x=0x45;break;    //按下E
  70.    case 0xbd:x=0x33;break;    //按下3
  71.    case 0xbb:x=0x36;break;    //按下6
  72.    case 0xb7:x=0x39;break;    //按下9
  73.    case 0x7e:x=0x44;break;    //按下D
  74.    case 0x7d:x=0x43;break;    //按下C
  75.    case 0x7b:x=0x42;break;    //按下B
  76.    case 0x77:x=0x41;break;    //按下A
  77.    default:x=0xff;break;
  78.    }
  79.   FMQ=1;       //关闭蜂鸣器
  80.    while(i==0)    //等待按键松开
  81.    {
  82.     P2=0xf0;
  83.     delay(150);
  84.     if(P2==0xf0)
  85.     {
  86.      i=1;
  87.     }
  88.     else{i=0;}
  89.    }
  90.   return x;    //返回x(ASCII码)
  91. }
  92. //------------------12864写指令子函数-----//
  93. void write_12864com(unsigned char com)
  94. {
  95. RS=0;
  96. RW=0;
  97. delay(1);
  98. E=1;
  99. P0=com;
  100. delay(2);
  101. E=0;
  102. delay(1);
  103. }
  104. //------------------12864写数据子函数-----//
  105. void write_12864dat(unsigned char dat)
  106. {
  107. RS=1;
  108. RW=0;
  109. delay(1);
  110. E=1;
  111. P0=dat;
  112. delay(2);
  113. E=0;
  114. delay(1);
  115. }
  116. //------------------------------LCD初始化-----//
  117. void initinal(void)
  118. {
  119.   delay(100);
  120.   write_12864com(0x30);   //8位并行通信
  121.   delay(1);
  122.   write_12864com(0x30);   //8位并行通信
  123.   delay(1);
  124.   write_12864com(0x02);  
  125.   delay(2);
  126.   write_12864com(0x06);  
  127.   delay(2);
  128.   write_12864com(0x0c);  
  129.   delay(2);
  130.   write_12864com(0x01);  
  131.   delay(2);
  132.   write_12864com(0x80);  
  133.   delay(2);
  134. }
  135. //--------------------主函数-------------//
  136. void main(void)
  137. {
  138.    uchar  LCD[16]={"0123456789ABCDEF"};
  139.    code uchar JM1[]={0xb5,0xda,0xc8,0xfd,0xd7,0xe9,0xb5,0xe7,0xd7,0xd3,0xb3,0xc6};
  140.    code uchar JM2[]={"单价: 00.0元    "};
  141.    code uchar JM3[]={"重量: 00.000KG  "};
  142.    code uchar JM4[]={"总价: 0000.0元  "};
  143.    uchar DJ[3];       //单价
  144.    uchar ZL[5];       //重量
  145.    uchar QPZL[5];   //去皮时的重量
  146.    uchar ZJ[5];       //总价
  147.    unsigned long J1;
  148.    uint J2,J3,J6=0;
  149.    bit J5=1;
  150.    uint J7;
  151.    uchar i;
  152.    uchar JM5[]={5679};
  153.    initinal();  //初始化
  154.   for(i=0;i<3;i++)  //填值
  155.   {
  156.    DJ[i]=0;
  157.   }
  158.   for(i=0;i<5;i++)   //填值
  159.   {
  160.    ZL[i]=0;
  161.   }
  162.   for(i=0;i<5;i++)   //填值
  163.   {
  164.    QPZL[i]=0;
  165.   }
  166.   for(i=0;i<5;i++)   //填值
  167.   {
  168.    ZJ[i]=0;
  169.   }
  170.     write_12864com(0x81);  //定位
  171.   for(i=0;i<12;i++)
  172. {
  173.   write_12864dat(JM1[i]);  //显示 第三组电子称
  174. }
  175. write_12864com(0x90);  //定位
  176. for(i=0;JM2[i]!='\0';i++)
  177. {
  178.   write_12864dat(JM2[i]);    //显示 单价:00.0元
  179. }
  180. write_12864com(0x88);  //定位
  181. for(i=0;JM3[i]!='\0';i++)
  182. {
  183.   write_12864dat(JM3[i]);  //显示 重量: 00.000KG
  184. }
  185. write_12864com(0x98);    //定位
  186. for(i=0;JM4[i]!='\0';i++)
  187. {
  188.   write_12864dat(JM4[i]);   //显示 总价: 0000.0元
  189. }
  190. P2=0xf0;
  191. while(1)
  192. {
  193.    while(P2==0xf0)      //但没有按键按下的时候进入,有按键按下的时候跳出来
  194.    {
  195.    J1=ReadCount();    //读AD值
  196.    J3=((J1-8388608)/150)-11;  //取值
  197.    ZL[0]=(J3/10000)%10;   //重量十位
  198.    if(ZL[0]>3){FMQ=0;}     //超重报警
  199.    else{FMQ=1;}
  200.    ZL[1]=(J3/1000)%10;       //重量个位
  201.    ZL[2]=(J3/100)%10;     //计算位
  202.    ZL[3]=(J3/10)%10;
  203.    ZL[4]=J3%10;
  204.    J7=ZL[4];
  205.    J7+=ZL[3]*10;
  206.    J7+=ZL[2]*100;
  207.    J7+=ZL[1]*1000;
  208.    J7+=ZL[0]*10000;
  209.    J3=QPZL[4];
  210.    J3+=QPZL[3]*10;
  211.    J3+=QPZL[2]*100;
  212.    J3+=QPZL[1]*1000;
  213.    J3+=QPZL[0]*10000;
  214.    J7-=J3;
  215.    ZL[0]=J7/10000;
  216.    J7%=10000;
  217.    ZL[1]=J7/1000;
  218.    J7%=1000;
  219.    ZL[2]=J7/100;
  220.    J7%=100;
  221.    ZL[3]=J7/10;
  222.    J7%=10;
  223.    ZL[4]=J7;
  224.    write_12864com(0x8b); //定位
  225.    write_12864dat(LCD[ZL[0]]);    //送显示
  226.    write_12864dat(LCD[ZL[1]]);    //送显示
  227.    write_12864dat(0x2e);    //送显示
  228.    write_12864dat(LCD[ZL[2]]);    //送显示
  229.    write_12864dat(LCD[ZL[3]]);    //送显示
  230.    write_12864dat(LCD[ZL[4]]);    //送显示
  231.    J7=DJ[2]*ZL[3];
  232.    J7+=DJ[2]*ZL[2]*10;
  233.    J7+=DJ[2]*ZL[1]*100;
  234.    J7+=DJ[2]*ZL[0]*1000;
  235.    J7/=10;
  236.    J7+=DJ[1]*ZL[3];
  237.    J7+=DJ[1]*ZL[2]*10;
  238.    J7+=DJ[1]*ZL[1]*100;
  239.    J7+=DJ[1]*ZL[0]*1000;
  240.    J7/=10;
  241.    J7+=DJ[0]*ZL[3];   
  242.    J7+=DJ[0]*ZL[2]*10;
  243.    J7+=DJ[0]*ZL[1]*100;
  244.    J7+=DJ[0]*ZL[0]*1000;

  245. ZJ[0]=J7/10000;
  246. J7%=10000;
  247. ZJ[1]=J7/1000;
  248. J7%=1000;
  249. ZJ[2]=J7/100;
  250. J7%=100;
  251. ZJ[3]=J7/10;
  252. J7%=10;
  253. ZJ[4]=J7;
  254.   write_12864com(0x9b); //定位
  255.   i=ZJ[0];
  256.   i=LCD[i];
  257.   write_12864dat(i);    //送显示
  258.    i=ZJ[1];
  259.   i=LCD[i];
  260.   write_12864dat(i);    //送显示
  261.    i=ZJ[2];
  262.   i=LCD[i];
  263.   write_12864dat(i);    //送显示
  264.    i=ZJ[3];
  265.   i=LCD[i];
  266.   write_12864dat(i);    //送显示
  267.   write_12864dat(0x2e);   //显示点
  268.     i=ZJ[4];
  269.   i=LCD[i];
  270.   write_12864dat(i);    //送显示
  271.    P2=0xf0;
  272.    delay(1);
  273.    }
  274.    J2=JP();
  275.    if(J6>2){J6=0;}
  276.    if(J2<0x40)
  277.    {
  278.    J2-=0x30;
  279.    DJ[J6]=J2;
  280.    J2=0xff;
  281.    J6++;
  282.    }
  283.    else
  284.    {
  285.     switch(J2)
  286.    {
  287. case 0x41:P2=0xf0;while(P2==0xf0);J2=0xff;break;    //按下A锁定界面
  288.     case 0x42:J2=0xff;break;         //解除锁定
  289. case 0x43:J1=ReadCount();          //去皮
  290.            J3=((J1-8388608)/150)-11;
  291.      QPZL[0]=(J3/10000)%10;
  292.      QPZL[1]=(J3/1000)%10;
  293.      QPZL[2]=(J3/100)%10;
  294.      QPZL[3]=(J3/10)%10;
  295.      QPZL[4]=J3%10;
  296.      J2=0xff;
  297.      break;
  298. case 0x44:DJ[0]=0;DJ[1]=0;DJ[2]=0;J6=0;J2=0xff;break;    //单价 复位
  299.     case 0x45:QPZL[0]=0;QPZL[1]=0;QPZL[2]=0;QPZL[3]=0;QPZL[4]=0;J2=0xff;break;   //重量复位
  300.     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;    //单价 重量 复位
  301. default:break;
  302.    }
  303.    }
  304.    write_12864com(0x93);
  305.    i=DJ[0];
  306.    i=LCD[i];
  307.    write_12864dat(i);
  308.    i=DJ[1];
  309.    i=LCD[i];
  310.    write_12864dat(i);
  311.    write_12864dat(0x2e);
  312.    i=DJ[2];
  313.    i=LCD[i];
  314.    write_12864dat(i);
  315. }
  316. }
复制代码



作者: 龙道科技    时间: 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