找回密码
 立即注册

QQ登录

只需一步,快速开始

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

电子秤 输入单价 显示总价,质量,有清零和超重报警的源码+仿真

  [复制链接]
跳转到指定楼层
楼主
电子秤 输入单价 显示总价、质量,有清零和超重报警的源码+仿真
连夜赶出来的项目

proteus仿真图设计:




下面贴出源码:
  1. #include<reg52.h>
  2. #include<intrins.h>
  3. typedef unsigned char uint8;
  4. typedef unsigned int uint16;
  5. sbit rs=P2^6;
  6. sbit rw=P2^5;
  7. sbit e=P2^7;
  8. sbit scl=P2^1;
  9. sbit sda=P2^0;
  10. uint8 num[]="0123456789";
  11. uint8 d1[]="RMB/kg: ";
  12. uint16 ad[5],m[5];
  13. uint8 kn=10;
  14. uint8 keynum[3];
  15. float pric=0;
  16. sbit CS=P3^5;                           
  17. sbit Clk=P3^6;                           //时钟
  18. sbit DO=P3^7;                           //ADC0832输出引脚
  19. sbit DI=P3^7; //ADC0832输入引脚
  20. unsigned char dat,count=0,point=0;
  21. void delay(uint16 i)
  22. {
  23.         while(i--);
  24. }
  25. void wrc(uint8 c)
  26. {
  27.         delay(1);
  28.         rs=0;
  29.         rw=0;
  30.         e=0;
  31.         P0=c;
  32.         e=1;
  33.         delay(1);
  34.         e=0;
  35. }
  36. void wrd(uint8 dat)
  37. {
  38.         delay(1);
  39.         rs=1;
  40.         rw=0;
  41.         e=0;
  42.         P0=dat;
  43.         e=1;
  44.         delay(1);
  45.         e=0;
  46.         rs=0;
  47. }
  48. void init()
  49. {
  50.         delay(1);
  51.         wrc(0x38);
  52.         wrc(0x38);
  53.         wrc(0x38);
  54.         wrc(0x06);
  55.         wrc(0x0c);
  56.         wrc(0x01);
  57. }
  58. /************************【AD0832】*************************************/

  59. unsigned char A_D(unsigned char CH)                     //AD函数
  60. {
  61.        unsigned char i,adval,test;               //定义局部变量并初始化
  62.        adval=0x00;
  63.        test=0x00;
  64.        Clk=0;                                 //clk低电平
  65.        DI=1;                                   //DI初始高电平在第一个时钟脉冲的下降沿前保持高电平,表示启动信号
  66.        _nop_();                              
  67.        CS=0;                                  //片选
  68.        _nop_();
  69.        Clk=1;                                 //clk上升沿,起始位写入
  70.        _nop_();
  71.        if(CH==0x00)                      //选择通道0
  72.        {
  73.               Clk=0;                              //clk低电平
  74.                DI=1;                             
  75.               _nop_();
  76.               Clk=1;                              //clk上升沿,通道0的第一位写入
  77.               _nop_();
  78.               Clk=0;
  79.               DI=1;
  80.               _nop_();
  81.               Clk=1;                              //clk上升沿,通道0的第二位写入
  82.               _nop_();
  83.        }
  84.        else
  85.        {
  86.               Clk=0;
  87.               DI=1;
  88.               _nop_();
  89.               Clk=1;                          //clk上升沿,通道1的第一位写入
  90.               _nop_();
  91.               Clk=0;
  92.               DI=1;
  93.               _nop_();                        //clk上升沿,通道1的第二位写入
  94.               Clk=1;
  95.               _nop_();
  96.        }
  97.        Clk=0;
  98.        DI=1;
  99.        for(i=0;i<8;i++)                //从高位向低位读取八位AD值
  100.        {
  101.               _nop_();
  102.               adval<<=1;
  103.               Clk=1;
  104.               _nop_();
  105.               Clk=0;
  106.               if(DO)
  107.                      adval|=0x01;
  108.               else
  109.                      adval|=0x00;
  110.        }
  111.        for(i=0;i<8;i++)
  112.        {
  113.             
  114.               test>>=1;                             //从低位向高位读取八位AD值
  115.             
  116.               if(DO)
  117.                      test|=0x80;  
  118.               else              
  119.                      test|=0x00;
  120.                      _nop_();
  121.                      Clk=1;
  122.                      _nop_();
  123.                      Clk=0;
  124.        }
  125.        if(adval==test)    dat=test;                 //判断两个读取值是否相等相等就把读取的数赋值给DAT
  126.        _nop_();
  127.        CS=1;
  128.        DO=1;
  129.        Clk=1;
  130.        return dat;
  131. }  
  132. uint8 keyscan()                 //按键扫描程序
  133. {
  134.         uint8 h,l,value;
  135.         P1=0x0f;
  136.         h=P1&0x0f;
  137.         if(h!=0x0f)
  138.         {
  139.                 delay(1);
  140.                 if(h!=0x0f)
  141.                 {
  142.                         h=P1&0x0f;
  143.                         l=P1|0xf0;
  144.                         P1=l;
  145.                         l=P1&0xf0;
  146.                         h=P1&0x0f;
  147.                         value=h+l;        
  148.                 }
  149.                 return value;
  150.         }
  151. }
  152. void keypros()                  //按键处理函数
  153. {
  154.         uint8 key;
  155.         key=keyscan();
  156.         switch(key)
  157.         {
  158.                 case 0xee: kn=0;break;
  159.                 case 0xde: kn=1;break;
  160.                 case 0xbe: kn=2;break;
  161.                 case 0x7e:break;
  162.                 case 0xed: kn=3;break;
  163.                 case 0xdd: kn=4;break;
  164.                 case 0xbd: kn=5;break;
  165.                 case 0x7d: break;
  166.                 case 0xeb: kn=6;break;
  167.                 case 0xdb: kn=7;break;
  168.                 case 0xbb: kn=8;break;   
  169.                 case 0x7b: break;
  170.                 case 0xe7: kn=9;break;
  171.                 case 0xd7: kn=10;break; //小数点按下标志位
  172.                 case 0xb7: kn=11;break; //clear,清空计价输入
  173.                 case 0x77: break;
  174.                 default :  break;
  175.         }        
  176. }
  177. void datapros()
  178. {
  179.         uint8 i;
  180.                            //将按键值保存在数组keynum中
  181.         
  182.                 P1=0x0f;
  183.                 if(P1!=0x0f)               
  184.                 {
  185.                         keypros();
  186.                         P1=0x0f;
  187.                         while(P1!=0x0f);//等待按键松开
  188.                         if(kn>=0&&kn<=9)
  189.                         {
  190.                                 
  191.                                 if(point==0)
  192.                                 {        
  193.                                 if(count<2)        
  194.                                 {count++;
  195.                                         keynum[count]=kn;
  196.                                         wrc(0x09+count+point+0x80);  //移位显示
  197.                                         wrd(keynum[count]+0x30);
  198.                                 
  199.                                         pric=pric*10+kn;        
  200.                                        
  201.                                 }
  202.                         }
  203.                                 else if(point<3)
  204.                                 {point++;
  205.                                         keynum[count]=kn;
  206.                                         wrc(0x09+count+point+0x80);  //移位显示
  207.                                         wrd(keynum[count]+0x30);
  208.                                 if(point==2)
  209.                                         pric=pric+kn*1.0/10;        
  210.                                 if(point==3)pric=pric+kn*1.0/100;        
  211.                                 
  212.                                 }
  213.                         }
  214.                                 if(kn==10&&point==0)
  215.                                 {        point=1;
  216.                                         //count=0;
  217.                                         if(count==0)
  218.                                         {wrc(0x09+0x80);  //移位显示
  219.                                         wrd('0');
  220.                                         }
  221.                                         wrc(0x09+count+point+0x80);  //移位显示
  222.                                         wrd('.');
  223.                                        
  224.                                 }
  225.                                        
  226.                         if(kn==11)          //清除按键计价数
  227.                         {
  228.                                 wrc(0x01);//清屏处理        
  229.                                 pric=0;
  230.                                 count=0;
  231.                                 point=0;
  232.                                 for(i=0;i<3;i++)
  233.                                 keynum[i]=0;
  234.                         }
  235.                
  236.         
  237.         
  238.                
  239.         
  240.                 }                        
  241.                
  242.         kn=0;
  243. }
  244. void display()
  245. {
  246.         float v;
  247.         uint8 i;
  248.         uint16 price;
  249.         ad[0]=A_D(0);        //读取第一次之前的那次数据
  250.         v=ad[0]*0.01953;//将电位器的数据转换成电压值
  251.         v=v*100;//取2位有效数值
  252.         ad[0]=v;
  253.         price=ad[0]*pric;         //每千克多少钱如果我们定义每千克2元那么就可以乘以2,如果为其他我们可以乘以其他数,最大定义的价格是200元每千克
  254.         wrc(0x00+0x80);
  255.         for(i=0;i<8;i++)
  256.         {
  257.                 wrd(d1[i]);
  258.         }
  259.         wrc(0x40+0x80);
  260.         wrd('m');
  261.         wrd(':');
  262.         wrd(num[ad[0]/100]);
  263.         wrd('.');
  264. ……………………

  265. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
电子秤.zip (68.65 KB, 下载次数: 190)


评分

参与人数 1黑币 +100 收起 理由
admin + 100 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:146834 发表于 2017-6-16 15:33 | 只看该作者
咋没有人回帖。
回复

使用道具 举报

板凳
ID:708082 发表于 2020-3-14 09:19 | 只看该作者
好东西 研究研究
回复

使用道具 举报

地板
ID:721884 发表于 2020-4-8 13:11 来自手机 | 只看该作者
楼主,压敏电阻代替了压力传感器吗
回复

使用道具 举报

5#
ID:1017118 发表于 2022-4-10 00:27 | 只看该作者
这个资料好,正好想做一个类似的,好好研究一下
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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