找回密码
 立即注册

QQ登录

只需一步,快速开始

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

我做的单片机步进电机和lcd显示温度传感器和AD值

[复制链接]
跳转到指定楼层
楼主
ID:419409 发表于 2018-11-2 16:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
LCD1602液晶+步进电机+18B20+矩阵键盘+电位计AD值。考核内容,矩阵键盘(1,1)步进电机启动(1.2)步进电机加速(1.3)步进电机二倍速(1.4)步进电机停止。
(2.1)控制LCD1602(2.2)LCD1602液晶循环显示两个传感器采集的数据。

单片机源程序如下:
  1. /*******************************************************************************
  2. *                 
  3. *                                        普中科技
  4. --------------------------------------------------------------------------------
  5. * 实 验 名                 : 18B20温度显示试验
  6. * 实验说明       : LCD1602显示温度值。
  7. * 连接方式       : 见连接图
  8. * 注    意                 :
  9. *******************************************************************************/

  10. #include<reg51.h>
  11. #include"lcd.h"
  12. #include"temp.h"
  13. #include"XPT2046.h"
  14. void LcdDisplay(int);
  15. void datapros();
  16. typedef unsigned int u16;          
  17. typedef unsigned char u8;



  18. sbit MOTOA = P1^0;
  19. sbit MOTOB = P1^1;
  20. sbit MOTOC = P1^2;
  21. sbit MOTOD = P1^3;

  22. #define SPEED1 200
  23. #define SPEED2 250
  24. #define SPEED3 400
  25. #define GPIO_KEY P3
  26. #define GPIO_DIG P0       

  27. u8 KeyValue;
  28. void delay(u16 i)
  29. {
  30.         while(i--);       
  31. }



  32. void KeyDown(void)
  33. {
  34.         char a=0;
  35.         GPIO_KEY=0x0f;
  36.         if(GPIO_KEY!=0x0f)//读取按键是否按下
  37.         {
  38.                 delay(1000);//延时10ms进行消抖
  39.                 if(GPIO_KEY!=0x0f)//再次检测键盘是否按下
  40.                 {       
  41.                         //测试列
  42.                         GPIO_KEY=0X0F;
  43.                         switch(GPIO_KEY)
  44.                         {
  45.                                 case(0X07):        KeyValue=0;break;
  46.                                 case(0X0b):        KeyValue=1;break;
  47.                                 case(0X0d): KeyValue=2;break;
  48.                                 case(0X0e):        KeyValue=3;break;
  49.                         }
  50.                         //测试行
  51.                         GPIO_KEY=0XF0;
  52.                         switch(GPIO_KEY)
  53.                         {
  54.                                 case(0X70):        KeyValue=KeyValue;break;
  55.                                 case(0Xb0):        KeyValue=KeyValue+4;break;
  56.                                 case(0Xd0): KeyValue=KeyValue+8;break;
  57.                                 case(0Xe0):        KeyValue=KeyValue+12;break;
  58.                         }
  59.                         while((a<50)&&(GPIO_KEY!=0xf0))         //检测按键松手检测
  60.                         {
  61.                                 delay(1000);
  62.                                 a++;
  63.                         }
  64.                 }
  65.         }
  66. }



  67. /*******************************************************************************
  68. * 函数名         : main
  69. * 函数功能                   : 主函数
  70. * 输入           : 无
  71. * 输出                  : 无
  72. *******************************************************************************/

  73. void main()
  74. {
  75.         LcdInit();        //初始化LCD1602
  76.         P1=0X00;


  77.            while(1)
  78.         {       
  79.                 KeyDown();                   //按键判断函数
  80.                  while( KeyValue==0 )
  81.                 {       
  82.                   MOTOA = 1;
  83.                  MOTOB = 0;
  84.                  MOTOC = 1;
  85.                  MOTOD = 1;
  86.                  delay(SPEED1);

  87.                  MOTOA = 1;
  88.                    MOTOB = 1;
  89.                  MOTOC = 1;
  90.                  MOTOD = 0;
  91.                  delay(SPEED1);

  92.                  MOTOA = 0;
  93.                  MOTOB = 1;
  94.                  MOTOC = 1;
  95.                  MOTOD = 1;
  96.                  delay(SPEED1);

  97.                  MOTOA = 1;
  98.                  MOTOB = 1;
  99.                  MOTOC = 0;
  100.                  MOTOD = 1;
  101.                  delay(SPEED1);
  102.                           break;
  103.                 }
  104.                 while( KeyValue==1 )
  105.                 {       
  106.                  MOTOA = 1;
  107.                     MOTOB = 0;
  108.                  MOTOC = 1;
  109.                  MOTOD = 1;
  110.                  delay(SPEED2);

  111.                  MOTOA = 1;
  112.                  MOTOB = 1;
  113.                  MOTOC = 1;
  114.                  MOTOD = 0;
  115.                  delay(SPEED2);

  116.                  MOTOA = 0;
  117.                  MOTOB = 1;
  118.                  MOTOC = 1;
  119.                  MOTOD = 1;
  120.                  delay(SPEED2);

  121.                  MOTOA = 1;
  122.                  MOTOB = 1;
  123.                  MOTOC = 0;
  124.                  MOTOD = 1;
  125.                  delay(SPEED2);
  126.                            break;
  127.                 }
  128.                 while( KeyValue==2 )
  129.                 {       
  130.                  MOTOA = 1;
  131.                  MOTOB = 0;
  132.                  MOTOC = 1;
  133.                  MOTOD = 1;
  134.                  delay(SPEED3);

  135.                 MOTOA = 1;
  136.                 MOTOB = 1;
  137.                 MOTOC = 1;
  138.                 MOTOD = 0;
  139.                 delay(SPEED3);

  140.                 MOTOA = 0;
  141.                 MOTOB = 1;
  142.                 MOTOC = 1;
  143.                 MOTOD = 1;
  144.                 delay(SPEED3);

  145.                 MOTOA = 1;
  146.                 MOTOB = 1;
  147.                 MOTOC = 0;
  148.                 MOTOD = 1;
  149.                 delay(SPEED3);
  150.                           break;
  151.                  }
  152.                 while(KeyValue==3)
  153.                 {
  154.                  P1=0X00;
  155.                           break;
  156.                 }
  157.                 while(KeyValue==4)
  158.                 {
  159.                  LcdWriteCom(0x88);        //写地址 80表示初始地址
  160.              LcdWriteData('C');
  161.                  LcdDisplay(Ds18b20ReadTemp());
  162.                  Delay1ms(1000);
  163.                
  164.                       break;
  165.                 }
  166.                 while(KeyValue==5)
  167.                 {
  168.                
  169.                   P1=0X00;
  170.                  
  171.                  
  172.                   datapros();
  173.                
  174.                       break;
  175.                 }
  176.        
  177.         }               
  178. }

  179. /*******************************************************************************
  180. * 函数名         : LcdDisplay()
  181. * 函数功能                   : LCD显示读取到的温度
  182. * 输入           : v
  183. * 输出                  : 无
  184. *******************************************************************************/

  185. void LcdDisplay(int temp)          //lcd显示温度
  186. {
  187.    
  188.           unsigned char datas[] = {0, 0, 0, 0, 0}; //定义数组
  189.         float tp;  
  190.         if(temp< 0)                                //当温度值为负数
  191.           {
  192.                   LcdWriteCom(0x80);                //写地址 80表示初始地址
  193.             LcdWriteData('-');                  //显示负
  194.                 //因为读取的温度是实际温度的补码,所以减1,再取反求出原码
  195.                 temp=temp-1;
  196.                 temp=~temp;
  197.                 tp=temp;
  198.                 temp=tp*0.0625*100+0.5;       
  199.                 //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
  200.                 //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就
  201.                 //算由?.5,还是在小数点后面。

  202.           }
  203.         else
  204.           {                       
  205.                   LcdWriteCom(0x80);                //写地址 80表示初始地址
  206.             LcdWriteData('+');                 //显示正
  207.                 tp=temp;//因为数据处理有小数点所以将温度赋给一个浮点型变量
  208.                 //如果温度是正的那么,那么正数的原码就是补码它本身
  209.                 temp=tp*0.0625*100+0.5;       
  210.                 //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
  211.                 //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就
  212.                 //算加上0.5,还是在小数点后面。
  213.         }
  214.         datas[0] = temp / 10000;
  215.         datas[1] = temp % 10000 / 1000;
  216.         datas[2] = temp % 1000 / 100;
  217.         datas[3] = temp % 100 / 10;
  218.         datas[4] = temp % 10;

  219.         LcdWriteCom(0x82);                  //写地址 80表示初始地址
  220.         LcdWriteData('0'+datas[0]); //百位

  221.        
  222.         LcdWriteCom(0x83);                 //写地址 80表示初始地址
  223.         LcdWriteData('0'+datas[1]); //十位

  224.         LcdWriteCom(0x84);                //写地址 80表示初始地址
  225.         LcdWriteData('0'+datas[2]); //个位

  226.         LcdWriteCom(0x85);                //写地址 80表示初始地址
  227.         LcdWriteData('.');                 //显示 ‘.’

  228.         LcdWriteCom(0x86);                 //写地址 80表示初始地址
  229.         LcdWriteData('0'+datas[3]); //显示小数点  

  230.         LcdWriteCom(0x87);                 //写地址 80表示初始地址
  231.         LcdWriteData('0'+datas[4]); //显示小数点  
  232. }


  233. /*******************************************************************************
  234. * 函数名         :datapros()
  235. * 函数功能                 :数据处理函数
  236. * 输入           : 无
  237. * 输出                  : 无
  238. *******************************************************************************/
  239. void datapros()
  240. {

  241.         unsigned char datas2[] = {0, 0, 0, 0, }; //定义数组
  242.         u16 temp;
  243.         static u8 i;
  244.         if(i==50)
  245.         {
  246.                 i=0;
  247.                 temp = Read_AD_Data(0xE4);                //   AIN3 外部输入
  248.         }
  249.         i++;
  250.         datas2[0] = temp / 1000;
  251.         datas2[1] = temp % 10000 / 100;
  252.         datas2[2] = temp % 1000 / 10;
  253.         datas2[3] = temp % 1000 % 100%10;
  254.        
  255.        
  256.         LcdWriteCom(0x82);                  //写地址 80表示初始地址
  257.         LcdWriteData('0'+datas2[0]); //百位

  258.        
  259.         LcdWriteCom(0x83);                 //写地址 80表示初始地址
  260.         LcdWriteData('0'+datas2[1]); //十位

  261.         LcdWriteCom(0x84);                //写地址 80表示初始地址
  262.         LcdWriteData('0'+datas2[2]); //个位


  263.         LcdWriteCom(0x85);                 //写地址 80表示初始地址
  264.         LcdWriteData('0'+datas2[3]); //显示小数点  

  265.         LcdWriteCom(0x86);                 //写地址 80表示初始地址
  266.         LcdWriteData('0'+datas2[4]); //显示小数点         
  267. }
复制代码

所有资料51hei提供下载:
LCD显示AD和温度传感器.zip (62.81 KB, 下载次数: 22)



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

使用道具 举报

沙发
ID:1 发表于 2018-11-2 16:32 | 只看该作者
楼主能分享下原理图吗?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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