找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2269|回复: 0
打印 上一主题 下一主题
收起左侧

16年山东电赛电子称程序

[复制链接]
跳转到指定楼层
楼主
ID:225587 发表于 2017-8-7 21:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这是16年山东电赛电子称的程序,各方面功能都已经齐全,希望能帮助到大家

所有资料51hei提供下载:
电赛电子称.zip (2.43 KB, 下载次数: 43)

单片机源程序如下:
  1. #include<reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int

  4. sbit ADDO=P3^0;    //51CPU 准双向I/0 输入使能(DOUT)  / 串行数据输出
  5. sbit ADSK=P3^1;    // 使能AD(PD_SCK)   /  串行时钟输入
  6.     sbit RS=P1^1;     //寄存器选择引脚,搞电平选择数据寄存器,低电平选择指令寄存器
  7.     sbit RW=P1^2;    //读写操作使能引脚,高电平使能读操作,低电平使能写操作
  8.     sbit E=P1^3;     //总使能引脚
  9. sbit FMQ=P1^0;           //蜂鸣器

  10. //----------------------AD转换程序--//
  11. unsigned long ReadCount(void)  //无参数,返回长整形变量
  12. {
  13.   unsigned long Count;      //声明长整形变量Count
  14.   unsigned char i;       //声明字符型变量i
  15.   ADSK=0;         //串行输入拉低
  16.   Count=0;       //变量Count置零
  17.   while(ADDO);      //等待串行输出拉高
  18.   for(i=0;i<24;i++)      //接收24个数据和发送24个脉冲
  19.   {         
  20.    ADSK=1;         //发送脉冲
  21.    Count=Count<<1;        //变量左移
  22.    ADSK=0;          //拉低
  23.    if(ADDO)Count++;       //读入数据(高>>低)
  24.   }
  25.   ADSK=1;          //发送第25个脉冲(选择A通道、128增益。)
  26.   Count=Count^0x800000;    //按位相异或
  27.   ADSK=0;       //串行拉低
  28.      return Count; //返回
  29. }  
  30. //--------------------延时子函数--------//
  31. void delay(unsigned char delayata)
  32. {
  33.   uchar i,j;
  34.   for(i=0;i<delayata;i++)
  35.   {
  36.    for(j=0;j<121;j++)
  37.    {;}
  38.   }
  39. }
  40. //-------------------------------------单键扫描子函数-----//
  41. unsigned char JP()
  42. {
  43. unsigned char x=0x00;
  44.   bit i=0;
  45.   x=P2;   //扫描Y坐标
  46.   FMQ=0;    //响起蜂鸣器
  47.   delay(125);  //延时去抖动
  48.   P2=0x0f;
  49.   delay(2);
  50.   x+=P2;    //扫描X坐标
  51.   switch(x)
  52.   {
  53.    case 0xee:x=0x31;break;    //按下1
  54.    case 0xed:x=0x34;break;    //按下4
  55.    case 0xeb:x=0x37;break;    //按下7
  56.    case 0xe7:x=0x46;break;    //按下F         8888
  57.    case 0xde:x=0x32;break;       //按下2/.
  58.    case 0xdd:x=0x35;break;    //按下5
  59.       case 0xdb:x=0x38;break;    //按下8
  60.    case 0xd7:x=0x30;break;    //按下0         
  61.    case 0xbe:x=0x33;break;    //按下3
  62.    case 0xbd:x=0x36;break;    //按下6
  63.    case 0xbb:x=0x39;break;    //按下9
  64.    case 0xb7:x=0x45;break;    //按下E         88888
  65.    case 0x7e:x=0x44;break;    //按下D
  66.    case 0x7d:x=0x43;break;    //按下C
  67.    case 0x7b:x=0x42;break;    //按下B
  68.    case 0x77:x=0x41;break;    //按下A
  69.    default:x=0xff;break;
  70.    }
  71.   FMQ=1;       //关闭蜂鸣器
  72.    while(i==0)    //等待按键松开
  73.    {
  74.     P2=0xf0;
  75.     delay(150);
  76.     if(P2==0xf0)
  77.     {
  78.      i=1;
  79.     }
  80.     else{i=0;}
  81.    }
  82.   return x;    //返回x(ASCII码)
  83. }
  84. //------------------12864写指令子函数-----//
  85. void write_12864com(unsigned char com)
  86. {
  87. RS=0;
  88. RW=0;
  89. delay(1);
  90. E=1;
  91. P0=com;
  92. delay(2);
  93. E=0;
  94. delay(1);
  95. }
  96. //------------------12864写数据子函数-----//
  97. void write_12864dat(unsigned char dat)
  98. {
  99. RS=1;
  100. RW=0;
  101. delay(1);
  102. E=1;
  103. P0=dat;
  104. delay(2);
  105. E=0;
  106. delay(1);
  107. }
  108. //------------------------------LCD初始化-----//
  109. void initinal(void)
  110. {
  111.   delay(100);
  112.   write_12864com(0x30);   //8位并行通信
  113.   delay(1);
  114.   write_12864com(0x30);   //8位并行通信
  115.   delay(1);
  116.   write_12864com(0x02);  
  117.   delay(2);
  118.   write_12864com(0x06);  
  119.   delay(2);
  120.   write_12864com(0x0c);  
  121.   delay(2);
  122.   write_12864com(0x01);  
  123.   delay(2);
  124.   write_12864com(0x80);  
  125.   delay(2);
  126. }
  127. //--------------------主函数-------------//
  128. void main(void)
  129. {
  130.    uchar  LCD[16]={"0123456789ABCDEF"};
  131.    code uchar JM1[]={"地表最强战队"};
  132.    code uchar JM2[]={"单价: 0.0 元    "};
  133.    code uchar JM3[]={"重量: 0000.0克  "};
  134.    code uchar JM4[]={"总价: 0000.0元  "};
  135.    uchar DJ[2];       //单价
  136.    uchar ZL[5];       //重量
  137.    uchar QPZL[5];   //去皮时的重量
  138.    uchar ZJ[5];       //总价
  139.    unsigned long J1;
  140.    uint J2,J3,J6=0;
  141.    bit J5=1;
  142.    uint J7;
  143.    uchar i;
  144.    uchar JM5[]={5679};
  145.    initinal();  //初始化
  146.   for(i=0;i<3;i++)  //填值
  147.   {
  148.    DJ[i]=0;
  149.   }
  150.   for(i=0;i<5;i++)   //填值
  151.   {
  152.    ZL[i]=0;
  153.   }
  154.   for(i=0;i<5;i++)   //填值
  155.   {
  156.    QPZL[i]=0;
  157.   }
  158.   for(i=0;i<5;i++)   //填值
  159.   {
  160.    ZJ[i]=0;
  161.   }
  162.     write_12864com(0x81);  //定位
  163.   for(i=0;i<12;i++)
  164. {
  165.   write_12864dat(JM1[i]);  //显示 第三组电子称
  166. }
  167. write_12864com(0x90);  //定位
  168. for(i=0;i<14;i++)
  169. {
  170.   write_12864dat(JM2[i]);    //显示 单价:00.0元
  171. }
  172. write_12864com(0x88);  //定位
  173. for(i=0;JM3[i]!='\0';i++)
  174. {
  175.   write_12864dat(JM3[i]);  //显示 重量: 00.000KG
  176. }
  177. write_12864com(0x98);    //定位
  178. for(i=0;JM4[i]!='\0';i++)
  179. {
  180.   write_12864dat(JM4[i]);   //显示 总价: 0000.0元
  181. }
  182. P2=0xf0;
  183. while(1)
  184. {
  185.    while(P2==0xf0)      //但没有按键按下的时候进入,有按键按下的时候跳出来
  186.    {
  187.    J1=ReadCount();
  188.      //读AD值
  189.    
  190.    J3=(unsigned int)((float)(J1/43.10+0.05)/1.0288);  //取值

  191.    
  192.      //重量十位,一般为零
  193.    ZL[0]=(J3/10000)%10;       //重量个位 一                                         
  194.    ZL[1]=(J3/1000)%10;     //计算位  百科为
  195.    ZL[2]=(J3/100)%10;                           //市科委
  196.    ZL[3]=(J3/10)%10;                                                //各位
  197.    ZL[4]=J3%10;                                        //小数点后以为

  198.    J7=ZL[4];
  199.    J7+=ZL[3]*10;
  200.    J7+=ZL[2]*100;
  201.    J7+=ZL[1]*1000;
  202.    J7+=ZL[0]*10000;
  203.    
  204.    J3=QPZL[4];
  205.    J3+=QPZL[3]*10;
  206.    J3+=QPZL[2]*100;
  207.    J3+=QPZL[1]*1000;
  208.    J3+=QPZL[0]*10000;
  209.    
  210.    J7-=J3;
  211.    
  212.    ZL[0]=J7/10000;
  213.    J7%=10000;
  214.    ZL[1]=J7/1000;
  215.    J7%=1000;
  216.    ZL[2]=J7/100;
  217.    J7%=100;
  218.    ZL[3]=J7/10;
  219.    J7%=10;
  220.    ZL[4]=J7;
  221.    write_12864com(0x8b); //定位
  222.    
  223.    write_12864dat(LCD[ZL[0]]);    //送显示
  224.    write_12864dat(LCD[ZL[1]]);    //送显示
  225.    write_12864dat(LCD[ZL[2]]);    //送显示
  226.    write_12864dat(LCD[ZL[3]]);    //送显示
  227.    write_12864dat(0x2e);    //送显示
  228.    write_12864dat(LCD[ZL[4]]);    //送显示
  229.    

  230.    J7=DJ[1]*ZL[4];
  231.    J7+=DJ[1]*ZL[3]*10;
  232.    J7+=DJ[1]*ZL[2]*100;
  233.    J7+=DJ[1]*ZL[1]*1000;
  234.    J7+=DJ[1]*ZL[0]*10000;

  235.   

  236.    J7+=DJ[0]*ZL[4]*10;
  237.    J7+=DJ[0]*ZL[3]*100;   
  238.    J7+=DJ[0]*ZL[2]*1000;
  239.    J7+=DJ[0]*ZL[1]*10000;
  240.    J7+=DJ[0]*ZL[0]*100000;

  241. ZJ[0]=J7/10000;
  242. J7%=10000;
  243. ZJ[1]=J7/1000;
  244. J7%=1000;
  245. ZJ[2]=J7/100;
  246. J7%=100;
  247. ZJ[3]=J7/10;
  248. J7%=10;
  249. ZJ[4]=J7;

  250.   write_12864com(0x9b); //定位
  251.   i=ZJ[0];
  252.   i=LCD[i];
  253.   write_12864dat(i);    //送显示
  254.    i=ZJ[1];
  255.   i=LCD[i];
  256.   write_12864dat(i);    //送显示
  257.   
  258.    i=ZJ[2];
  259.   i=LCD[i];
  260.   write_12864dat(i);    //送显示
  261.    write_12864dat(0x2e);   //显示点
  262.    i=ZJ[3];
  263.   i=LCD[i];
  264.   write_12864dat(i);    //送显示

  265.     i=ZJ[4];
  266.   i=LCD[i];
  267.   write_12864dat(i);    //送显示
  268.    P2=0xf0;
  269.    delay(1);
  270.    }
  271.    J2=JP();
  272.    if(J6>1){J6=0;}
  273.    if(J2<0x40)
  274.    {
  275.    J2-=0x30;
  276.    DJ[J6]=J2;
  277.    J2=0xff;
  278.    J6++;
  279.    }
  280.    else
  281.    {
  282. ……………………

  283. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码



评分

参与人数 1黑币 +50 收起 理由
admin + 50 绝世好帖!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表