欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 10534|回復(fù): 8
打印 上一主題 下一主題
收起左側(cè)

單片機電子秤Proteus仿真設(shè)計 附源碼與說明

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:429086 發(fā)表于 2018-11-19 11:26 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
電子秤使用說明:
按鍵:
數(shù)字鍵0-9、RTP為去皮鍵,GOOD1-GOOD4鍵為商品1-4鍵,DOLLAR為美元匯率鍵,EURO為歐元匯率鍵,UNITS為單位切換鍵,TOTAL鍵為計價鍵,ALL鍵為求和鍵,MEMO為存儲鍵,SET鍵為設(shè)置鍵,BACK鍵為萬能返回鍵,OPEN鍵為串口通訊開放鍵,CLOSE鍵為串口通信關(guān)閉鍵,SHIFT鍵為切換鍵(用來切換一個按鍵的第二功能,如數(shù)字7鍵,按下shift鍵后,數(shù)字7鍵實現(xiàn)為GOO1鍵的功能)
功能及使用方法:
1,計價:直接按下數(shù)字鍵,可設(shè)置0-100內(nèi)的單價,可精確至小數(shù)點后一位,輸入好單價后,按下TOTAL鍵即可算出價格。
2,快速計價:首先是給商品鍵設(shè)置單價,按下SET鍵,再按下數(shù)字鍵來輸入我們想設(shè)置的單價,再按下SHIFT鍵,再按下數(shù)字鍵7即我們將想要的單價設(shè)置存儲至商品鍵1中,按下BACK鍵和SHIFT鍵返回至初始界面,接下來是快速計價,按下SHIFT鍵,再按下數(shù)字鍵7即顯示出設(shè)置好的商品鍵1的單價,最后按下計價鍵(需要再按下SHIFT鍵,否則顯示為求和功能),完成計價
3,匯率轉(zhuǎn)換:首先是設(shè)置匯率,與之前設(shè)置單價的步驟一致,按下SET鍵,再按下數(shù)字鍵來輸入我們想設(shè)置的匯率(可精確至小數(shù)點后兩位),再按下SHIFT鍵,再按下數(shù)字鍵1即我們將想要的匯率設(shè)置存儲至美元鍵中,接下來是匯率轉(zhuǎn)換,當(dāng)計算完一次價格后,按下SHIFT鍵,再按下數(shù)字鍵1,既可以將價格進(jìn)行所設(shè)置的匯率轉(zhuǎn)換
4,存儲求和:計算完一次價格后,按下SHIFT鍵,再按下小數(shù)點鍵即將此次價格存儲下來,可以存儲多次價格將其求和,最后按下求和鍵(即SHIFT加上計價鍵)可以將存儲的價格求和出來。
5,串口通信:按下OPEN鍵(即SHIFT加數(shù)字鍵5)既可以將計算完的價格傳至從機中在從機中顯示并記錄下來,傳送完畢后按下CLOSE鍵即可關(guān)閉通信,從機可以瀏覽最近三次的傳送價格記錄,從機中的OPEN為打開記錄,CLOSE為關(guān)閉記錄,SWITCH為切換下一條記錄。
電子秤還具有其他的小功能如去皮,單位切換等,由于操作比較直觀所以不做介紹。
設(shè)計還不夠完善,不過應(yīng)付小的課程設(shè)計和要求不是很嚴(yán)格的本科畢業(yè)設(shè)計差不多夠了。

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機源程序如下:
  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();                                   //非零執(zhí)行檢測忙信號
  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負(fù)跳變,執(zhí)行指令
  368.    
  369. }

  370. /***********寫數(shù)據(jù)至lcm*************/
  371. void WriteDataLCM(uchar WDLCM)
  372. {
  373.     lcd_wait( );              //檢測忙信號   
  374.         DATAPORT=WDLCM;                          //將WDLCM的值賦予P0口
  375.     LCM_RS=1;                 //選擇數(shù)據(jù)寄存器
  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負(fù)跳變,執(zhí)行指令
  387. }
  388. /***********lcm內(nèi)部等待函數(shù)*************/

  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,讀忙標(biāo)志和地址
  395.     _nop_();                                 //空指令
  396.     _nop_();                                 //空指令
  397.     _nop_();                                 //空指令
  398.     _nop_();                                 //空指令
  399.     _nop_();                                 //空指令
  400.     _nop_();                                 //空指令
  401.         _nop_();                                 //空指令
  402.     while(DATAPORT&BUSY)           //若讀忙標(biāo)志位為1,則執(zhí)行while循環(huán)
  403.         {  LCM_EN=0;                         //EN低電平,執(zhí)行指令,標(biāo)志位可變
  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低電平,執(zhí)行指令
  422. }

  423. /**********LCM初始化子函數(shù)***********/

  424. void initLCM( )
  425. {  
  426.     LCM_EN=0;
  427.         DATAPORT=0;        
  428.         delay(15);
  429.         WriteCommandLCM(0x38,0);    //8bit數(shù)據(jù)傳送,2行顯示,5*7字型,不檢測忙信號
  430.     delay(5);                                         //延時5ms
  431.     WriteCommandLCM(0x38,0);        //8bit數(shù)據(jù)傳送,2行顯示,5*7字型,不檢測忙信號
  432.     delay(5);                                         //延時5ms
  433.     WriteCommandLCM(0x38,0);        //8bit數(shù)據(jù)傳送,2行顯示,5*7字型,不檢測忙信號
  434.     delay(5);                                         //延時5ms

  435.     WriteCommandLCM(0x38,1);    //8bit數(shù)據(jù)傳送,2行顯示,5*7字型,檢測忙信號
  436.     WriteCommandLCM(0x08,1);    //關(guān)閉顯示,檢測忙信號
  437.     WriteCommandLCM(0x01,1);    //清屏,檢測忙信號
  438.     WriteCommandLCM(0x06,1);    //顯示光標(biāo)右移設(shè)置,檢測忙信號
  439.     WriteCommandLCM(0x0c,1);    //顯示屏打開,光標(biāo)不顯示,不閃爍,檢測忙信號
  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. /****顯示指定坐標(biāo)的一個字符子函數(shù)****/

  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);         //寫數(shù)據(jù)至第一行或第二行中
  469. }

  470. /*******顯示指定坐標(biāo)的一串字符子函數(shù)*****/

  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(列數(shù))小于16,執(zhí)行while循環(huán)
  477.     {
  478.         DisplayOneChar(X,Y,DData[ListLength]);                 //顯示指定坐標(biāo)的一個字符
  479.         ListLength++;                                                                 //ListLength加1
  480.         X++;                                                                                 //x(列數(shù)加1)
  481.     }
  482. }

  483. /*******顯示程序1子函數(shù)*****/
  484. void display(void)
  485. {
  486.            WriteCommandLCM(0x0c,1);                                                 //顯示屏打開,光標(biāo)不顯示,不閃爍,檢測忙信號                           
  487. if(temp1<=5000)                                                                         //若temp1(重量)小于5000g時,執(zhí)行if程序
  488. {
  489.         DisplayListChar(0,0,str0);                                                 //顯示字符串str0
  490.         DisplayOneChar(8,0,press_ge+0x30);                                 //在第1行第9列顯示press_ge的數(shù)值
  491.         DisplayOneChar(10,0,press_shifen+0x30);                         //在第1行第11列顯示press_shifen的數(shù)值
  492.         DisplayOneChar(11,0,press_baifen+0x30);                         //在第1行第12列顯示press_baifen的數(shù)值
  493.     DisplayOneChar(12,0,press_qianfen+0x30);                 //在第1行第13列顯示press_qianfen的數(shù)值
  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子函數(shù)*****/
  503. void display1(void)                                                               
  504. {
  505.            WriteCommandLCM(0x0c,1);                                                 //顯示屏打開,光標(biāo)不顯示,不閃爍,檢測忙信號
  506.         DisplayListChar(0,0,str4);                                                 //顯示字符串str4
  507.         DisplayOneChar(7,0,press_ge1+0x30);                                 //在第1行第8列顯示press_ge1的數(shù)值
  508.         DisplayOneChar(8,0,press_shifen1+0x30);                         //在第1行第9列顯示press_shifen1的數(shù)值
  509.         DisplayOneChar(9,0,press_baifen1+0x30);                         //在第1行第10列顯示press_baifen1的數(shù)值
  510.     DisplayOneChar(10,0,press_qianfen1+0x30);                 //在第1行第11列顯示press_qianfen1的數(shù)值
  511.         DisplayOneChar(12,0,press_wanfen1+0x30);                 //在第1行第13列顯示press_wanfen1的數(shù)值
  512.         delay(1000);                                                //延時1s
  513. }

  514. /*******讀取adc0832函數(shù),采集并返回*****/
  515. uchar Adc0832(unsigned char channel)   
  516. {
  517.     uchar i=0;                                                                                 //定義i=0
  518.     uchar j;                                                                                 //定義j
  519.     uint dat=0;                                                                                 //定義整數(shù)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;                                                                                         //設(shè)置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輸出第一個數(shù)字為0
  536.     ADCLK=1;                                                                                 //第二個時鐘脈沖上升
  537.     _nop_();
  538.     _nop_();
  539.     ADCLK=0;                                                                                 //第二個時鐘脈沖下降
  540.     _nop_();
  541.     _nop_();
  542.         ADDI=0;                                                                                         //DI輸出第二個數(shù)字為0,即為以CH0為正,CH1為負(fù)的差分輸入
  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循環(huán)八次,DI以D7至D0的順序向dat賦值
  552.     {                                                                                                
  553.                 dat|=ADDO;                                                                         //dat與D0輸出的值進(jìn)行位或,即向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循環(huán)八次,DI以D0至D7的順序向ndat賦值
  564.     {
  565.         j=0;                                                                                 //令j=0
  566.         j=j|ADDO;                                                                         //j與D0輸出的值進(jìn)行位或,即向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的值位或并將結(jié)果賦予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()  //開始數(shù)據(jù)傳送,開始位
  756. {
  757.         SDA=1;  //SDA初始化為高電平“1”
  758.         SCL=1;  //開始數(shù)據(jù)傳送時,要求SCL為高電平“1”
  759.         _nop_();
  760.         _nop_();  //空操作兩個機器周期
  761.         SDA=0;  //SDA的下降沿被認(rèn)為是開始信號
  762.         _nop_();
  763.         _nop_();
  764.         _nop_();
  765.         _nop_();  //空操作四個機器周期
  766.         SCL=0;  //SCL為低電平時,SDA上數(shù)據(jù)才允許變化(即允許以后的數(shù)據(jù)傳遞)
  767. }
  768. void stop()  //結(jié)束數(shù)據(jù)傳遞
  769. {
  770.         SDA=0;  //SDA初始化為低電平“0”
  771.         _nop_();
  772.         _nop_();  //空操作兩個機器周期
  773.         SCL=1;  //結(jié)束數(shù)據(jù)傳送時,要求SCL為高電平“1”
  774.         _nop_();
  775.         _nop_();
  776.         _nop_();
  777.         _nop_();  //空操作四個機器周期
  778.         SDA=1;  //SDA的上升沿被認(rèn)為是結(jié)束信號
  779. }
  780. unsigned char ReadData()  //從AT24Cxx讀取數(shù)據(jù),出口參數(shù)x,從AT24Cxx移入數(shù)據(jù)到MCU
  781. {
  782.         unsigned char i;
  783.         unsigned char x;  //存儲從AT24Cxx中讀出的數(shù)據(jù)
  784.         for(i=0;i<8;i++)
  785.         {
  786.                 SCL=1;  //SCL置為高電平
  787.                 x<<=1;  //將x中的各二進(jìn)位向左移一位
  788.                 x|=(unsigned char)SDA;  //將SDA上的數(shù)據(jù)通過按位“或”運算存入x中
  789.                 SCL=0;  //在SCL的下降沿讀出數(shù)據(jù)
  790.         }
  791.         return(x);  //將讀取的數(shù)據(jù)返還
  792. }
  793. bit WriteCurrent(unsigned char y)  //向AT23Cxx的當(dāng)前地址寫入數(shù)據(jù),入口參數(shù)y(存儲待寫入的數(shù)據(jù)),在調(diào)用此數(shù)據(jù)寫入函數(shù)前需首先調(diào)用開始start(),所以SCL=0
  794. {
  795.         unsigned char i, ack_bit;  //存儲應(yīng)答位
  796.         for(i=0;i<8;i++)  //循環(huán)移入8個位
  797.         {
  798.                 SDA=(bit)(y&0x80);  //通過按位“與”運算將最高位數(shù)據(jù)送到S,因為傳送時高位在前,低位在后
  799.                 _nop_();  //空操作一個機器周期
  800.                 SCL=1;  //在SCL的上升沿將數(shù)據(jù)寫入AT24Cxx
  801.                 _nop_();
  802.                 _nop_();  //空操作兩個機器周期
  803.                 SCL=0;  //將SCL重新置為低電平,以在SCL線形成傳送數(shù)據(jù)所需的8個脈沖
  804.                 y<<=1;  //將y中的各二進(jìn)位向左移一位
  805.         }
  806.         SDA=1;  //發(fā)送設(shè)備(主機)應(yīng)在時鐘脈沖的高電平期間(SCL=1)釋放SDA線,以讓SDA線轉(zhuǎn)由接收設(shè)備(AT24Cxx)控制
  807.         _nop_();
  808.         _nop_();  //空操作兩個機器周期
  809.         SCL=1;  //根據(jù)上述規(guī)定,SCL應(yīng)為高電平
  810.         _nop_();
  811.         _nop_();
  812.         _nop_();
  813.         _nop_();;  //空操作四個機器周期
  814.         ack_bit=SDA;  //接收設(shè)備(AT24Cxx)向SDA送低電平,表示已經(jīng)接收到一個字節(jié),若送高電平,表示沒有收到,傳送異常
  815.         SCL=0;  //SCL為低電平時,SDA上數(shù)據(jù)才允許變化(即允許以后的數(shù)據(jù)傳遞)
  816.         return  ack_bit;  //返回AT24Cxx答應(yīng)位
  817. }
  818. void WriteSet(unsigned char add,unsigned char dat)  //向AT24Cxx中的指定地址寫入數(shù)據(jù),存儲地址add,存儲待寫入數(shù)據(jù)dat
  819. //在指定地址add處寫入數(shù)據(jù)WriteCurrent
  820. {
  821.         start();  //開始數(shù)據(jù)傳遞
  822.         WriteCurrent(OP_WRITE);  //選擇要操作的AT24Cxx芯片,并告知要對其寫入數(shù)據(jù)
  823.         WriteCurrent(add);  //寫入指定地址
  824.         WriteCurrent(dat);  //向當(dāng)前地址(上面指定的地址)寫入數(shù)據(jù)
  825.         stop();  //停止數(shù)據(jù)傳遞
  826.         delay(4);  //一字節(jié)的寫入周期為1ms,最好延時1ms以上
  827. }
  828. unsigned char ReadCurrent()  //從AT24Cxx中的當(dāng)前地址讀取數(shù)據(jù),出口參數(shù)x
  829. {
  830.         unsigned char x;
  831.         start();  //開始數(shù)據(jù)傳遞
  832.         WriteCurrent(OP_READ);  //選擇要操作的AT24Cxx芯片,并告知要讀取其數(shù)據(jù)
  833.         x=ReadData();  //將讀取的數(shù)據(jù)存入x
  834.         stop();  //停止數(shù)據(jù)傳遞
  835.         return x;  //返回讀取的數(shù)據(jù)
  836. }
  837. unsigned char ReadSet(unsigned char set_add)  //從AT24Cxx中的指定地址讀取數(shù)據(jù),入口set_add,出口x
  838. //在指定地址讀取
  839. {
  840.         start();  //開始數(shù)據(jù)傳遞
  841.         WriteCurrent(OP_WRITE);  //選擇要操作的AT24Cxx芯片,并告知要對其寫入數(shù)據(jù)
  842.         WriteCurrent(set_add);  //寫入指定地址
  843.         return(ReadCurrent());  //從指定地址讀出數(shù)據(jù)并返回
  844. }
復(fù)制代碼

所有資料51hei提供下載:
電子秤仿真設(shè)計.rar (134.55 KB, 下載次數(shù): 207)


評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

來自 2#
ID:706222 發(fā)表于 2020-5-25 11:48 | 只看該作者
謝謝樓主分享!有一個文件路徑不對,我修改了一下

電子秤仿真設(shè)計.7z

71.85 KB, 下載次數(shù): 23, 下載積分: 黑幣 -5

回復(fù)

使用道具 舉報

板凳
ID:424725 發(fā)表于 2019-3-31 17:19 | 只看該作者
謝謝樓主分享!我用Proteus打開的效果:

51hei.png (19.32 KB, 下載次數(shù): 41)

51hei.png
回復(fù)

使用道具 舉報

地板
ID:645297 發(fā)表于 2019-12-25 16:37 | 只看該作者
你這里面主機程序打不開啊
回復(fù)

使用道具 舉報

5#
ID:645297 發(fā)表于 2019-12-25 16:43 | 只看該作者
程序錯誤百出啊,源程序打不開,按照復(fù)制代碼報錯改半天
回復(fù)

使用道具 舉報

6#
ID:748874 發(fā)表于 2020-5-11 11:04 | 只看該作者
1994745550 發(fā)表于 2019-12-25 16:43
程序錯誤百出啊,源程序打不開,按照復(fù)制代碼報錯改半天

兄弟,可以把改好的程序發(fā)我一下嗎
回復(fù)

使用道具 舉報

7#
ID:957924 發(fā)表于 2021-7-31 15:48 | 只看該作者
看看這個

電子秤仿真設(shè)計.rar

25.37 KB, 下載次數(shù): 25, 下載積分: 黑幣 -5

回復(fù)

使用道具 舉報

8#
ID:990681 發(fā)表于 2021-12-11 19:34 | 只看該作者

你好,我想問下那個從機是用來傳輸記錄數(shù)據(jù)的嗎,還有其他的作用嗎,下面那個從機刪掉的話沒有影響吧
回復(fù)

使用道具 舉報

9#
ID:990681 發(fā)表于 2021-12-11 19:34 | 只看該作者

你好,我想問下那個從機是用來傳輸記錄數(shù)據(jù)的嗎,還有其他的作用嗎,下面那個從機刪掉的話沒有影響吧
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表