找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6079|回复: 1
收起左侧

电子秤程序及仿真图 附课程设计报告书

[复制链接]
ID:201652 发表于 2017-5-17 09:14 | 显示全部楼层 |阅读模式
电子秤的程序及仿真图
仿真.jpg 仿真1.jpg 仿真2.jpg 仿真3.jpg
目录
电子技能课程设计报告书......................................................................................... 1
基于AT89C51的数字电子秤的设计...................................................................... 1
1、设计目的......................................................................................................... 1
2、设计的主要内容和要求................................................................................ 1
3、 整体设计方案............................................................................................... 1
3.1设计方案................................................................................................... 1
3.2工作原理................................................................................................... 1
4、 硬件电路的设计........................................................................................... 2
5、软件设计......................................................................................................... 3
5.1主程序设计.............................................................................................. 3
5.2 LM4229液晶显示驱动程序.................................................................. 4
5.3 ADC0832采样程序................................................................................. 5
5.4 4*4键盘程序............................................................................................ 6
6、系统仿真......................................................................................................... 6
7、 使用说明 ..................................................................................................... 9
8、设计总结......................................................................................................... 9
参考文献................................................................................................................ 9
附录A ................................................................................................................ 10
0.png 电子秤总图.jpg 电子秤框图.jpg 流程图1.jpg 总流程图.jpg 流程图4.jpg 流程图3.jpg 流程图2.jpg


单片机源程序如下:
  1. #include<reg51.h>
  2. #include<intrins.h>
  3. #include <absacc.h>
  4. #include <math.h>
  5. #include<lm4229.h>
  6. #define uchar unsigned char
  7. #define uint   unsigned int
  8. sbit ADCS =P3^5;
  9. sbit ADDI =P3^7;  
  10. sbit ADDO =P3^7;  
  11. sbit ADCLK =P3^6;  
  12. uint x1,y1,z1=0,w1;
  13. uchar ad_data,k,n,m,e,num,s;                              //采样值存储
  14. uint temp1;
  15. sbit beep =P3^0;                                          
  16. char press_data;                                  //标度变换存储单元
  17. float  press;
  18. unsigned char ad_alarm,temp;                           //报警值存储单元
  19. unsigned char abc[5]={48,46,48,48,48};
  20. unsigned char price_all[6]={48,48,46,48,48,48};
  21. float price_unit[10]={5.5,2.8,3.6,4.5,5.8,6.8,7.9,8.0,9.5,0};       //商品初始单价
  22. uchar price_danjia[5]={48,46,48,48,48};
  23. float price;
  24. uint price_temp1,price_temp2;                             //商品总价      
  25. uchar Adc0832(unsigned char channel);                                                                                                                        
  26. void alarm(void);
  27. void data_pro(void);
  28. void delay(uint k);
  29. void keyscan();
  30. void disp_init();
  31. void  price_jisuan();
  32. /************
  33. 主函数
  34. ************/
  35. void main(void)
  36. {
  37.    delay(500);                        //系统延时500ms启动
  38.    //ad_data=0;                       //采样值存储单元初始化为0
  39.    lcd_init();                        //显示初始化
  40.    disp_init();                                          //开始进入欢迎界面
  41.    delay(1000);                                                  //延时进入称量画面
  42.    clear_lcd(0,4,40);
  43.    clear_lcd(16,0,100);
  44.    clear_lcd(28,0,40);
  45.    clear_lcd(44,0,100);
  46.    clear_lcd(56,0,40);
  47.    clear_lcd(72,0,100);
  48.    clear_lcd(84,0,40);
  49.    clear_lcd(100,0,100);
  50.    clear_lcd(112,0,40);
  51.    write_lcd(0,8,"实用电子秤");              
  52.         while(1)
  53.     {
  54.            ad_data =Adc0832(0);           //采样值存储单元初始化为0
  55.            alarm();
  56.            data_pro(); //读取重量
  57.            keyscan();  //查询商品种类
  58.            write_lcd(40,0,"------------------------------");
  59.            write_lcd(56,0,"单  价:");
  60.            write_lcd(56,11,price_danjia);
  61.            write_lcd(56,20,"元/千克");
  62.            write_lcd(72,0,"总重量:");
  63.            write_lcd(72,11,abc);
  64.            write_lcd(72,20,"千克");
  65.            write_lcd(88,0,"总  价:");
  66.            price_jisuan();           //计算出价格
  67.            write_lcd(88,10,price_all);
  68.            write_lcd(88,20,"元");
  69.            write_lcd(112,0,"设计学生: 0612201*16 朱珍奇");
  70.         }
  71. }
  72. /************
  73. 读ADC0832函数
  74. ************/

  75. //采集并返回
  76. uchar Adc0832(unsigned char channel)     //AD转换,返回结果
  77. {
  78.      uchar i=0;
  79.     uchar j;
  80.     uint dat=0;
  81.     uchar ndat=0;

  82.     if(channel==0)channel=2;
  83.     if(channel==1)channel=3;
  84.     ADDI=1;
  85.     _nop_();
  86.     _nop_();
  87.     ADCS=0;//拉低CS端
  88.     _nop_();
  89.     _nop_();
  90.     ADCLK=1;//拉高CLK端
  91.     _nop_();
  92.     _nop_();
  93.     ADCLK=0;//拉低CLK端,形成下降沿1
  94.     _nop_();
  95.     _nop_();
  96.     ADCLK=1;//拉高CLK端
  97.     ADDI=channel&0x1;
  98.     _nop_();
  99.     _nop_();
  100.     ADCLK=0;//拉低CLK端,形成下降沿2
  101.     _nop_();
  102.     _nop_();
  103.     ADCLK=1;//拉高CLK端
  104.     ADDI=(channel>>1)&0x1;
  105.     _nop_();
  106.     _nop_();
  107.     ADCLK=0;//拉低CLK端,形成下降沿3
  108.     ADDI=1;//控制命令结束
  109.     _nop_();
  110.     _nop_();
  111.     dat=0;
  112.     for(i=0;i<8;i++)
  113.     {
  114.         dat|=ADDO;//收数据
  115.         ADCLK=1;
  116.         _nop_();
  117.         _nop_();
  118.         ADCLK=0;//形成一次时钟脉冲
  119.         _nop_();
  120.         _nop_();
  121.         dat<<=1;
  122.         if(i==7)dat|=ADDO;
  123.     }  
  124.     for(i=0;i<8;i++)
  125.     {
  126.         j=0;
  127.         j=j|ADDO;//收数据
  128.         ADCLK=1;
  129.         _nop_();
  130.         _nop_();
  131.         ADCLK=0;//形成一次时钟脉冲
  132.         _nop_();
  133.         _nop_();
  134.         j=j<<7;
  135.         ndat=ndat|j;
  136.         if(i<7)ndat>>=1;
  137.     }
  138.     ADCS=1;//拉搞CS端
  139.     ADCLK=0;//拉低CLK端
  140.     ADDO=1;//拉高数据端,回到初始状态
  141.     dat<<=8;
  142.     dat|=ndat;
  143.     return(dat);            //return ad k         
  144. }


  145. void data_pro(void)
  146. {
  147.       unsigned int;                             
  148.           if(0<ad_data<256)                                      
  149.                  {                           
  150.                     int vary=ad_data;                                                                        
  151.                         press=(0.019531*vary);                        
  152.                                                                                                                   
  153.                         temp1=(int)(press*1000);                        //放大1000倍,便于后面的计算
  154.                            abc[0]=temp1/1000+48;                                     //取压力值百位
  155.                         abc[1]=46;
  156.                         abc[2]=(temp1%1000)/100+48;                            //取压力值十位
  157.                         abc[3]=((temp1%1000)%100)/10+48;                    //取压力值个位
  158.                         abc[4]=((temp1%1000)%100)%10+48;                        //取压力值十分位

  159.                       }            
  160.                         
  161. }
  162. /*****************报警子函数*******************/

  163. void alarm(void)
  164. {
  165.          if(ad_data>=256)                        

  166.            beep=0;          //则启动报警
  167.         
  168.           else
  169.                beep=1;                  
  170. }

  171. void delay(uint k)
  172. {
  173.    uint i,j;
  174.    for(i=0;i<k;i++)
  175.     for(j=0;j<100;j++);
  176. }
  177. //开机欢迎界面
  178. void disp_init()
  179. {
  180.    write_lcd(0,8,"欢迎使用电子秤");
  181.    write_lcd(16,0,"------------------------------");
  182.    write_lcd(28,0,"设计学生:朱珍奇");
  183.    write_lcd(44,0,"------------------------------");
  184.    write_lcd(56,0,"班级学号:0612201*16");
  185.    write_lcd(72,0,"------------------------------");
  186.    write_lcd(84,0,"指导老师:龚伦峰");
  187.    write_lcd(100,0,"------------------------------");
  188.    write_lcd(112,0,"设计日期:2009年6月16日");

  189. }


  190. //键盘服务程序
  191. void keyscan()
  192. {
  193.                         P1=0xfe;
  194.                         temp=P1;
  195.                         temp=temp&0xf0;
  196.                         while(temp!=0xf0)
  197.                                 {
  198.                                         delay(5);
  199.                                         temp=P1;
  200.                                         temp=temp&0xf0;
  201.                                         while(temp!=0xf0)
  202.                                         {
  203.                                                 temp=P1;
  204.                                         switch(temp)
  205.                                                 {                                                                                                                                                
  206.                                                         case 0xee:num=1,price=price_unit[0], write_lcd(24,0,"名  称:   杏    仁");
  207.                                                                 break;
  208.                                                         case 0xde:num=2,price=price_unit[1],write_lcd(24,0,"名  称:   李     子");
  209.                                                                 break;
  210.                                                         case 0xbe:num=3,price=price_unit[2],write_lcd(24,0,"名  称:   草     莓");
  211.                                                                 break;
  212.                                                         case 0x7e:num=4,price=price_unit[3],write_lcd(24,0,"名  称:   葡     萄");
  213.                                                                 break;
  214.                                                 }
  215.                                         while(temp!=0xf0)
  216.                                                 {
  217.                                                         temp=P1;
  218.                                                         temp=temp&0xf0;
  219.                                                 }
  220.                                         }
  221.                                 }

  222.                         P1=0xfd;
  223.                         temp=P1;
  224.                         temp=temp&0xf0;
  225.                         while(temp!=0xf0)
  226.                                 {
  227.                                         delay(5);
  228.                                         temp=P1;
  229.                                         temp=temp&0xf0;
  230.                                         while(temp!=0xf0)
  231.                                         {
  232.                                                 temp=P1;
  233.                                         switch(temp)
  234.                                                 {
  235.                                                         case 0xed:num=5,price=price_unit[4],write_lcd(24,0,"名  称:   西     瓜");
  236.                                                                 break;
  237.                                                         case 0xdd:num=6,price=price_unit[5],write_lcd(24,0,"名  称:   苹     果");
  238.                                                                 break;
  239.                                                         case 0xbd:num=7,price=price_unit[6],write_lcd(24,0,"名  称:   雪     梨");
  240.                                                                 break;
  241.                                                         case 0x7d:num=8,price=price_unit[7],write_lcd(24,0,"名  称:   核     桃");
  242.                                                                 break;
  243.                                                 }
  244.                                         while(temp!=0xf0)
  245.                                                 {
  246.                                                         temp=P1;
  247.                                                         temp=temp&0xf0;
  248.                                                 }
  249.                                         }
  250.                                 }


  251.                         P1=0xfb;
  252.                         temp=P1;
  253.                         temp=temp&0xf0;
  254.                         while(temp!=0xf0)
  255.                                 {
  256.                                         delay(5);
  257.                                         temp=P1;
  258.                                         temp=temp&0xf0;
  259.                                         while(temp!=0xf0)
  260.                                         {
  261.                                                 temp=P1;
  262.                                         switch(temp)
  263.                                                 {
  264.                                                         case 0xeb:num=9,price=price_unit[8],write_lcd(24,0,"名  称:   香     蕉");
  265.                                                                 break;
  266.                                                         case 0xdb:num=10,price=price_unit[9],write_lcd(24,0,"名  称:    商品代码");
  267.                                                                 break;
  268.                                                         case 0xbb:num=11,price=price_unit[1];
  269.                                                                 break;
  270.                                                         case 0x7b:num=12,price=price_unit[2];
  271.                                                                 break;
  272.                                                 }
  273.                                         while(temp!=0xf0)
  274.                                                 {
  275.                                                         temp=P1;
  276.                                                         temp=temp&0xf0;
  277.                                                 }
  278.                                         }
  279.                                 }


  280.                         P1=0xf7;
  281.                         temp=P1;
  282.                         temp=temp&0xf0;
  283.                         while(temp!=0xf0)
  284.                                 {
  285.                                         delay(5);
  286.                                         temp=P1;
  287.                                         temp=temp&0xf0;
  288.                                         while(temp!=0xf0)
  289.                                         {
  290. ……………………

  291. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
0.png
所有资料51hei提供下载 带仿真 程序 课程设计报告书:
dfg.rar (1.1 MB, 下载次数: 132)
回复

使用道具 举报

ID:439735 发表于 2018-12-6 22:32 | 显示全部楼层
这个能把程序改成12864液晶屏的程序吗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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