|
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
 
單片機(jī)源程序如下:
- #include<reg51.h>
- #define uchar unsigned char
- #define uint unsigned int
- uchar shu[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
- float u,ti;
- double r,z4,z2,cun;
- long jie;
- double sum,money,date1,date2; //sum為重量,money為總金額, date為輸入單價(jià), date1單價(jià)整數(shù)
- uint y,t;
- uint zhen,zhan,pan;
- uchar comcode,empt1,empt0,biaozhi,zheng,xiao;
- uchar g,m,h,ss,n,f1,f2,z,zengshu,qq,jia;
- uchar n,k,s,bb=0,data1,dip=0,dap=0;//n用來顯示總輸入,k識(shí)別輸入字符性質(zhì),dap識(shí)別顯示方式,dip為小數(shù)識(shí)別,bb小數(shù)字位數(shù)識(shí)別
- uchar jia1[]={0,0,0,0,0};
- uchar money1[]={0,0,0,0,0,0};//金額顯示
- void jianpan() ;//鍵盤函數(shù)申明
- sbit speak=P2^7;//報(bào)警
- sbit k2=P2^5;
- sbit d0=P2^0;//對(duì)應(yīng)著138的A輸入端
- sbit d1=P2^1;//對(duì)應(yīng)著138的B輸入端
- sbit d2=P2^2;//對(duì)應(yīng)著138的C輸入端
- sbit d3=P2^3;//對(duì)應(yīng)著138的E2控制端
- sbit m6=P0^6;
- sbit zt=P2^4;
- sbit xiaoshu=P0^7;
- void delay(uint z) //延時(shí)1mS函數(shù)
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=60;y>0;y--);
- }
- /******************************************************************************
- AD0832AD轉(zhuǎn)換子程序
- *******************************************************************************/
- sbit bADcs=P3^4; //片選位
- sbit bADcl=P3^6; //時(shí)鐘位
- sbit bADda=P3^7; //數(shù)據(jù)位
- void ad(void)
- { uchar i;
- bADcs = 0;//當(dāng)ADC0832未工作時(shí)其CS輸入端應(yīng)為高電平,此時(shí)芯片禁用,開始工作CS為低電平
- bADcl=0; //第一個(gè)時(shí)鐘下降沿前da為1,第二個(gè)與第三時(shí)鐘下降沿前的數(shù)據(jù)為通道選擇
- bADda=1; //選置起始位
- bADcl=1;
- bADcl=0; // 1down
- bADda=1; //通道選擇第1位
- bADcl=1;
- bADcl=0; // 2 down
- bADda=0; //通道選擇第2位,通道選擇為1,0選通道0
- bADcl=1;
- bADcl=0; // 3 down
- bADda=1;
- bADcl=1;
- bADcl=0; // 4 down
- for(i=8;i>0;i--)
- {
- data1<<=1; //從第7位開始,要左移data1=data1<<1
- bADcl=0;
- bADcl=1;
- if(bADda==1) data1|=0x01; //如果輸出1,data1最后一位補(bǔ)1
- }
- bADcs=1; //轉(zhuǎn)換完后CS置1
- }
- /******************************************************************************
- AD0832AD數(shù)據(jù)處理程序
- *******************************************************************************/
- void zhiliang()
- {
- d3=0;
- sum=data1*0.0196078;
- zengshu=(uchar)sum;
- t=(uint)((sum-zengshu)*1000);
- P0=0x00;
- P0=shu[zengshu];
- d2=0;d1=0;d0=0;
- xiaoshu=1;
- delay(5);
- //xiaoshu=0;
- P0=0x00;
- P0=shu[t/100];
- d2=0;d1=0;d0=1;
- delay(5);
- P0=0x00;
- P0=shu[(t%100)/10];
- d2=0;d1=1;d0=0;
- delay(5);
- P0=0x00;
- P0=shu[(t%100)%10];
- d3=0;
- d2=0;d1=1;d0=1;
- delay(5);
- }
- void qian()//對(duì)總的金額進(jìn)行處理
- {
- if(k=='=')//判斷是否對(duì)輸入的單價(jià)肯定
- {
- d3=1;
- money=ti*sum;
- z=(unsigned char)money;//取出總金額的8位整數(shù)部分
- if(money>255)//判斷是否超限
- {
- qq=1;//置其標(biāo)志位,為零對(duì)金額進(jìn)行顯示
- //k2=0;
- z=0;//清零
- speak=0;//報(bào)警標(biāo)志
- }
- if(qq==0)//沒超出顯示的范圍且顯示金額
- {
- d3=1;//對(duì)138進(jìn)行片選
- y=(money-z)*10;//取出小數(shù)部分
- P0=0x00;
- P0=shu[y];
- d2=1;d1=0;d0=1;
- xiaoshu=0;
- delay(5);
- P0=0x00;
- P0=shu[z%100%10];
- d2=1;d1=0;d0=0;
- xiaoshu=1;
- delay(5);
- P0=0x00;
- P0=shu[z%100/10];
- d2=0;d1=1;d0=1;
- delay(5);
- P0=0x00;
- P0=shu[z/100];
- d2=0;d1=1;d0=0;
- delay(5);
- //P0=0x00;
- //P0=shu[z/1000];
- //d2=0;d1=0;d0=1;
- //delay(5);
- //P0=0x00;
- //P0=shu[z/1000];
- //d2=0;d1=0;d0=0;
- //delay(5);
- }
- }
- }
- void zht()
- { TI=0;
- RI=0;
- dip=0;
- zt=0;
- k2=0;
- m=0;//清除按下數(shù)字鍵的個(gè)數(shù)
- r=0;//清除鍵值數(shù)據(jù)
- n=0;//清除鍵值
- h=0;//清除小數(shù)點(diǎn)的位數(shù)
- g=0;//清除按鍵的次數(shù)
- zhen=0;//清除鍵值處理好的數(shù)據(jù)
- zhan=0;//清除鍵值處理好的數(shù)據(jù)
- biaozhi=0;
- comcode=0;
- }
- /******************************************************************************
- 鍵盤子程序
- *******************************************************************************/
- void jianpan()
- { uchar temp;
- EX1=0;
- P1=0xfe;//判斷7、8、9、。
- temp=P1;
- temp=temp&0xf0;//判斷有無按鍵
- if(temp!=0xf0)
- {
- delay(5);
- temp=P1;
- temp=temp&0xf0;
- while(temp!=0xf0)//有按鍵
- {
- temp=P1;
- switch(temp)
- {
- case 0xee:n=7;k=1;s++;break;//K為數(shù)字與功能的判斷
- case 0xde:n=8;k=1;s++;break;
- case 0xbe:n=9;k=1;s++;break;
- case 0x7e:k='.';s++;break;
- }
- while(temp!=0xf0)//等待按鍵放開
- {
- temp=P1;
- temp=temp&0xf0;
- }
- }
- }
- P1=0xfd;
- temp=P1;
- temp=temp&0xf0;
- if(temp!=0xf0)
- {
- delay(5);
- temp=P1;
- temp=temp&0xf0;
- while(temp!=0xf0)
- {
- temp=P1;
- switch(temp)
- {
- case 0xed:n=4;k=1;s++;break;
- case 0xdd:n=5;k=1;s++;break;
- case 0xbd:n=6;k=1;s++;break;
- }
- while(temp!=0xf0)
- {
- temp=P1;
- temp=temp&0xf0;
- }
- }
- }
- P1=0xfb;
- temp=P1;
- temp=temp&0xf0;
- if(temp!=0xf0)
- {
- delay(5);
- temp=P1;
- temp=temp&0xf0;
- while(temp!=0xf0)
- {
- temp=P1;
- switch(temp)
- {
- case 0xeb:n=1;k=1;s++;break;
- case 0xdb:n=2;k=1;s++;break;
- case 0xbb:n=3;k=1;s++;break;
- case 0x7b:k='-';break;//進(jìn)入累加的標(biāo)志位
- }
- if(temp==0x7b)//如果按下了清零鍵則將金額清零
- {
- zht();
- }
- while(temp!=0xf0)
- {
- temp=P1;
- temp=temp&0xf0;
- }
- }
- }
- P1=0xf7;
- temp=P1;
- temp=temp&0xf0;
- if(temp!=0xf0)
- {
- delay(5);
- temp=P1;
- temp=temp&0xf0;
- while(temp!=0xf0)
- {
- temp=P1;
- switch(temp)
- {
- case 0xe7:k=' ';break;
- case 0xd7:n=0;k=1;s++;;break;
- case 0xb7:k='=';dip=1;jia=1;break;
- case 0x77:k='+';dap=2;break;//累加等于打標(biāo)志位
- }
-
- while(temp!=0xf0)
- {
- temp=P1;
- temp=temp&0xf0;
- }
- }
- }
- }
-
- void tuichu()
- {qq=0;
- k=0;
- //if(k==' ')//判斷是否有退出鍵按下
- speak=1;//取消報(bào)警
- g=0;//清除按鍵的次數(shù)
- dip=0;//取消等于鍵按下的標(biāo)志
- dap=0;//取消累加等于的標(biāo)志
- jie=0;//清除累加的整數(shù)數(shù)據(jù)
- date2=0;//清除小數(shù)累加的數(shù)據(jù)
- m=0;//清除數(shù)字鍵按下的次數(shù)
- r=0;//清除鍵值
- n=0;
- h=0;//清除小數(shù)點(diǎn)的位置
- zhen=0;//清除單價(jià)值
- zhan=0;//清除單價(jià)值
- ti=0;//清除鍵值
- z=0;//清除累加的整數(shù)值
- y=0;//清除累加的小數(shù)值
- money=0;//清除金額
- zt=1;//取消報(bào)警
- bb=0;//清除累加的次數(shù)
- biaozhi=0;
-
- }
- void faleijia()//發(fā)累加的函數(shù)
- {TI=0;
- RI=0;
- zheng=0;
- zheng=(jie/256)+128;//一次計(jì)算的金額不會(huì)超過256,最先發(fā)送的是最高位
-
- xiao=y;
- //chaobiao=1;//抄表標(biāo)志位置1
- EA=0;
- SBUF=zheng;//發(fā)高8位
- while(TI==0);
- TI=0;
- zheng=jie%256;//發(fā)送的是次高位
- //sum=data1*0.0196 ;
- //EA=0;//關(guān)中斷
- SBUF=zheng;//發(fā)整數(shù)
- while(TI==0);
- TI=0;
- SBUF=xiao;//發(fā)小數(shù)
- while(TI==0);
- TI=0;
- EA=1;
- }
- void leijia()//累加的函數(shù)
- {
- while(jia==1)//判斷是否按下了等于鍵,如果按下了則將當(dāng)前的金額進(jìn)行保存
- {bb=bb+1;//累加的次數(shù)
- //cun=sum;//將當(dāng)前的
- ss=(uchar)money;//對(duì)當(dāng)前的金額進(jìn)行取整處理
- jie=jie+(long)ss;//累加上當(dāng)前的整數(shù)金額
- cun=money-ss;//取出當(dāng)前金額的小數(shù)部分
- date2=date2+cun;//累加上當(dāng)前的小數(shù)金額
- jie=jie+(long)date2;//將小數(shù)累加的結(jié)果進(jìn)行取整后,與累加的金額進(jìn)行和運(yùn)算
- z=(uchar)date2;//取出小數(shù)累加的整數(shù),以便取出其小數(shù)
- y=(date2-z)*10;//將高位的小數(shù)擴(kuò)大十倍,轉(zhuǎn)換成一位整數(shù)
- //z=(unsigned int)date2;
- //y=(date2-z)*10;
- jia=0;//等待下一次的按鍵
- //z=(unsigned char)date2;
- //y=(date2-z)*10;
- //qian();
- }//進(jìn)入累加的顯示
- if(dap==2)//累加顯示
- {d3=1;//對(duì)138進(jìn)行控制
- //k2=0;
- dip=1;//等于鍵的標(biāo)志位
- //y=(money-z)*10;//取出小數(shù)部分
- P0=0x00;//段碼初始化
- P0=shu[y];//顯示小數(shù)
- d2=1;d1=0;d0=1;//位碼的地址
- delay(4);//調(diào)延時(shí)
- P0=0x00;//段碼初始化
- P0=shu[jie%10];//顯示累加的各位
- d2=1;d1=0;d0=0;
- xiaoshu=1;//固定顯示小數(shù)點(diǎn)
- delay(4);
- P0=0x00;//段碼初始化
- P0=shu[jie%100/10];//顯示累加的十位
- d2=0;d1=1;d0=1;
- delay(4);
- P0=0x00;//段碼初始化
- P0=shu[(jie/100)%10];//顯示累加的百位
- d2=0;d1=1;d0=0;
- delay(4);
- //P0=0x00;//段碼初始化
- //P0=shu[(jie/1000)%10];//顯示累加的千位
- //d2=0;d1=0;d0=1;
- //delay(4);
- //P0=0x00;
- //P0=shu[jie/10000];//顯示累加的萬位
- //d2=0;d1=0;d0=0;
- //delay(4);//進(jìn)入累加的顯示
- d3=0;
- P0=0x00;//段碼初始化
- P0=shu[bb%10];//顯示累加的次數(shù)
- d2=1;d1=0;d0=0;
- delay(4);
- P0=0x00;//段碼初始化
- P0=shu[bb/10];//顯示累加的次數(shù)
- d2=1;d1=0;d0=1;
- delay(4);
- }
- }
- void zh()// 錄入數(shù)據(jù)的函數(shù)
- {
- if(s>0)//確認(rèn)有數(shù)字和小數(shù)鍵按下了
- {
- g=g+1;//確定按下鍵的次數(shù),并保存
- s=0;//準(zhǔn)備下一次按鍵
- if(k==1)//確定是數(shù)字鍵按下了
- {
- m=m+1;//保存按下數(shù)字鍵的次數(shù)
- k=0;//保證只有數(shù)字按下鍵才執(zhí)行,準(zhǔn)備下一次按鍵
- switch(m)//開關(guān)判斷語(yǔ)句,無論小數(shù)都將其轉(zhuǎn)換為整數(shù)
- {
- //cy=m;//保存按下數(shù)字鍵的次數(shù)
- case 1:r=n;k=0;f1=r;break;//確認(rèn)只有一個(gè)數(shù)字鍵按下了
- case 2:r=(r*10)+n;k=0;f2=r;break;//確認(rèn)只有二個(gè)數(shù)字鍵按下了
- case 3:r=(r*10)+n;k=0;break;//確認(rèn)只有三個(gè)數(shù)字鍵按下了
- }
- }
- if(k=='.')//判斷是否有小數(shù)點(diǎn)按下
- {
- //k2=0;
- //w='.';
- //e=1;//置其標(biāo)志位
- h=g;//將按鍵的次數(shù)保存到h
- k=0;//準(zhǔn)備下一次按鍵
- }
- if((h==m)&&(m==2))//一位小數(shù)和一位整數(shù)的處理
- {
- r=f1+(n*0.1);
- u=f1+(n*0.1);//考慮
- }
- if((h==m)&&(m==3))//一位小數(shù)和兩位整數(shù)的處理
- {
- r=f2+(n*0.1);
- z4=r;//考慮
- }
- if((m==3)&&(h==2))//兩位小數(shù)和一位整數(shù)的處理
- {
- //k2=0;
- r=u+(n*0.01);
- //r=c;
- z2=r;
- }
- if((h==2)&&(m==4))//三位小數(shù)和一位整數(shù)的處理
- {
- r=z2+(n*0.001); //r=u;
- }
- if((h==3)&&(m==4))//兩位小數(shù)和兩位整數(shù)的處理
- {
- r=z4+(n*0.01);}
- if((h==4)&&(m==4))//一位小數(shù)和三位整數(shù)的處理
- {
- r=r+(n*0.1);}
- if(((r>255)&&(h==0))||(m>4))//如果鍵值超限則報(bào)警
- {
- //write_com(0x01);//有問題
- //r=0;//清除超限的數(shù)據(jù)
- speak=0;//置報(bào)警標(biāo)志
- //WriteString(runout,0,0);
- }
- }
- ti=r;//
- }
- void danjiaxian()//單價(jià)的顯示程序
- {
- P0=0x00;//清零
- //P2=0xff;
- d3=0;//數(shù)碼管的控制端
- if(m==1)//顯示一位數(shù)字
- {
- P0=shu[n];
- d2=1;d1=0;d0=0;//位碼地址
- delay(5);//調(diào)延時(shí)
- }
- if((g==2)&&(m==1))//有兩次按鍵,一次整數(shù),一次小數(shù)點(diǎn),即顯示一位數(shù)字和一位小數(shù)
- {
- xiaoshu=1;//小數(shù)點(diǎn)控制位
- d2=1;d1=0;d0=0;
- delay(5);}
- if(m==2)//顯示兩位數(shù)字
- {
- zhan=(unsigned int)r;//對(duì)鍵值進(jìn)行取整數(shù)處理
- if(zhan<=9)//有小數(shù)點(diǎn)按下了
- {//xiao=1;
- zhan=zhan*10+n;//兩位數(shù)中如果有一位小數(shù)則擴(kuò)大十倍
- }
- if((h==3)&&(m==2))
- {
- xiaoshu=1;
- d2=1;d1=0;d0=0;
- delay(5);}
- P0=0x00;
- //P2=0xff;
- P0=shu[zhan%10];
- d2=1;d1=0;d0=0;
- delay(5);
- P0=0x00;
- //P2=0xff;
- P0=shu[zhan/10];
- d2=1;d1=0;d0=1;
- delay(5);
- }
- if((r<10)&&(m==2))
- {
- xiaoshu=1;
- d2=1;d1=0;d0=1;
- delay(5);
- }
-
- if(m==3)
- {
- zhen=(unsigned int)r;//(uint)r;
- //pan=zhen;
- if(zhen<10)
- {pan=zhen;
- //if(er==1)//三位數(shù)中如果有兩位小數(shù)則擴(kuò)大百倍
- zhan=(r-zhen)*100;
- zhen=zhen*100+zhan;
- }
- if(zhen<=99)
- {pan=zhen;
- zhan=(r-zhen)*10;
- zhen=zhen*10+zhan;
- }
- if((r>99)&&(h==4))
- {xiaoshu=1;
- d2=1;d1=0;d0=0;
- delay(2);}
- if((h==3)&&(m==3))
- {
- xiaoshu=1;
- d2=1;d1=0;d0=1;
- delay(5);}
- P0=0x00;
- //P2=0xff;
- P0=shu[n];
- d2=1;d1=0;d0=0;
- delay(5);
- P0=0x00;
- //P2=0xff;
- P0=shu[zhen/10%10];
- d2=1;d1=0;d0=1;
- delay(5);
- P0=0x00;
- //P2=0xff;
- P0=shu[zhen/100];
- d2=1;d1=1;d0=0;
- delay(5);
- }
- if((r<10)&&(m==3))
- {xiaoshu=1;
- d2=1;d1=1;d0=0;
- delay(5);}
- if(m==4)
- {
- //if(r==1999)
- //k2=0;
- zhen=(uint)r;
- if(zhen<10)
- {
- //if(er==1)//三位數(shù)中如果有兩位小數(shù)則擴(kuò)大百倍
- zhan=(r-zhen)*1000;
- zhen=zhen*1000+zhan;
-
- }
- if(zhen<=99)
- {zhan=(r-zhen)*100;
- zhen=zhen*100+zhan;
- }
- if(zhen<255)
- {
- zhan=(r-zhen)*10;
- zhen=zhen*10+zhan;
-
- }
- if((h==4)&&(m==4))
- {
- d2=1;d1=0;d0=1;
- xiaoshu=1;
- delay(5);
- }
- if((h==2)&&(m==4))
- {
- d2=1;d1=1;d0=1;
- xiaoshu=1;
- delay(5);
- }
- if((h==3)&&(m==4))
- {
- d2=1;d1=1;d0=0;
- xiaoshu=1;
- delay(5);
- }
- P0=0x00;
- //P2=0xff;
- P0=shu[n];
- d2=1;d1=0;d0=0;
- delay(5);
- P0=0x00;
- //P2=0xff;
- P0=shu[zhen/10%10];
- d2=1;d1=0;d0=1;
- delay(5);
- P0=0x00;
- //P2=0xff;
- P0=shu[zhen/100%10];
- d2=1;d1=1;d0=0;
- delay(5);
- P0=0x00;
- //P2=0xff;
- P0=shu[zhen/1000];
- d2=1;d1=1;d0=1;
- delay(5);
- }
- }
- void danjia1()//下位機(jī)接受單價(jià)并顯示的程序
- {
- d3=0;
- jia1[0]=empt1/100;
- jia1[1]=(empt1%100)/10;
- jia1[2]=(empt1%100)%10;
- jia1[3]=empt0/10;
- r=empt1+jia1[3]*0.1;//把上位機(jī)發(fā)過來的值變成單價(jià),只要有單價(jià)則就有金額 有問題
- money=r*sum;//計(jì)算出此次測(cè)量的金額
- //jia1[4]=empt0%10;
- P0=0x00;
- //P2=0xff;
- P0=shu[jia1[0]];
- d2=1;d1=1;d0=1;
- delay(5);
- P0=0x00;
- //P2=0xff;
- P0=shu[jia1[1]];
- d2=1;d1=1;d0=0;
- delay(5);
- P0=0x00;
- //P2=0xff;
- P0=shu[jia1[2]];
- d2=1;d1=0;d0=1;
- xiaoshu=1;
- delay(5);
- P0=0x00;
- //P2=0xff;
- P0=shu[jia1[3]];
- d2=1;d1=0;d0=0;
- delay(5);
- //empt1=0;
- //empt0=0;
- //biaozhi=0;
-
- }
- void jine1()
- {
- d3=1;//對(duì)138進(jìn)行片選
- jia1[0]=empt1/100;
- jia1[1]=(empt1%100)/10;
- jia1[2]=(empt1%100)%10;
- jia1[3]=empt0/10;
- P0=0x00;
- P0=shu[jia1[3]];
- d2=1;d1=0;d0=1;
- xiaoshu=0;
- delay(5);
- P0=0x00;
- P0=shu[jia1[2]];
- d2=1;d1=0;d0=0;
- xiaoshu=1;
- delay(5);
- P0=0x00;
- P0=shu[jia1[1]];
- d2=0;d1=1;d0=1;
- delay(5);
- P0=0x00;
- P0=shu[jia1[0]];
- d2=0;d1=1;d0=0;
- delay(5);
- //empt1=0;
- //empt0=0;
- //biaozhi=0;
- //comcode=0;
- }
- void sendcishu()
- {
- RI=0;
- EA=0;
- SBUF=8;//發(fā)高8位
- while(TI==0);
- TI=0;
- //sum=data1*0.0196 ;
- //EA=0;//關(guān)中斷
- SBUF=bb;//發(fā)整數(shù)
- while(TI==0);
- TI=0;
- SBUF=bb;//發(fā)小數(shù)
- while(TI==0);
- TI=0;
- EA=1;
- }
- void send()//抄表發(fā)送程序
- {zheng=0;
- TI=0;
- zheng=(uchar)data1*0.0196078;//一次計(jì)算的金額不會(huì)超過256
- RI=0;
- xiao=(uchar)((sum-zheng)*100);
- //chaobiao=1;//抄表標(biāo)志位置1
- EA=0;
- SBUF=4;//發(fā)高8位
- while(TI==0);
- TI=0;
- //sum=data1*0.0196 ;
- //EA=0;//關(guān)中斷
- SBUF=zheng;//發(fā)整數(shù)
- while(TI==0);
- TI=0;
- SBUF=xiao;//發(fā)小數(shù)
- while(TI==0);
- TI=0;
- EA=1;
- }
- void senddanjia()//抄表發(fā)送程序
- { zheng=0;
- EA=0;
- RI=0;//拒絕此時(shí)接受
- TI=0;
- zheng=(uchar)r;//取出單價(jià)的整數(shù)
- xiao=(uchar)((r-zheng)*100);//取出單價(jià)的小數(shù)部分
- SBUF=5;//發(fā)出單價(jià)識(shí)別項(xiàng)
- while(TI==0);
- TI=0;
- SBUF=zheng;//發(fā)送單價(jià)的整數(shù)部分
- while(TI==0);
- TI=0;
- SBUF=xiao;//發(fā)送單價(jià)的小數(shù)部分
- while(TI==0);
- TI=0;
- EA=1;//重新開中斷
- }
- void sendjine()//抄表發(fā)送程序
- { zheng=0;
- EA=0;//關(guān)掉中斷但各標(biāo)志位都是有效的
- RI=0;//拒絕此時(shí)此刻的接受
- TI=0;//發(fā)送標(biāo)志位清零
- zheng=(uchar)money;//取出金額的整數(shù)
- xiao=(uchar)((money-zheng)*100);//取出金額的小數(shù)部分
- SBUF=6;//發(fā)出單價(jià)識(shí)別項(xiàng)
- while(TI==0);
- TI=0;
- SBUF=zheng;//發(fā)送單價(jià)的整數(shù)部分
- while(TI==0);
- TI=0;
- SBUF=xiao;//發(fā)送單價(jià)的小數(shù)部分
- while(TI==0);
- TI=0;
- EA=1;//重新開中斷
- }
- //danjia[4]=empt0%10;
- void main()
- {
- TMOD=0x20;//T0計(jì)數(shù),工作方式2,自動(dòng)再裝
- SCON=0x50;//串口通信方式1,波特率由T1的溢出率決定
- //TH0=224;//32個(gè)脈沖為0。01度電
- //TL0=224;
- TH1=0xfd;//波特率9600
- TL1=0xfd;
- PCON=0x00;PS=1;//SMOD=0,波特率不倍增,串口中斷優(yōu)先
- EA=1;ES=1;//開中斷,注意ET1不能開放,否則死機(jī)
- TR1=1;//啟動(dòng)定時(shí)
- while(1)
- {
- //if(ddd==0)
- ad();//adc的轉(zhuǎn)換程序
- jianpan();//鍵盤的處理程序
- zh();//鍵盤的轉(zhuǎn)換程序
- //if(dip==0)
- zhiliang();//重量的顯示程序
- //qingling();
- if((dap!=2)&&(d3!=1))
- danjiaxian();//單價(jià)的顯示程序
- if(dip==1)
- {
- senddanjia();
- delay(2);
- //jia=0;
- //delay(5);
- sendjine();
- }
- qian();//金額的顯示程序
- //if(k==' ')//判斷是否有退出鍵按下
- //{
- //dip=0;//使金額不顯示
- //}
- send();
- leijia();//調(diào)用累加函數(shù)
- if(dap==2)
- {RI=0;
- sendcishu();
- delay(2);
- RI=0;
- faleijia();//發(fā)累加給上位機(jī)
- }
- if(k==' ')//判斷是否有退出鍵按下
- tuichu();
- if(biaozhi==2)
- {
- jine1();
- }
- if(biaozhi==1)
- danjia1();
- if(biaozhi==3)
- tuichu();
- if(biaozhi==5)
- {
- zht();
- biaozhi=0;
- }
- if(biaozhi==4)
- dap=2;//打開累加顯示
- //if(k=='+')
- //{dip=0;
- //leijia();
- //if((jie==jie+(r*sum))
- }
- }
- void int4() interrupt 4//串口中斷函數(shù)
- {
- EA=0;//先關(guān)閉中斷,防止共他中斷干擾
- RI=0;
- TI=0;
-
- comcode=SBUF; //再收控制碼
- if(comcode==2)
- {
- biaozhi=5;}
- if(comcode==4)
- {//RI=0;
- // biaozhi=0;
- //comcode=0;
- biaozhi=4;}
- if(comcode!=4)
- {
- if(comcode!=2)
- {
- //comcode=SBUF; //再收控制碼
- if(comcode!=7)
- {
- while(RI==0);
- RI=0;
- empt1=SBUF; //接收充值的整數(shù)
- while(RI==0);
- RI=0;
- empt0=SBUF;//接收充值的小數(shù)
- }
- if(comcode==1)
- {//RI=0;TI=0;//繼續(xù)接受
- biaozhi=1;
- //comcode=0;
- }
-
- //zhenshu=empt1+(empt0*0.01);//合成整數(shù)
- //dim=1;//存儲(chǔ)標(biāo)志置1,存一次
-
- //if(comcode==3)) //如控制碼為2,為抄重量
- //{
- //sum=data1*0.0196 ;
- //zheng=(uchar)sum;
- //xiao=(uchar)((sum-zheng)*100);
- //chaobiao=1;//抄表標(biāo)志位置1
- // EA=0;//關(guān)中斷
- //SBUF=data1;//發(fā)整數(shù)
- //while(TI==0);
- //TI=0;
- //SBUF=data1;//發(fā)小數(shù)
- // while(TI==0);
- //TI=0;
- //comcode=0;
- //EA=1;//重新開中斷
- // }
- if(comcode==3) //如控制碼為3為寫金額
- {jia=1;
- //bb=bb+1;
- //comcode=0;
- //biaozhi=0;
- //RI=0;TI=0;
- biaozhi=2;
- }
-
- if(comcode==7)
- {
- //RI=0;
- //biaozhi=0;
- //comcode=0;
- biaozhi=3;}}}
-
- EA=1;//重新開中斷
- }
復(fù)制代碼
仿真工程下載:http://www.torrancerestoration.com/bbs/dpj-206869-1.html
|
|