模拟电子秤仿真实验报告 - 图文(4)

2019-08-29 21:56

此项功能只需要增加一个蜂鸣器(接单片机P1.7脚)在编写按键扫描程序中,在每一个case语句后添加上蜂鸣器的驱动程序即可。当有按键按下时,就会调用蜂鸣器的驱动序,促使蜂鸣器发出“滴” 的一声。

附录Ⅰ:

图一:所有电路连接的全局图

图一

附录Ⅱ:

附所有程序源代码:

Font.h//存放取模数据的头文件

#define uchar unsigned char #define uint unsigned int uint code number[][16]={

{0x00,0x00,0xE0,0x0F,0x10,0x10,0x08,0x20,0x08,0x20,0x10,0x10,0xE0,0x0F,0x00,0x00},/*\

{0x00,0x00,0x10,0x20,0x10,0x20,0xF8,0x3F,0x00,0x20,0x00,0x20,0x00,0x00,0x00,0x00},/*\

{0x00,0x00,0x70,0x30,0x08,0x28,0x08,0x24,0x08,0x22,0x88,0x21,0x70,0x30,0x00,0x00},/*\

{0x00,0x00,0x30,0x18,0x08,0x20,0x88,0x20,0x88,0x20,0x48,0x11,0x30,0x0E,0x00,0x00},/*\

{0x00,0x00,0x00,0x07,0xC0,0x04,0x20,0x24,0x10,0x24,0xF8,0x3F,0x00,0x24,0x00,0x00},/*\

{0x00,0x00,0xF8,0x19,0x08,0x21,0x88,0x20,0x88,0x20,0x08,0x11,0x08,0x0E,0x00,0x00},/*\

{0x00,0x00,0xE0,0x0F,0x10,0x11,0x88,0x20,0x88,0x20,0x18,0x11,0x00,0x0E,0x00,0x00},/*\

{0x00,0x00,0x38,0x00,0x08,0x00,0x08,0x3F,0xC8,0x00,0x38,0x00,0x08,0x00,0x00,0x00},/*\

{0x00,0x00,0x70,0x1C,0x88,0x22,0x08,0x21,0x08,0x21,0x88,0x22,0x70,0x1C,0x00,0x00},/*\

{0x00,0x00,0xE0,0x00,0x10,0x31,0x08,0x22,0x08,0x22,0x10,0x11,0xE0,0x0F,0x00,0x00},/*\

{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*\

{0x08,0x20,0xF8,0x3F,0x00,0x24,0x00,0x02,0x80,0x2D,0x80,0x30,0x80,0x20,0x00,0x00},/*\

{0x00,0x00,0x00,0x6B,0x80,0x94,0x80,0x94,0x80,0x94,0x80,0x93,0x80,0x60,0x00,0x00},/*\

{0x00,0x00,0x00,0x30,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*\

{0x20,0x80,0x20,0x40,0x22,0x20,0x22,0x10,0x22,0x0C,0xE2,0x03,0x22,0x00,0x22,0x00},

{0x22,0x00,0xE2,0x3F,0x22,0x40,0x22,0x40,0x22,0x40,0x20,0x40,0x20,0x78,0x00,0x00},/*\元\

};

uint code tem[][16]={

{0x08,0x20,0xF8,0x3F,0x08,0x21,0x08,0x01,0x08,0x01,0x08,0x01,0xF0,0x00,0x00,0x00},/*\

{0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*\:\

{0xF8,0x03,0x08,0x3C,0x00,0x07,0xF8,0x00,0x00,0x07,0x08,0x3C,0xF8,0x03,0x00,0x00},/*\

{0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*\:\

{0x00,0x40,0x00,0x30,0x00,0x00,0xF1,0x03,0x12,0x39,0x14,0x41,0x10,0x41,0x10,0x45},

{0x10,0x59,0x14,0x41,0x12,0x41,0xF1,0x73,0x00,0x00,0x00,0x08,0x00,0x30,0x00,0x00},/*\总\

{0x00,0x01,0x80,0x00,0x60,0x00,0xF8,0xFF,0x07,0x00,0x40,0x80,0x20,0x60,0x90,0x1F},

{0x0C,0x00,0x03,0x00,0x0C,0x00,0x90,0xFF,0x20,0x00,0x40,0x00,0x40,0x00,0x00,0x00},/*\价\

{0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*\:\

}Delay.c//延时函数 void delay(uint x){/*100us延时函数*/ uint i; while(x--) for(i=100; i>0; i--);

}LCD12232.c//LCD12232

的使用函数

sfr DATAport=0x80;//定义LCD12232数据口(0x80表示P0口)

sbit lcda0=P2^0;//写(数据/指令)(1/0)选择 sbit lcde1=P2^1;//LCD左边使能 sbit lcde2=P2^2;//LCD右边使能

sbit lcdrw=P2^3;//(读/写)(1/0)状态选择

sbit lcdbusy=P0^7;//忙状态检测位(即数据口最高位) void LCDcmd(uchar temp){ delay(2); lcde1=0; //禁止控制器

