⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 最终程序.c

📁 电子秤的相关程序,?缱映拥南喙爻绦?电子秤的相关程序.
💻 C
📖 第 1 页 / 共 2 页
字号:
#include<reg52.h> 
#include<absacc.h> 
#include<stdio.h>


//以下是端口分配
//ad 控制线 
sbit ad_SCLK=P2^1; //MAX187时钟
sbit ad_DOUT=P2^2; //MAX187数据输出
sbit ad_CS=P2^3; //MAX187片选
sbit baoj=P1^6; // 报警端口
sbit lcxz=P1^7; //量程选择控制端:低电平是大量程,高电平是小量程。

//lcd 控制线 
sbit lcd_di=P1^0; //数据、指令选择端(高电平收数据,低电平接收指令)
sbit lcd_rw=P1^1; //读写控制端(高电平读,低电平写)
sbit lcd_e=P1^2;  //片选信号端,使能端(高电平有效)

//7289 控制线 
sbit cs7289=P1^3;  //7289 片选线
sbit clk7289=P1^4; //7289 时钟信号
sbit dio7289=P1^5; //7289 的输入端
sbit key7289=P3^2; //7289 中断方式 


//以下是被调用函数声明
//7289 子程序 
void ini_7289(void); //7289初始化子程序
void send7289(short); //向7289发送数据子程序 
short receive(void); //从7289接收按键值子程序 
void keyin(void); //7289键值判断子程序

//lcd 子程序 
void ini_lcd(void);   //lcd初始化子程序
void lcdd_send(short);//lcd数据输出子程序
void lcdi_send(short); // lcd命令输出子程序
void chk_busy(void);  // 检测BF端子程序

//ad 子程序 
unsigned long int ad_max187(void);//接收ad_max187数据子程序
void ad_delay(void);//延时
void baojing(void);//  报警子程序
void d_change(long);//重量数据转换为字符串子程序
void d_change1(long) ;//金额单价总额等数据转换为字符串子程序
unsigned long zhenshizhi(unsigned long celiang)	;//根据测量值自动选择量程,并得到真实值

// 初始化,编号,日期 
char xdata shuju[7]=""; //所测数据转换成字符串后存放的地方
void ini();//页面初始化子程序

void nop1()//空操作
{} 
void change(char s[16]) //字符串整合子程序
{
 char danwei[3];
 danwei[0]=s[6];
 danwei[1]=s[7];
 danwei[2]= '\0';
 s[6]=shuju[0]; 
 s[7]=shuju[1]; 
 s[8]=shuju[2]; 
 s[9]=shuju[3]; 
 s[10]=shuju[4]; 
 s[11]=shuju[5]; 
 s[12]=shuju[6];
 s[13]=danwei[0];
 s[14]=danwei[1];
 s[15]=danwei[2];
}


//以下是全局变量声明
char Key;//键值
int delay; // 全局变量 
short sh=0; // 商品号 
short dot=0; // 小数点标志 
bit list=0; //标志是否显示清单
short qb=0; // 记录商品数目
char xdata s1[16]="单价:元"; 
char xdata s2[16]="重量:Kg"; 
char xdata s3[16]="金额:元"; 
char xdata s4[16]="累计:元"; 

char code message0[16]="——欢迎使用——"; 
char code message1[16]="输入收银员代号:"; 
char code message2[16]=" 输入日期:"; 
char code message3[16]="华北科技学院"; 
char code message4[16]="华信公司欢迎您!"; 

char xdata bianhao[16]="收银员:"; 
char xdata riqi[16]="    -  -  "; 
long int xdata zongjia=0,jine=0,jine1=0; 
unsigned long int xdata shizhong=0,pizhong=0,zhongliang=0,pizhong1=0,zhongliang1=0; 
long int xdata qingdan[20][4]; 
char code shangpin[11][4]={{"单价"},{"苹果"},{"梨"},{"花生"},{"大米"}, {"桃子"},{"塑料"},{"瓜子"},{"桔子"},{"香蕉"},{"玉米"}}; 
long int xdata danjia[11]= 
{1000,2000,3635,5502,6660,3320,5502,660,3210,6600,5600}; 	//价格是原始价格的1000倍,后面回除以1000
char xdata jiage[6]={ 0x0,0x0,0x0,'.',0x0,0x0}; // 0.00 
short xdata xiuzheng[]={0,2,5,6,7,8,9,12,13}; 	 //可作为修正值使用

