找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2261|回复: 0
收起左侧

单片机+ADC0832+电桥+放大与校正电路的电子秤代码Proteus仿真

[复制链接]
ID:921990 发表于 2021-5-16 03:57 | 显示全部楼层 |阅读模式
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. #include<reg51.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. uchar shu[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
  5. float u,ti;
  6. double r,z4,z2,cun;
  7. long jie;
  8. double sum,money,date1,date2;  //sum为重量,money为总金额, date为输入单价, date1单价整数
  9. uint y,t;
  10. uint zhen,zhan,pan;
  11. uchar comcode,empt1,empt0,biaozhi,zheng,xiao;
  12. uchar g,m,h,ss,n,f1,f2,z,zengshu,qq,jia;
  13. uchar n,k,s,bb=0,data1,dip=0,dap=0;//n用来显示总输入,k识别输入字符性质,dap识别显示方式,dip为小数识别,bb小数字位数识别
  14. uchar jia1[]={0,0,0,0,0};
  15. uchar money1[]={0,0,0,0,0,0};//金额显示
  16. void jianpan() ;//键盘函数申明
  17. sbit speak=P2^7;//报警
  18. sbit k2=P2^5;
  19. sbit d0=P2^0;//对应着138的A输入端
  20. sbit d1=P2^1;//对应着138的B输入端
  21. sbit d2=P2^2;//对应着138的C输入端
  22. sbit d3=P2^3;//对应着138的E2控制端
  23. sbit m6=P0^6;
  24. sbit zt=P2^4;
  25. sbit xiaoshu=P0^7;
  26. void delay(uint z)    //延时1mS函数
  27. {
  28. uint x,y;
  29. for(x=z;x>0;x--)
  30. for(y=60;y>0;y--);
  31. }
  32. /******************************************************************************
  33.                             AD0832AD转换子程序
  34. *******************************************************************************/
  35. sbit bADcs=P3^4;   //片选位
  36. sbit bADcl=P3^6;   //时钟位
  37. sbit bADda=P3^7;   //数据位
  38. void ad(void)
  39. {           uchar i;
  40.      bADcs = 0;//当ADC0832未工作时其CS输入端应为高电平,此时芯片禁用,开始工作CS为低电平
  41.          bADcl=0;  //第一个时钟下降沿前da为1,第二个与第三时钟下降沿前的数据为通道选择
  42.          bADda=1;  //选置起始位
  43.          bADcl=1;
  44.          bADcl=0;   //   1down
  45.          bADda=1;   //通道选择第1位
  46.          bADcl=1;
  47.          bADcl=0;        //   2 down
  48.          bADda=0;   //通道选择第2位,通道选择为1,0选通道0
  49.          bADcl=1;
  50.          bADcl=0;        //   3 down
  51.          bADda=1;
  52.          bADcl=1;
  53.          bADcl=0;        //   4 down
  54.          for(i=8;i>0;i--)
  55.                  {               
  56.                  data1<<=1;  //从第7位开始,要左移data1=data1<<1
  57.                  bADcl=0;
  58.                 bADcl=1;
  59.                 if(bADda==1) data1|=0x01;  //如果输出1,data1最后一位补1
  60.                  }
  61.         bADcs=1;        //转换完后CS置1
  62. }
  63. /******************************************************************************
  64.                             AD0832AD数据处理程序
  65. *******************************************************************************/
  66. void zhiliang()
  67. {
  68. d3=0;
  69. sum=data1*0.0196078;
  70. zengshu=(uchar)sum;
  71. t=(uint)((sum-zengshu)*1000);
  72. P0=0x00;
  73. P0=shu[zengshu];
  74. d2=0;d1=0;d0=0;
  75. xiaoshu=1;
  76. delay(5);
  77. //xiaoshu=0;
  78. P0=0x00;
  79. P0=shu[t/100];
  80. d2=0;d1=0;d0=1;
  81. delay(5);
  82. P0=0x00;
  83. P0=shu[(t%100)/10];
  84. d2=0;d1=1;d0=0;
  85. delay(5);
  86. P0=0x00;
  87. P0=shu[(t%100)%10];
  88. d3=0;
  89. d2=0;d1=1;d0=1;
  90. delay(5);
  91. }
  92. void qian()//对总的金额进行处理
  93. {
  94. if(k=='=')//判断是否对输入的单价肯定
  95. {
  96. d3=1;
  97. money=ti*sum;
  98. z=(unsigned char)money;//取出总金额的8位整数部分
  99. if(money>255)//判断是否超限
  100. {
  101. qq=1;//置其标志位,为零对金额进行显示
  102. //k2=0;
  103. z=0;//清零
  104. speak=0;//报警标志
  105. }
  106. if(qq==0)//没超出显示的范围且显示金额
  107. {
  108. d3=1;//对138进行片选
  109. y=(money-z)*10;//取出小数部分
  110. P0=0x00;
  111. P0=shu[y];
  112. d2=1;d1=0;d0=1;
  113. xiaoshu=0;
  114. delay(5);
  115. P0=0x00;
  116. P0=shu[z%100%10];
  117. d2=1;d1=0;d0=0;
  118. xiaoshu=1;
  119. delay(5);
  120. P0=0x00;
  121. P0=shu[z%100/10];
  122. d2=0;d1=1;d0=1;
  123. delay(5);
  124. P0=0x00;
  125. P0=shu[z/100];
  126. d2=0;d1=1;d0=0;
  127. delay(5);
  128. //P0=0x00;
  129. //P0=shu[z/1000];
  130. //d2=0;d1=0;d0=1;
  131. //delay(5);
  132. //P0=0x00;
  133. //P0=shu[z/1000];
  134. //d2=0;d1=0;d0=0;
  135. //delay(5);
  136. }
  137. }
  138. }
  139. void zht()
  140. {     TI=0;
  141.         RI=0;
  142.          dip=0;
  143.          zt=0;
  144.            k2=0;
  145.          m=0;//清除按下数字键的个数
  146.          r=0;//清除键值数据
  147.          n=0;//清除键值
  148.          h=0;//清除小数点的位数
  149.                  g=0;//清除按键的次数
  150.          zhen=0;//清除键值处理好的数据
  151.          zhan=0;//清除键值处理好的数据
  152.                  biaozhi=0;
  153.                  comcode=0;
  154.                  }
  155. /******************************************************************************
  156.                            键盘子程序
  157. *******************************************************************************/
  158. void jianpan()
  159. { uchar temp;
  160.   EX1=0;
  161.   P1=0xfe;//判断7、8、9、。
  162.   temp=P1;
  163.   temp=temp&0xf0;//判断有无按键
  164.   if(temp!=0xf0)
  165.   {
  166.     delay(5);
  167.         temp=P1;
  168.     temp=temp&0xf0;
  169.         while(temp!=0xf0)//有按键
  170.         {
  171.           temp=P1;
  172.           switch(temp)
  173.           {
  174.             case 0xee:n=7;k=1;s++;break;//K为数字与功能的判断
  175.             case 0xde:n=8;k=1;s++;break;
  176.             case 0xbe:n=9;k=1;s++;break;
  177.             case 0x7e:k='.';s++;break;         
  178.       }
  179.           while(temp!=0xf0)//等待按键放开
  180.           {
  181.                    temp=P1;
  182.         temp=temp&0xf0;
  183.           }
  184.         }
  185.   }
  186.   P1=0xfd;
  187.   temp=P1;
  188.   temp=temp&0xf0;
  189.   if(temp!=0xf0)
  190.   {
  191.     delay(5);
  192.         temp=P1;
  193.     temp=temp&0xf0;
  194.         while(temp!=0xf0)
  195.         {
  196.           temp=P1;
  197.           switch(temp)
  198.           {
  199.             case 0xed:n=4;k=1;s++;break;
  200.             case 0xdd:n=5;k=1;s++;break;
  201.             case 0xbd:n=6;k=1;s++;break;

  202.           }
  203.           while(temp!=0xf0)
  204.           {
  205.                    temp=P1;
  206.         temp=temp&0xf0;
  207.           }
  208.         }
  209.   }
  210.   P1=0xfb;
  211.   temp=P1;
  212.   temp=temp&0xf0;
  213.   if(temp!=0xf0)
  214.   {
  215.     delay(5);
  216.         temp=P1;
  217.     temp=temp&0xf0;
  218.         while(temp!=0xf0)
  219.         {
  220.           temp=P1;
  221.           switch(temp)
  222.           {
  223.             case 0xeb:n=1;k=1;s++;break;
  224.             case 0xdb:n=2;k=1;s++;break;
  225.             case 0xbb:n=3;k=1;s++;break;
  226.             case 0x7b:k='-';break;//进入累加的标志位
  227.           }
  228.       if(temp==0x7b)//如果按下了清零键则将金额清零
  229.        {
  230.             zht();
  231.                 }
  232.           while(temp!=0xf0)
  233.           {
  234.                    temp=P1;
  235.         temp=temp&0xf0;
  236.           }
  237.         }
  238.   }
  239.   P1=0xf7;
  240.   temp=P1;
  241.   temp=temp&0xf0;
  242.   if(temp!=0xf0)
  243.   {
  244.     delay(5);
  245.         temp=P1;
  246.     temp=temp&0xf0;
  247.         while(temp!=0xf0)
  248.         {
  249.           temp=P1;
  250.           switch(temp)
  251.           {
  252.             case 0xe7:k=' ';break;
  253.             case 0xd7:n=0;k=1;s++;;break;
  254.             case 0xb7:k='=';dip=1;jia=1;break;
  255.             case 0x77:k='+';dap=2;break;//累加等于打标志位
  256.        }
  257.       
  258.           while(temp!=0xf0)
  259.           {
  260.                    temp=P1;
  261.         temp=temp&0xf0;
  262.           }
  263.          }  
  264.   }
  265. }

  266. void tuichu()
  267. {qq=0;
  268.       k=0;
  269. //if(k==' ')//判断是否有退出键按下
  270.        speak=1;//取消报警
  271.                   g=0;//清除按键的次数
  272.                  dip=0;//取消等于键按下的标志
  273.                  dap=0;//取消累加等于的标志
  274.                  jie=0;//清除累加的整数数据
  275.                  date2=0;//清除小数累加的数据
  276.                  m=0;//清除数字键按下的次数
  277.          r=0;//清除键值
  278.           n=0;
  279.           h=0;//清除小数点的位置
  280.           zhen=0;//清除单价值
  281.           zhan=0;//清除单价值
  282.                   ti=0;//清除键值
  283.           z=0;//清除累加的整数值
  284.           y=0;//清除累加的小数值
  285.           money=0;//清除金额
  286.           zt=1;//取消报警
  287.                   bb=0;//清除累加的次数
  288.                   biaozhi=0;
  289.         
  290.                         }
  291. void faleijia()//发累加的函数
  292. {TI=0;
  293. RI=0;
  294. zheng=0;
  295. zheng=(jie/256)+128;//一次计算的金额不会超过256,最先发送的是最高位

  296. xiao=y;
  297.    //chaobiao=1;//抄表标志位置1
  298.   EA=0;
  299.   SBUF=zheng;//发高8位
  300.   while(TI==0);
  301.   TI=0;
  302.   zheng=jie%256;//发送的是次高位
  303.   //sum=data1*0.0196 ;
  304. //EA=0;//关中断
  305.   SBUF=zheng;//发整数
  306.   while(TI==0);
  307.   TI=0;
  308.   SBUF=xiao;//发小数
  309.   while(TI==0);
  310.   TI=0;
  311.   EA=1;
  312.   }

  313. void leijia()//累加的函数
  314. {
  315. while(jia==1)//判断是否按下了等于键,如果按下了则将当前的金额进行保存
  316.                 {bb=bb+1;//累加的次数
  317.                  //cun=sum;//将当前的
  318.                  ss=(uchar)money;//对当前的金额进行取整处理
  319.                  jie=jie+(long)ss;//累加上当前的整数金额
  320.          cun=money-ss;//取出当前金额的小数部分
  321.          date2=date2+cun;//累加上当前的小数金额
  322.          jie=jie+(long)date2;//将小数累加的结果进行取整后,与累加的金额进行和运算
  323.                  z=(uchar)date2;//取出小数累加的整数,以便取出其小数
  324.                  y=(date2-z)*10;//将高位的小数扩大十倍,转换成一位整数
  325.           //z=(unsigned int)date2;
  326.           //y=(date2-z)*10;
  327.                  jia=0;//等待下一次的按键
  328.                  //z=(unsigned char)date2;
  329.          //y=(date2-z)*10;
  330.          //qian();
  331.                  }//进入累加的显示
  332.        if(dap==2)//累加显示
  333.          {d3=1;//对138进行控制
  334.                  //k2=0;
  335.                  dip=1;//等于键的标志位
  336.          //y=(money-z)*10;//取出小数部分
  337.          P0=0x00;//段码初始化
  338.          P0=shu[y];//显示小数
  339.         d2=1;d1=0;d0=1;//位码的地址
  340.         delay(4);//调延时
  341.         P0=0x00;//段码初始化
  342.         P0=shu[jie%10];//显示累加的各位
  343.          d2=1;d1=0;d0=0;
  344.            xiaoshu=1;//固定显示小数点
  345.           delay(4);
  346.         P0=0x00;//段码初始化
  347.         P0=shu[jie%100/10];//显示累加的十位
  348.          d2=0;d1=1;d0=1;
  349.         delay(4);
  350.         P0=0x00;//段码初始化
  351.         P0=shu[(jie/100)%10];//显示累加的百位
  352.      d2=0;d1=1;d0=0;
  353.       delay(4);
  354. //P0=0x00;//段码初始化
  355. //P0=shu[(jie/1000)%10];//显示累加的千位
  356. //d2=0;d1=0;d0=1;
  357. //delay(4);
  358. //P0=0x00;
  359. //P0=shu[jie/10000];//显示累加的万位
  360. //d2=0;d1=0;d0=0;
  361. //delay(4);//进入累加的显示
  362. d3=0;
  363. P0=0x00;//段码初始化
  364. P0=shu[bb%10];//显示累加的次数
  365. d2=1;d1=0;d0=0;
  366. delay(4);
  367. P0=0x00;//段码初始化
  368. P0=shu[bb/10];//显示累加的次数
  369. d2=1;d1=0;d0=1;
  370. delay(4);
  371. }
  372. }
  373. void zh()// 录入数据的函数
  374. {
  375. if(s>0)//确认有数字和小数键按下了
  376. {
  377. g=g+1;//确定按下键的次数,并保存
  378. s=0;//准备下一次按键
  379. if(k==1)//确定是数字键按下了
  380. {
  381. m=m+1;//保存按下数字键的次数
  382. k=0;//保证只有数字按下键才执行,准备下一次按键
  383. switch(m)//开关判断语句,无论小数都将其转换为整数
  384. {
  385. //cy=m;//保存按下数字键的次数
  386. case 1:r=n;k=0;f1=r;break;//确认只有一个数字键按下了
  387. case 2:r=(r*10)+n;k=0;f2=r;break;//确认只有二个数字键按下了
  388. case 3:r=(r*10)+n;k=0;break;//确认只有三个数字键按下了
  389. }
  390. }
  391. if(k=='.')//判断是否有小数点按下
  392. {
  393. //k2=0;
  394. //w='.';
  395. //e=1;//置其标志位
  396. h=g;//将按键的次数保存到h
  397. k=0;//准备下一次按键
  398. }
  399. if((h==m)&&(m==2))//一位小数和一位整数的处理
  400. {
  401. r=f1+(n*0.1);
  402. u=f1+(n*0.1);//考虑
  403. }
  404. if((h==m)&&(m==3))//一位小数和两位整数的处理
  405. {
  406. r=f2+(n*0.1);
  407. z4=r;//考虑
  408. }
  409. if((m==3)&&(h==2))//两位小数和一位整数的处理
  410. {
  411. //k2=0;
  412. r=u+(n*0.01);
  413. //r=c;
  414. z2=r;
  415. }
  416. if((h==2)&&(m==4))//三位小数和一位整数的处理
  417. {
  418. r=z2+(n*0.001); //r=u;
  419. }
  420. if((h==3)&&(m==4))//两位小数和两位整数的处理
  421. {
  422. r=z4+(n*0.01);}
  423. if((h==4)&&(m==4))//一位小数和三位整数的处理
  424. {
  425. r=r+(n*0.1);}
  426. if(((r>255)&&(h==0))||(m>4))//如果键值超限则报警
  427. {
  428. //write_com(0x01);//有问题
  429. //r=0;//清除超限的数据
  430. speak=0;//置报警标志
  431. //WriteString(runout,0,0);
  432. }
  433. }
  434. ti=r;//
  435. }
  436. void danjiaxian()//单价的显示程序
  437. {
  438. P0=0x00;//清零
  439. //P2=0xff;
  440. d3=0;//数码管的控制端
  441. if(m==1)//显示一位数字
  442. {
  443. P0=shu[n];
  444. d2=1;d1=0;d0=0;//位码地址
  445. delay(5);//调延时
  446. }
  447. if((g==2)&&(m==1))//有两次按键,一次整数,一次小数点,即显示一位数字和一位小数
  448.     {
  449.      xiaoshu=1;//小数点控制位
  450.       d2=1;d1=0;d0=0;
  451.        delay(5);}
  452.    if(m==2)//显示两位数字
  453.    {
  454.    zhan=(unsigned int)r;//对键值进行取整数处理
  455.    if(zhan<=9)//有小数点按下了
  456.    {//xiao=1;
  457.    zhan=zhan*10+n;//两位数中如果有一位小数则扩大十倍
  458.    }
  459. if((h==3)&&(m==2))
  460.         {
  461.         xiaoshu=1;
  462.      d2=1;d1=0;d0=0;
  463.     delay(5);}
  464. P0=0x00;
  465. //P2=0xff;
  466. P0=shu[zhan%10];
  467. d2=1;d1=0;d0=0;
  468. delay(5);
  469. P0=0x00;
  470. //P2=0xff;
  471. P0=shu[zhan/10];
  472. d2=1;d1=0;d0=1;
  473. delay(5);
  474. }
  475.   if((r<10)&&(m==2))
  476.    {
  477.    xiaoshu=1;
  478.     d2=1;d1=0;d0=1;
  479.      delay(5);
  480.      }
  481.         
  482. if(m==3)
  483. {
  484. zhen=(unsigned int)r;//(uint)r;
  485.     //pan=zhen;
  486.      if(zhen<10)
  487.       {pan=zhen;
  488.        //if(er==1)//三位数中如果有两位小数则扩大百倍
  489.         zhan=(r-zhen)*100;
  490.          zhen=zhen*100+zhan;
  491.          }
  492.      if(zhen<=99)
  493.       {pan=zhen;
  494.           zhan=(r-zhen)*10;
  495.        zhen=zhen*10+zhan;
  496.         }
  497. if((r>99)&&(h==4))
  498.          {xiaoshu=1;
  499.       d2=1;d1=0;d0=0;
  500.      delay(2);}
  501. if((h==3)&&(m==3))
  502.      {
  503.          xiaoshu=1;
  504.       d2=1;d1=0;d0=1;
  505.      delay(5);}
  506. P0=0x00;
  507. //P2=0xff;
  508. P0=shu[n];
  509. d2=1;d1=0;d0=0;
  510. delay(5);
  511. P0=0x00;
  512. //P2=0xff;
  513. P0=shu[zhen/10%10];
  514. d2=1;d1=0;d0=1;
  515. delay(5);
  516. P0=0x00;
  517. //P2=0xff;
  518. P0=shu[zhen/100];
  519. d2=1;d1=1;d0=0;
  520. delay(5);
  521. }
  522.     if((r<10)&&(m==3))
  523.          {xiaoshu=1;
  524.       d2=1;d1=1;d0=0;
  525.      delay(5);}
  526. if(m==4)
  527. {
  528. //if(r==1999)
  529.              //k2=0;
  530. zhen=(uint)r;
  531.      if(zhen<10)
  532.       {
  533.        //if(er==1)//三位数中如果有两位小数则扩大百倍
  534.          zhan=(r-zhen)*1000;
  535.          zhen=zhen*1000+zhan;
  536.         
  537.          }
  538.      if(zhen<=99)
  539.       {zhan=(r-zhen)*100;
  540.        zhen=zhen*100+zhan;
  541.         }
  542.          if(zhen<255)
  543.      {   
  544.       zhan=(r-zhen)*10;  
  545.        zhen=zhen*10+zhan;
  546.          
  547.        }
  548. if((h==4)&&(m==4))
  549. {
  550. d2=1;d1=0;d0=1;
  551. xiaoshu=1;
  552. delay(5);
  553. }
  554. if((h==2)&&(m==4))
  555. {
  556. d2=1;d1=1;d0=1;
  557. xiaoshu=1;
  558. delay(5);
  559. }
  560. if((h==3)&&(m==4))
  561. {
  562. d2=1;d1=1;d0=0;
  563. xiaoshu=1;
  564. delay(5);
  565. }
  566. P0=0x00;
  567. //P2=0xff;
  568. P0=shu[n];
  569. d2=1;d1=0;d0=0;
  570. delay(5);
  571. P0=0x00;
  572. //P2=0xff;
  573. P0=shu[zhen/10%10];
  574. d2=1;d1=0;d0=1;
  575. delay(5);
  576. P0=0x00;
  577. //P2=0xff;
  578. P0=shu[zhen/100%10];
  579. d2=1;d1=1;d0=0;
  580. delay(5);
  581. P0=0x00;
  582. //P2=0xff;
  583. P0=shu[zhen/1000];
  584. d2=1;d1=1;d0=1;
  585. delay(5);
  586. }
  587. }
  588. void danjia1()//下位机接受单价并显示的程序
  589. {
  590.   d3=0;
  591.   jia1[0]=empt1/100;
  592.   jia1[1]=(empt1%100)/10;              
  593.   jia1[2]=(empt1%100)%10;
  594.   jia1[3]=empt0/10;
  595.   r=empt1+jia1[3]*0.1;//把上位机发过来的值变成单价,只要有单价则就有金额      有问题
  596.   money=r*sum;//计算出此次测量的金额
  597.   //jia1[4]=empt0%10;
  598.   P0=0x00;
  599. //P2=0xff;
  600.   P0=shu[jia1[0]];
  601.   d2=1;d1=1;d0=1;
  602.   delay(5);
  603.   P0=0x00;
  604. //P2=0xff;
  605.   P0=shu[jia1[1]];
  606.   d2=1;d1=1;d0=0;
  607.   delay(5);
  608.   P0=0x00;
  609. //P2=0xff;
  610.   P0=shu[jia1[2]];
  611.   d2=1;d1=0;d0=1;
  612.   xiaoshu=1;
  613.   delay(5);
  614.   P0=0x00;
  615. //P2=0xff;
  616.   P0=shu[jia1[3]];
  617.   d2=1;d1=0;d0=0;
  618.   delay(5);
  619.   //empt1=0;
  620.   //empt0=0;
  621.   //biaozhi=0;
  622.   
  623.   }
  624.   void jine1()
  625.   {
  626.   d3=1;//对138进行片选
  627.   jia1[0]=empt1/100;
  628.   jia1[1]=(empt1%100)/10;
  629.   jia1[2]=(empt1%100)%10;
  630.   jia1[3]=empt0/10;
  631.   P0=0x00;
  632.   P0=shu[jia1[3]];
  633.   d2=1;d1=0;d0=1;
  634.   xiaoshu=0;
  635.   delay(5);
  636.   P0=0x00;
  637.   P0=shu[jia1[2]];
  638.   d2=1;d1=0;d0=0;
  639.   xiaoshu=1;
  640.   delay(5);
  641.   P0=0x00;
  642.   P0=shu[jia1[1]];
  643.   d2=0;d1=1;d0=1;
  644.   delay(5);
  645.   P0=0x00;
  646.   P0=shu[jia1[0]];
  647.   d2=0;d1=1;d0=0;
  648.   delay(5);
  649. //empt1=0;
  650. //empt0=0;
  651. //biaozhi=0;
  652. //comcode=0;
  653. }
  654. void sendcishu()
  655. {
  656. RI=0;
  657.   EA=0;
  658.   SBUF=8;//发高8位
  659.   while(TI==0);
  660.   TI=0;
  661.   //sum=data1*0.0196 ;
  662. //EA=0;//关中断
  663.   SBUF=bb;//发整数
  664.   while(TI==0);
  665.   TI=0;
  666.   SBUF=bb;//发小数
  667.   while(TI==0);
  668.   TI=0;
  669.   EA=1;
  670. }
  671. void send()//抄表发送程序
  672. {zheng=0;
  673. TI=0;
  674.   zheng=(uchar)data1*0.0196078;//一次计算的金额不会超过256
  675.   RI=0;
  676.   xiao=(uchar)((sum-zheng)*100);
  677.    //chaobiao=1;//抄表标志位置1
  678.   EA=0;
  679.   SBUF=4;//发高8位
  680.   while(TI==0);
  681.   TI=0;
  682.   //sum=data1*0.0196 ;
  683. //EA=0;//关中断
  684.   SBUF=zheng;//发整数
  685.   while(TI==0);
  686.   TI=0;
  687.   SBUF=xiao;//发小数
  688.   while(TI==0);
  689.   TI=0;
  690.   EA=1;
  691. }
  692. void senddanjia()//抄表发送程序
  693. { zheng=0;
  694.   EA=0;
  695.   RI=0;//拒绝此时接受
  696.   TI=0;
  697.   zheng=(uchar)r;//取出单价的整数
  698.   xiao=(uchar)((r-zheng)*100);//取出单价的小数部分
  699.   SBUF=5;//发出单价识别项
  700.   while(TI==0);
  701.   TI=0;
  702.   SBUF=zheng;//发送单价的整数部分
  703.   while(TI==0);
  704.   TI=0;
  705.   SBUF=xiao;//发送单价的小数部分
  706.   while(TI==0);
  707.   TI=0;
  708.   EA=1;//重新开中断
  709. }
  710. void sendjine()//抄表发送程序
  711. { zheng=0;
  712. EA=0;//关掉中断但各标志位都是有效的
  713.   RI=0;//拒绝此时此刻的接受
  714.   TI=0;//发送标志位清零
  715.   zheng=(uchar)money;//取出金额的整数
  716.   xiao=(uchar)((money-zheng)*100);//取出金额的小数部分
  717.   SBUF=6;//发出单价识别项
  718.   while(TI==0);
  719.   TI=0;
  720.   SBUF=zheng;//发送单价的整数部分
  721.   while(TI==0);
  722.   TI=0;
  723.   SBUF=xiao;//发送单价的小数部分
  724.   while(TI==0);
  725.   TI=0;
  726.   EA=1;//重新开中断
  727. }
  728.   //danjia[4]=empt0%10;
  729. void main()
  730. {
  731. TMOD=0x20;//T0计数,工作方式2,自动再装
  732. SCON=0x50;//串口通信方式1,波特率由T1的溢出率决定
  733.   //TH0=224;//32个脉冲为0。01度电
  734.   //TL0=224;
  735.   TH1=0xfd;//波特率9600
  736.   TL1=0xfd;
  737.   PCON=0x00;PS=1;//SMOD=0,波特率不倍增,串口中断优先
  738.   EA=1;ES=1;//开中断,注意ET1不能开放,否则死机
  739.   TR1=1;//启动定时
  740. while(1)
  741. {
  742. //if(ddd==0)
  743. ad();//adc的转换程序
  744. jianpan();//键盘的处理程序
  745. zh();//键盘的转换程序
  746. //if(dip==0)
  747. zhiliang();//重量的显示程序
  748. //qingling();
  749. if((dap!=2)&&(d3!=1))
  750. danjiaxian();//单价的显示程序
  751. if(dip==1)
  752. {
  753. senddanjia();
  754. delay(2);
  755. //jia=0;
  756. //delay(5);
  757. sendjine();
  758. }
  759. qian();//金额的显示程序
  760. //if(k==' ')//判断是否有退出键按下
  761. //{
  762. //dip=0;//使金额不显示
  763. //}
  764. send();
  765. leijia();//调用累加函数
  766. if(dap==2)
  767. {RI=0;
  768. sendcishu();
  769. delay(2);
  770. RI=0;
  771. faleijia();//发累加给上位机
  772. }
  773. if(k==' ')//判断是否有退出键按下
  774. tuichu();
  775. if(biaozhi==2)
  776. {
  777. jine1();
  778. }
  779. if(biaozhi==1)
  780. danjia1();
  781. if(biaozhi==3)
  782. tuichu();
  783. if(biaozhi==5)
  784. {
  785. zht();
  786. biaozhi=0;
  787. }
  788. if(biaozhi==4)
  789. dap=2;//打开累加显示
  790. //if(k=='+')
  791. //{dip=0;
  792. //leijia();
  793. //if((jie==jie+(r*sum))
  794. }
  795. }
  796. void int4() interrupt 4//串口中断函数
  797. {
  798.    EA=0;//先关闭中断,防止共他中断干扰
  799.    RI=0;
  800.    TI=0;

  801.    comcode=SBUF;  //再收控制码
  802. if(comcode==2)
  803. {
  804.   biaozhi=5;}
  805.   if(comcode==4)
  806. {//RI=0;
  807. // biaozhi=0;
  808. //comcode=0;
  809. biaozhi=4;}
  810. if(comcode!=4)
  811. {
  812.   if(comcode!=2)
  813.   {
  814.    //comcode=SBUF;  //再收控制码
  815.    if(comcode!=7)
  816.    {
  817.    while(RI==0);
  818.    RI=0;
  819.    empt1=SBUF; //接收充值的整数
  820.    while(RI==0);
  821.    RI=0;
  822.    empt0=SBUF;//接收充值的小数
  823.    }   
  824.   if(comcode==1)
  825.   {//RI=0;TI=0;//继续接受
  826.    biaozhi=1;
  827.    //comcode=0;
  828.    }

  829.    //zhenshu=empt1+(empt0*0.01);//合成整数
  830.    //dim=1;//存储标志置1,存一次
  831.   
  832.   //if(comcode==3)) //如控制码为2,为抄重量
  833.   //{
  834.   //sum=data1*0.0196 ;
  835.   //zheng=(uchar)sum;
  836.   //xiao=(uchar)((sum-zheng)*100);
  837.    //chaobiao=1;//抄表标志位置1
  838. // EA=0;//关中断
  839.   //SBUF=data1;//发整数
  840.   //while(TI==0);
  841.   //TI=0;
  842.   //SBUF=data1;//发小数
  843. // while(TI==0);
  844.   //TI=0;
  845.   //comcode=0;
  846.   //EA=1;//重新开中断
  847. // }
  848.   if(comcode==3) //如控制码为3为写金额
  849.   {jia=1;
  850.    //bb=bb+1;
  851.   //comcode=0;
  852. //biaozhi=0;
  853.   //RI=0;TI=0;
  854.   biaozhi=2;
  855.   }

  856.   if(comcode==7)
  857.   {
  858. //RI=0;
  859.   //biaozhi=0;
  860.   //comcode=0;
  861.   biaozhi=3;}}}

  862.   EA=1;//重新开中断
  863. }
复制代码

仿真工程下载:http://www.51hei.com/bbs/dpj-206869-1.html

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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