lcde2=0; lcda0=0;

//写指令模式 lcdrw=0; //写使能 lcde1=1; //控制器使能 lcde2=1;

DATAport=temp; //写指令

lcde1=0;

//写完后,禁止控制器 lcde2=0;

}

/*写数据*/

void LCDdata(bit lcde,uchar temp){ delay(2); lcde1=0;

//禁止控制器

lcde2=0; lcda0=1;

//写数据模式 lcdrw=0; //写使能

lcde1=~lcde;

//(lcde=0/1)(左/右)控

制器使能

lcde2=lcde;

DATAport=temp; //写数据 lcde1=0;

//写完后,禁止主控制器

lcde2=0;

}

/*LCD清屏*/

void LCDclr(uint Page){

unsigned char i; LCDcmd(0xB8|Page); //设置主控制器页地址

LCDcmd(0x00);

//设置主控制器列地址 for(i=0;i<61;i++){ LCDdata(0,0x00);

}

for(i=0;i<61;i++){ LCDdata(1,0x00);

}

}

/*LCD初始化*/

void LCDrst(){ LCDcmd(0xE2);//复位 LCDcmd(0xAE);//关显示

LCDcmd(0xA4);//正常驱动模式

LCDcmd(0xA9);//占空比为1/32(即32行液晶显示驱

动)

LCDcmd(0xA1);//设定列驱动与液晶列数据口连接方式 LCDcmd(0xEE);//正常读写模式(读/写数据后列地址+1)

LCDclr(0); //擦除0页 LCDclr(1); //擦除1页

LCDclr(2); //擦除2页 LCDclr(3);

//擦除3页

LCDcmd(0xAF);//开显示

}

/*写LCD字符串*/ /*写指令*/

void LCDshow010(uint *a,uint b){ uint i,j;

for(j=0;j<2;j++){

LCDcmd(0xB8|j);

//第j页显示

LCDcmd(0x00);

//设置列开始地址

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

//写前半部分,显示“P:” LCDdata(0,tem[0][i*2+j%2]);

if(a[1]==0){

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

//写前半部分,如果十位为0,空格占位

LCDdata(0,number[10][i*2+j%2]);

}

else{

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

//写前半部分 ,显示单价的十位

LCDdata(0,number[a[1]][i*2+j%2]);

}

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

//写前半部分,显示单价的个位

LCDdata(0,number[a[0]][i*2+j%2]);

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

//写前半部分,空格占位

LCDdata(0,number[10][i*2+j%2]);

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

//写前半部分,空格占位

LCDdata(0,number[10][i*2+j%2]);

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

//写前半部分,空格占位

LCDdata(0,number[10][i*2+j%2]);

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

//写后半部分,显示“W:”

LCDdata(0,tem[2][i*2+j%2]);

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

//写后半部分 ,越界处理 LCDdata(1,tem[2][i*2+j%2]); if(b/100==0){

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

//写后半部分,如果十位为0,空格占位

LCDdata(1,number[10][i*2+j%2]);

}

else{

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

//写后半部分 ,显示重量的十位

LCDdata(1,number[b/100][i*2+j%2]);

}

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

//写后半部分 ,显示重量的个位

LCDdata(1,number[(b/10)][i*2+j%2]);

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

//写后半部分,显示小数点

LCDdata(1,number[13][i*2+j%2]);

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

//写后半部分,显示重量的小数位

LCDdata(1,number[b][i*2+j%2]);

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

//写后半部分 显示“kg”符号

LCDdata(1,number[11][i*2+j%2]);

}

}

void LCDshow230(uint c){ uint i,j;

for(j=2;j<4;j++){

LCDcmd(0xB8|j);

//第j页显示

LCDcmd(0x00);

//设置列开始地址

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

//写前半部分,显示“总价:” LCDdata(0,tem[4][i*2+j%2]);

if(c/10000==0){

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

//写前半部分,如果千位为0,千位空格占

LCDdata(0,number[10][i*2+j%2]);

}

else{

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

//写前半部分 ,显示总价的千位

LCDdata(0,number[c/10000][i*2+j%2]);

}

if(c/1000==0){

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

//写前半部分,在千,百位都为0的情况

下,百位空格占位

LCDdata(0,number[10][i*2+j%2]);

}

else{

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

//写前半部分 ,显示总价的百位

LCDdata(0,number[(c/1000)][i*2+j%2]);

}

if(c/100==0){

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

//写前半部分,在千、百、十位都为0 的情

况下,十位空格占位

LCDdata(0,number[10][i*2+j%2]);

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

//写后半部分,显示空格占位,因为存在越

LCDdata(1,number[10][i*2+j%2]);

}

else{

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

//写前半部分,显示总价的十位

LCDdata(0,number[(c/100)][i*2+j%2]);

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

//写后半部分,显示总价的十位,因为存在

越界

LCDdata(1,number[(c/100)][i*2+j%2]);

}

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

//写后半部分,显示总价的个位

LCDdata(1,number[(c/10)][i*2+j%2]);

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

//写后半部分,显示小数点

LCDdata(1,number[13][i*2+j%2]);

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

//写后半部分,显示总价的小数位

LCDdata(1,number[c][i*2+j%2]);

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

//写后半部分,显示“元”符号

LCDdata(1,number[14][i*2+j%2]);

}

}ADC0832.c//ADC0832的使用函数