//****************************************************
//主函数
main() 
{
 short i,j; 
 long int x; 
 int y; 
 int xdata duilie[3]={0}; 
 lcxz=0; //初始设定电子秤工作在大量程状态
 P1=0xff; 
 ini_lcd(); // 初始化 LCD
 lcdi_send(0x8a); 
 while(message0[i]) 
       lcdd_send(message0[i++]); 
 ini_7289(); // 初始化 7289      
 pizhong1 = ad_max187();
 pizhong = zhenshizhi(pizhong1); 
 lcdi_send(0x1); //清 屏 
 ini(); // 初始页面 , 收银员编号,日期 
 lcdi_send(0x1); //清 屏 
 EA=1;EX0=1; // 开中断 
 EX1=1; 
 ad_CS=1; 
 while(1) 
       {
        if(list)
           {
            lcdi_send(0x80); // 显示设计者所在单位名称 
            for(i=0;i<16;i++) 
                lcdd_send(message3[i]); 

            x=qingdan[0][0]; // 商品名 单价 
            for(i=0;i<4;i++) 
                s1[i]=shangpin[x][i]; 

            x=qingdan[0][1]; 
            d_change1(x); 
            change(s1); 
            lcdi_send(0x90); 
            for(i=0;i<16;i++) 
                lcdd_send(s1[i]); 

            x=qingdan[0][2]; // 显示重量 
            d_change(x); 
            change(s2); 
            if(s2[8]==32) 
               s2[8]=0x30; //如果个位为空格,转为0
            lcdi_send(0x88); 
            for(i=0;i<16;i++) 
                lcdd_send(s2[i]); 

            x=qingdan[0][3];//显示金额 
            d_change1(x); 
            change(s3); 
            lcdi_send(0x98); 
            for(i=0;i<16;i++) 
                lcdd_send(s3[i]);
            // 以上为第一页 


            EA=0;EX0=0; // 关键盘中断 
            for(j=1;j<qb;) 
                {
                 while(key7289); //等待键盘输入
                 if(Key==0x1f)	 //向下翻页
                    j++;
                 else if(Key==0x1e)	 //向上翻页
                    j--;
                 if(j==0) //若已经翻到第一页,不可再向上翻页
                    j=1;
                 x=qingdan[j][2]; 
                 d_change(x); // 显示重量数据 
				 change(s2); 
                 if(s2[8]==32) 
                    s2[8]=0x30; 
                 lcdi_send(0x90); 
                 for(i=0;i<16;i++) 
                     lcdd_send(s2[i]); 

                 x=qingdan[j][1]; 
                 d_change1(x); 
				 change(s1); 

                 x=qingdan[j][0]; 
                 for(i=0;i<4;i++) 
                     s1[i]=shangpin[x][i]; 
                 lcdi_send(0x80); 
                 for(i=0;i<16;i++)
                     lcdd_send(s1[i]); 

                 x=qingdan[j][3]; 
                 d_change(x); 
				 change(s3); 
                 lcdi_send(0x88); 
                 for(i=0;i<16;i++) 
                     lcdd_send(s3[i]); 
                 lcdi_send(0x98); 
                 for(i=0;i<16;i++) 
                     lcdd_send(0x20); 
                 lcdi_send(0x98); 
                 while(key7289==0); 
                } 
            while(key7289);
            d_change1(zongjia); 
            change(s4); 
            lcdi_send(0x80); 
            for(i=0;i<16;i++) 
                lcdd_send(s4[i]); 
            lcdi_send(0x90); 
            for(i=0;i<16;i++) 
                lcdd_send(bianhao[i]); 
            lcdi_send(0x88); 
            for(i=0;i<16;i++) 
                lcdd_send(message4[i]); 
            lcdi_send(0x98); 
            for(i=0;i<16;i++) 
                lcdd_send(riqi[i]); 
            list=0; 
            while(key7289==0); 
            while(key7289==1); 
            while(key7289==0); 
            EA=1;
			EX0=1; 
           } 
        else
           { 
            y=0; 
            duilie[2]=duilie[1]; // 数字滤波 
            duilie[1]=duilie[0]; 
            y=ad_max187(); 
            duilie[0]=y>>1; 
            x=duilie[0]; 
            x=x<<1; 
            x=x+duilie[1]+duilie[2]; 

            zhongliang1=ad_max187();
			zhongliang = zhenshizhi(zhongliang1); 
            shizhong=zhongliang-pizhong; // 数据转换 
            x=danjia[sh]; 
            jine1=shizhong*x; 
            jine=jine1/1000; //省去0.01元以后的值
            d_change(shizhong); // 显示数据
            change(s2); 
            if(s2[8]==32) 
			   s2[8]=0x30; 
            lcdi_send(0x90); 
            for(i=0;i<16;i++) 
                lcdd_send(s2[i]); 
            d_change1(danjia[sh]); 
            change(s1); 
            for(i=0;i<4;i++) 
                s1[i]=shangpin[sh][i]; 
            lcdi_send(0x80); 
            for(i=0;i<16;i++) 
                lcdd_send(s1[i]); 
            d_change1(jine); 
            change(s3); 
            lcdi_send(0x88); 
            for(i=0;i<16;i++) 
                lcdd_send(s3[i]); 
            d_change1(zongjia); 
            change(s4); 
            lcdi_send(0x98); 
            for(i=0;i<16;i++) 
                lcdd_send(s4[i]); 
            lcdi_send(0x98); 
            while(1);  //等待中断
           } 
       } 
} 
//LCD相关子程序
void ini_lcd() //LCD 初始化子程序 
{ 
 lcdi_send(0x30);//功能设定指令
 lcdi_send(0x1); // 总清 
 lcdi_send(0xc);//显示状态
 lcdi_send(0x2); // 光标右移, AC+1 
} 
void lcdd_send(short X) //LCD 发送数据子程序 
{
 chk_busy();  //检测BF是否满
 nop1(); 
 lcd_di=1;	 //端口初始化
 lcd_rw=0;
 lcd_e=1; 
 P0=X; 		 //发送
 for(delay=0;delay<5;delay++);// 延时等待输出完毕
 lcd_e=0; 	//关闭
 X=X; 
 P0=0xff; 	 //使P0口处于可直接输入状态
} 
void lcdi_send(short X) //LCD 发送指令子程序 
{
 chk_busy();   //检测BF是否满
 nop1(); 
 lcd_di=0;	   //端口初始化
 lcd_rw=0;
 lcd_e=1; 
 P0=X; 		   //发送
 for(delay=0;delay<5;delay++);//延时等待输出完毕
 lcd_e=0;
 X=X; 		   //关闭
 P0=0xff;  //使P0口处于可直接输入状态
} 
void chk_busy() 
{
 short i=0xff; 		//定义一个检测变量
 while(i&0x80) 
       {
        lcd_di=0; 	//端口初始化
        lcd_rw=1; 
        lcd_e=1; 
        i=P0; 		//读值
        lcd_e=0; 	//关闭
       } 
} 
//7289子相关程序
void ini_7289()  //7289 初始化子程序
{
 short i; 
 cs7289=1; 
 key7289=1; 
 dio7289=1; 
 for(i=0;i<50;i++) 
     for(delay=0;delay<150;delay++); // 延时 25ms 
 send7289(0xa4); //复位	指令
 cs7289=1; 
} 
void send7289(short X)  //向7289发送数据子程序 
{
 short i,j,k; 
 cs7289=0; 
 for(delay=0;delay<25;delay++); // 延时 50us 
 for(i=7;i>=0;i--) 
    {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -