找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 9373|回复: 8
收起左侧

单片机电子秤Proteus仿真设计 附源码与说明

  [复制链接]
ID:429086 发表于 2018-11-19 11:26 | 显示全部楼层 |阅读模式
电子秤使用说明:
按键:
数字键0-9、RTP为去皮键,GOOD1-GOOD4键为商品1-4键,DOLLAR为美元汇率键,EURO为欧元汇率键,UNITS为单位切换键,TOTAL键为计价键,ALL键为求和键,MEMO为存储键,SET键为设置键,BACK键为万能返回键,OPEN键为串口通讯开放键,CLOSE键为串口通信关闭键,SHIFT键为切换键(用来切换一个按键的第二功能,如数字7键,按下shift键后,数字7键实现为GOO1键的功能)
功能及使用方法:
1,计价:直接按下数字键,可设置0-100内的单价,可精确至小数点后一位,输入好单价后,按下TOTAL键即可算出价格。
2,快速计价:首先是给商品键设置单价,按下SET键,再按下数字键来输入我们想设置的单价,再按下SHIFT键,再按下数字键7即我们将想要的单价设置存储至商品键1中,按下BACK键和SHIFT键返回至初始界面,接下来是快速计价,按下SHIFT键,再按下数字键7即显示出设置好的商品键1的单价,最后按下计价键(需要再按下SHIFT键,否则显示为求和功能),完成计价
3,汇率转换:首先是设置汇率,与之前设置单价的步骤一致,按下SET键,再按下数字键来输入我们想设置的汇率(可精确至小数点后两位),再按下SHIFT键,再按下数字键1即我们将想要的汇率设置存储至美元键中,接下来是汇率转换,当计算完一次价格后,按下SHIFT键,再按下数字键1,既可以将价格进行所设置的汇率转换
4,存储求和:计算完一次价格后,按下SHIFT键,再按下小数点键即将此次价格存储下来,可以存储多次价格将其求和,最后按下求和键(即SHIFT加上计价键)可以将存储的价格求和出来。
5,串口通信:按下OPEN键(即SHIFT加数字键5)既可以将计算完的价格传至从机中在从机中显示并记录下来,传送完毕后按下CLOSE键即可关闭通信,从机可以浏览最近三次的传送价格记录,从机中的OPEN为打开记录,CLOSE为关闭记录,SWITCH为切换下一条记录。
电子秤还具有其他的小功能如去皮,单位切换等,由于操作比较直观所以不做介绍。
设计还不够完善,不过应付小的课程设计和要求不是很严格的本科毕业设计差不多够了。

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0.png 0.png

