找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机测速与1602显示程序与电路

  [复制链接]
跳转到指定楼层
楼主
ID:157256 发表于 2016-12-23 23:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STC12C单片机控制
光传感器测速
PWM控制直流电机
下载:
程序 15:28.rar (109.18 KB, 下载次数: 148)


部分代码预览:
  1. #include"mytype.h"  //包含总合的头文件

  2. #define DATA P2    //定义P0口为数据端

  3. //定义按键I/O口
  4. sbit key0=P0^6;                //正反转、停止模式切换按键
  5. sbit key1=P0^7;                //加速按键
  6. sbit key2=P0^2;       
  7. sbit key3=P0^1;        //减速按键
  8. //sbit PWM=P0^0;
  9. //****************
  10. uchar   table2[16]="     _DGUT_     ";//第1行液晶显示
  11. uchar  table1[16]= "000  Chen ZiXing";//第2行液晶显示
  12. uchar  number_table[10]="0123456789";
  13. sbit lcden=P3^2;//液晶使能端
  14. sbit lcdrs=P3^5;//液晶读写控制端
  15. sbit wela=P3^3;
  16. //uchar number;
  17. uchar ge=0,shi=0,bai=0;
  18. //****************
  19. //定义全局变量flag=0,
  20. uchar speed=0,speed1=0;  //正反转的标志位,0停止,1正转,2反转
  21. uint  num;   //定时器1的计数变量
  22. int quan;

  23. void delay(uint z)//延时函数
  24. {
  25.         uint x,y;
  26.         for(x=z;x>0;x--)
  27.                 for(y=310;y>0;y--);
  28. }
  29. void write_com(uchar com)//液晶写地址函数
  30. {
  31.         lcdrs=0;
  32.         P2=com;
  33.         delay(5);
  34.         lcden=1;
  35.         delay(5);
  36.         lcden=0;
  37. }
  38. void write_data(uchar date)//液晶写数据函数
  39. {
  40.         lcdrs=1;
  41.         P2=date;
  42.         delay(5);
  43.         lcden=1;
  44.         delay(5);
  45.         lcden=0;
  46. }
  47. void init()//液晶初始化函数
  48. {

  49.         wela=0;
  50.         lcden=0;
  51.         write_com(0x38);
  52.         write_com(0x0c);
  53.         write_com(0x06);
  54.         write_com(0x01);
  55. }
  56. void Lcd_display()//液晶显示函数,主要是刷新转速专用
  57. {
  58.         uint i;
  59.         table1[0]=number_table[bai];
  60.         table1[1]=number_table[shi];
  61.         table1[2]=number_table[ge];

  62.         write_com(0x80+0x40);
  63.         for(i=0;i<3;i++)
  64.         {
  65.                  write_data(table1[i]);
  66.                 delay(1);
  67.         }
  68. }
  69. void main()
  70. {        
  71.        
  72.         uchar number;
  73.         time_init();    //定时器初始化
  74.         PWM_Init();     //PWM初始化       
  75.         UART1_Init(9600);//串口初始化
  76.         DATA=0x00;      //数据端初始化为0
  77.         init();

  78.         write_com(0x80);
  79.         for(number=0;number<16;number++)
  80.         {
  81.                 write_data(table2[number]);
  82.                 delay(10);
  83.          }
  84.          write_com(0x80+0x40);
  85.          for(number=0;number<16;number++)
  86.          {
  87.                  write_data(table1[number]);
  88.                 delay(10);
  89.         }
  90.        
  91.         PWM_SET(46,0);//进去先让电机速度为零
  92.        
  93.         while(1)
  94.          {
  95.                  keyscan();                                                        //按键扫描                   
  96.                  
  97.         /******用定时器1计算时间,每1秒算一次速度直接显示*******/
  98.                  if(num>=20)//num 是T1计数器计数变量,numG=20时为1秒
  99.                  {
  100.                          TR0=0;TR1=0;//关定时器0/1中断
  101.                          
  102.                                  num=0;//计数变量清零
  103.                          
  104.                                  ge=quan%10;quan=quan/10;
  105.                                  shi=quan%10;quan=quan/10;
  106.                                  bai=quan%10;

  107.                                  Lcd_display();        //LCD显示控制                         
  108.                                  quan=0;//圈数记录清零
  109.                                 TR1=1;TR0=1;        //开定时器0/1中断
  110.                  }

  111.         /*******************************************************************/
  112.                           
  113.          }

  114. }

  115. void time_init()
  116. {
  117.   TMOD=0x15;               //设置定时器0为计数模式,定时器1为定时模式,都为工作方式1
  118.         TH0=(65536-1)/256;     
  119.         TL0=(65536-1)%256;
  120.         TH1=(65536-45872)/256;
  121.         TL1=(65536-45872)%256;       
  122.         ET0=1;                                        //开定时器0中断
  123.         TR0=1;                                        //启动定时器0
  124.         ET1=1;                                        //开定时器1中断
  125.         TR1=1;                                        //启动定时器1   
  126.         EA=1;                                 //开启总中断
  127. }

  128. //*************************************************************//
  129. //函数:keyscan()
  130. //功能:实现按键扫描、同时控制电机速度
  131. //
  132. //////********************************************************//
  133. void keyscan()
  134. {
  135.         if(key0==0||key1==0||key2==0)
  136.         {
  137.                 delay_ms(10);//延时去抖
  138.                 if(key0==0)
  139.                 {
  140.                         UART1_SendStr("a");
  141.                        
  142.                         if(speed<9)speed++;
  143.        else if(speed1<9){speed=0;speed1++;}
  144. //                        else speed=9;
  145.                         PWM_SET(speed1*10+speed,0);
  146.                         while(!key0);
  147.                 }
  148.                 else if(key1==0)
  149.                 {
  150.                                 UART1_SendStr("q");
  151.                                 if(speed>0)speed--;
  152.                           else if (speed1>0){speed1--;speed=9;}
  153.                         PWM_SET(speed1*10+speed,0);
  154.                                 while(!key1);
  155.      }
  156.                 else if(key2==0)
  157.                 {
  158.                                 UART1_SendStr("key2");
  159.                                 while(!key2);
  160.      }
  161.                           write_com(0x80);
  162.                  write_data(number_table[speed1]);        
  163.                  write_data(number_table[speed]);
  164.         }
  165. }

  166. void T0_time() interrupt 1 //外部中断0函数,记录红外对管脉冲高个数,quan就是脉冲个数发,也是圈数
  167. {
  168.         TH0=(65536-1)/256;      //设置初值,每计数1就溢出
  169.         TL0=(65536-1)%256;
  170.         quan++;
  171. }

  172.                
  173. void T1_time() interrupt 3 //定时器1函数,定时计算一秒的时间,num==20的时候就是1秒
  174. {
  175.         TH1=(65536-45872)/256;        //设置初值,每计数15872就溢出
  176.         TL1=(65536-45872)%256;
  177.         num++;
  178. //if(num%speed==0)PWM=~PWM;        //累加溢出次数,40次为1秒,晶振为22.1184(20次为1秒,晶振为11.0592)
  179. }

  180. void delay_ms(int xms)   //延时函数,单位为ms
  181. {
  182.         uchar m;
  183.         uint n;
  184.         for(n=0;n<xms;n++)
  185.                 for(m=0;m<110;m++);
  186. }