sbit ADC_CS =P1^0; sbit ADC_CLK=P1^1; sbit ADC_DIO =P1^2;

uchar ReadADC() //把模拟电压值转换成8位二进制数并返回 { uchar i,dat1=1,dat2=0; ADC_CS=0;ADC_CLK=0; ADC_DIO=1;

_nop_();_nop_(); ADC_CLK=1;

_nop_();_nop_();

ADC_CLK=0;ADC_DIO=1; _nop_();_nop_(); ADC_CLK=1;

_nop_();_nop_();

ADC_CLK=0;ADC_DIO=0; _nop_();_nop_(); ADC_CLK=1;

_nop_();_nop_();

ADC_CLK=0;ADC_DIO=1; _nop_();_nop_();

for(i=0;i<8;i++) { ADC_CLK=1; _nop_();_nop_(); ADC_CLK=0;

_nop_();_nop_();

dat1=(dat1<<1)|ADC_DIO;

}

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

dat2=dat2|((uchar)ADC_DIO<

ADC_CLK=1; _nop_();_nop_();

ADC_CLK=0;

_nop_();_nop_();

}

ADC_CS=1;

return (dat1==dat2)?dat1:0x00;

}MM74C922.c //MM74C922的使用函数

sbit DA=P1^6; sbit BEEP=P1^7; uchar Get_key(){ uint a=16; if(DA) a=P2/16;

return a;

}

void Beep() { uchar i;

for(i=0;i<100;i++){ delay(1); BEEP=~BEEP; }

BEEP=1;

}

void Juge_key(uint *c,uint e,uint f,uint *g,uint *h){ uint i,b=Get_key(); switch(b){ case 0:if(c[1]!=0)break;for(i=1;i>0;i--)c[i]=c[i-1];c[i]=1;while(DA);Beep();break; case 1:if(c[1]!=0)break;for(i=1;i>0;i--)c[i]=c[i-1];c[i]=2;while(DA);Beep();break; case

2:if(c[1]!=0)break;for(i=1;i>0;i--)c[i]=c[i-

1];c[i]=3;while(DA);Beep();break;

case 3:Beep();break; case 4:if(c[1]!=0)break;for(i=1;i>0;i--)c[i]=c[i-1];c[i]=4;while(DA);Beep();break; case 5:if(c[1]!=0)break;for(i=1;i>0;i--)c[i]=c[i-1];c[i]=5;while(DA);Beep();break; case 6:if(c[1]!=0)break;for(i=1;i>0;i--)c[i]=c[i-

1];c[i]=6;while(DA);Beep();break;

case 7:break; case 8:if(c[1]!=0)break;for(i=1;i>0;i--)c[i]=c[i-1];c[i]=7;while(DA);Beep();break; case 9:if(c[1]!=0)break;for(i=1;i>0;i--)c[i]=c[i-1];c[i]=8;while(DA);Beep();break; case

10:if(c[1]!=0)break;for(i=1;i>0;i--)c[i]=c[i-1];c[i]=9;while(DA);Beep();break;

case 11:(*h)=e;while(DA);Beep();break; case 12:c[0]=0;c[1]=0;(*g)=0;(*h)=0;while(DA);Beep();break; case

13:if(c[1]!=0)break;for(i=1;i>0;i--)c[i]=c[i-

1];c[i]=0;while(DA);Beep();break;

case 14:(*g)=e*f;while(DA);Beep();break;

case

15:for(i=1;i>0;i--)c[i]=c[i-

1];c[i]=3;while(DA);Beep();break;

}

}main()函数 #include//调用头文件

#include #include

#include\存放取模数据的头文件 #include\延时函数 //#include\

#include\的使用函数 #include\的使用函数 #include\的使用函数 uchar adcdata; //uint DataTime[]; uint p[]={0,0};

uint price=0,weight,Total_price=0; uint Levelweight=0; main(){ delay(10);//LCD复位前适当延时,保证LCD复位成功 LCDrst();//LCD复位 while(1){ adcdata=ReadADC(); //

GetTime(DataTime);

Juge_key(p,weight,price,&Total_price,&Levelweight);

//总价的计算

weight=2*adcdata*1.47-Levelweight-2;

//实际重量与放大后电压的关系

Juge_key(p,weight,price,&Total_price,&Levelweight);

//总价的计算 LCDshow010(p,weight); price=p[0]+10*p[1];

//单价的输入

Juge_key(p,weight,price,&Total_price,&Levelweight);

//总价的计算 LCDshow230(Total_price);

Juge_key(p,weight,price,&Total_price,&Levelweight);

//总价的计算 }

}


模拟电子秤仿真实验报告 - 图文(4).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:中文数字图书馆检索

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: