找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

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

單片機(jī)+ADC0832+電橋+放大與校正電路的電子秤代碼Proteus仿真

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:921990 發(fā)表于 2021-5-16 03:57 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機(jī)源程序如下:
  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為輸入單價(jià), date1單價(jià)整數(shù)
  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識(shí)別輸入字符性質(zhì),dap識(shí)別顯示方式,dip為小數(shù)識(shí)別,bb小數(shù)字位數(shù)識(shí)別
  14. uchar jia1[]={0,0,0,0,0};
  15. uchar money1[]={0,0,0,0,0,0};//金額顯示
  16. void jianpan() ;//鍵盤函數(shù)申明
  17. sbit speak=P2^7;//報(bào)警
  18. sbit k2=P2^5;
  19. sbit d0=P2^0;//對(duì)應(yīng)著138的A輸入端
  20. sbit d1=P2^1;//對(duì)應(yīng)著138的B輸入端
  21. sbit d2=P2^2;//對(duì)應(yīng)著138的C輸入端
  22. sbit d3=P2^3;//對(duì)應(yīng)著138的E2控制端
  23. sbit m6=P0^6;
  24. sbit zt=P2^4;
  25. sbit xiaoshu=P0^7;
  26. void delay(uint z)    //延時(shí)1mS函數(shù)
  27. {
  28. uint x,y;
  29. for(x=z;x>0;x--)
  30. for(y=60;y>0;y--);
  31. }
  32. /******************************************************************************
  33.                             AD0832AD轉(zhuǎn)換子程序
  34. *******************************************************************************/
  35. sbit bADcs=P3^4;   //片選位
  36. sbit bADcl=P3^6;   //時(shí)鐘位
  37. sbit bADda=P3^7;   //數(shù)據(jù)位
  38. void ad(void)
  39. {           uchar i;
  40.      bADcs = 0;//當(dāng)ADC0832未工作時(shí)其CS輸入端應(yīng)為高電平,此時(shí)芯片禁用,開始工作CS為低電平
  41.          bADcl=0;  //第一個(gè)時(shí)鐘下降沿前da為1,第二個(gè)與第三時(shí)鐘下降沿前的數(shù)據(jù)為通道選擇
  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最后一位補(bǔ)1
  60.                  }
  61.         bADcs=1;        //轉(zhuǎn)換完后CS置1
  62. }
  63. /******************************************************************************
  64.                             AD0832AD數(shù)據(jù)處理程序
  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()//對(duì)總的金額進(jìn)行處理
  93. {
  94. if(k=='=')//判斷是否對(duì)輸入的單價(jià)肯定
  95. {
  96. d3=1;
  97. money=ti*sum;
  98. z=(unsigned char)money;//取出總金額的8位整數(shù)部分
  99. if(money>255)//判斷是否超限
  100. {
  101. qq=1;//置其標(biāo)志位,為零對(duì)金額進(jìn)行顯示
  102. //k2=0;
  103. z=0;//清零
  104. speak=0;//報(bào)警標(biāo)志
  105. }
  106. if(qq==0)//沒超出顯示的范圍且顯示金額
  107. {
  108. d3=1;//對(duì)138進(jìn)行片選
  109. y=(money-z)*10;//取出小數(shù)部分
  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;//清除按下數(shù)字鍵的個(gè)數(shù)
  146.          r=0;//清除鍵值數(shù)據(jù)
  147.          n=0;//清除鍵值
  148.          h=0;//清除小數(shù)點(diǎn)的位數(shù)
  149.                  g=0;//清除按鍵的次數(shù)
  150.          zhen=0;//清除鍵值處理好的數(shù)據(jù)
  151.          zhan=0;//清除鍵值處理好的數(shù)據(jù)
  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為數(shù)字與功能的判斷
  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;//進(jìn)入累加的標(biāo)志位
  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;//累加等于打標(biāo)志位
  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;//取消報(bào)警
  271.                   g=0;//清除按鍵的次數(shù)
  272.                  dip=0;//取消等于鍵按下的標(biāo)志
  273.                  dap=0;//取消累加等于的標(biāo)志
  274.                  jie=0;//清除累加的整數(shù)數(shù)據(jù)
  275.                  date2=0;//清除小數(shù)累加的數(shù)據(jù)
  276.                  m=0;//清除數(shù)字鍵按下的次數(shù)
  277.          r=0;//清除鍵值
  278.           n=0;
  279.           h=0;//清除小數(shù)點(diǎn)的位置
  280.           zhen=0;//清除單價(jià)值
  281.           zhan=0;//清除單價(jià)值
  282.                   ti=0;//清除鍵值
  283.           z=0;//清除累加的整數(shù)值
  284.           y=0;//清除累加的小數(shù)值
  285.           money=0;//清除金額
  286.           zt=1;//取消報(bào)警
  287.                   bb=0;//清除累加的次數(shù)
  288.                   biaozhi=0;
  289.         
  290.                         }
  291. void faleijia()//發(fā)累加的函數(shù)
  292. {TI=0;
  293. RI=0;
  294. zheng=0;
  295. zheng=(jie/256)+128;//一次計(jì)算的金額不會(huì)超過256,最先發(fā)送的是最高位

  296. xiao=y;
  297.    //chaobiao=1;//抄表標(biāo)志位置1
  298.   EA=0;
  299.   SBUF=zheng;//發(fā)高8位
  300.   while(TI==0);
  301.   TI=0;
  302.   zheng=jie%256;//發(fā)送的是次高位
  303.   //sum=data1*0.0196 ;
  304. //EA=0;//關(guān)中斷
  305.   SBUF=zheng;//發(fā)整數(shù)
  306.   while(TI==0);
  307.   TI=0;
  308.   SBUF=xiao;//發(fā)小數(shù)
  309.   while(TI==0);
  310.   TI=0;
  311.   EA=1;
  312.   }

  313. void leijia()//累加的函數(shù)
  314. {
  315. while(jia==1)//判斷是否按下了等于鍵,如果按下了則將當(dāng)前的金額進(jìn)行保存
  316.                 {bb=bb+1;//累加的次數(shù)
  317.                  //cun=sum;//將當(dāng)前的
  318.                  ss=(uchar)money;//對(duì)當(dāng)前的金額進(jìn)行取整處理
  319.                  jie=jie+(long)ss;//累加上當(dāng)前的整數(shù)金額
  320.          cun=money-ss;//取出當(dāng)前金額的小數(shù)部分
  321.          date2=date2+cun;//累加上當(dāng)前的小數(shù)金額
  322.          jie=jie+(long)date2;//將小數(shù)累加的結(jié)果進(jìn)行取整后,與累加的金額進(jìn)行和運(yùn)算
  323.                  z=(uchar)date2;//取出小數(shù)累加的整數(shù),以便取出其小數(shù)
  324.                  y=(date2-z)*10;//將高位的小數(shù)擴(kuò)大十倍,轉(zhuǎn)換成一位整數(shù)
  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.                  }//進(jìn)入累加的顯示
  332.        if(dap==2)//累加顯示
  333.          {d3=1;//對(duì)138進(jìn)行控制
  334.                  //k2=0;
  335.                  dip=1;//等于鍵的標(biāo)志位
  336.          //y=(money-z)*10;//取出小數(shù)部分
  337.          P0=0x00;//段碼初始化
  338.          P0=shu[y];//顯示小數(shù)
  339.         d2=1;d1=0;d0=1;//位碼的地址
  340.         delay(4);//調(diào)延時(shí)
  341.         P0=0x00;//段碼初始化
  342.         P0=shu[jie%10];//顯示累加的各位
  343.          d2=1;d1=0;d0=0;
  344.            xiaoshu=1;//固定顯示小數(shù)點(diǎn)
  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);//進(jìn)入累加的顯示
  362. d3=0;
  363. P0=0x00;//段碼初始化
  364. P0=shu[bb%10];//顯示累加的次數(shù)
  365. d2=1;d1=0;d0=0;
  366. delay(4);
  367. P0=0x00;//段碼初始化
  368. P0=shu[bb/10];//顯示累加的次數(shù)
  369. d2=1;d1=0;d0=1;
  370. delay(4);
  371. }
  372. }
  373. void zh()// 錄入數(shù)據(jù)的函數(shù)
  374. {
  375. if(s>0)//確認(rèn)有數(shù)字和小數(shù)鍵按下了
  376. {
  377. g=g+1;//確定按下鍵的次數(shù),并保存
  378. s=0;//準(zhǔn)備下一次按鍵
  379. if(k==1)//確定是數(shù)字鍵按下了
  380. {
  381. m=m+1;//保存按下數(shù)字鍵的次數(shù)
  382. k=0;//保證只有數(shù)字按下鍵才執(zhí)行,準(zhǔn)備下一次按鍵
  383. switch(m)//開關(guān)判斷語(yǔ)句,無論小數(shù)都將其轉(zhuǎn)換為整數(shù)
  384. {
  385. //cy=m;//保存按下數(shù)字鍵的次數(shù)
  386. case 1:r=n;k=0;f1=r;break;//確認(rèn)只有一個(gè)數(shù)字鍵按下了
  387. case 2:r=(r*10)+n;k=0;f2=r;break;//確認(rèn)只有二個(gè)數(shù)字鍵按下了
  388. case 3:r=(r*10)+n;k=0;break;//確認(rèn)只有三個(gè)數(shù)字鍵按下了
  389. }
  390. }
  391. if(k=='.')//判斷是否有小數(shù)點(diǎn)按下
  392. {
  393. //k2=0;
  394. //w='.';
  395. //e=1;//置其標(biāo)志位
  396. h=g;//將按鍵的次數(shù)保存到h
  397. k=0;//準(zhǔn)備下一次按鍵
  398. }
  399. if((h==m)&&(m==2))//一位小數(shù)和一位整數(shù)的處理
  400. {
  401. r=f1+(n*0.1);
  402. u=f1+(n*0.1);//考慮
  403. }
  404. if((h==m)&&(m==3))//一位小數(shù)和兩位整數(shù)的處理
  405. {
  406. r=f2+(n*0.1);
  407. z4=r;//考慮
  408. }
  409. if((m==3)&&(h==2))//兩位小數(shù)和一位整數(shù)的處理
  410. {
  411. //k2=0;
  412. r=u+(n*0.01);
  413. //r=c;
  414. z2=r;
  415. }
  416. if((h==2)&&(m==4))//三位小數(shù)和一位整數(shù)的處理
  417. {
  418. r=z2+(n*0.001); //r=u;
  419. }
  420. if((h==3)&&(m==4))//兩位小數(shù)和兩位整數(shù)的處理
  421. {
  422. r=z4+(n*0.01);}
  423. if((h==4)&&(m==4))//一位小數(shù)和三位整數(shù)的處理
  424. {
  425. r=r+(n*0.1);}
  426. if(((r>255)&&(h==0))||(m>4))//如果鍵值超限則報(bào)警
  427. {
  428. //write_com(0x01);//有問題
  429. //r=0;//清除超限的數(shù)據(jù)
  430. speak=0;//置報(bào)警標(biāo)志
  431. //WriteString(runout,0,0);
  432. }
  433. }
  434. ti=r;//
  435. }
  436. void danjiaxian()//單價(jià)的顯示程序
  437. {
  438. P0=0x00;//清零
  439. //P2=0xff;
  440. d3=0;//數(shù)碼管的控制端
  441. if(m==1)//顯示一位數(shù)字
  442. {
  443. P0=shu[n];
  444. d2=1;d1=0;d0=0;//位碼地址
  445. delay(5);//調(diào)延時(shí)
  446. }
  447. if((g==2)&&(m==1))//有兩次按鍵,一次整數(shù),一次小數(shù)點(diǎn),即顯示一位數(shù)字和一位小數(shù)
  448.     {
  449.      xiaoshu=1;//小數(shù)點(diǎn)控制位
  450.       d2=1;d1=0;d0=0;
  451.        delay(5);}
  452.    if(m==2)//顯示兩位數(shù)字
  453.    {
  454.    zhan=(unsigned int)r;//對(duì)鍵值進(jìn)行取整數(shù)處理
  455.    if(zhan<=9)//有小數(shù)點(diǎn)按下了
  456.    {//xiao=1;
  457.    zhan=zhan*10+n;//兩位數(shù)中如果有一位小數(shù)則擴(kuò)大十倍
  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)//三位數(shù)中如果有兩位小數(shù)則擴(kuò)大百倍
  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)//三位數(shù)中如果有兩位小數(shù)則擴(kuò)大百倍
  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()//下位機(jī)接受單價(jià)并顯示的程序
  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;//把上位機(jī)發(fā)過來的值變成單價(jià),只要有單價(jià)則就有金額      有問題
  596.   money=r*sum;//計(jì)算出此次測(cè)量的金額
  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;//對(duì)138進(jìn)行片選
  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;//發(fā)高8位
  659.   while(TI==0);
  660.   TI=0;
  661.   //sum=data1*0.0196 ;
  662. //EA=0;//關(guān)中斷
  663.   SBUF=bb;//發(fā)整數(shù)
  664.   while(TI==0);
  665.   TI=0;
  666.   SBUF=bb;//發(fā)小數(shù)
  667.   while(TI==0);
  668.   TI=0;
  669.   EA=1;
  670. }
  671. void send()//抄表發(fā)送程序
  672. {zheng=0;
  673. TI=0;
  674.   zheng=(uchar)data1*0.0196078;//一次計(jì)算的金額不會(huì)超過256
  675.   RI=0;
  676.   xiao=(uchar)((sum-zheng)*100);
  677.    //chaobiao=1;//抄表標(biāo)志位置1
  678.   EA=0;
  679.   SBUF=4;//發(fā)高8位
  680.   while(TI==0);
  681.   TI=0;
  682.   //sum=data1*0.0196 ;
  683. //EA=0;//關(guān)中斷
  684.   SBUF=zheng;//發(fā)整數(shù)
  685.   while(TI==0);
  686.   TI=0;
  687.   SBUF=xiao;//發(fā)小數(shù)
  688.   while(TI==0);
  689.   TI=0;
  690.   EA=1;
  691. }
  692. void senddanjia()//抄表發(fā)送程序
  693. { zheng=0;
  694.   EA=0;
  695.   RI=0;//拒絕此時(shí)接受
  696.   TI=0;
  697.   zheng=(uchar)r;//取出單價(jià)的整數(shù)
  698.   xiao=(uchar)((r-zheng)*100);//取出單價(jià)的小數(shù)部分
  699.   SBUF=5;//發(fā)出單價(jià)識(shí)別項(xiàng)
  700.   while(TI==0);
  701.   TI=0;
  702.   SBUF=zheng;//發(fā)送單價(jià)的整數(shù)部分
  703.   while(TI==0);
  704.   TI=0;
  705.   SBUF=xiao;//發(fā)送單價(jià)的小數(shù)部分
  706.   while(TI==0);
  707.   TI=0;
  708.   EA=1;//重新開中斷
  709. }
  710. void sendjine()//抄表發(fā)送程序
  711. { zheng=0;
  712. EA=0;//關(guān)掉中斷但各標(biāo)志位都是有效的
  713.   RI=0;//拒絕此時(shí)此刻的接受
  714.   TI=0;//發(fā)送標(biāo)志位清零
  715.   zheng=(uchar)money;//取出金額的整數(shù)
  716.   xiao=(uchar)((money-zheng)*100);//取出金額的小數(shù)部分
  717.   SBUF=6;//發(fā)出單價(jià)識(shí)別項(xiàng)
  718.   while(TI==0);
  719.   TI=0;
  720.   SBUF=zheng;//發(fā)送單價(jià)的整數(shù)部分
  721.   while(TI==0);
  722.   TI=0;
  723.   SBUF=xiao;//發(fā)送單價(jià)的小數(shù)部分
  724.   while(TI==0);
  725.   TI=0;
  726.   EA=1;//重新開中斷
  727. }
  728.   //danjia[4]=empt0%10;
  729. void main()
  730. {
  731. TMOD=0x20;//T0計(jì)數(shù),工作方式2,自動(dòng)再裝
  732. SCON=0x50;//串口通信方式1,波特率由T1的溢出率決定
  733.   //TH0=224;//32個(gè)脈沖為0。01度電
  734.   //TL0=224;
  735.   TH1=0xfd;//波特率9600
  736.   TL1=0xfd;
  737.   PCON=0x00;PS=1;//SMOD=0,波特率不倍增,串口中斷優(yōu)先
  738.   EA=1;ES=1;//開中斷,注意ET1不能開放,否則死機(jī)
  739.   TR1=1;//啟動(dòng)定時(shí)
  740. while(1)
  741. {
  742. //if(ddd==0)
  743. ad();//adc的轉(zhuǎn)換程序
  744. jianpan();//鍵盤的處理程序
  745. zh();//鍵盤的轉(zhuǎn)換程序
  746. //if(dip==0)
  747. zhiliang();//重量的顯示程序
  748. //qingling();
  749. if((dap!=2)&&(d3!=1))
  750. danjiaxian();//單價(jià)的顯示程序
  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();//調(diào)用累加函數(shù)
  766. if(dap==2)
  767. {RI=0;
  768. sendcishu();
  769. delay(2);
  770. RI=0;
  771. faleijia();//發(fā)累加給上位機(jī)
  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//串口中斷函數(shù)
  797. {
  798.    EA=0;//先關(guān)閉中斷,防止共他中斷干擾
  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; //接收充值的整數(shù)
  820.    while(RI==0);
  821.    RI=0;
  822.    empt0=SBUF;//接收充值的小數(shù)
  823.    }   
  824.   if(comcode==1)
  825.   {//RI=0;TI=0;//繼續(xù)接受
  826.    biaozhi=1;
  827.    //comcode=0;
  828.    }

  829.    //zhenshu=empt1+(empt0*0.01);//合成整數(shù)
  830.    //dim=1;//存儲(chǔ)標(biāo)志置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;//抄表標(biāo)志位置1
  838. // EA=0;//關(guān)中斷
  839.   //SBUF=data1;//發(fā)整數(shù)
  840.   //while(TI==0);
  841.   //TI=0;
  842.   //SBUF=data1;//發(fā)小數(shù)
  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. }
復(fù)制代碼

仿真工程下載:http://www.torrancerestoration.com/bbs/dpj-206869-1.html

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

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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