12电子秤程序.docx

上传人:b****7 文档编号:10439141 上传时间:2023-02-11 格式:DOCX 页数:23 大小:17.94KB
下载 相关 举报
12电子秤程序.docx_第1页
第1页 / 共23页
12电子秤程序.docx_第2页
第2页 / 共23页
12电子秤程序.docx_第3页
第3页 / 共23页
12电子秤程序.docx_第4页
第4页 / 共23页
12电子秤程序.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

12电子秤程序.docx

《12电子秤程序.docx》由会员分享,可在线阅读,更多相关《12电子秤程序.docx(23页珍藏版)》请在冰豆网上搜索。

12电子秤程序.docx

12电子秤程序

程序

/********************头文件***********************/

#include

#include

#include

#include

#defineucharunsignedchar

#defineuintunsignedint

#definedelayNOP();{_nop_();_nop_();_nop_();_nop_();};

#defineAD_dataP1//AD数据口

#defineLCD_dataP0//液晶数据口

/********************函数声明*********************/

voiddisplay_weigh();

voidAlarm();

voidAD_0809();

voidlcd_init();

voidclr_screen();

voidbytecode();

voidfitle();

voidfunkey();

unsignedcharkeyscan();

/********************定义变量*********************/

sbitLCD_RS=P3^0;//寄存器选择输入

sbitLCD_RW=P3^1;//液晶读/写控制

sbitLCD_EN=P3^2;//液晶使能控制

sbitled=P3^5;

sbitbell=P3^4;

sbitAD_EOC=P3^3;//A/D转换接口

sbitST=P3^6;//A/D转换启动

sbitOE=P3^7;//A/D输出允许

unsignedcharab[8]=0;

//unsignedcharabc[4]=0;

unsignedcharptr[4]=0;

unsignedcharptrl[4]=0;

inti;

intm,n;

floatss;

intj;

intzhongliang;

uintdanjia;

intYZ=5000;//初始阈值为5

unsignedintgetdata;

floatVOL;

unsignedcharrekey=0,ge=0,shi=0,xiaoshu=0;

unsignedcharsetflag=0,fuwei;

floatx[5]={0.00,0.00,0.00,0.00,0.00};

ucharcodeDIS1[]={"西安科技大学"};

ucharcodeDIS2[]={"毕业设计课题"};

ucharcodeDIS3[]={"多功能电子称"};

ucharcodeDIS4[]={"康昊张晨"};

