#include<reg51.h> #include<intrins.h> #include<absacc.h> #include<math.h> #include<lm4229.h> #defineuchar unsigned char #defineuint unsigned int sbit ADCS=P3^5; sbit ADDI=P3^7; sbit ADDO=P3^7; sbitADCLK =P3^6; uintx1,y1,z1=0,w1; ucharad_data,k,n,m,e,num,s; //采樣值存儲(chǔ) uinttemp1; sbit beep=P3^0; charpress_data; //標(biāo)度變換存儲(chǔ)單元 float press; unsignedchar ad_alarm,temp; //報(bào)警值存儲(chǔ)單元 unsignedchar abc[5]={48,46,48,48,48}; unsignedchar price_all[6]={48,48,46,48,48,48}; floatprice_unit[10]={5.5,2.8,3.6,4.5,2.4,4.2,3.8,6.0,1.5,0}; //商品初始單價(jià) ucharprice_danjia[5]={48,46,48,48,48}; floatprice; uintprice_temp1,price_temp2; //商品總價(jià) ucharAdc0832(unsigned char channel); voidalarm(void); voiddata_pro(void); voiddelay(uint k); voidkeyscan(); voiddisp_init(); void price_jisuan(); /************ 主函數(shù) ************/ voidmain(void) { delay(500); //系統(tǒng)延時(shí)500ms啟動(dòng) //ad_data=0; //采樣值存儲(chǔ)單元初始化為0 lcd_init(); //顯示初始化 disp_init(); //開(kāi)始進(jìn)入歡迎界面 delay(1000); //延時(shí)進(jìn)入稱量畫(huà)面 clear_lcd(0,4,40); clear_lcd(16,0,100); clear_lcd(28,0,40); clear_lcd(44,0,100); clear_lcd(56,0,40); clear_lcd(72,0,100); clear_lcd(84,0,40); clear_lcd(100,0,100); clear_lcd(112,0,40); write_lcd(0,8,"實(shí)用電子秤"); while(1) { ad_data =Adc0832(0); //采樣值存儲(chǔ)單元初始化為0 alarm(); data_pro(); //讀取重量 keyscan(); //查詢商品種類 write_lcd(40,0,"------------------------------"); write_lcd(56,0,"單 價(jià):"); write_lcd(56,11,price_danjia); write_lcd(56,20,"元/千克"); write_lcd(72,0,"總重量:"); write_lcd(72,11,abc); write_lcd(72,20,"千克"); write_lcd(88,0,"總 價(jià):"); price_jisuan(); //計(jì)算出價(jià)格 write_lcd(88,10,price_all); write_lcd(88,20,"元"); write_lcd(112,0,"設(shè)計(jì)學(xué)生:0712201-23王 超"); } } /************ 讀ADC0832函數(shù) ************/ //采集并返回 ucharAdc0832(unsigned char channel) //AD轉(zhuǎn)換,返回結(jié)果 { uchar i=0; uchar j; uint dat=0; uchar ndat=0; if(channel==0)channel=2; if(channel==1)channel=3; ADDI=1; _nop_(); _nop_(); ADCS=0;//拉低CS端 _nop_(); _nop_(); ADCLK=1;//拉高CLK端 _nop_(); _nop_(); ADCLK=0;//拉低CLK端,形成下降沿1 _nop_(); _nop_(); ADCLK=1;//拉高CLK端 ADDI=channel&0x1; _nop_(); _nop_(); ADCLK=0;//拉低CLK端,形成下降沿2 _nop_(); _nop_(); ADCLK=1;//拉高CLK端 ADDI=(channel>>1)&0x1; _nop_(); _nop_(); ADCLK=0;//拉低CLK端,形成下降沿3 ADDI=1;//控制命令結(jié)束 _nop_(); _nop_(); dat=0; for(i=0;i<8;i++) { dat|=ADDO;//收數(shù)據(jù) ADCLK=1; _nop_(); _nop_(); ADCLK=0;//形成一次時(shí)鐘脈沖 _nop_(); _nop_(); dat<<=1; if(i==7)dat|=ADDO; } for(i=0;i<8;i++) { j=0; j=j|ADDO;//收數(shù)據(jù) ADCLK=1; _nop_(); _nop_(); ADCLK=0;//形成一次時(shí)鐘脈沖 _nop_(); _nop_(); j=j<<7; ndat=ndat|j; if(i<7)ndat>>=1; } ADCS=1;//拉搞CS端 ADCLK=0;//拉低CLK端 ADDO=1;//拉高數(shù)據(jù)端,回到初始狀態(tài) dat<<=8; dat|=ndat; return(dat); //return ad k } voiddata_pro(void) { unsigned int; if(0<ad_data<256) { int vary=ad_data; press=(0.019531*vary); temp1=(int)(press*1000); //放大1000倍,便于后面的計(jì)算 abc[0]=temp1/1000+48; //取壓力值百位 abc[1]=46; abc[2]=(temp1%1000)/100+48; //取壓力值十位 abc[3]=((temp1%1000)%100)/10+48; //取壓力值個(gè)位 abc[4]=((temp1%1000)%100)%10+48; //取壓力值十分位 } } /*****************報(bào)警子函數(shù)*******************/ voidalarm(void) { if(ad_data>=256) beep=0; //則啟動(dòng)報(bào)警 else beep=1; } voiddelay(uint k) { uint i,j; for(i=0;i<k;i++) for(j=0;j<100;j++); } //開(kāi)機(jī)歡迎界面 voiddisp_init() { write_lcd(0,8,"歡迎使用電子秤"); write_lcd(16,0,"------------------------------"); write_lcd(28,0,"設(shè)計(jì)學(xué)生:王 超"); write_lcd(44,0,"------------------------------"); write_lcd(56,0,"班級(jí)學(xué)號(hào):0712201-23"); write_lcd(72,0,"------------------------------"); write_lcd(84,0,"指導(dǎo)老師:譚 躍"); write_lcd(100,0,"------------------------------"); write_lcd(112,0,"設(shè)計(jì)日期:2010年6月29日"); } //鍵盤(pán)服務(wù)程序 voidkeyscan() { P1=0xfe; temp=P1; temp=temp&0xf0; while(temp!=0xf0) { delay(5); temp=P1; temp=temp&0xf0; while(temp!=0xf0) { temp=P1; switch(temp) { case0xee:num=1,price=price_unit[0], write_lcd(24,0,"名 稱: 杏 仁"); break; case0xde:num=2,price=price_unit[1],write_lcd(24,0,"名 稱: 李 子"); break; case0xbe:num=3,price=price_unit[2],write_lcd(24,0,"名 稱: 草 莓"); break; case0x7e:num=4,price=price_unit[3],write_lcd(24,0,"名 稱: 葡 萄"); break; } while(temp!=0xf0) { temp=P1; temp=temp&0xf0; } } } P1=0xfd; temp=P1; temp=temp&0xf0; while(temp!=0xf0) { delay(5); temp=P1; temp=temp&0xf0; while(temp!=0xf0) { temp=P1; switch(temp) { case0xed:num=5,price=price_unit[4],write_lcd(24,0,"名 稱: 西 瓜"); break; case 0xdd:num=6,price=price_unit[5],write_lcd(24,0,"名 稱: 蘋(píng) 果"); break; case0xbd:num=7,price=price_unit[6],write_lcd(24,0,"名 稱: 雪 梨"); break; case0x7d:num=8,price=price_unit[7],write_lcd(24,0,"名 稱: 核 桃"); break; } while(temp!=0xf0) { temp=P1; temp=temp&0xf0; } } } P1=0xfb; temp=P1; temp=temp&0xf0; while(temp!=0xf0) { delay(5); temp=P1; temp=temp&0xf0; while(temp!=0xf0) { temp=P1; switch(temp) { case0xeb:num=9,price=price_unit[8],write_lcd(24,0,"名 稱: 香 蕉"); break; case0xdb:num=10,price=price_unit[9],write_lcd(24,0,"名 稱: 商品代碼"); break; case0xbb:num=11,price=price_unit[1]; break; case0x7b:num=12,price=price_unit[2]; break; } while(temp!=0xf0) { temp=P1; temp=temp&0xf0; } } } P1=0xf7; temp=P1; temp=temp&0xf0; while(temp!=0xf0) { delay(5); temp=P1; temp=temp&0xf0; while(temp!=0xf0) { temp=P1; switch(temp) { case0xe7:num=13,price=price_unit[3]; break; case0xd7:num=14,price=price_unit[4]; break; case0xb7:num=15,price=price_unit[5]; break; case0x77:num=16,price=price_unit[6]; break; } while(temp!=0xf0) { temp=P1; temp=temp&0xf0; } } } price_temp1=(int)(price*1000); price_danjia[0]=price_temp1/1000+48; //取單價(jià)個(gè)位 price_danjia[1]=46; price_danjia[2]=(price_temp1%1000)/100+48; //取單價(jià)十分位 price_danjia[3]=((price_temp1%1000)%100)/10+48; //取單價(jià)百分位 price_danjia[4]=((price_temp1%1000)%100)%10+48; //取單價(jià)千分位 } void price_jisuan() { price_temp2=(int)(price*press*1000); price_all[0]=price_temp2/10000+48; price_all[1]=(price_temp2/1000)%10+48; price_all[2]=46; price_all[3]=(price_temp2%1000)/100+48; price_all[4]=((price_temp2%1000)%100)/10+48; price_all[5]=((price_temp2%1000)%100)%10+48; }
|