#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; //采樣值存儲 uinttemp1; sbit beep=P3^0; charpress_data; //標度變換存儲單元 float press; unsignedchar ad_alarm,temp; //報警值存儲單元 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}; //商品初始單價 ucharprice_danjia[5]={48,46,48,48,48}; floatprice; uintprice_temp1,price_temp2; //商品總價 ucharAdc0832(unsigned char channel); voidalarm(void); voiddata_pro(void); voiddelay(uint k); voidkeyscan(); voiddisp_init(); void price_jisuan(); /************ 主函數 ************/ voidmain(void) { delay(500); //系統延時500ms啟動 //ad_data=0; //采樣值存儲單元初始化為0 lcd_init(); //顯示初始化 disp_init(); //開始進入歡迎界面 delay(1000); //延時進入稱量畫面 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,"實用電子秤"); while(1) { ad_data =Adc0832(0); //采樣值存儲單元初始化為0 alarm(); data_pro(); //讀取重量 keyscan(); //查詢商品種類 write_lcd(40,0,"------------------------------"); write_lcd(56,0,"單 價:"); 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,"總 價:"); price_jisuan(); //計算出價格 write_lcd(88,10,price_all); write_lcd(88,20,"元"); write_lcd(112,0,"設計學生:0712201-23王 超"); } } /************ 讀ADC0832函數 ************/ //采集并返回 ucharAdc0832(unsigned char channel) //AD轉換,返回結果 { 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;//控制命令結束 _nop_(); _nop_(); dat=0; for(i=0;i<8;i++) { dat|=ADDO;//收數據 ADCLK=1; _nop_(); _nop_(); ADCLK=0;//形成一次時鐘脈沖 _nop_(); _nop_(); dat<<=1; if(i==7)dat|=ADDO; } for(i=0;i<8;i++) { j=0; j=j|ADDO;//收數據 ADCLK=1; _nop_(); _nop_(); ADCLK=0;//形成一次時鐘脈沖 _nop_(); _nop_(); j=j<<7; ndat=ndat|j; if(i<7)ndat>>=1; } ADCS=1;//拉搞CS端 ADCLK=0;//拉低CLK端 ADDO=1;//拉高數據端,回到初始狀態 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倍,便于后面的計算 abc[0]=temp1/1000+48; //取壓力值百位 abc[1]=46; abc[2]=(temp1%1000)/100+48; //取壓力值十位 abc[3]=((temp1%1000)%100)/10+48; //取壓力值個位 abc[4]=((temp1%1000)%100)%10+48; //取壓力值十分位 } } /*****************報警子函數*******************/ voidalarm(void) { if(ad_data>=256) beep=0; //則啟動報警 else beep=1; } voiddelay(uint k) { uint i,j; for(i=0;i<k;i++) for(j=0;j<100;j++); } //開機歡迎界面 voiddisp_init() { write_lcd(0,8,"歡迎使用電子秤"); write_lcd(16,0,"------------------------------"); write_lcd(28,0,"設計學生:王 超"); write_lcd(44,0,"------------------------------"); write_lcd(56,0,"班級學號:0712201-23"); write_lcd(72,0,"------------------------------"); write_lcd(84,0,"指導老師:譚 躍"); write_lcd(100,0,"------------------------------"); write_lcd(112,0,"設計日期:2010年6月29日"); } //鍵盤服務程序 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,"名 稱: 蘋 果"); 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; //取單價個位 price_danjia[1]=46; price_danjia[2]=(price_temp1%1000)/100+48; //取單價十分位 price_danjia[3]=((price_temp1%1000)%100)/10+48; //取單價百分位 price_danjia[4]=((price_temp1%1000)%100)%10+48; //取單價千分位 } 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; }
|