找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 34019|回复: 71
打印 上一主题 下一主题
收起左侧

单片机电子秤设计(源程序+lcd12864显示)

  [复制链接]
跳转到指定楼层
楼主
ID:75005 发表于 2015-3-22 02:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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. }
复制代码


评分

参与人数 5黑币 +26 收起 理由
512713659 + 5 赞一个!
黑boy + 1 赞一个!
ssfc + 5 赞一个!
YJGG + 10 很给力!
madell + 5 赞一个!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏23 分享淘帖 顶9 踩
回复

使用道具 举报

沙发
ID:73868 发表于 2015-3-25 08:58 | 只看该作者
不错啊,谢谢分享
回复

使用道具 举报

板凳
ID:79560 发表于 2015-5-10 21:58 | 只看该作者
LZ 有没有电路图,有点路途就更好了
回复

使用道具 举报

地板
ID:75610 发表于 2015-5-12 18:59 | 只看该作者
很好的学习资料,谢谢分享
回复

使用道具 举报

5#
ID:81478 发表于 2015-5-29 16:28 | 只看该作者
楼主ad转换程序是不是有点问题啊 刚开始不是0 哦
回复

使用道具 举报

6#
ID:85424 发表于 2015-7-12 00:53 | 只看该作者
有仿真的图么???求资源,谢谢你。
回复

使用道具 举报

7#
ID:85424 发表于 2015-7-12 01:14 | 只看该作者
楼主有没有仿真的电路图,
回复

使用道具 举报

8#
ID:86684 发表于 2015-7-24 09:10 | 只看该作者
很好的参考资料,谢谢分享,如有电路图更好
回复

使用道具 举报

9#
ID:87991 发表于 2015-8-9 18:34 | 只看该作者
楼主,放教程啊
回复

使用道具 举报

10#
ID:93227 发表于 2015-10-29 01:31 | 只看该作者
太好了,一直想弄个电子称,谢谢楼主
回复

使用道具 举报

11#
ID:102541 发表于 2016-1-9 17:29 | 只看该作者
谁有量清杯的程序啊
回复

使用道具 举报

12#
ID:109330 发表于 2016-3-17 14:23 | 只看该作者
LZ,有没有图啊?方便给下吗?
回复

使用道具 举报

13#
ID:109797 发表于 2016-3-20 10:56 | 只看该作者
楼主,我在做相关的毕业设计,能放教程出来么
回复

使用道具 举报

14#
ID:109752 发表于 2016-3-22 20:30 | 只看该作者
有仿真图吗?
回复

使用道具 举报

15#
ID:106211 发表于 2016-3-27 01:12 | 只看该作者
学习了,顶起
回复

使用道具 举报

16#
ID:110375 发表于 2016-4-18 15:05 | 只看该作者
楼主厉害哦!学习了!谢谢分享!
回复

使用道具 举报

17#
ID:45225 发表于 2016-6-12 12:28 | 只看该作者
“case 0x41:P2=0xf0;while(P2==0xf0);J2=0xff;break;    //按下A锁定界面
    case 0x42:J2=0xff;break;         //解除锁定”          怎样锁定界面?请介绍下原理,谢谢!
回复

使用道具 举报

18#
ID:134965 发表于 2016-7-25 16:58 | 只看该作者
楼主方便给一下仿真图吗
回复

使用道具 举报

19#
ID:135271 发表于 2016-7-27 21:49 | 只看该作者
刚学习,用HX711做的
回复

使用道具 举报

20#
ID:135275 发表于 2016-7-27 22:13 | 只看该作者
lz  有没有原理图啊  给一个 拜谢
回复

使用道具 举报

21#
ID:135271 发表于 2016-7-27 23:42 | 只看该作者
不是1602显示的吗??
回复

使用道具 举报

22#
ID:135275 发表于 2016-7-28 00:35 | 只看该作者
请问你的A/D模块是HX711吗?还是别的
回复

使用道具 举报

23#
ID:135299 发表于 2016-7-28 07:22 | 只看该作者
很好,值得学习
回复

使用道具 举报

24#
ID:135166 发表于 2016-7-28 07:57 | 只看该作者
谢谢楼主大人的分享
回复

使用道具 举报

25#
ID:139833 发表于 2016-9-19 15:16 | 只看该作者
感谢 感谢 感谢 非常感谢
回复

使用道具 举报

26#
ID:113220 发表于 2016-10-11 13:01 | 只看该作者

很好的参考资料,谢谢分享,如有电路图更好
回复

使用道具 举报

27#
ID:142342 发表于 2016-10-11 17:46 | 只看该作者

很好的学习资料,谢谢分享
回复

使用道具 举报

28#
ID:117161 发表于 2016-10-13 19:48 | 只看该作者
     兄弟有电路图吗
回复

使用道具 举报

29#
ID:149863 发表于 2016-11-24 10:52 | 只看该作者
可以帮助哈我吗  楼主
回复

使用道具 举报

30#
ID:150514 发表于 2016-11-28 18:31 | 只看该作者
楼主再好把电路图也上传, 大家也学习一下。
回复

使用道具 举报

31#
ID:147658 发表于 2016-11-29 23:44 | 只看该作者
厉害理解啊
回复

使用道具 举报

32#
ID:62391 发表于 2016-12-7 08:11 | 只看该作者
有原理图吗
回复

使用道具 举报

33#
ID:73795 发表于 2016-12-7 10:16 | 只看该作者
LZ 有电路图吗?
回复

使用道具 举报

34#
ID:155015 发表于 2016-12-15 15:22 | 只看该作者
好棒的设计,很清晰
回复

使用道具 举报

35#
ID:110866 发表于 2016-12-20 13:08 | 只看该作者
感谢分享,学习了
回复

使用道具 举报

36#
ID:184237 发表于 2017-4-1 14:54 | 只看该作者
感谢分享
回复

使用道具 举报

37#
ID:108598 发表于 2017-4-12 17:43 | 只看该作者
有原理图吗?我想参考一下。
回复

使用道具 举报

38#
ID:146492 发表于 2017-4-12 22:00 | 只看该作者
值得学习一段时间了,感谢楼主的分享
回复

使用道具 举报

39#
ID:18572 发表于 2017-4-13 14:13 | 只看该作者
不错啊,谢谢分享
回复

使用道具 举报

40#
ID:18572 发表于 2017-4-13 20:00 | 只看该作者
谢谢真不错
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表