|
電子秤使用說明:
按鍵:
數(shù)字鍵0-9、RTP為去皮鍵,GOOD1-GOOD4鍵為商品1-4鍵,DOLLAR為美元匯率鍵,EURO為歐元匯率鍵,UNITS為單位切換鍵,TOTAL鍵為計價鍵,ALL鍵為求和鍵,MEMO為存儲鍵,SET鍵為設(shè)置鍵,BACK鍵為萬能返回鍵,OPEN鍵為串口通訊開放鍵,CLOSE鍵為串口通信關(guān)閉鍵,SHIFT鍵為切換鍵(用來切換一個按鍵的第二功能,如數(shù)字7鍵,按下shift鍵后,數(shù)字7鍵實現(xiàn)為GOO1鍵的功能)
功能及使用方法:
1,計價:直接按下數(shù)字鍵,可設(shè)置0-100內(nèi)的單價,可精確至小數(shù)點后一位,輸入好單價后,按下TOTAL鍵即可算出價格。
2,快速計價:首先是給商品鍵設(shè)置單價,按下SET鍵,再按下數(shù)字鍵來輸入我們想設(shè)置的單價,再按下SHIFT鍵,再按下數(shù)字鍵7即我們將想要的單價設(shè)置存儲至商品鍵1中,按下BACK鍵和SHIFT鍵返回至初始界面,接下來是快速計價,按下SHIFT鍵,再按下數(shù)字鍵7即顯示出設(shè)置好的商品鍵1的單價,最后按下計價鍵(需要再按下SHIFT鍵,否則顯示為求和功能),完成計價
3,匯率轉(zhuǎn)換:首先是設(shè)置匯率,與之前設(shè)置單價的步驟一致,按下SET鍵,再按下數(shù)字鍵來輸入我們想設(shè)置的匯率(可精確至小數(shù)點后兩位),再按下SHIFT鍵,再按下數(shù)字鍵1即我們將想要的匯率設(shè)置存儲至美元鍵中,接下來是匯率轉(zhuǎn)換,當(dāng)計算完一次價格后,按下SHIFT鍵,再按下數(shù)字鍵1,既可以將價格進(jìn)行所設(shè)置的匯率轉(zhuǎn)換
4,存儲求和:計算完一次價格后,按下SHIFT鍵,再按下小數(shù)點鍵即將此次價格存儲下來,可以存儲多次價格將其求和,最后按下求和鍵(即SHIFT加上計價鍵)可以將存儲的價格求和出來。
5,串口通信:按下OPEN鍵(即SHIFT加數(shù)字鍵5)既可以將計算完的價格傳至從機中在從機中顯示并記錄下來,傳送完畢后按下CLOSE鍵即可關(guān)閉通信,從機可以瀏覽最近三次的傳送價格記錄,從機中的OPEN為打開記錄,CLOSE為關(guān)閉記錄,SWITCH為切換下一條記錄。
電子秤還具有其他的小功能如去皮,單位切換等,由于操作比較直觀所以不做介紹。
設(shè)計還不夠完善,不過應(yīng)付小的課程設(shè)計和要求不是很嚴(yán)格的本科畢業(yè)設(shè)計差不多夠了。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png (12 KB, 下載次數(shù): 62)
下載附件
2018-11-19 16:28 上傳
0.png (14.91 KB, 下載次數(shù): 59)
下載附件
2018-11-19 16:29 上傳
單片機源程序如下:
- #include<reg52.h>
- #include<intrins.h>
- #include <absacc.h>
- #include <math.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define BUSY 0x80
- #define DATAPORT P0
- #define OP_READ 0xa1
- #define OP_WRITE 0xa0
- sbit ADCS =P3^5;
- sbit ADDI =P3^7;
- sbit ADDO =P3^7;
- sbit ADCLK =P3^6;
- sbit beep=P2^7;
- sbit LCM_RS=P2^0;
- sbit LCM_RW=P2^1;
- sbit LCM_EN=P2^2;
- sbit SCL=P2^3;
- sbit SDA=P2^4;
- sbit Kai=P2^5;
- uint h1,n1,w1,g1,j1,j2,j3,j4,j5,j6,temp1,temp2,temp3,temp4=0,temp5,temp6,a3,b3,c3,d3,a4,b4,c4,d4,a7,b7,c7,d7,e7,a8,b8,c8,d8,e8;
- uchar ad_data,k,n,m,e,num,s,shift,sett,h,ncm,a1,b1,c1,d1,a2,b2,c2,d2,x1,y1,z1,mc,na,nb,nc;
-
- char press_data;
- unsigned char press_ge=0;
- unsigned char press_shifen=0;
- unsigned char press_baifen=0;
- unsigned char press_qianfen=0;
- unsigned char press_ge1=0;
- unsigned char press_shifen1=0;
- unsigned char press_baifen1=0;
- unsigned char press_qianfen1=0;
- unsigned char press_wanfen1=0;
- uchar code str0[]={"Weight: . Kg "};
- uchar code str1[]={"error"};
- uchar code str2[]={"Price: "};
- uchar code str3[]={"Total: "};
- uchar code table2[]={0x37,0x38,0x39,0xfd,0x34,0x35,0x36,0x78,0x31,0x32,0x33,0x2d,0x3d,0x30,0x2e,};
- uchar code str4[]={"Weight: . g "};
- uchar code str5[]={"GOOD : "};
- uchar code str6[]={"RATE : "};
- uchar code str7[]={"DOLLAR: "};
- uchar code str8[]={"EURO : "};
- void delay(uint);
- void lcd_wait(void);
- void delay_LCM(uint);
- void initLCM( void);
- void lcd_wait(void);
- void WriteCommandLCM(uchar WCLCM,uchar BusyC);
- void WriteDataLCM(uchar WDLCM);
- void DisplayOneChar(uchar X,uchar Y,uchar DData);
- void DisplayListChar(uchar X,uchar Y,uchar code *DData);
- void display(void);
- uchar Adc0832(unsigned char channel);
- void data_pro(void);
- void data_pro1(void);
- void display1(void);
- void alarm(void);
- void weishu1(uint m);
- void WriteSet(uchar X,uchar Y);
- uchar ReadSet(uchar channel);
- void com(uchar X);
- void intcom(void);
-
- void main(void)
- {
- delay(500);
- initLCM( );
- intcom();
- delay(100);
- WriteCommandLCM(0x01,1);
- DisplayListChar(0,0,str0);
- DisplayListChar(0,1,str2);
- while(1)
- {
- if(ncm!=1)
- {
- ad_data =Adc0832(0);
- h=ad_data;
- alarm();
- data_pro();
- display();
- }
- if(ncm==1)
- {
- ad_data=Adc0832(0)-h;
- alarm();
- data_pro();
- display();
- }
- if(k==1&&(shift%2)==0)
- {
- DisplayOneChar((s+7),1,table2[num-1]);
- if(s+7==8) x1=n;
- if(s+7==9) y1=n;
- if(s+7==11) z1=n;
- if(s+7==12) g1=n;
- mc=10*x1+y1;
- }
- if(num==1&&(shift%2)==1&&(sett%2)==1)
- {
- WriteCommandLCM(0x01,1);
- DisplayListChar(0,1,str5);
- DisplayOneChar(4,1,table2[8]);
- a1=mc;b1=z1;c1=x1;d1=y1;
- DisplayOneChar(8,1,x1+0x30);
- DisplayOneChar(9,1,y1+0x30);
- DisplayOneChar(10,1,0x2e);
- DisplayOneChar(11,1,z1+0x30);
- WriteSet(0x01,mc);
- WriteSet(0x02,x1);
- WriteSet(0x03,y1);
- WriteSet(0x04,z1);
- }
- if(num==1&&(shift%2)==1&&(sett%2)==0&&k!='=')
- {
- WriteCommandLCM(0x01,1);
- DisplayListChar(0,1,str2);
- a1=ReadSet(0x01);
- c1=ReadSet(0x02);
- DisplayOneChar(8,1,c1+0x30);
- d1=ReadSet(0x03);
- DisplayOneChar(9,1,d1+0x30);
- DisplayOneChar(10,1,0x2e);
- b1=ReadSet(0x04);
- DisplayOneChar(11,1,b1+0x30);
- mc=a1;z1=b1;
- }
- if(num==2&&(shift%2)==1&&(sett%2)==1)
- {
- WriteCommandLCM(0x01,1);
- DisplayListChar(0,1,str5);
- DisplayOneChar(4,1,table2[9]);
- a2=mc;b2=z1;c2=x1;d2=y1;
- DisplayOneChar(8,1,x1+0x30);
- DisplayOneChar(9,1,y1+0x30);
- DisplayOneChar(10,1,0x2e);
- DisplayOneChar(11,1,z1+0x30);
- WriteSet(0x05,mc);
- WriteSet(0x06,z1);
- WriteSet(0x07,x1);
- WriteSet(0x08,y1);
- }
- if(num==2&&(shift%2)==1&&(sett%2)==0&&k!='=')
- {
- a2=ReadSet(0x05);
- b2=ReadSet(0x06);
- c2=ReadSet(0x07);
- d2=ReadSet(0x08);
- WriteCommandLCM(0x01,1);
- DisplayListChar(0,1,str2);
- DisplayOneChar(8,1,c2+0x30);
- DisplayOneChar(9,1,d2+0x30);
- DisplayOneChar(10,1,0x2e);
- DisplayOneChar(11,1,b2+0x30);
- mc=a2;z1=b2;
- }
- if(num==3&&(shift%2)==1&&(sett%2)==1)
- {
- WriteCommandLCM(0x01,1);
- DisplayListChar(0,1,str5);
- DisplayOneChar(4,1,table2[10]);
- a3=mc;b3=z1;c3=x1;d3=y1;
- DisplayOneChar(8,1,x1+0x30);
- DisplayOneChar(9,1,y1+0x30);
- DisplayOneChar(10,1,0x2e);
- DisplayOneChar(11,1,z1+0x30);
- WriteSet(0x09,mc);
- WriteSet(0x0a,z1);
- WriteSet(0x0b,x1);
- WriteSet(0x0c,y1);
- }
- if(num==3&&(shift%2)==1&&(sett%2)==0&&k!='=')
- {
- a3=ReadSet(0x09);
- b3=ReadSet(0x0a);
- c3=ReadSet(0x0b);
- d3=ReadSet(0x0c);
- WriteCommandLCM(0x01,1);
- DisplayListChar(0,1,str2);
- DisplayOneChar(8,1,c3+0x30);
- DisplayOneChar(9,1,d3+0x30);
- DisplayOneChar(10,1,0x2e);
- DisplayOneChar(11,1,b3+0x30);
- mc=a3;z1=b3;
- }
- if(num==5&&(shift%2)==1&&(sett%2)==1)
- {
- WriteCommandLCM(0x01,1);
- DisplayListChar(0,1,str5);
- DisplayOneChar(4,1,table2[4]);
- a4=mc;b4=z1;c4=x1;d4=y1;
- DisplayOneChar(8,1,x1+0x30);
- DisplayOneChar(9,1,y1+0x30);
- DisplayOneChar(10,1,0x2e);
- DisplayOneChar(11,1,z1+0x30);
- }
- if(num==5&&(shift%2)==1&&(sett%2)==0&&k!='=')
- {
- WriteCommandLCM(0x01,1);
- DisplayListChar(0,1,str2);
- DisplayOneChar(8,1,c4+0x30);
- DisplayOneChar(9,1,d4+0x30);
- DisplayOneChar(10,1,0x2e);
- DisplayOneChar(11,1,b4+0x30);
- mc=a4;z1=b4;
- }
- if(num==6&&(shift%2)==1)
- {
- ES=1;
- com(na);
- delay(10);
- com(nb);
- delay(10);
- com(nc);
- num=0;
- }
- if(num==7&&(shift%2)==1)
- {
- ES=0;
- }
- if(num==9&&(shift%2)==1&&(sett%2)==1)
- {
- WriteCommandLCM(0x01,1);
- DisplayListChar(0,1,str6);
- a7=mc;b7=z1;c7=x1;d7=y1;e7=g1;
- DisplayOneChar(8,1,c7+0x30);
- DisplayOneChar(9,1,d7+0x30);
- DisplayOneChar(10,1,0x2e);
- DisplayOneChar(11,1,b7+0x30);
- DisplayOneChar(12,1,e7+0x30);
- WriteSet(0x10,mc);
- WriteSet(0x11,z1);
- WriteSet(0x12,x1);
- WriteSet(0x13,y1);
- WriteSet(0x14,g1);
- }
- if(num==9&&(shift%2)==1&&(sett%2)==0)
- {
- b7=ReadSet(0x11);
- c7=ReadSet(0x12);
- d7=ReadSet(0x13);
- e7=ReadSet(0x14);
- j1=w1/100;j2=w1%100;j3=a7*j1*100;j4=b7*10+e7;j5=j1*j4;j6=j2*a7;j3=j3+j5+j6+(j2*j4)/100;;
- WriteCommandLCM(0x01,1);
- DisplayListChar(0,1,str7);
- weishu1(j3);
- j1=0;j2=0;j3=0;j4=0;j5=0;j6=0; num=0;
- }
- if(num==10&&(shift%2)==1&&(sett%2)==1)
- {
- WriteCommandLCM(0x01,1);
- DisplayListChar(0,1,str6);
- a8=w1;b8=z1;c8=x1;d8=y1;e8=g1;
- DisplayOneChar(8,1,c8+0x30);
- DisplayOneChar(9,1,d8+0x30);
- DisplayOneChar(10,1,0x2e);
- DisplayOneChar(11,1,b8+0x30);
- DisplayOneChar(12,1,e8+0x30);
- }
- if(num==10&&(shift%2)==1&&(sett%2)==0)
- {
- j1=w1/100;j2=w1%100;j3=a8*j1*100;j4=b8*10+e8;j5=j1*j4;j6=j2*a8;j3=j3+j5+j6+(j2*j4)/100;
- WriteCommandLCM(0x01,1);
- DisplayListChar(0,1,str8);
- weishu1(j3);
- j1=0;j2=0;j3=0;j4=0;j5=0;j6=0; num=0;
- }
- if(k=='='&&(shift%2)==0)
- {
- w1=mc;
- n1=w1*temp5;
- w1=w1*temp2;
- h1=(z1*temp1)/10;
- h1=(n1+h1)/10;
- w1=w1+h1;
- WriteCommandLCM(0x01,1);
- DisplayListChar(0,1,str3);
- s=0;
- weishu1(w1);
- k=0;
- na=w1/1000;
- nb=(w1-na*1000)/10;
- nc=(w1-na*1000-nb*10);
- }
- if(k==' ')
- {
- WriteCommandLCM(0x80+0x40,1);
- WriteCommandLCM(0x01,1);
- DisplayListChar(0,0,str0);
- DisplayListChar(0,1,str2);
- w1=0;
- s=0;
- n1=0;
- h1=0;
- z1=0;
- x1=0;
- y1=0;
- g1=0;
- mc=0;
- sett=0;
- num=0;
- ncm=0; //防止清零時指針后移動
- }
- if(num==15&&(shift%2)==1)
- {
- temp6=w1;
- temp4=temp4+temp6;
- k=0;
- num=0;
- }
- if(k=='='&&(shift%2)==1)
- {
- DisplayListChar(0,1,str3);
- weishu1(temp4);
- delay(2000);
- temp4=0;
- k=0;
- }
- while(num==14&&(shift%2)==1)
- {
- _nop_(); //空指令
- _nop_(); //空指令
- _nop_(); //空指令
- _nop_(); //空指令
- _nop_(); //空指令
- _nop_(); //空指令
- }
- if(num==11&&(shift%2)==1)
- {
- data_pro1();
- display1();
- delay(3000);
- k=0;
- s=0;
- num=0;
- }
- }
- }
-
- void com(uchar c)
- {
- SBUF=c;
- TI=0;
- }
- void delay(uint k)
- {
- uint i,j;
- for(i=0;i<k;i++)
- for(j=0;j<100;j++);
- }
- /***********寫指令至lcm*************/
- void WriteCommandLCM(uchar WCLCM,uchar BusyC)
- {
- if(BusyC) //判別busyC是否非零
- lcd_wait(); //非零執(zhí)行檢測忙信號
- DATAPORT=WCLCM; //將WCLCM的值賦予P0口
- LCM_RS=0; //選擇指令寄存器
- LCM_RW=0; //選擇寫模式
- LCM_EN=1; //EN高電平,讀取信息
- _nop_(); //空指令
- _nop_(); //空指令
- _nop_(); //空指令
- _nop_(); //空指令
- _nop_(); //空指令
- _nop_(); //空指令
- _nop_(); //空指令
- LCM_EN=0; //EN負(fù)跳變,執(zhí)行指令
-
- }
- /***********寫數(shù)據(jù)至lcm*************/
- void WriteDataLCM(uchar WDLCM)
- {
- lcd_wait( ); //檢測忙信號
- DATAPORT=WDLCM; //將WDLCM的值賦予P0口
- LCM_RS=1; //選擇數(shù)據(jù)寄存器
- LCM_RW=0; //選擇寫模式
- LCM_EN=1; //EN高電平,讀取信息
- _nop_(); //空指令
- _nop_(); //空指令
- _nop_(); //空指令
- _nop_(); //空指令
- _nop_(); //空指令
- _nop_(); //空指令
- _nop_(); //空指令
- _nop_(); //空指令
- LCM_EN=0; //EN負(fù)跳變,執(zhí)行指令
- }
- /***********lcm內(nèi)部等待函數(shù)*************/
- void lcd_wait(void)
- {
- DATAPORT=0xff; //令P0口等于0ffh
- LCM_EN=1; //EN高電平,讀取信息
- LCM_RS=0;
- LCM_RW=1; //rs=0,rw=1,讀忙標(biāo)志和地址
- _nop_(); //空指令
- _nop_(); //空指令
- _nop_(); //空指令
- _nop_(); //空指令
- _nop_(); //空指令
- _nop_(); //空指令
- _nop_(); //空指令
- while(DATAPORT&BUSY) //若讀忙標(biāo)志位為1,則執(zhí)行while循環(huán)
- { LCM_EN=0; //EN低電平,執(zhí)行指令,標(biāo)志位可變
- _nop_(); //空指令
- _nop_(); //空指令
- _nop_(); //空指令
- _nop_(); //空指令
- _nop_(); //空指令
- _nop_(); //空指令
- _nop_(); //空指令
- _nop_(); //空指令
- LCM_EN=1; //EN高電平,讀取信息
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- }
- LCM_EN=0; //EN低電平,執(zhí)行指令
- }
- /**********LCM初始化子函數(shù)***********/
- void initLCM( )
- {
- LCM_EN=0;
- DATAPORT=0;
- delay(15);
- WriteCommandLCM(0x38,0); //8bit數(shù)據(jù)傳送,2行顯示,5*7字型,不檢測忙信號
- delay(5); //延時5ms
- WriteCommandLCM(0x38,0); //8bit數(shù)據(jù)傳送,2行顯示,5*7字型,不檢測忙信號
- delay(5); //延時5ms
- WriteCommandLCM(0x38,0); //8bit數(shù)據(jù)傳送,2行顯示,5*7字型,不檢測忙信號
- delay(5); //延時5ms
- WriteCommandLCM(0x38,1); //8bit數(shù)據(jù)傳送,2行顯示,5*7字型,檢測忙信號
- WriteCommandLCM(0x08,1); //關(guān)閉顯示,檢測忙信號
- WriteCommandLCM(0x01,1); //清屏,檢測忙信號
- WriteCommandLCM(0x06,1); //顯示光標(biāo)右移設(shè)置,檢測忙信號
- WriteCommandLCM(0x0c,1); //顯示屏打開,光標(biāo)不顯示,不閃爍,檢測忙信號
- EA=1;
- TMOD=0x21; //定時器0和定時器1為操作模
- ET0=1;
- TR0=1;
- x1=0;
- y1=0;
- z1=0;
- }
- void intcom()
- {
- SCON=0x50;
- PCON = 0x00;
- SCON = 0x40;
- TH1 = 0xFd;
- TL1 = 0xFd;
- TR1 = 1;
- ES=1;
- }
- /****顯示指定坐標(biāo)的一個字符子函數(shù)****/
- void DisplayOneChar(uchar X,uchar Y,uchar DData)
-
- {
- Y&=0x01; //y與01位與,即保留最后一位,其余置零
- X&=0x0f; //x與0f位與,即保留低四位,其余置零
- if(Y) //判斷y是否為1
- X|=0x40; //若y為1(顯示第二行),地址碼+0X40
- X|=0x80; //指令碼為地址碼+0X80
- WriteCommandLCM(X,1); //若y為1,則顯示第二行;若y為0,則顯示第一行。
- WriteDataLCM(DData); //寫數(shù)據(jù)至第一行或第二行中
- }
- /*******顯示指定坐標(biāo)的一串字符子函數(shù)*****/
-
- void DisplayListChar(uchar X,uchar Y,uchar code *DData)
- {
- uchar ListLength=0; //定義ListLength等于0
- Y&=0x01; //令y與01h位與
- X&=0x0f; //令x與0fh位與
- while(X<16) //若x(列數(shù))小于16,執(zhí)行while循環(huán)
- {
- DisplayOneChar(X,Y,DData[ListLength]); //顯示指定坐標(biāo)的一個字符
- ListLength++; //ListLength加1
- X++; //x(列數(shù)加1)
- }
- }
- /*******顯示程序1子函數(shù)*****/
- void display(void)
- {
- WriteCommandLCM(0x0c,1); //顯示屏打開,光標(biāo)不顯示,不閃爍,檢測忙信號
- if(temp1<=5000) //若temp1(重量)小于5000g時,執(zhí)行if程序
- {
- DisplayListChar(0,0,str0); //顯示字符串str0
- DisplayOneChar(8,0,press_ge+0x30); //在第1行第9列顯示press_ge的數(shù)值
- DisplayOneChar(10,0,press_shifen+0x30); //在第1行第11列顯示press_shifen的數(shù)值
- DisplayOneChar(11,0,press_baifen+0x30); //在第1行第12列顯示press_baifen的數(shù)值
- DisplayOneChar(12,0,press_qianfen+0x30); //在第1行第13列顯示press_qianfen的數(shù)值
- delay(1000);
- }
- if(temp1>5000)
- DisplayListChar(0,0,str1);
- if(shift%2==1)
- DisplayOneChar(15,0,0x73);
- delay(1000);
- }
- /*******顯示程序2子函數(shù)*****/
- void display1(void)
- {
- WriteCommandLCM(0x0c,1); //顯示屏打開,光標(biāo)不顯示,不閃爍,檢測忙信號
- DisplayListChar(0,0,str4); //顯示字符串str4
- DisplayOneChar(7,0,press_ge1+0x30); //在第1行第8列顯示press_ge1的數(shù)值
- DisplayOneChar(8,0,press_shifen1+0x30); //在第1行第9列顯示press_shifen1的數(shù)值
- DisplayOneChar(9,0,press_baifen1+0x30); //在第1行第10列顯示press_baifen1的數(shù)值
- DisplayOneChar(10,0,press_qianfen1+0x30); //在第1行第11列顯示press_qianfen1的數(shù)值
- DisplayOneChar(12,0,press_wanfen1+0x30); //在第1行第13列顯示press_wanfen1的數(shù)值
- delay(1000); //延時1s
- }
- /*******讀取adc0832函數(shù),采集并返回*****/
- uchar Adc0832(unsigned char channel)
- {
- uchar i=0; //定義i=0
- uchar j; //定義j
- uint dat=0; //定義整數(shù)dat=0
- uchar ndat=0; //定義ndat=0
- if(channel==0)channel=2; //如果channel=0,則channel=2
- if(channel==1)channel=3; //如果channel=1,則channel=3
- ADDI=1; //設(shè)置DI端為高電平
- _nop_();
- _nop_();
- ADCS=0; //使能端為低電平,使能端起效
- _nop_();
- _nop_();
- ADCLK=1; //第一個時鐘脈沖上升
- _nop_();
- _nop_();
- ADCLK=0; //第一個時鐘脈沖下降
- _nop_();
- _nop_();
- ADDI=0; //DI輸出第一個數(shù)字為0
- ADCLK=1; //第二個時鐘脈沖上升
- _nop_();
- _nop_();
- ADCLK=0; //第二個時鐘脈沖下降
- _nop_();
- _nop_();
- ADDI=0; //DI輸出第二個數(shù)字為0,即為以CH0為正,CH1為負(fù)的差分輸入
- ADCLK=1; //第三個時鐘脈沖上升
- _nop_();
- _nop_();
- ADCLK=0; //第三個時鐘脈沖下降
- ADDI=1;
- _nop_();
- _nop_();
- dat=0;
- for(i=0;i<8;i++) //for循環(huán)八次,DI以D7至D0的順序向dat賦值
- {
- dat|=ADDO; //dat與D0輸出的值進(jìn)行位或,即向dat輸值
- ADCLK=1;
- _nop_();
- _nop_();
- ADCLK=0; //時鐘脈沖下降
- _nop_();
- _nop_();
- dat<<=1;
- if(i==7)dat|=ADDO;
- }
- for(i=0;i<8;i++) //for循環(huán)八次,DI以D0至D7的順序向ndat賦值
- {
- j=0; //令j=0
- j=j|ADDO; //j與D0輸出的值進(jìn)行位或,即向j輸值
- ADCLK=1; //時鐘脈沖上升
- _nop_();
- _nop_();
- ADCLK=0; //時鐘脈沖下降
- _nop_();
- _nop_();
- j=j<<7; //將j的值左移7位
- ndat=ndat|j; //將ndat與j的值位或并將結(jié)果賦予nadt中,即將j值輸出到ndat上
- if(i<7)ndat>>=1; //此步驟和以上步驟實則將ndat的值變成以D7至D0的順序
- }
- ADCS=1; //CS端失效
- ADCLK=0;
- ADDO=1;
- if(dat==ndat) //DO端高電平
- return(dat);
- }
- void data_pro(void)
- {
- unsigned int;
- float press;
- if(0<ad_data<256)
- {
- int vary=ad_data;
- press=(0.021111*vary);
- temp1=(int)(press*1000);
- temp2=(int)(press*100);
- temp5=temp1-10*temp2;
- press_ge=temp1/1000;
- press_shifen=(temp1%1000)/100;
- press_baifen=((temp1%1000)%100)/10;
- press_qianfen=((temp1%1000)%100)%10;
- }
- }
- void data_pro1(void)
- {
- unsigned int;
- float press1;
- if(0<ad_data<256)
- {
- int vary=ad_data;
- press1=(0.021111*vary);
- temp3=(int)(press1*10000);
- press_ge1=temp3/10000;
- press_shifen1=(temp3%10000)/1000;
- press_baifen1=((temp3%10000)%1000)/100;
- press_qianfen1=(((temp3%10000)%1000)%100)/10;
- press_wanfen1=(((temp3%10000)%1000)%100)%10;
- }
- }
- void alarm(void)
- {
- if(temp1>=5000)
- beep=0;
-
- else
- { beep=1;
- DisplayListChar(0,0,str1);
- }
- }
- void weishu1(uint m)
- {
- uchar wei4,wei3,wei2,wei1,wei0;
- wei4=m/10000;
- wei3=(m%10000)/1000;
- wei2=((m%10000)%1000)/100;
- wei1=(((m%10000)%1000)%100)/10;
- wei0=(((m%10000)%1000)%100)%10;
- DisplayOneChar(8,1,0x30+wei4);
- DisplayOneChar(9,1,0x30+wei3);
- DisplayOneChar(10,1,0x30+wei2);
- DisplayOneChar(11,1,'.');
- DisplayOneChar(12,1,0x30+wei1);
- //DisplayOneChar(10,1,'.');
- DisplayOneChar(13,1,0x30+wei0);
- }
- void temer1() interrupt 1
- { uchar temp;
- EX1=0;
- P1=0xfe;
- temp=P1;
- temp=temp&0xf0;
- if(temp!=0xf0)
- {
- delay(5);
- temp=P1;
- temp=temp&0xf0;
- while(temp!=0xf0)
- {
- temp=P1;
- switch(temp)
- {
- case 0xee:num=1;n=7;k=1;if(shift%2==0) s++;break;
- case 0xde:num=2;n=8;k=1;if(shift%2==0)s++;break;
- case 0xbe:num=3;n=9;k=1;if(shift%2==0)s++;break;
- case 0x7e:num=4;k='/';shift++;break;
- }
- while(temp!=0xf0)
- {
- temp=P1;
- temp=temp&0xf0;
- }
- //DisplayOneChar((s+6),1,table2[num-1]);
- }
- }
- 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:num=5;n=4;k=1;if(shift%2==0)s++;break;
- case 0xdd:num=6;n=5;k=1;if(shift%2==0)s++;break;
- case 0xbd:num=7;n=6;k=1;if(shift%2==0)s++;break;
- case 0x7d:k='*';ncm=1;break;
- }
- while(temp!=0xf0)
- {
- temp=P1;
- temp=temp&0xf0;
- }
- //DisplayOneChar(k+6,1,table2[num-1]);
- }
- }
- 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:num=9;n=1;k=1;if(shift%2==0)s++;break;
- case 0xdb:num=10;n=2;k=1;if(shift%2==0)s++;break;
- case 0xbb:num=11;n=3;k=1;if(shift%2==0)s++;break;
- case 0x7b:k='-';sett++;break;
- }
- while(temp!=0xf0)
- {
- temp=P1;
- temp=temp&0xf0;
- }
- // DisplayOneChar(k+6,1,table2[num-1]);
- }
- }
- 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:num=13;k=' ';break;
- case 0xd7:num=14;n=0;k=1;if(shift%2==0)s++;;break;
- case 0xb7:num=16;k='=';break;
- case 0x77:num=15;k=1;s++;break;
- }
- while(temp!=0xf0)
- {
- temp=P1;
- temp=temp&0xf0;
- }
- }
-
- }
- EX1=1;
- }
- void com()interrupt 4
- {
- RI=0;
- }
- void start() //開始數(shù)據(jù)傳送,開始位
- {
- SDA=1; //SDA初始化為高電平“1”
- SCL=1; //開始數(shù)據(jù)傳送時,要求SCL為高電平“1”
- _nop_();
- _nop_(); //空操作兩個機器周期
- SDA=0; //SDA的下降沿被認(rèn)為是開始信號
- _nop_();
- _nop_();
- _nop_();
- _nop_(); //空操作四個機器周期
- SCL=0; //SCL為低電平時,SDA上數(shù)據(jù)才允許變化(即允許以后的數(shù)據(jù)傳遞)
- }
- void stop() //結(jié)束數(shù)據(jù)傳遞
- {
- SDA=0; //SDA初始化為低電平“0”
- _nop_();
- _nop_(); //空操作兩個機器周期
- SCL=1; //結(jié)束數(shù)據(jù)傳送時,要求SCL為高電平“1”
- _nop_();
- _nop_();
- _nop_();
- _nop_(); //空操作四個機器周期
- SDA=1; //SDA的上升沿被認(rèn)為是結(jié)束信號
- }
- unsigned char ReadData() //從AT24Cxx讀取數(shù)據(jù),出口參數(shù)x,從AT24Cxx移入數(shù)據(jù)到MCU
- {
- unsigned char i;
- unsigned char x; //存儲從AT24Cxx中讀出的數(shù)據(jù)
- for(i=0;i<8;i++)
- {
- SCL=1; //SCL置為高電平
- x<<=1; //將x中的各二進(jìn)位向左移一位
- x|=(unsigned char)SDA; //將SDA上的數(shù)據(jù)通過按位“或”運算存入x中
- SCL=0; //在SCL的下降沿讀出數(shù)據(jù)
- }
- return(x); //將讀取的數(shù)據(jù)返還
- }
- bit WriteCurrent(unsigned char y) //向AT23Cxx的當(dāng)前地址寫入數(shù)據(jù),入口參數(shù)y(存儲待寫入的數(shù)據(jù)),在調(diào)用此數(shù)據(jù)寫入函數(shù)前需首先調(diào)用開始start(),所以SCL=0
- {
- unsigned char i, ack_bit; //存儲應(yīng)答位
- for(i=0;i<8;i++) //循環(huán)移入8個位
- {
- SDA=(bit)(y&0x80); //通過按位“與”運算將最高位數(shù)據(jù)送到S,因為傳送時高位在前,低位在后
- _nop_(); //空操作一個機器周期
- SCL=1; //在SCL的上升沿將數(shù)據(jù)寫入AT24Cxx
- _nop_();
- _nop_(); //空操作兩個機器周期
- SCL=0; //將SCL重新置為低電平,以在SCL線形成傳送數(shù)據(jù)所需的8個脈沖
- y<<=1; //將y中的各二進(jìn)位向左移一位
- }
- SDA=1; //發(fā)送設(shè)備(主機)應(yīng)在時鐘脈沖的高電平期間(SCL=1)釋放SDA線,以讓SDA線轉(zhuǎn)由接收設(shè)備(AT24Cxx)控制
- _nop_();
- _nop_(); //空操作兩個機器周期
- SCL=1; //根據(jù)上述規(guī)定,SCL應(yīng)為高電平
- _nop_();
- _nop_();
- _nop_();
- _nop_();; //空操作四個機器周期
- ack_bit=SDA; //接收設(shè)備(AT24Cxx)向SDA送低電平,表示已經(jīng)接收到一個字節(jié),若送高電平,表示沒有收到,傳送異常
- SCL=0; //SCL為低電平時,SDA上數(shù)據(jù)才允許變化(即允許以后的數(shù)據(jù)傳遞)
- return ack_bit; //返回AT24Cxx答應(yīng)位
- }
- void WriteSet(unsigned char add,unsigned char dat) //向AT24Cxx中的指定地址寫入數(shù)據(jù),存儲地址add,存儲待寫入數(shù)據(jù)dat
- //在指定地址add處寫入數(shù)據(jù)WriteCurrent
- {
- start(); //開始數(shù)據(jù)傳遞
- WriteCurrent(OP_WRITE); //選擇要操作的AT24Cxx芯片,并告知要對其寫入數(shù)據(jù)
- WriteCurrent(add); //寫入指定地址
- WriteCurrent(dat); //向當(dāng)前地址(上面指定的地址)寫入數(shù)據(jù)
- stop(); //停止數(shù)據(jù)傳遞
- delay(4); //一字節(jié)的寫入周期為1ms,最好延時1ms以上
- }
- unsigned char ReadCurrent() //從AT24Cxx中的當(dāng)前地址讀取數(shù)據(jù),出口參數(shù)x
- {
- unsigned char x;
- start(); //開始數(shù)據(jù)傳遞
- WriteCurrent(OP_READ); //選擇要操作的AT24Cxx芯片,并告知要讀取其數(shù)據(jù)
- x=ReadData(); //將讀取的數(shù)據(jù)存入x
- stop(); //停止數(shù)據(jù)傳遞
- return x; //返回讀取的數(shù)據(jù)
- }
- unsigned char ReadSet(unsigned char set_add) //從AT24Cxx中的指定地址讀取數(shù)據(jù),入口set_add,出口x
- //在指定地址讀取
- {
- start(); //開始數(shù)據(jù)傳遞
- WriteCurrent(OP_WRITE); //選擇要操作的AT24Cxx芯片,并告知要對其寫入數(shù)據(jù)
- WriteCurrent(set_add); //寫入指定地址
- return(ReadCurrent()); //從指定地址讀出數(shù)據(jù)并返回
- }
復(fù)制代碼
所有資料51hei提供下載:
電子秤仿真設(shè)計.rar
(134.55 KB, 下載次數(shù): 207)
2018-11-19 11:23 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|
評分
-
查看全部評分
|