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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2737|回復: 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.raoushi.com/bbs/dpj-206869-1.html

回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表