单片机源程序如下:
  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #include <absacc.h>
  4. #include <math.h>

  5. #define uchar unsigned char
  6. #define uint   unsigned int
  7. #define BUSY  0x80                              
  8. #define DATAPORT P0
  9. #define OP_READ 0xa1  
  10. #define OP_WRITE 0xa0

  11. sbit ADCS =P3^5;
  12. sbit ADDI =P3^7;  
  13. sbit ADDO =P3^7;  
  14. sbit ADCLK =P3^6;  
  15. sbit beep=P2^7;
  16. sbit LCM_RS=P2^0;
  17. sbit LCM_RW=P2^1;
  18. sbit LCM_EN=P2^2;
  19. sbit SCL=P2^3;
  20. sbit SDA=P2^4;
  21. sbit Kai=P2^5;

  22. uint h1,n1,w1,g1,j1,j2,j3,j4,j5,j6,temp1,temp2,temp3,temp4=0,temp5,temp6,a3,b3,c3,d3,a4,b4,c4,d4,a7,b7,c7,d7,e7,a8,b8,c8,d8,e8;
  23. uchar ad_data,k,n,m,e,num,s,shift,sett,h,ncm,a1,b1,c1,d1,a2,b2,c2,d2,x1,y1,z1,mc,na,nb,nc;                                                     
  24.                   
  25. char press_data;                                                         
  26. unsigned char press_ge=0;                        
  27. unsigned char press_shifen=0;                        
  28. unsigned char press_baifen=0;                        
  29. unsigned char press_qianfen=0;
  30. unsigned char press_ge1=0;                        
  31. unsigned char press_shifen1=0;                        
  32. unsigned char press_baifen1=0;                        
  33. unsigned char press_qianfen1=0;                        
  34. unsigned char press_wanfen1=0;

  35. uchar code str0[]={"Weight:  .   Kg "};
  36. uchar code str1[]={"error"};
  37. uchar code str2[]={"Price:          "};
  38. uchar code str3[]={"Total:             "};
  39. uchar code table2[]={0x37,0x38,0x39,0xfd,0x34,0x35,0x36,0x78,0x31,0x32,0x33,0x2d,0x3d,0x30,0x2e,};
  40. uchar code str4[]={"Weight:    .  g "};
  41. uchar code str5[]={"GOOD :          "};
  42. uchar code str6[]={"RATE :          "};
  43. uchar code str7[]={"DOLLAR:         "};  
  44. uchar code str8[]={"EURO  :         "};   
  45. void delay(uint);
  46. void lcd_wait(void);
  47. void delay_LCM(uint);                                                                                                     
  48. void initLCM( void);                                                                                                      
  49. void lcd_wait(void);                                                                                                      
  50. void WriteCommandLCM(uchar WCLCM,uchar BusyC);                              
  51. void WriteDataLCM(uchar WDLCM);                                             
  52. void DisplayOneChar(uchar X,uchar Y,uchar DData);                           
  53. void DisplayListChar(uchar X,uchar Y,uchar code *DData);                                                
  54. void display(void);
  55. uchar Adc0832(unsigned char channel);                                                                                                                        
  56. void data_pro(void);
  57. void data_pro1(void);
  58. void display1(void);
  59. void alarm(void);
  60. void weishu1(uint m);
  61. void WriteSet(uchar X,uchar Y);
  62. uchar ReadSet(uchar channel);
  63. void com(uchar X);
  64. void intcom(void);

  65. void main(void)
  66. {
  67.     delay(500);                                            
  68.            initLCM( );
  69.         intcom();
  70.         delay(100);  
  71.            WriteCommandLCM(0x01,1);                    
  72.     DisplayListChar(0,0,str0);
  73.         DisplayListChar(0,1,str2);
  74.         while(1)
  75.     {
  76.            if(ncm!=1)
  77.            {
  78.            ad_data =Adc0832(0);
  79.            h=ad_data;   
  80.            alarm();
  81.            data_pro();
  82.            display();
  83.            }
  84. if(ncm==1)
  85. {
  86.    ad_data=Adc0832(0)-h;
  87.    alarm();
  88.    data_pro();
  89.         display();
  90. }
  91.          if(k==1&&(shift%2)==0)
  92.      {

  93.       DisplayOneChar((s+7),1,table2[num-1]);
  94.           if(s+7==8) x1=n;
  95.           if(s+7==9) y1=n;
  96.           if(s+7==11) z1=n;
  97.           if(s+7==12) g1=n;
  98.           mc=10*x1+y1;
  99.      }
  100.         if(num==1&&(shift%2)==1&&(sett%2)==1)
  101.         {
  102.          WriteCommandLCM(0x01,1);
  103.          DisplayListChar(0,1,str5);
  104.          DisplayOneChar(4,1,table2[8]);
  105.          a1=mc;b1=z1;c1=x1;d1=y1;
  106.          DisplayOneChar(8,1,x1+0x30);
  107.          DisplayOneChar(9,1,y1+0x30);
  108.          DisplayOneChar(10,1,0x2e);
  109.           DisplayOneChar(11,1,z1+0x30);
  110.      WriteSet(0x01,mc);
  111.          WriteSet(0x02,x1);
  112.      WriteSet(0x03,y1);
  113.      WriteSet(0x04,z1);
  114.         }
  115.    if(num==1&&(shift%2)==1&&(sett%2)==0&&k!='=')
  116.    {        
  117.         WriteCommandLCM(0x01,1);
  118.         DisplayListChar(0,1,str2);
  119.         a1=ReadSet(0x01);
  120.         c1=ReadSet(0x02);
  121.         DisplayOneChar(8,1,c1+0x30);
  122.         d1=ReadSet(0x03);
  123.         DisplayOneChar(9,1,d1+0x30);
  124.         DisplayOneChar(10,1,0x2e);
  125.         b1=ReadSet(0x04);
  126.         DisplayOneChar(11,1,b1+0x30);
  127.          mc=a1;z1=b1;
  128.    }
  129.         if(num==2&&(shift%2)==1&&(sett%2)==1)
  130.         {
  131.          WriteCommandLCM(0x01,1);
  132.          DisplayListChar(0,1,str5);
  133.          DisplayOneChar(4,1,table2[9]);
  134.          a2=mc;b2=z1;c2=x1;d2=y1;
  135.          DisplayOneChar(8,1,x1+0x30);
  136.          DisplayOneChar(9,1,y1+0x30);
  137.          DisplayOneChar(10,1,0x2e);
  138.          DisplayOneChar(11,1,z1+0x30);
  139. WriteSet(0x05,mc);
  140. WriteSet(0x06,z1);
  141. WriteSet(0x07,x1);
  142. WriteSet(0x08,y1);
  143.            }
  144.    if(num==2&&(shift%2)==1&&(sett%2)==0&&k!='=')
  145.    {
  146.     a2=ReadSet(0x05);
  147.         b2=ReadSet(0x06);
  148.     c2=ReadSet(0x07);
  149.     d2=ReadSet(0x08);        
  150.         WriteCommandLCM(0x01,1);
  151.         DisplayListChar(0,1,str2);
  152.         DisplayOneChar(8,1,c2+0x30);
  153.         DisplayOneChar(9,1,d2+0x30);
  154.         DisplayOneChar(10,1,0x2e);
  155.         DisplayOneChar(11,1,b2+0x30);
  156.          mc=a2;z1=b2;
  157.    }
  158.          if(num==3&&(shift%2)==1&&(sett%2)==1)
  159.         {
  160.          WriteCommandLCM(0x01,1);
  161.          DisplayListChar(0,1,str5);
  162.          DisplayOneChar(4,1,table2[10]);
  163.          a3=mc;b3=z1;c3=x1;d3=y1;
  164.          DisplayOneChar(8,1,x1+0x30);
  165.          DisplayOneChar(9,1,y1+0x30);
  166.          DisplayOneChar(10,1,0x2e);
  167.           DisplayOneChar(11,1,z1+0x30);
  168.         WriteSet(0x09,mc);
  169. WriteSet(0x0a,z1);
  170. WriteSet(0x0b,x1);
  171. WriteSet(0x0c,y1);
  172.         }
  173.    if(num==3&&(shift%2)==1&&(sett%2)==0&&k!='=')
  174.    {
  175.      a3=ReadSet(0x09);
  176.         b3=ReadSet(0x0a);
  177.     c3=ReadSet(0x0b);
  178.     d3=ReadSet(0x0c);
  179.         WriteCommandLCM(0x01,1);
  180.         DisplayListChar(0,1,str2);
  181.         DisplayOneChar(8,1,c3+0x30);
  182.         DisplayOneChar(9,1,d3+0x30);
  183.         DisplayOneChar(10,1,0x2e);
  184.         DisplayOneChar(11,1,b3+0x30);
  185.          mc=a3;z1=b3;
  186.    }
  187.         if(num==5&&(shift%2)==1&&(sett%2)==1)
  188.         {
  189.          WriteCommandLCM(0x01,1);
  190.          DisplayListChar(0,1,str5);
  191.          DisplayOneChar(4,1,table2[4]);
  192.          a4=mc;b4=z1;c4=x1;d4=y1;
  193.          DisplayOneChar(8,1,x1+0x30);
  194.          DisplayOneChar(9,1,y1+0x30);
  195.          DisplayOneChar(10,1,0x2e);
  196.           DisplayOneChar(11,1,z1+0x30);
  197.         }
  198.    if(num==5&&(shift%2)==1&&(sett%2)==0&&k!='=')
  199.    {
  200.         WriteCommandLCM(0x01,1);
  201.         DisplayListChar(0,1,str2);
  202.         DisplayOneChar(8,1,c4+0x30);
  203.         DisplayOneChar(9,1,d4+0x30);
  204.         DisplayOneChar(10,1,0x2e);
  205.         DisplayOneChar(11,1,b4+0x30);
  206.          mc=a4;z1=b4;
  207.    }
  208.    if(num==6&&(shift%2)==1)
  209.    {
  210.         ES=1;
  211.         com(na);
  212.         delay(10);
  213.         com(nb);
  214.         delay(10);
  215.         com(nc);
  216.   num=0;
  217.    }
  218.    if(num==7&&(shift%2)==1)
  219.    {
  220.    ES=0;
  221.    }
  222.    if(num==9&&(shift%2)==1&&(sett%2)==1)
  223.         {
  224.          WriteCommandLCM(0x01,1);
  225.          DisplayListChar(0,1,str6);
  226.          a7=mc;b7=z1;c7=x1;d7=y1;e7=g1;
  227.          DisplayOneChar(8,1,c7+0x30);
  228.          DisplayOneChar(9,1,d7+0x30);
  229.          DisplayOneChar(10,1,0x2e);
  230.          DisplayOneChar(11,1,b7+0x30);
  231.          DisplayOneChar(12,1,e7+0x30);
  232.                 WriteSet(0x10,mc);
  233. WriteSet(0x11,z1);
  234. WriteSet(0x12,x1);
  235. WriteSet(0x13,y1);
  236. WriteSet(0x14,g1);
  237.         }
  238. if(num==9&&(shift%2)==1&&(sett%2)==0)
  239. {
  240.   b7=ReadSet(0x11);
  241.   c7=ReadSet(0x12);
  242.   d7=ReadSet(0x13);
  243.   e7=ReadSet(0x14);
  244.    j1=w1/100;j2=w1%100;j3=a7*j1*100;j4=b7*10+e7;j5=j1*j4;j6=j2*a7;j3=j3+j5+j6+(j2*j4)/100;;
  245.    WriteCommandLCM(0x01,1);
  246.    DisplayListChar(0,1,str7);
  247.    weishu1(j3);
  248.    j1=0;j2=0;j3=0;j4=0;j5=0;j6=0; num=0;
  249. }
  250.     if(num==10&&(shift%2)==1&&(sett%2)==1)
  251.         {
  252.          WriteCommandLCM(0x01,1);
  253.          DisplayListChar(0,1,str6);
  254.          a8=w1;b8=z1;c8=x1;d8=y1;e8=g1;
  255.          DisplayOneChar(8,1,c8+0x30);
  256.          DisplayOneChar(9,1,d8+0x30);
  257.          DisplayOneChar(10,1,0x2e);
  258.          DisplayOneChar(11,1,b8+0x30);
  259.          DisplayOneChar(12,1,e8+0x30);
  260.         }
  261. if(num==10&&(shift%2)==1&&(sett%2)==0)
  262. {
  263.    j1=w1/100;j2=w1%100;j3=a8*j1*100;j4=b8*10+e8;j5=j1*j4;j6=j2*a8;j3=j3+j5+j6+(j2*j4)/100;
  264.    WriteCommandLCM(0x01,1);
  265.    DisplayListChar(0,1,str8);
  266.    weishu1(j3);
  267.    j1=0;j2=0;j3=0;j4=0;j5=0;j6=0; num=0;
  268. }
  269.         if(k=='='&&(shift%2)==0)
  270.         {         
  271.                 w1=mc;
  272.                 n1=w1*temp5;
  273.             w1=w1*temp2;
  274.                 h1=(z1*temp1)/10;
  275.             h1=(n1+h1)/10;
  276.                 w1=w1+h1;
  277.             WriteCommandLCM(0x01,1);
  278.         DisplayListChar(0,1,str3);
  279.                 s=0;
  280.             weishu1(w1);
  281.             k=0;
  282.                 na=w1/1000;
  283.                 nb=(w1-na*1000)/10;
  284.                 nc=(w1-na*1000-nb*10);
  285.         }
  286.         if(k==' ')
  287.         {
  288.            WriteCommandLCM(0x80+0x40,1);
  289.            WriteCommandLCM(0x01,1);
  290.            DisplayListChar(0,0,str0);
  291.            DisplayListChar(0,1,str2);
  292.            w1=0;
  293.            s=0;
  294.            n1=0;
  295.            h1=0;
  296.            z1=0;
  297.            x1=0;
  298.            y1=0;
  299.            g1=0;
  300.            mc=0;
  301.            sett=0;
  302.            num=0;
  303.            ncm=0;   //防止清零时指针后移动
  304.         }
  305.     if(num==15&&(shift%2)==1)
  306.    {
  307.          temp6=w1;
  308.          temp4=temp4+temp6;
  309.          k=0;
  310.          num=0;
  311.         }
  312.         if(k=='='&&(shift%2)==1)
  313.         {
  314.         DisplayListChar(0,1,str3);
  315.         weishu1(temp4);
  316.         delay(2000);
  317.         temp4=0;
  318.         k=0;
  319.         }
  320.         while(num==14&&(shift%2)==1)
  321.         {
  322.          _nop_();                                     //空指令
  323.         _nop_();                                   //空指令
  324.    _nop_();                                           //空指令
  325.    _nop_();                                           //空指令
  326.    _nop_();                                           //空指令
  327.    _nop_();                                           //空指令
  328.         }
  329.         if(num==11&&(shift%2)==1)
  330.         {
  331.            data_pro1();
  332.           display1();
  333.           delay(3000);
  334.           k=0;
  335.           s=0;
  336.           num=0;
  337.         }
  338.   }                                                                                                
  339. }

  340. void com(uchar c)
  341. {
  342.   SBUF=c;
  343.   TI=0;         
  344.   }
  345. void delay(uint k)
  346. {
  347.    uint i,j;
  348.    for(i=0;i<k;i++)
  349.     for(j=0;j<100;j++);
  350. }   

  351. /***********写指令至lcm*************/
  352. void WriteCommandLCM(uchar WCLCM,uchar BusyC)
  353. {
  354.     if(BusyC)                                   //判别busyC是否非零
  355.         lcd_wait();                                   //非零执行检测忙信号
  356.         DATAPORT=WCLCM;                           //将WCLCM的值赋予P0口
  357.     LCM_RS=0;                  //选择指令寄存器
  358.     LCM_RW=0;                 //选择写模式        
  359.     LCM_EN=1;                              //EN高电平,读取信息
  360.         _nop_();                                     //空指令
  361.         _nop_();                                   //空指令
  362.    _nop_();                                           //空指令
  363.    _nop_();                                           //空指令
  364.    _nop_();                                           //空指令
  365.    _nop_();                                           //空指令
  366.    _nop_();                                           //空指令
  367.     LCM_EN=0;                                //EN负跳变,执行指令
  368.    
  369. }

  370. /***********写数据至lcm*************/
  371. void WriteDataLCM(uchar WDLCM)
  372. {
  373.     lcd_wait( );              //检测忙信号   
  374.         DATAPORT=WDLCM;                          //将WDLCM的值赋予P0口
  375.     LCM_RS=1;                 //选择数据寄存器
  376.     LCM_RW=0;                     //选择写模式
  377.     LCM_EN=1;                                  //EN高电平,读取信息
  378.     _nop_();                                  //空指令
  379.            _nop_();                                  //空指令
  380.            _nop_();                                  //空指令
  381.            _nop_();                                  //空指令
  382.            _nop_();                                  //空指令
  383.            _nop_();                                  //空指令
  384.            _nop_();                                  //空指令
  385.         _nop_();                                  //空指令
  386.     LCM_EN=0;                                 //EN负跳变,执行指令
  387. }
  388. /***********lcm内部等待函数*************/

  389. void lcd_wait(void)
  390. {
  391.     DATAPORT=0xff;                      //令P0口等于0ffh
  392.         LCM_EN=1;                                 //EN高电平,读取信息
  393.     LCM_RS=0;                           
  394.     LCM_RW=1;                            //rs=0,rw=1,读忙标志和地址
  395.     _nop_();                                 //空指令
  396.     _nop_();                                 //空指令
  397.     _nop_();                                 //空指令
  398.     _nop_();                                 //空指令
  399.     _nop_();                                 //空指令
  400.     _nop_();                                 //空指令
  401.         _nop_();                                 //空指令
  402.     while(DATAPORT&BUSY)           //若读忙标志位为1,则执行while循环
  403.         {  LCM_EN=0;                         //EN低电平,执行指令,标志位可变
  404.            _nop_();                                 //空指令
  405.     _nop_();                                 //空指令
  406.     _nop_();                                 //空指令
  407.     _nop_();                                 //空指令
  408.     _nop_();                                 //空指令
  409.     _nop_();                                 //空指令
  410.     _nop_();                                  //空指令
  411.     _nop_();                                 //空指令
  412.            LCM_EN=1;                         //EN高电平,读取信息
  413.     _nop_();
  414.     _nop_();
  415.     _nop_();
  416.     _nop_();
  417.     _nop_();
  418.         _nop_();
  419.         _nop_();
  420.            }         
  421.            LCM_EN=0;                                //EN低电平,执行指令
  422. }

  423. /**********LCM初始化子函数***********/

  424. void initLCM( )
  425. {  
  426.     LCM_EN=0;
  427.         DATAPORT=0;        
  428.         delay(15);
  429.         WriteCommandLCM(0x38,0);    //8bit数据传送,2行显示,5*7字型,不检测忙信号
  430.     delay(5);                                         //延时5ms
  431.     WriteCommandLCM(0x38,0);        //8bit数据传送,2行显示,5*7字型,不检测忙信号
  432.     delay(5);                                         //延时5ms
  433.     WriteCommandLCM(0x38,0);        //8bit数据传送,2行显示,5*7字型,不检测忙信号
  434.     delay(5);                                         //延时5ms

  435.     WriteCommandLCM(0x38,1);    //8bit数据传送,2行显示,5*7字型,检测忙信号
  436.     WriteCommandLCM(0x08,1);    //关闭显示,检测忙信号
  437.     WriteCommandLCM(0x01,1);    //清屏,检测忙信号
  438.     WriteCommandLCM(0x06,1);    //显示光标右移设置,检测忙信号
  439.     WriteCommandLCM(0x0c,1);    //显示屏打开,光标不显示,不闪烁,检测忙信号
  440.         EA=1;
  441.         TMOD=0x21;                                        //定时器0和定时器1为操作模
  442.         ET0=1;
  443.         TR0=1;
  444.         x1=0;
  445.         y1=0;
  446.         z1=0;
  447. }

  448. void intcom()
  449. {
  450. SCON=0x50;
  451.   PCON = 0x00;
  452. SCON = 0x40;
  453. TH1 = 0xFd;
  454. TL1 = 0xFd;
  455. TR1 = 1;
  456. ES=1;
  457. }
  458. /****显示指定坐标的一个字符子函数****/

  459. void DisplayOneChar(uchar X,uchar Y,uchar DData)
  460.                                           
  461. {
  462.     Y&=0x01;                                  //y与01位与,即保留最后一位,其余置零
  463.     X&=0x0f;                                 //x与0f位与,即保留低四位,其余置零
  464.     if(Y)                                         //判断y是否为1
  465.         X|=0x40;                 //若y为1(显示第二行),地址码+0X40
  466.     X|=0x80;                 //指令码为地址码+0X80
  467.     WriteCommandLCM(X,1);         //若y为1,则显示第二行;若y为0,则显示第一行。
  468.     WriteDataLCM(DData);         //写数据至第一行或第二行中
  469. }

  470. /*******显示指定坐标的一串字符子函数*****/

  471. void DisplayListChar(uchar X,uchar Y,uchar code *DData)
  472. {
  473.     uchar ListLength=0;                 //定义ListLength等于0
  474.     Y&=0x01;                                 //令y与01h位与
  475.     X&=0x0f;                                 //令x与0fh位与
  476.     while(X<16)                                 //若x(列数)小于16,执行while循环
  477.     {
  478.         DisplayOneChar(X,Y,DData[ListLength]);                 //显示指定坐标的一个字符
  479.         ListLength++;                                                                 //ListLength加1
  480.         X++;                                                                                 //x(列数加1)
  481.     }
  482. }

  483. /*******显示程序1子函数*****/
  484. void display(void)
  485. {
  486.            WriteCommandLCM(0x0c,1);                                                 //显示屏打开,光标不显示,不闪烁,检测忙信号                           
  487. if(temp1<=5000)                                                                         //若temp1(重量)小于5000g时,执行if程序
  488. {
  489.         DisplayListChar(0,0,str0);                                                 //显示字符串str0
  490.         DisplayOneChar(8,0,press_ge+0x30);                                 //在第1行第9列显示press_ge的数值
  491.         DisplayOneChar(10,0,press_shifen+0x30);                         //在第1行第11列显示press_shifen的数值
  492.         DisplayOneChar(11,0,press_baifen+0x30);                         //在第1行第12列显示press_baifen的数值
  493.     DisplayOneChar(12,0,press_qianfen+0x30);                 //在第1行第13列显示press_qianfen的数值
  494.         delay(1000);
  495.         }
  496. if(temp1>5000)
  497.                 DisplayListChar(0,0,str1);
  498. if(shift%2==1)
  499.         DisplayOneChar(15,0,0x73);
  500.         delay(1000);                                       
  501. }
  502. /*******显示程序2子函数*****/
  503. void display1(void)                                                               
  504. {
  505.            WriteCommandLCM(0x0c,1);                                                 //显示屏打开,光标不显示,不闪烁,检测忙信号
  506.         DisplayListChar(0,0,str4);                                                 //显示字符串str4
  507.         DisplayOneChar(7,0,press_ge1+0x30);                                 //在第1行第8列显示press_ge1的数值
  508.         DisplayOneChar(8,0,press_shifen1+0x30);                         //在第1行第9列显示press_shifen1的数值
  509.         DisplayOneChar(9,0,press_baifen1+0x30);                         //在第1行第10列显示press_baifen1的数值
  510.     DisplayOneChar(10,0,press_qianfen1+0x30);                 //在第1行第11列显示press_qianfen1的数值
  511.         DisplayOneChar(12,0,press_wanfen1+0x30);                 //在第1行第13列显示press_wanfen1的数值
  512.         delay(1000);                                                //延时1s
  513. }

  514. /*******读取adc0832函数,采集并返回*****/
  515. uchar Adc0832(unsigned char channel)   
  516. {
  517.     uchar i=0;                                                                                 //定义i=0
  518.     uchar j;                                                                                 //定义j
  519.     uint dat=0;                                                                                 //定义整数dat=0
  520.     uchar ndat=0;                                                                         //定义ndat=0
  521.     if(channel==0)channel=2;                                                 //如果channel=0,则channel=2
  522.     if(channel==1)channel=3;                                                 //如果channel=1,则channel=3
  523.     ADDI=1;                                                                                         //设置DI端为高电平
  524.     _nop_();
  525.     _nop_();
  526.     ADCS=0;                                                                                         //使能端为低电平,使能端起效
  527.     _nop_();
  528.     _nop_();
  529.     ADCLK=1;                                                                                 //第一个时钟脉冲上升
  530.     _nop_();
  531.     _nop_();
  532.     ADCLK=0;                                                                                 //第一个时钟脉冲下降
  533.     _nop_();
  534.     _nop_();
  535.         ADDI=0;                                                                                   //DI输出第一个数字为0
  536.     ADCLK=1;                                                                                 //第二个时钟脉冲上升
  537.     _nop_();
  538.     _nop_();
  539.     ADCLK=0;                                                                                 //第二个时钟脉冲下降
  540.     _nop_();
  541.     _nop_();
  542.         ADDI=0;                                                                                         //DI输出第二个数字为0,即为以CH0为正,CH1为负的差分输入
  543.     ADCLK=1;                                                                                 //第三个时钟脉冲上升
  544.     _nop_();
  545.     _nop_();
  546.     ADCLK=0;                                                                                 //第三个时钟脉冲下降
  547.         ADDI=1;
  548.     _nop_();
  549.     _nop_();
  550.     dat=0;                                                                                         
  551.     for(i=0;i<8;i++)                                                                 //for循环八次,DI以D7至D0的顺序向dat赋值
  552.     {                                                                                                
  553.                 dat|=ADDO;                                                                         //dat与D0输出的值进行位或,即向dat输值                                                        
  554.         ADCLK=1;
  555.                 _nop_();
  556.         _nop_();
  557.                 ADCLK=0;                                                                         //时钟脉冲下降
  558.         _nop_();
  559.         _nop_();
  560.                 dat<<=1;
  561.         if(i==7)dat|=ADDO;                                                                                                                                 
  562.     }  
  563.     for(i=0;i<8;i++)                                                                 //for循环八次,DI以D0至D7的顺序向ndat赋值
  564.     {
  565.         j=0;                                                                                 //令j=0
  566.         j=j|ADDO;                                                                         //j与D0输出的值进行位或,即向j输值
  567.         ADCLK=1;                                                                         //时钟脉冲上升
  568.         _nop_();
  569.         _nop_();
  570.         ADCLK=0;                                                                         //时钟脉冲下降
  571.         _nop_();
  572.         _nop_();
  573.         j=j<<7;                                                                                 //将j的值左移7位
  574.         ndat=ndat|j;                                                                 //将ndat与j的值位或并将结果赋予nadt中,即将j值输出到ndat上
  575.         if(i<7)ndat>>=1;                                                         //此步骤和以上步骤实则将ndat的值变成以D7至D0的顺序
  576.     }
  577.     ADCS=1;                                                                                         //CS端失效
  578.     ADCLK=0;
  579.         ADDO=1;        
  580. if(dat==ndat)                                                                                         //DO端高电平
  581.         return(dat);                     
  582. }


  583. void data_pro(void)
  584. {
  585.       unsigned int;
  586.       float  press;                             

  587.           if(0<ad_data<256)                                      
  588.                  {                           
  589.                     int vary=ad_data;                                                                        
  590.                         press=(0.021111*vary);                          
  591.                         temp1=(int)(press*1000);
  592.                         temp2=(int)(press*100);
  593.                         temp5=temp1-10*temp2;                                                
  594.                         press_ge=temp1/1000;                                    
  595.                         press_shifen=(temp1%1000)/100;                           
  596.                         press_baifen=((temp1%1000)%100)/10;                    
  597.                         press_qianfen=((temp1%1000)%100)%10;                        

  598.                       }            
  599. }
  600. void data_pro1(void)
  601. {
  602.       unsigned int;
  603.       float  press1;                             

  604.           if(0<ad_data<256)                                      
  605.                  {                           
  606.                     int vary=ad_data;                                                                        
  607.                         press1=(0.021111*vary);                          
  608.                         temp3=(int)(press1*10000);                                                        
  609.                         press_ge1=temp3/10000;                                    
  610.                         press_shifen1=(temp3%10000)/1000;                           
  611.                         press_baifen1=((temp3%10000)%1000)/100;                    
  612.                         press_qianfen1=(((temp3%10000)%1000)%100)/10;               
  613.                         press_wanfen1=(((temp3%10000)%1000)%100)%10;
  614.                       }            
  615. }
  616.   void alarm(void)
  617. {
  618.          if(temp1>=5000)                        

  619.            beep=0;         
  620.         
  621.           else
  622.               { beep=1;
  623.                    DisplayListChar(0,0,str1);
  624.                    }                  
  625. }
  626. void weishu1(uint m)
  627. {  
  628.    uchar wei4,wei3,wei2,wei1,wei0;
  629.    wei4=m/10000;
  630.    wei3=(m%10000)/1000;
  631.    wei2=((m%10000)%1000)/100;
  632.    wei1=(((m%10000)%1000)%100)/10;
  633.    wei0=(((m%10000)%1000)%100)%10;
  634.    DisplayOneChar(8,1,0x30+wei4);
  635.    DisplayOneChar(9,1,0x30+wei3);
  636.    DisplayOneChar(10,1,0x30+wei2);
  637.    DisplayOneChar(11,1,'.');        
  638.    DisplayOneChar(12,1,0x30+wei1);
  639.    //DisplayOneChar(10,1,'.');
  640.    DisplayOneChar(13,1,0x30+wei0);
  641. }
  642. void temer1() interrupt 1
  643. { uchar temp;
  644.   EX1=0;
  645.   P1=0xfe;
  646.   temp=P1;
  647.   temp=temp&0xf0;
  648.   if(temp!=0xf0)
  649.   {
  650.     delay(5);
  651.         temp=P1;
  652.     temp=temp&0xf0;
  653.         while(temp!=0xf0)
  654.         {
  655.           temp=P1;
  656.           switch(temp)
  657.           {
  658.             case 0xee:num=1;n=7;k=1;if(shift%2==0) s++;break;
  659.             case 0xde:num=2;n=8;k=1;if(shift%2==0)s++;break;
  660.             case 0xbe:num=3;n=9;k=1;if(shift%2==0)s++;break;
  661.             case 0x7e:num=4;k='/';shift++;break;
  662.           }
  663.           while(temp!=0xf0)
  664.           {
  665.                    temp=P1;
  666.         temp=temp&0xf0;
  667.           }
  668.         //DisplayOneChar((s+6),1,table2[num-1]);
  669.         }
  670.   }
  671.   P1=0xfd;
  672.   temp=P1;
  673.   temp=temp&0xf0;
  674.   if(temp!=0xf0)
  675.   {
  676.     delay(5);
  677.         temp=P1;
  678.     temp=temp&0xf0;
  679.         while(temp!=0xf0)
  680.         {
  681.           temp=P1;
  682.           switch(temp)
  683.           {
  684.             case 0xed:num=5;n=4;k=1;if(shift%2==0)s++;break;
  685.             case 0xdd:num=6;n=5;k=1;if(shift%2==0)s++;break;
  686.             case 0xbd:num=7;n=6;k=1;if(shift%2==0)s++;break;
  687.                 case 0x7d:k='*';ncm=1;break;
  688.           }
  689.           while(temp!=0xf0)
  690.           {
  691.                    temp=P1;
  692.         temp=temp&0xf0;
  693.           }
  694.         //DisplayOneChar(k+6,1,table2[num-1]);
  695.         }
  696.   }
  697.   P1=0xfb;
  698.   temp=P1;
  699.   temp=temp&0xf0;
  700.   if(temp!=0xf0)
  701.   {
  702.     delay(5);
  703.         temp=P1;
  704.     temp=temp&0xf0;
  705.         while(temp!=0xf0)
  706.         {
  707.           temp=P1;
  708.           switch(temp)
  709.           {
  710.             case 0xeb:num=9;n=1;k=1;if(shift%2==0)s++;break;
  711.             case 0xdb:num=10;n=2;k=1;if(shift%2==0)s++;break;
  712.             case 0xbb:num=11;n=3;k=1;if(shift%2==0)s++;break;
  713.                 case 0x7b:k='-';sett++;break;
  714.           }
  715.           while(temp!=0xf0)
  716.           {
  717.                    temp=P1;
  718.         temp=temp&0xf0;
  719.           }
  720. //        DisplayOneChar(k+6,1,table2[num-1]);

  721.         }
  722.   }
  723.   P1=0xf7;
  724.   temp=P1;
  725.   temp=temp&0xf0;
  726.   if(temp!=0xf0)
  727.   {
  728.     delay(5);
  729.         temp=P1;
  730.     temp=temp&0xf0;
  731.         while(temp!=0xf0)
  732.         {
  733.           temp=P1;
  734.           switch(temp)
  735.           {
  736.             case 0xe7:num=13;k=' ';break;
  737.             case 0xd7:num=14;n=0;k=1;if(shift%2==0)s++;;break;
  738.                 case 0xb7:num=16;k='=';break;
  739.                 case 0x77:num=15;k=1;s++;break;
  740.           }
  741.           while(temp!=0xf0)
  742.           {
  743.                    temp=P1;
  744.         temp=temp&0xf0;
  745.           }
  746.          }
  747.    
  748.   }
  749.   EX1=1;
  750. }
  751. void com()interrupt 4
  752. {
  753. RI=0;
  754. }
  755. void start()  //开始数据传送,开始位
  756. {
  757.         SDA=1;  //SDA初始化为高电平“1”
  758.         SCL=1;  //开始数据传送时,要求SCL为高电平“1”
  759.         _nop_();
  760.         _nop_();  //空操作两个机器周期
  761.         SDA=0;  //SDA的下降沿被认为是开始信号
  762.         _nop_();
  763.         _nop_();
  764.         _nop_();
  765.         _nop_();  //空操作四个机器周期
  766.         SCL=0;  //SCL为低电平时,SDA上数据才允许变化(即允许以后的数据传递)
  767. }
  768. void stop()  //结束数据传递
  769. {
  770.         SDA=0;  //SDA初始化为低电平“0”
  771.         _nop_();
  772.         _nop_();  //空操作两个机器周期
  773.         SCL=1;  //结束数据传送时,要求SCL为高电平“1”
  774.         _nop_();
  775.         _nop_();
  776.         _nop_();
  777.         _nop_();  //空操作四个机器周期
  778.         SDA=1;  //SDA的上升沿被认为是结束信号
  779. }
  780. unsigned char ReadData()  //从AT24Cxx读取数据,出口参数x,从AT24Cxx移入数据到MCU
  781. {
  782.         unsigned char i;
  783.         unsigned char x;  //存储从AT24Cxx中读出的数据
  784.         for(i=0;i<8;i++)
  785.         {
  786.                 SCL=1;  //SCL置为高电平
  787.                 x<<=1;  //将x中的各二进位向左移一位
  788.                 x|=(unsigned char)SDA;  //将SDA上的数据通过按位“或”运算存入x中
  789.                 SCL=0;  //在SCL的下降沿读出数据
  790.         }
  791.         return(x);  //将读取的数据返还
  792. }
  793. bit WriteCurrent(unsigned char y)  //向AT23Cxx的当前地址写入数据,入口参数y(存储待写入的数据),在调用此数据写入函数前需首先调用开始start(),所以SCL=0
  794. {
  795.         unsigned char i, ack_bit;  //存储应答位
  796.         for(i=0;i<8;i++)  //循环移入8个位
  797.         {
  798.                 SDA=(bit)(y&0x80);  //通过按位“与”运算将最高位数据送到S,因为传送时高位在前,低位在后
  799.                 _nop_();  //空操作一个机器周期
  800.                 SCL=1;  //在SCL的上升沿将数据写入AT24Cxx
  801.                 _nop_();
  802.                 _nop_();  //空操作两个机器周期
  803.                 SCL=0;  //将SCL重新置为低电平,以在SCL线形成传送数据所需的8个脉冲
  804.                 y<<=1;  //将y中的各二进位向左移一位
  805.         }
  806.         SDA=1;  //发送设备(主机)应在时钟脉冲的高电平期间(SCL=1)释放SDA线,以让SDA线转由接收设备(AT24Cxx)控制
  807.         _nop_();
  808.         _nop_();  //空操作两个机器周期
  809.         SCL=1;  //根据上述规定,SCL应为高电平
  810.         _nop_();
  811.         _nop_();
  812.         _nop_();
  813.         _nop_();;  //空操作四个机器周期
  814.         ack_bit=SDA;  //接收设备(AT24Cxx)向SDA送低电平,表示已经接收到一个字节,若送高电平,表示没有收到,传送异常
  815.         SCL=0;  //SCL为低电平时,SDA上数据才允许变化(即允许以后的数据传递)
  816.         return  ack_bit;  //返回AT24Cxx答应位
  817. }
  818. void WriteSet(unsigned char add,unsigned char dat)  //向AT24Cxx中的指定地址写入数据,存储地址add,存储待写入数据dat
  819. //在指定地址add处写入数据WriteCurrent
  820. {
  821.         start();  //开始数据传递
  822.         WriteCurrent(OP_WRITE);  //选择要操作的AT24Cxx芯片,并告知要对其写入数据
  823.         WriteCurrent(add);  //写入指定地址
  824.         WriteCurrent(dat);  //向当前地址(上面指定的地址)写入数据
  825.         stop();  //停止数据传递
  826.         delay(4);  //一字节的写入周期为1ms,最好延时1ms以上
  827. }
  828. unsigned char ReadCurrent()  //从AT24Cxx中的当前地址读取数据,出口参数x
  829. {
  830.         unsigned char x;
  831.         start();  //开始数据传递
  832.         WriteCurrent(OP_READ);  //选择要操作的AT24Cxx芯片,并告知要读取其数据
  833.         x=ReadData();  //将读取的数据存入x
  834.         stop();  //停止数据传递
  835.         return x;  //返回读取的数据
  836. }
  837. unsigned char ReadSet(unsigned char set_add)  //从AT24Cxx中的指定地址读取数据,入口set_add,出口x
  838. //在指定地址读取
  839. {
  840.         start();  //开始数据传递
  841.         WriteCurrent(OP_WRITE);  //选择要操作的AT24Cxx芯片,并告知要对其写入数据
  842.         WriteCurrent(set_add);  //写入指定地址
  843.         return(ReadCurrent());  //从指定地址读出数据并返回
  844. }