ucharaDIS1[]={"重量:

"};

ucharaDIS2[]={'k','g'};

ucharbDIS1[]={"单价:

"};

ucharbDIS2[]={"元/Kg"};

ucharcDIS1[]={"金额:

"};

/*************************************************

函数名称:

AD_0809

函数功能:

数模转换

*************************************************/

voidAD_0809()

{

OE=0;//输出禁止

_nop_();

_nop_();

ST=0;//启动转换

_nop_();

_nop_();

ST=1;

_nop_();//保证足够的上升沿

ST=0;

while(!

AD_EOC);//等待输出

OE=1;//输出允许

P1=0xFF;

getdata=P1;

_nop_();

_nop_();

_nop_();

_nop_();

VOL=4.44*getdata/256;//ADC0809实际基准电压为4.44

}

/**************************************************

延时函数

**************************************************/

voiddelay(intms)

{

while(ms--)

{

uchari;

for(i=0;i<150;i++)

{

_nop_();

_nop_();

_nop_();

_nop_();

}

}

}

/**************************************************

检查LCD忙状态

lcd_busy为1时,忙,等待;lcd_busy为0时。

闲,可写指令与数据。

**************************************************/

bitlcd_busy()

{

bitresult;

LCD_RS=0;

LCD_RW=1;

LCD_EN=1;

delayNOP();

result=(bit)(P0&0x80);

LCD_EN=0;

return(result);

}

/***************************************************

写指令数据到LCD

RS=L,RW=L,E=高脉冲,D0-D7=指令码。

***************************************************/

voidlcd_wcmd(ucharcmd)

{

while(lcd_busy());

LCD_RS=0;

LCD_RW=0;

LCD_EN=0;

_nop_();

_nop_();

P0=cmd;

delayNOP();

LCD_EN=1;

delayNOP();

LCD_EN=0;

}

/**************************************************

写显示数据到LCD

RS=H,RW=L,E=高脉冲,D0-D7=数据。

***************************************************/

voidlcd_wdat(uchardat)

{

while(lcd_busy());

LCD_RS=1;

LCD_RW=0;

LCD_EN=0;

P0=dat;

delayNOP();

LCD_EN=1;

delayNOP();

LCD_EN=0;

}

/**************************************************

LCD初始化设定

**************************************************/

voidlcd_init()

{

//LCD_PSB=1;//并口方式

//LCD_RST=0;//液晶复位

delay(3);

//LCD_RST=1;

delay(3);

lcd_wcmd(0x34);//扩充指令操作

delay(5);

lcd_wcmd(0x30);//基本指令操作

delay(5);

lcd_wcmd(0x0C);//显示开,关光标

delay(5);

lcd_wcmd(0x01);//清除LCD的显示内容

delay(5);

}

/*************************************************

设定显示位置

*************************************************/

voidlcd_pos(ucharX,ucharY)

{

ucharpos;

if(X==1)

{X=0x80;}

elseif(X==2)

{X=0x90;}

elseif(X==3)

{X=0x88;}

elseif(X==4)

{X=0x98;}

pos=X+Y;

lcd_wcmd(pos);//显示地址

}

/*********************************************************

**

*闪烁函数*

**

*********************************************************/

voidlcdflag()

{

lcd_wcmd(0x08);

delay(300);

lcd_wcmd(0x0c);

delay(300);

lcd_wcmd(0x08);

delay(300);

lcd_wcmd(0x0c);

delay(300);

lcd_wcmd(0x08);

delay(100);

lcd_wcmd(0x0c);

delay(50);

lcd_wcmd(0x01);

delay(50);

}

/*************************************************

清屏函数

*************************************************/

voidclr_screen()

{

lcd_wcmd(0x34);//扩充指令操作

delay(5);

lcd_wcmd(0x30);//基本指令操作

delay(5);

lcd_wcmd(0x01);//清屏

delay(5);

}

/**************************************************

显示字符表代码

**************************************************/

voidbytecode()

{

uchars;

clr_screen();//清屏

lcd_wcmd(0x80);//设置显示位置为第一行

for(s=0;s<16;s++)

{

lcd_wdat(0x30+s);

}

lcd_wcmd(0x90);//设置显示位置为第二行

for(s=0;s<16;s++)

{

lcd_wdat(0x40+s);

}

lcd_wcmd(0x88);//设置显示位置为第三行

for(s=0;s<16;s++)

{

lcd_wdat(0x50+s);

}

lcd_wcmd(0x98);//设置显示位置为第四行

for(s=0;s<16;s++)

{

lcd_wdat(0x60+s);

}

}

/*************************************************

将数值转换成可显示函数

**************************************************/

voidTrans_val(floathhh)

{

zhongliang=(int)(hhh*2);

Alarm();

ptr[0]=2+zhongliang/10;

ptr[1]=2+zhongliang%10;

ptr[2]=0;

zhongliang=(int)(hhh*2000);

ptr[3]=2+zhongliang%1000/100;

ptr[4]=2+zhongliang%100/10;

ptr[5]=2+zhongliang%10;

//zhongliang=(int)(hhh*2);

Alarm();

}

/**************************************************

函数名称:

display_open

函数功能:

开机正常显示界面

**************************************************/

voiddisplay_open()

{

lcd_pos(1,1);//设置显示位置为第一行

for(i=0;i<12;i++)

{

lcd_wdat(DIS1[i]);

delay(30);

}

lcd_pos(2,1);//设置显示位置为第二行

for(i=0;i<12;i++)

{

lcd_wdat(DIS2[i]);

delay(30);

}

lcd_pos(3,1);//设置显示位置为第三行

for(i=0;i<12;i++)

{

lcd_wdat(DIS3[i]);

delay(30);

}

lcd_pos(4,1);//设置显示位置为第四行

for(i=0;i<12;i++)

{

lcd_wdat(DIS4[i]);

delay(30);

}

delay(500);

}

/**************************************************

函数名称:

display_right

函数功能:

开机正常显示界面

**************************************************/

voiddisplay_right()

{

lcd_pos(1,1);//设置显示位置为第一行

for(i=0;i<12;i++)

{

lcd_wdat(DIS3[i]);

//delay(300);

}

lcd_pos(2,0);//设置显示位置为第二行

for(i=0;i<6;i++)

{

lcd_wdat(aDIS1[i]);

delay(30);

}

lcd_pos(2,7);

for(i=0;i<2;i++)

{

lcd_wdat(aDIS2[i]);

//delay(300);

}

lcd_pos(3,0);//设置显示位置为第三行

for(i=0;i<6;i++)

{

lcd_wdat(bDIS1[i]);

//delay(300);

}

lcd_pos(3,5);

for(i=0;i<5;i++)

{

lcd_wdat(bDIS2[i]);

//delay(300);

}

lcd_pos(4,0);//设置显示位置为第四行

for(i=0;i<6;i++)

{

lcd_wdat(cDIS1[i]);

//delay(300);

}

lcd_pos(4,7);//设置显示位置为第四行

for(i=0;i<2;i++)

{

lcd_wdat(bDIS2[i]);

//delay(300);

}

}

/*******************************************************************

函数名:

Alarm

功能:

报警

*******************************************************************/

voidAlarm()

{

if(zhongliang>YZ)//重量大于阈值

{

led=1;//发光二极管点亮

delay(10);

bell=0;//蜂鸣器响

delay(10);

}

if(zhongliang

{

led=0;//发光二极管熄灭

delay(10);

bell=1;//蜂鸣器不响

delay(10);

}

}

/**************************************************

函数名称:

display_weigh

函数功能:

电子秤显示界面

**************************************************/

voiddisplay_weigh()

{

uinti;

Trans_val(ss);//数据分离

for(i=0;i<5;i++)

ptr[i]=ptr[i]+0x2e;//更新数据

lcd_pos(2,3);//设置显示位置为第一行

for(i=0;i<5;i++)

{

lcd_wdat(ptr[i]);

//delay(300);

}

}

/***************************************************************************

函数名称:

filter

函数功能:

滤波

***************************************************************************/

floatfilter()

{

unsignedchari;

floatsum=0.00;

for(i=0;i<5;i++)

{

sum+=x[i];

}

sum=sum/5;

returnsum;

}

/***************************************************************************

函数名称:

fun_key

函数功能:

单价输入

***************************************************************************/

voidfunkey()

{fuwei=1;

n=0;

m=0;

shi=0;ge=0;xiaoshu=0;

setflag=0;

while(setflag==0)

{

rekey=keyscan();

if(rekey==16)

{clr_screen();display_open();delay(500);clr_screen();

display_right();setflag=1;ab[8]=0;ptrl[4]=0;fuwei=1;ptr[8]=0;

lcd_pos(3,3);//设置显示位置为第一行

for(i=0;i<4;i++)

{

lcd_wdat(0x20);

delay(10);

}

lcd_pos(4,3);//设置显示位置为第一行

for(i=0;i<8;i++)

{

lcd_wdat(0x20);

delay(10);

}

}

if(rekey==12)

{clr_screen();

display_right();setflag=1;ab[8]=0;ptrl[4]=0;fuwei=0;

lcd_pos(3,3);//设置显示位置为第一行

for(i=0;i<4;i++)

{

lcd_wdat(0x20);

delay(15);

}

lcd_pos(4,3);//设置显示位置为第一行

for(i=0;i<8;i++)

{

lcd_wdat(0x20);

delay(15);

}

}

if(rekey>=1&&rekey<=10)

{ab[n]=rekey-1;ptrl[n]=rekey+0x2f;n++;if(n>4)break;

lcd_pos(3,3);//设置显示位置为第一行

for(i=0;i

{

lcd_wdat(ptrl[i]);

delay(10);

}

}

if(rekey==11)

{m=n;ab[n]=0x2e;ptrl[n]=0x2e;n++;if(n>4)break;

lcd_pos(3,3);//设置显示位置为第一行

for(i=0;i

{

lcd_wdat(ptrl[i]);

delay(5);

}

}

if(rekey==14)

{n--;

lcd_pos(3,3);//设置显示位置为第一行

for(i=0;i<4;i++)

{

lcd_wdat(0x20);

delay(5);

}

lcd_pos(3,3);//设置显示位置为第一行

for(i=0;i

{

lcd_wdat(ptrl[i]);

delay(5);

}

}

if(rekey==13)

{lcd_pos(3,3);//设置显示位置为第一行

for(i=0;i

{

lcd_wdat(ptrl[i]);

delay(50);

}

setflag=1;fuwei=0;

}

if(rekey==15)

{fuwei=1;setflag=1;}

}

if(fuwei==1)

{

lcd_pos(4,3);//设置显示位置为第一行

for(i=0;i<8;i++)

{

lcd_wdat(0x20);

delay(10);

}

}

if(fuwei==0)

{

if(setflag==1)

{if(m==0){xiaoshu=ab[1];}

if(m==1){ge=ab[0];xiaoshu=ab[2];}

if(m==2){shi=ab[0];ge=ab[1];xiaoshu=ab[3];}

danjia=shi*10+ge+xiaoshu*0.1;

//(ptr[3]-2)

//zhongliang=zhongliang*10;

//danjia=1;

//zhongliang=8900;

//zhongliang=ptr[0]*1000+ptr[1]*100+ptr[2]*10+ptr[3];

//zhongliang=zhongliang*10;

//danji

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 法学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1