该设计为二哲科技Proteus系列之电子称设计,主要用于菜市场的电子称,可以设置价格,根据价格和重量计算出金额,该设计采用了Proteus仿真软件,采用AT89C51为主控,采用ADC0832芯片来进行ADC的转换,采用LCD1602显示屏显示,同时设计了矩阵键盘用于输入价格。设计难度3颗星(满星为5颗)。
首先设计电路图,由于模块不多,所以接口可以随意分配,电路仿真图如下图1。
图1
设计时需要一步一步进行设计,一般设计开始尽量将人机交互的模块优先级调高。这里呢就优先对LCD1602进行设计,驱动程序如下:
void wrc(uint8 c){ delay(1); rs=0; rw=0; e=0; P0=c; e=1; delay(1); e=0; } void wrd(uint8 dat) { delay(1); rs=1; rw=0; e=0; P0=dat; e=1; delay(1); e=0; rs=0; } void init() { delay(1); wrc(0x38); wrc(0x38); wrc(0x38); wrc(0x06); wrc(0x0c); wrc(0x01); }
复制代码unsigned char A_D(unsigned char CH) //AD函数{ unsigned char i,adval,test; //定义局部变量并初始化 adval=0x00; test=0x00; Clk=0; //clk低电平 DI=1; //DI初始高电平在第一个时钟脉冲的下降沿前保持高电平,表示启动信号 _nop_(); CS=0; //片选 _nop_(); Clk=1; //clk上升沿,起始位写入 _nop_(); if(CH==0x00) //选择通道0 { Clk=0; //clk低电平 DI=1; _nop_(); Clk=1; //clk上升沿,通道0的第一位写入 _nop_(); Clk=0; DI=1; _nop_(); Clk=1; //clk上升沿,通道0的第二位写入 _nop_(); } else { Clk=0; DI=1; _nop_(); Clk=1; //clk上升沿,通道1的第一位写入 _nop_(); Clk=0; DI=1; _nop_(); //clk上升沿,通道1的第二位写入 Clk=1; _nop_(); } Clk=0; DI=1; for(i=0;i<8;i++) //从高位向低位读取八位AD值 { _nop_(); adval<<=1; Clk=1; _nop_(); Clk=0; if(DO) adval|=0x01; else adval|=0x00; } for(i=0;i<8;i++) { test>>=1; //从低位向高位读取八位AD值 if(DO) test|=0x80; else test|=0x00; _nop_(); Clk=1; _nop_(); Clk=0; } if(adval==test) dat=test; //判断两个读取值是否相等相等就把读取的数赋值给DAT _nop_(); CS=1; DO=1; Clk=1; return dat; }
复制代码uint8 keyscan() //按键扫描程序{ uint8 h,l,value; P1=0x0f; h=P1&0x0f; if(h!=0x0f) { delay(1); if(h!=0x0f) { h=P1&0x0f; l=P1|0xf0; P1=l; l=P1&0xf0; h=P1&0x0f; value=h+l; } return value; } }
复制代码