找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3550|回复: 3
收起左侧

可切换价格计算总价的电子秤仿真及源程序

[复制链接]
ID:137190 发表于 2016-9-25 19:58 | 显示全部楼层 |阅读模式
给51黑电子论坛的朋友们分享一个可切换价格计算总价的电子秤仿真,下面是原理图:
0.png 0.png
所有资料下载:
电子秤仿真.zip (77.93 KB, 下载次数: 53)


源程序:
  1. #include<reg51.h>
  2. #include<intrins.h>
  3. #include <ZM.h>
  4. #define LCD P0
  5. unsigned char a,i,j,k,ad_data;
  6. float press=0.0;
  7. int b;
  8. int num=1,num_t=0;
  9. sbit EXCHANGE=P1^0;
  10. sbit MENU=P1^1;
  11. sbit ADD=P1^2;
  12. sbit SUB=P1^3;
  13. sbit OK=P1^4;
  14. sbit EN=P2^0;
  15. sbit RW=P2^1;
  16. sbit RS=P2^2;
  17. sbit CS1=P2^3;
  18. sbit CS2=P2^4;
  19. sbit BUSY=P0^0;
  20. sbit ADCS =P3^5;
  21. sbit ADDI =P3^7;  
  22. sbit ADDO =P3^7;  
  23. sbit ADCLK =P3^6;   
  24. float f_price[5]={10.5,11.5,12.5,13.5,14.5};
  25. float sum=0;

  26. void delay(unsigned char a)
  27.         {
  28.         unsigned char i,j;
  29.         for(i=0;i<a;i++)
  30.                 for(j=0;j<100;j++)
  31.                         ;
  32.         }
  33. void temer1() interrupt 2
  34. {
  35.         EX1=0;
  36.         delay(10);
  37.          if(EXCHANGE==0)
  38.         {
  39.                 num++;
  40.                 if(num>=5)
  41.                 {
  42.                         num=0;
  43.                 }
  44.         }
  45.                
  46.   EX1=1;
  47. }

  48. //采集并返回
  49. unsigned char Adc0832(unsigned char channel)     //AD转换,返回结果
  50. {
  51.      unsigned char j,i=0,ndat=0;
  52.     unsigned int dat=0;

  53.     if(channel==0)channel=2;
  54.     if(channel==1)channel=3;
  55.     ADDI=1;
  56.     _nop_();
  57.     _nop_();
  58.     ADCS=0;//拉低CS端
  59.     _nop_();
  60.     _nop_();
  61.     ADCLK=1;//拉高CLK端
  62.     _nop_();
  63.     _nop_();
  64.     ADCLK=0;//拉低CLK端,形成下降沿1
  65.     _nop_();
  66.     _nop_();
  67.     ADCLK=1;//拉高CLK端
  68.     ADDI=channel&0x1;
  69.     _nop_();
  70.     _nop_();
  71.     ADCLK=0;//拉低CLK端,形成下降沿2
  72.     _nop_();
  73.     _nop_();
  74.     ADCLK=1;//拉高CLK端
  75.     ADDI=(channel>>1)&0x1;
  76.     _nop_();
  77.     _nop_();
  78.     ADCLK=0;//拉低CLK端,形成下降沿3
  79.     ADDI=1;//控制命令结束
  80.     _nop_();
  81.     _nop_();
  82.     dat=0;
  83.     for(i=0;i<8;i++)
  84.     {
  85.         dat|=ADDO;//收数据
  86.         ADCLK=1;
  87.         _nop_();
  88.         _nop_();
  89.         ADCLK=0;//形成一次时钟脉冲
  90.         _nop_();
  91.         _nop_();
  92.         dat<<=1;
  93.         if(i==7)dat|=ADDO;
  94.     }  
  95.     for(i=0;i<8;i++)
  96.     {
  97.         j=0;
  98.         j=j|ADDO;//收数据
  99.         ADCLK=1;
  100.         _nop_();
  101.         _nop_();
  102.         ADCLK=0;//形成一次时钟脉冲
  103.         _nop_();
  104.         _nop_();
  105.         j=j<<7;
  106.         ndat=ndat|j;
  107.         if(i<7)ndat>>=1;
  108.     }
  109.     ADCS=1;//拉低CS端
  110.     ADCLK=0;//拉低CLK端
  111.     ADDO=1;//拉高数据端,回到初始状态
  112.     dat<<=8;
  113.     dat|=ndat;
  114.     return(dat);            //return ad k         
  115. }

  116. void data_pro(void)
  117. {                             
  118.         if(0<ad_data<256)                                      
  119.          {                           
  120.                   int vary=ad_data;                                                                        
  121.                   press=(0.019531*vary);                                                                                                                                          
  122.           }            
  123. }

  124. void total(float w,float p)
  125. {
  126.         sum=w*p;
  127.         }
  128. unsigned char t1[6]={"000.00"};
  129. void turn(float t_float)
  130. {
  131.         int temp=(int)t_float;
  132.         t1[0]=temp/100+0X30;
  133.         t1[1]=(temp%100)/10+0X30;
  134.         t1[2]=temp%10+0X30;
  135.         temp=(int)(t_float*100);
  136.         t1[4]=(temp%100)/10+0X30;
  137.         t1[5]=temp%10+0X30;
  138. }

  139. checkbusy()
  140. {
  141.         EN=1;
  142.         RW=1;
  143.         RS=0;
  144.         LCD=0XFF;
  145.         if(BUSY);
  146. }

  147. writecode(unsigned char dat)  //写命令
  148. {
  149.         checkbusy();
  150.         EN=1;
  151.         RW=0;
  152.         RS=0;
  153.         LCD=dat;
  154.         EN=1;
  155.         EN=0;
  156. }
  157. writedata(unsigned char dat)  //写数据
  158. {
  159.         checkbusy();
  160.         EN=1;
  161.         RW=0;
  162.         RS=1;
  163.         LCD=dat;
  164.         EN=1;
  165.         EN=0;
  166. }
  167. void displayzifu(unsigned char page,unsigned char lineaddress,int n,  unsigned char table[])
  168. {
  169.         unsigned char  temp[16];
  170.         if(lineaddress<0X80)
  171.         {
  172.                 CS1=1;
  173.                 CS2=0;
  174.         }
  175.         for(j=0;j<n;j++)
  176.     {
  177.                 if(lineaddress>=0X80)
  178.                 {
  179.                         CS1=0;
  180.                         CS2=1;
  181.                         lineaddress=lineaddress-0X40;
  182.                 }
  183.                 b=table[j]-0X20;
  184.                 for(k=0;k<16;k++)
  185.                 {
  186.                         temp[k]=ch2[b][k];
  187.                 }
  188.                 writecode(page);
  189.                 writecode(lineaddress);
  190.                 for(i=0;i<8;i++)
  191.                 {
  192.                         writedata(temp[i]);
  193.                 }
  194.                 writecode(page+1);
  195.                 writecode(lineaddress);
  196.                 for(i=8;i<16;i++)
  197.         {
  198.                         writedata(temp[i]);
  199.                 }
  200.                 lineaddress+=8;
  201.     }
  202. }
  203. void clear(unsigned char page,unsigned char lineaddress,int n,  unsigned char table[])
  204. {
  205. unsigned char  temp[16];
  206.    if(lineaddress<0X80)
  207.   {CS1=1;
  208.   CS2=0;}


  209.   for(j=0;j<n;j++)
  210.     {  
  211.     if(lineaddress>=0X80)
  212.       {
  213.       CS1=0;
  214.         CS2=1;
  215.        lineaddress=lineaddress-0X40;
  216.        }
  217.      b=table[j]-0X20;
  218.      for(k=0;k<16;k++)
  219.        {temp[k]=ch2[b][k];}

  220.         writecode(page);
  221.         writecode(lineaddress);
  222.        for(i=0;i<8;i++)
  223.          { writedata(temp[i]);}

  224.        writecode(page+1);
  225.        writecode(lineaddress);
  226.        for(i=8;i<16;i++)
  227.         { writedata(temp[i]);}
  228.   lineaddress+=8;
  229.     }
  230. }
  231. void displayhanzi(unsigned char page,unsigned char lineaddress,int n,  unsigned char table[][16])
  232. {
  233.         unsigned char  temp[32];
  234.         if(lineaddress<0X80)
  235.           {
  236.                 CS1=1;        //left
  237.                 CS2=0;
  238.         }        
  239.         for(j=0;j<n;j++)
  240.     {
  241.                 if(lineaddress>=0X80)
  242.                 {
  243.                         CS1=0;                //right
  244.                        CS2=1;
  245.                         lineaddress=lineaddress-0X40;
  246.                 }
  247.                 for(k=0;k<16;k++)
  248.                 {
  249.                         temp[k]=table[j][k];
  250.                 }
  251.                 j+=1;
  252.                 for(k=0;k<16;k++)
  253.                 {
  254.                         temp[16+k]=table[j][k];
  255.                 }
  256.         writecode(page);
  257.         writecode(lineaddress);
  258.                 for(i=0;i<16;i++)
  259.         {
  260.                         writedata(temp[i]);
  261.                 }
  262.                 writecode(page+1);
  263.                 writecode(lineaddress);
  264.                 for(i=16;i<32;i++)
  265.         {
  266.                         writedata(temp[i]);
  267.                 }
  268.                 lineaddress+=16;
  269.     }
  270. }

  271. void lcdinti()
  272. {   
  273.         writecode(0X3f);//显示开关关
  274.     writecode(0XC0);//修改显示起始行
  275.     writecode(0XB8);//修改页地址,x地址
  276.     writecode(0X40);//修改列地址,y地址
  277.      
  278. }

  279. main()
  280. {
  281.         
  282.         unsigned char t[3]={'/','K','G'};
  283.         char m=':';
  284.         EA=1;
  285.     EX1=1;
  286.         lcdinti();
  287.         clear(0XB8,0X40,16,&table2);
  288.         clear(0XBa,0X40,16,&table2);
  289.         clear(0XBc,0X40,16,&table2);
  290.         clear(0XBe,0X40,16,&table2);
  291.         displayhanzi(0XB8,0X40,16,&TITLE);
  292.         displayhanzi(0XBa,0X40,4,&WEIGHT);
  293.         displayzifu(0XBa,0X60,1,&m);
  294.         displayhanzi(0XBc,0X40,4,&PRICE);
  295.         displayzifu(0XBc,0X60,1,&m);
  296.         displayhanzi(0XBE,0X40,4,&TOTAL);
  297.         displayzifu(0XBe,0X60,1,&m);
  298.         while(1)
  299.         {
  300.                 ad_data =Adc0832(0);           //采样值存储单元初始化为0
  301.                 data_pro();
  302.                 turn(press);
  303.                 displayzifu(0XBa,0X68,5,&t1[1]);
  304.                 displayzifu(0xba,0xB0,2,&t[1]);
  305.                 delay(100);
  306.                 turn(f_price[num]);
  307.                 displayzifu(0XBc,0X68,6,&t1[0]);
  308.                 displayhanzi(0xbc,0x98,2,&YUAN);
  309.                 displayzifu(0XBc,0XA8,3,&t);
  310.                 delay(100);
  311.                 total(press,f_price[num]);
  312.                 turn(sum);
  313.                 displayzifu(0XBe,0X68,6,&t1);
  314.                 displayhanzi(0xbe,0xB0,2,&YUAN);
  315.                 delay(100);
  316.         }
  317. }         
复制代码




回复

使用道具 举报

ID:155605 发表于 2016-12-19 02:43 | 显示全部楼层
谢谢 分享。。
回复

使用道具 举报

ID:200661 发表于 2017-6-16 12:44 | 显示全部楼层
好文件
回复

使用道具 举报

ID:486353 发表于 2019-3-24 18:21 | 显示全部楼层
不能实现多个称重物体的价格l累加
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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