模拟电子秤仿真实验报告 - 图文
更新时间:2024-01-23 03:09:01 阅读量: 教育文库 文档下载
- 模拟电子技术仿真实验报告推荐度:
- 相关推荐
阿坝师范高等专科学校电子信息工程系课程设计
模拟电子秤仿真设计
学生姓名 专业名称 班 级 学 号
樊益明 计算机控制技术
计控班 20113079
阿坝师范高等专科学校电子信息工程系
二○一三年四月
模拟电子秤设计报告
一、设计原理及要求
设计原理:
电子秤系统设计框图大致如图1所示:
四个定值电阻加一个电位器,模拟应利用差分放大电ADC0832:8位2进制模数转换器;将放大的电压信号转化为数值信号,方便单片机的处理 变式传感器,采集微小的电压信号 路,对采集到的微小电压放大到0~~5V MM74C922:键盘解码器,方便了对4x4键盘的扫描。键盘的作用主要在单价的输入上。 51单片机:处理和控制单元,整个模拟仿真的灵魂原件。1、将ADC0832转化来的数据处理后存放在重量(Wight)并用LCD显示;2、将键盘输入的数据赋给单价(Price);3、将总价(Total_price)计算出来,并显示
图1 系统整体设计框图
设计要求:
1、要求单价由键盘输入;
2、重量的精度能够达到十分之一千克;
3、按键有提示音; 4、有去皮的功能;
二、主要硬件及仿真软件
硬件:
(一)、ADC0832
ADC0832 是一种8 位分辨率、双通道A/D转换芯片。由于它体积小,兼容性,性价比高而深受单片机爱好者及企业欢迎。图2.1为ADC0832在Proteus中的逻辑符号
图2.1 ADC0832逻辑符号
芯片接口说明:
CS片选使能,低电平芯片使能; CH0 模拟输入通道0,或作为IN+/-使用。 CH1 模拟输入通道1,或作为IN+/-使用。 GND 芯片参考0 电位(地)。 DI 数据信号输入,选择通道控制。 DO 数据信号输出,转换数据输出。 CLK 芯片时钟输入。
Vcc/REF 电源输入及参考电压输入(复用)。 单片机对 ADC0832 的控制原理:
正常情况下 ADC0832 与单片机的接口应为 4 条数据线,分别是 CS、CLK、DO、DI但由于 DO 端与 DI 端在通信时并未同时有效并与单片机的接口是双向的,所以电路设计时可以将 DO 和 DI 并联在一根数据线上使用。(见图 3.6)当 ADC0832 未工作时其 CS 输入端应为高电平,此时芯片禁用,CLK 和DO/DI 的电平可任意。当要进行 A/D 转换时,须先将 CS 使能端置于低电平并且保持低电平直到转换完全结束。此时芯片开始转换工作,同时由处理器向芯片时钟输入端 CLK 输入时钟脉冲,DO/DI 端则使用 DI 端输入通道功能选择的数据信号。在第 1 个时钟脉冲的下沉之前 DI 端必须是高电平,表示启始信号。在第 2、3 个脉冲下沉之前 DI 端应输入 2 位数据用于选择通道功能,其功能项见表 1。
表 1
如表 1 所示,当此 2 位数据为“1”、“0”时,只对 CH0 进行单通道转换。当 2 位数据为“1”、“1”时,只对 CH1 进行单通道转换。当 2 位数据为“0”、“0”时,将 CH0 作为正输入端 IN+,CH1 作为负输入端 IN-进行输入。当 2 位数据为“0”、“1”时,将 CH0 作为负输入端 IN-,CH1 作为正输入端 IN+进行输入。所以我们利用前1——2个脉冲来设置ADC0832的通道选择,到第 3 个脉冲的下沉之后 DI 端的输入电平就失去输入作用,此后 DO/DI端则开始利用数据输出 DO 进行转换数据的读取。从第 4 个脉冲下沉开始由 DO端输出转换数据最高位 DATA7,随后每一个脉冲下沉 DO 端输出下一位数据。直到第 11 个脉冲时发出最低位数据 DATA0,一个字节的数据输出完成。也正是从此位开始输出下一个相反字节的数据,即从第 11 个字节的下沉输出 DATD0。随后输出 8 位数据,到第 19 个脉冲时数据输出完成,也标志着一次 A/D 转换的结束。最后将 CS 置高电平禁用芯片,直接将转换后的数据进行处理就可以了。更详细的时序说明请见图 2.2(图2.2为ADC0832的时序图)。
图2.2 ADC0832时序图
(二)、LCD12232
图2.3 LCD12232逻辑符号
管脚说明: VDD:逻辑电源正 GND(VSS): 逻辑电源地 VO(VEE):LCD驱动电源 RESET:复位端。 E1:读写使能。 E2:同E1引脚。
/RD:读允许,低电平有效。 /WR:写允许,低电平有效。 R/W:读写选择
A0:数据/指令选择 高电平:数据D0-D7将送入显示RAM; 低电平:数据D0-D7将送入指令执行器执行。 D0-D7:数据输入输出引脚。 图2.4为LCD的时序图
图2.4 LCD12232时序图
图2.5为显示存储器(DDRAM)与地址的对应关系 (显示设定为1/32DUTY,显示起始行为10th)
图2.5
(三)、AT89C51
在Protues中AT89C51的逻辑符号如图2.6所示:
图2.6 AT89C51逻辑符号
AT89C51是一种带4K字节FLASH存储器(FPEROM—Flash Programmable and Erasable Read Only Memory)的低电压、高性能CMOS 8位微处理器,俗称单片机。AT89C2051是一种带2K字节闪存可编程可擦除只读存储器的单片机。单片机的可擦除只读存储器可以反复擦除1000次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
AT89C51 提供以下标准功能:4k字节Flash闪速存储器,128字节内部RAM,32 个I/O 口线,两个16位定时/计数器,一个5向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路。同时,AT89C51可降至0Hz的静态逻辑操作,并支持两种软件可选的节电工作模式。空闲方式停止CPU的工作,但允许RAM,定时/计数器,串行通信口及中断系统继续工作。掉电方式保存RAM中的内容,但振荡器停止工作并禁止其它所有部件工作直到下一个硬件复位。
仿真软件:
(一)、Proteus
它不仅具有其它EDA工具软件的仿真功能,还能仿真单片机及外围器件。它是目前最好的仿真单片机及外围器件的工具,在这里完全能够满足我们对电子秤的仿真需要。
(二)、Keil C51
Keil C51是51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,因为我们在此次模拟仿真中使用C语言编程,所以Keil几乎就是我们的不二之选。
三、设计步骤
(一)、软件设计
1、延时函数delay()的编写(Delay.c):
在这个C文件中,只有一个函数void delay(uint x),该函数的作用 是,延时100*x(微
秒)。
2、ADC0832的驱动代码编写(ADC0832.c):
在这个C文件中,只有一个函数uchar ReadADC(),它的返回值为8位2进制数,表示的放
大后的电压值。
图3.1为uchar ReadADC()的程序设计流程图
开始
图3.1 程序设计流程图
结束 输出dat1 输出0x00 dat2=dat2|((uchar)ADC_DIO<
在这个C文件中,有三个函数:?、uchar Get_key(),作用是获得MM74C922转化的4位二进制,并转化为十进制;?、void Beep(),是蜂鸣器的驱动程序;?、void Juge_key()判断按键值,并作出相应操作
图3.2为void Juge_key()的程序设计流程图
图3.2 程序设计流程图
结束 b=Get_key(); switch(b) uchar Get_key()获得MM74C922转化的4位二进制,并转化为十进制b 开始 0~9 输出 0~9 12 归零 14 确认 11 去皮 15、4、7 显示时间、特效、小数点(。) 4、LCD12232的驱动代码编写(LCD12232.c):
在这个C文件中,主要包含了两个显示函数 ?、 void LCDshow010(uint *a,uint b)
这个函数主要是实现LCD第一行的显示,显示“P: 0 W 0.0kg”字样。 ?、void LCDshow230(uint c)
这个函数主要是实现LCD第二行的显示,显示“总价: 0.0元”字样。
5、Main文件的编写(Main.c):
在这个C文件中,主要包含了main()函数,它的功能是调用其他C文件中的函数,因此,在写main()函数时,应当先做其他文件的调用声明,如下:
#include\存放取模数据的头文件 #include\延时函数
#include\的驱动程序 #include\的驱动程序 #include\的驱动程序
图3.3为main()的程序设计流程图
图3.3 程序设计流程图
按键扫描函数Juge_key() LCD第二行显示LCDshow230(Total_price); 计算出总价Total_price=Price*Weight 将电压信号与重量建立等式关系开始 LCD的复位操作,为LCD的显示做准备,LCDrst(); 获得ADC的返回值adcdata=ReadADC(); weight=2*adcdata*1.960-Levelweight-3; LCD的第一行显示LCDshow010(p,weight); (二)、硬件电路搭建
1、模拟应变式传感器单臂电桥的搭建:
由于Proteus没有测重量的应变式传感器器件,所以在这里我们用四个电阻和一个电位器来模拟传感器的工作原理。采用如图3.4所示电路图连接:
Uo
图3.4 模拟传感器电桥
其中、R2?R4?100?;R1?RV1?R3?350?;图中所示Uo为传感器采集到的电压信号,
Rv1=1.5?,R3=348.5?,所以Uo的变化范围为0~~5mV
2、微小电压信号差分放大电路的搭建:
在实际应用中,此种放大电路能够有效的降低噪声对正常信号的影响。在本次模拟中能够有效的完成1000倍的放大,将最大0~~5mV的电压信号放大为最大0~~5V。连接电路图如图3.5所示:
具体推套方式如下:
u3?u4u?u?12
RV7?RV2?RV6RV2?u3?u4RV7?RV2?RV6?;u1?u2RV2
?RV7?RV6;?u3?u4R?1?2V7u1?u2RV2u3u?5R7?R5R5u4?uOu5?uO?R6?R8R8
u3uuOu4??O?
R7?R5R7?R5R5R7?R5u3?u4uOuO??
R7?R5R5R7?R5
?uORR?(1?2V7)5
u1?u2RV2R7根据以上推套,我们要实现1000倍的放大,则只需确定RV2、RV7、R7、R5四个电阻的阻值即可。本次设计中我们取RV2?1K?、RV7?185K?、R7?10K?、R5?20K?,只需调节
RV2和RV7、RV6即可达到1000倍,应当注意的是:RV7、RV6的调节幅度应该始终保持一样。
U1 U3 U5 Uo U2 U4 图3.5
U5
3、ADC0832与51单片机及LCD的连接电路:
关于ADC0832与单片机的连接方法在前面已经提过,在此不赘述了,我们选用CH0作为信号输入通道;
关于AT89C51的:
P1.0——P1.2口分别接ADC0832的片选使能端CS、时钟信号端CLK、数据输出端DIO,其中P1.6接MM74C922的输入提示端DA,P1.7接蜂鸣器;
图3.6 ADC0832与51单片机及LCD的连接电路
P0端口接上拉电阻作LCD的D0——D7数据输入端;
P2.0——P2.7依次接LCD的数据指令控制端A0、LCD前半部分使能端E0、LCD后半部分使能端E1、LCD读写控制端RW以及MM74C922的四位数据传输断A、B、C、D。
(具体连接如图3.6)
4、键盘解码器MM74C922以及4*4键盘的连接电路: 关于MM74C922 的电路连接如图3.7所示
图3.7 MM74C922与矩阵式键盘的连接电路图
四、设计结论
1、单价能够由键盘输入:
当开启仿真时,在没有调节模拟传感器的前提下,LCD的显示如图4.1所示
图4.1
当有重物时,LCD的显示如图4.2所示,重量的显示范围理论上为0.0~~99.9kg
图4.2
这时,我们可以在键盘上按下重物的单价,Price的输入理论范围为0~~99元/kg,例如:我们输入单价“15”,LCD的显示如图4.3所示:
图4.3
这时,我们只需要按下“确定”键,就可以得到总价了,LCD的显示如图4.4所示:
图4.4
应当注意的是:?、在每次使用前都应当按一下“归零”键,来防止前次使用时使用过去皮功能;?、在单价的输入程序中,当你按下了两位数后,数字键就应失效了,不能继续输入,若想重新输入,则按下“归零”键即可,例如:输入“15”,若我们按下1和5后继续按7,则第三次按
键是无效的,不会显示在LCD上;?、且,我们在写程序中应当加入防止重键的功能;④、若单价只有一位数,则lCD只显示一位数,不会出现“01”的情况,后面的重量、总价原理相同;
2、重量的精度能够达到十分之一千克:
理论上是达到要求了,但是由于我们用的是一个电位器来模拟传感器的电阻变化,而这个电位器只能1%的增加,而这1%换算到电压的改变就为0.05mV,算上电压与重量的关系1mV对应15kg,则电位器每增加1%重量就应该增加0.75kg左右。如图4.5a和图4.5b所示
图4.5a为当电位器调节到60%的时候,采集到的重量为48.0kg; 图4.5b为当电位器调节到65%的时候,采集到的重量为51.8kg;
?weight?weight65?weight60
=3.8kg
所以、平均变化为0.76kg
图4.5a
图4.5b
3、去皮的功能:
例,在图4.5b的显示情况下我们使用“去皮”的功能即按下“去皮”键,LCD的显示如图4.6所示:
图4.6
应当注意的是:在使用了去皮功能后,应当做归零操作。 4、按键有提示音:
此项功能只需要增加一个蜂鸣器(接单片机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\的使用函数 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);
//总价的计算 }
}
正在阅读:
模拟电子秤仿真实验报告 - 图文01-23
江南大学现代远程教育2014年下半年课程考试大作业 社会保障与社03-29
外资银行与中国国有商业银行股份制改革05-28
假日游园记作文800字07-09
新世纪大学英语(第二版)综合教程3课后习题答案完整版UNIT 608-24
我家的小庭院作文600字07-09
颠覆者友邦03-19
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- 电子秤
- 仿真
- 模拟
- 实验
- 图文
- 报告
- 管铺头小学冬季施工方案
- 融资融券业务的二套考题及答案
- 台府办〔2010〕73号-关于印发台山市小型建设工程承(发)包管理办法的通知
- 商业发票(填写说明中英文对照客户参考版)
- 2(科技风)对生物质锅炉管道高温腐蚀问题有效解决研究
- 《建筑工程估价实训》设计任务书 - 图文
- 进程创建与撤消
- 中华人民共和国社区矫正法(草案送审稿)
- 《听话和说话》测试题2
- 中文数字图书馆检索
- 华为EHS安全生产考试题
- 云计算系统运维高技能人才现状及需求、岗位能力及技能要求调研报告
- 优尼全能英语少儿英语之Donald的英语词典
- 债权法习题2012
- 运城制版集团战略内控体系思考
- 精读4 paraphrase unit3
- 2015宏观经济学练习题
- 福建省信息产业人才服务中心
- Catia V5-6R2015 在 Win7 和 Win10 上的安装总结 - 图文
- 浅谈新课程改革下构建高中物理高效课堂的策略