找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6983|回复: 11
收起左侧

单片机液体流量计仿真与源码 LCD1602显示

  [复制链接]
ID:315604 发表于 2018-4-24 19:13 | 显示全部楼层 |阅读模式
测水流量的~
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0.png 0.png

单片机源程序如下:
  1. #include<REG52.h>
  2. #include <intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. uchar temp_1[]={"00.00M3/H 000.0L"};        //显示第一行       
  6. uchar temp_2[]={"SI:0.0L         "};        //显示第2行
  7.                                                                                                                                                                                                                                                                                                          
  8. sbit k1=P2^0;//按键定义 分别4个开关
  9. sbit k2=P2^1;
  10. sbit k3=P2^2;

  11. uint liuliang; //变量定义
  12. uint shudu;
  13. uint M1;
  14. uint M2;
  15. uchar TEMP=01;




  16. //Port Definitions**********************************************************
  17. sbit LcdRs                = P1^0;
  18. sbit LcdRw                = P1^1;
  19. sbit LcdEn          = P1^2;
  20. sfr  DBPort         = 0x80;                //P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口


  21. void delay(uint z)
  22. {
  23.    uint a,b;
  24.    for(a=z;a>0;a--)
  25.      for(b=120;b>0;b--);
  26. }


  27. //内部等待函数**************************************************************************
  28. unsigned char LCD_Wait(void)
  29. {
  30.         LcdRs=0;
  31.         LcdRw=1;        _nop_();
  32.         LcdEn=1;        _nop_();                                         
  33.         LcdEn=0;
  34.         return DBPort;               
  35. }
  36. //向LCD写入命令或数据************************************************************
  37. #define LCD_COMMAND                        0      // Command
  38. #define LCD_DATA                        1      // Data
  39. #define LCD_CLEAR_SCREEN        0x01      // 清屏
  40. #define LCD_HOMING                  0x02      // 光标返回原点
  41. void LCD_Write(bit style, unsigned char input)
  42. {
  43.         LcdEn=0;
  44.         LcdRs=style;
  45.         LcdRw=0;                _nop_();
  46.         DBPort=input;        _nop_();//注意顺序
  47.         LcdEn=1;                _nop_();//注意顺序
  48.         LcdEn=0;                _nop_();
  49.         LCD_Wait();       
  50. }

  51. //设置显示模式************************************************************
  52. #define LCD_SHOW                        0x04    //显示开
  53. #define LCD_HIDE                        0x00    //显示关          

  54. #define LCD_CURSOR                        0x02         //显示光标
  55. #define LCD_NO_CURSOR                0x00    //无光标                     

  56. #define LCD_FLASH                        0x01    //光标闪动
  57. #define LCD_NO_FLASH                0x00    //光标不闪动

  58. void LCD_SetDisplay(unsigned char DisplayMode)
  59. {
  60.         LCD_Write(LCD_COMMAND, 0x08|DisplayMode);       
  61. }

  62. //设置输入模式************************************************************
  63. #define LCD_AC_UP                        0x02
  64. #define LCD_AC_DOWN                        0x00      // default

  65. #define LCD_MOVE                        0x01      // 画面可平移
  66. #define LCD_NO_MOVE                        0x00      //default

  67. void LCD_SetInput(unsigned char InputMode)
  68. {
  69.         LCD_Write(LCD_COMMAND, 0x04|InputMode);
  70. }

  71. //初始化LCD************************************************************
  72. void LCD_Initial()
  73. {
  74.         LcdEn=0;
  75.         LCD_Write(LCD_COMMAND,0x38);           //8位数据端口,2行显示,5*7点阵
  76.         delay(5);
  77.         LCD_Write(LCD_COMMAND,0x38);
  78.         delay(5);
  79.         LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR);    //开启显示, 无光标
  80.         delay(5);
  81.         LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);   //清屏
  82.         delay(5);
  83.         LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE);       //AC递增, 画面不动
  84.         delay(5);
  85. }

  86. //液晶字符输入的位置************************
  87. void GotoXY(unsigned char x, unsigned char y)
  88. {
  89.         if(y==0)
  90.                 LCD_Write(LCD_COMMAND,0x80|x);
  91.         if(y==1)
  92.                 LCD_Write(LCD_COMMAND,0x80|(x-0x40));
  93. }

  94. //将字符输出到液晶显示
  95. void Print(unsigned char *str)
  96. {
  97.         while(*str!='\0')
  98.         {
  99.                 LCD_Write(LCD_DATA,*str);
  100.                 str++;
  101.                 delay(1);
  102.         }
  103. }


  104. void key()// 按键检测
  105. {

  106.          if(k1==0)//设置预置数加
  107.   {
  108.    delay(5);
  109.    if(k1==0)//清零
  110.    {
  111.                                 M2=0;
  112.                                
  113.    while(k1==0);
  114.    }
  115.   }
  116.                
  117.                
  118.   if(k2==0)//设置预置数加
  119.   {
  120.    delay(5);
  121.    if(k2==0)
  122.    {
  123.    TEMP+=1;
  124.    if(TEMP>=99)
  125.    TEMP=99;
  126.    while(k2==0);
  127.    }
  128.   }
  129.    if(k3==0)//设置预置数减
  130.   {
  131.    delay(5);
  132.    if(k3==0)
  133.    {
  134.    if(TEMP>=1)
  135.    TEMP-=1;
  136.    else
  137.    TEMP=0;
  138.   while(k3==0);
  139.    }
  140.   }
  141.   

  142. }


  143. main()
  144. {

  145. EX0=1;//开外部中断0
  146. PX0=1;// 外部中断0高优先级
  147. IT0=1;//触发模式0= 电平 1=边沿触发
  148.         TMOD = 0x11;
  149. ET1=1;
  150.         TR1=1;

  151.         TH1 = (65535-50000)/256;
  152.         TL1 = (65535-50000)%256;
  153.         EA=1;                                                                               

  154. LCD_Initial();    //液晶初始化
  155. while(1)
  156. {
  157.    key();// 按键检测
  158.                        

  159.                         liuliang=M2*TEMP;

  160.    temp_1[0]=shudu/1000+0x30;//转换成液晶字符下同
  161.    temp_1[1]=shudu/100%10+0x30;
  162.    temp_1[3]=shudu/10%10+0x30;
  163.                  temp_1[4]=shudu%10+0x30;
  164.   
  165.    temp_1[10]=liuliang/1000+0x30;
  166.    temp_1[11]=liuliang/100%10+0x30;
  167.    temp_1[12]=liuliang/10%10+0x30;
  168.    temp_1[14]=liuliang%10+0x30;
  169.                
  170.    temp_2[3]=TEMP/10+0x30;
  171.    temp_2[5]=TEMP%10+0x30;

  172.        
  173.                
  174.    GotoXY(0,0);//显示起始位置   Y=0,第一行,Y=1 第二行//显示第一行
  175.    Print(temp_1);// 内容
  176.    GotoXY(0,1);//显示起始位置   Y=0,第一行,Y=1 第二行//显示第一行
  177.    Print(temp_2);// 内容

  178. }

  179. }
  180.        


  181. void my_INT0(void) interrupt 0
  182. {
  183.         M1++;
  184.         M2++;
  185. ……………………

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

所有资料51hei提供下载:
LCD液体流量计.zip (104.7 KB, 下载次数: 298)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:91580 发表于 2018-5-30 16:14 | 显示全部楼层
这种应用我也想做一个,净水器出水流量控制器。
回复

使用道具 举报

ID:343842 发表于 2018-6-10 16:15 | 显示全部楼层
请问SI代表什么,求回复
回复

使用道具 举报

ID:343842 发表于 2018-6-10 16:15 | 显示全部楼层
请问SI代表什么,求回复
回复

使用道具 举报

ID:387950 发表于 2018-9-9 19:39 | 显示全部楼层
多谢了..
回复

使用道具 举报

ID:429356 发表于 2019-2-22 15:41 | 显示全部楼层
信号空接了那个呢?能说一下吗?
回复

使用道具 举报

ID:601329 发表于 2019-10-26 11:31 | 显示全部楼层
你用的流量传感器是什么型号的
回复

使用道具 举报

ID:947182 发表于 2021-7-25 11:11 | 显示全部楼层
代码中si代表着什么意思
回复

使用道具 举报

ID:627828 发表于 2023-9-28 10:06 | 显示全部楼层

代码中si代表着什么意思
回复

使用道具 举报

ID:1111058 发表于 2024-2-17 18:44 | 显示全部楼层
xiaoguaishouya 发表于 2018-6-10 16:15
请问SI代表什么,求回复

信号完整性
回复

使用道具 举报

ID:1111058 发表于 2024-2-17 18:45 | 显示全部楼层
jack丶 发表于 2023-9-28 10:06
代码中si代表着什么意思

信号完整系性
回复

使用道具 举报

ID:1064915 发表于 2024-2-18 08:40 | 显示全部楼层
shudu=TEMP*M1*12*0.06*100/10;
没有说明
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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