#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; }
|