標(biāo)題:
單片機(jī)+ADC0832+電橋+放大與校正電路的電子秤代碼Proteus仿真
[打印本頁(yè)]
作者:
yonghu058
時(shí)間:
2021-5-16 03:57
標(biāo)題:
單片機(jī)+ADC0832+電橋+放大與校正電路的電子秤代碼Proteus仿真
仿真原理圖如下(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用來(lái)顯示總輸入,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() ;//鍵盤(pán)函數(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í)芯片禁用,開(kāi)始工作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位開(kāi)始,要左移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)//沒(méi)超出顯示的范圍且顯示金額
{
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;
}
/******************************************************************************
鍵盤(pán)子程序
*******************************************************************************/
void jianpan()
{ uchar temp;
EX1=0;
P1=0xfe;//判斷7、8、9、。
temp=P1;
temp=temp&0xf0;//判斷有無(wú)按鍵
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)//等待按鍵放開(kāi)
{
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ì)超過(guò)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];//顯示累加的萬(wàn)位
//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)//開(kāi)關(guān)判斷語(yǔ)句,無(wú)論小數(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);//有問(wèn)題
//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ā)過(guò)來(lái)的值變成單價(jià),只要有單價(jià)則就有金額 有問(wèn)題
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ì)超過(guò)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;//重新開(kāi)中斷
}
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;//重新開(kāi)中斷
}
//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;//開(kāi)中斷,注意ET1不能開(kāi)放,否則死機(jī)
TR1=1;//啟動(dòng)定時(shí)
while(1)
{
//if(ddd==0)
ad();//adc的轉(zhuǎn)換程序
jianpan();//鍵盤(pán)的處理程序
zh();//鍵盤(pán)的轉(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;//打開(kāi)累加顯示
//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;//重新開(kāi)中斷
// }
if(comcode==3) //如控制碼為3為寫(xiě)金額
{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;//重新開(kāi)中斷
}
復(fù)制代碼
仿真工程下載:
http://www.torrancerestoration.com/bbs/dpj-206869-1.html
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1