复制代码


评分

参与人数 4黑币 +56 收起 理由
旧城以西的故事 + 3 赞一个!
此用户名已注册 + 2 很给力!
yuxiaogang + 1 赞一个!
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:157262 发表于 2016-12-23 23:45 | 只看该作者
STC12C单片机控制  正是我想要的,谢谢
回复

使用道具 举报

板凳
ID:161244 发表于 2017-1-11 04:32 | 只看该作者
不错 谢谢分享
回复

使用道具 举报

地板
ID:160782 发表于 2017-1-11 07:59 来自手机 | 只看该作者
谢谢,先收下了!辛苦!
回复

使用道具 举报

5#
ID:161155 发表于 2017-1-11 11:01 | 只看该作者
谢谢不错不错
回复

使用道具 举报

6#
ID:106627 发表于 2017-1-26 13:44 | 只看该作者
谢谢楼主分享!!!!!!
回复

使用道具 举报

7#
ID:211103 发表于 2017-6-20 21:47 | 只看该作者
失望,下载完才发现没有仿真图
回复

使用道具 举报

8#
ID:211103 发表于 2017-6-20 21:47 | 只看该作者
失望,下载完才发现没有仿真图
回复

使用道具 举报

9#
ID:225166 发表于 2017-8-6 12:03 | 只看该作者
谢谢分享
回复

使用道具 举报

10#
ID:223453 发表于 2017-8-7 16:49 | 只看该作者
没有仿真图
回复

使用道具 举报

11#
ID:225554 发表于 2017-8-7 18:08 | 只看该作者

谢谢,先收下了!很快就要用到了!
回复

使用道具 举报

12#
ID:147659 发表于 2018-4-9 18:21 | 只看该作者
正想做个小车 ,  有仿真更好了
回复

使用道具 举报

13#
ID:313702 发表于 2018-4-28 09:35 | 只看该作者
谢谢分享
回复

使用道具 举报

14#
ID:409197 发表于 2018-10-13 22:09 | 只看该作者
这不是51单片机吗
回复

使用道具 举报

15#
ID:400245 发表于 2019-11-9 00:10 | 只看该作者
牛逼大佬的作为
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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