复制代码

所有资料51hei提供下载:
电子秤仿真设计.rar (134.55 KB, 下载次数: 207)

评分

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

查看全部评分

回复

使用道具 举报

ID:706222 发表于 2020-5-25 11:48 | 显示全部楼层
谢谢楼主分享!有一个文件路径不对,我修改了一下

电子秤仿真设计.7z

71.85 KB, 下载次数: 23, 下载积分: 黑币 -5

回复

使用道具 举报

ID:424725 发表于 2019-3-31 17:19 | 显示全部楼层
谢谢楼主分享!我用Proteus打开的效果:
51hei.png
回复

使用道具 举报

ID:645297 发表于 2019-12-25 16:37 | 显示全部楼层
你这里面主机程序打不开啊
回复

使用道具 举报

ID:645297 发表于 2019-12-25 16:43 | 显示全部楼层
程序错误百出啊,源程序打不开,按照复制代码报错改半天
回复

使用道具 举报

ID:748874 发表于 2020-5-11 11:04 | 显示全部楼层
1994745550 发表于 2019-12-25 16:43
程序错误百出啊,源程序打不开,按照复制代码报错改半天

兄弟,可以把改好的程序发我一下吗
回复

使用道具 举报

ID:957924 发表于 2021-7-31 15:48 | 显示全部楼层
看看这个

电子秤仿真设计.rar

25.37 KB, 下载次数: 25, 下载积分: 黑币 -5

回复

使用道具 举报

ID:990681 发表于 2021-12-11 19:34 | 显示全部楼层

你好,我想问下那个从机是用来传输记录数据的吗,还有其他的作用吗,下面那个从机删掉的话没有影响吧
回复

使用道具 举报

ID:990681 发表于 2021-12-11 19:34 | 显示全部楼层

你好,我想问下那个从机是用来传输记录数据的吗,还有其他的作用吗,下面那个从机删掉的话没有影响吧
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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