找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机按键控制是成功的?怎么样把按键控制,换为串口控制,求指导

[复制链接]
跳转到指定楼层
楼主
ID:858009 发表于 2021-5-6 16:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. #include <reg51.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. code tabup[]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};
  5. code tabdowm[]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01};
  6. void delay(uint z);
  7. int i;
  8. sbit S2=P3^0;
  9. sbit S3=P3^1;
  10. sbit S4=P3^2;
  11. keyval=0;
  12. void moveup()                //正转
  13. {
  14.         for(i=0;i<8;i++)
  15.         {
  16.                 P1=tabup[i];
  17.                 delay(1);
  18.         }
  19. }
  20. void movedowm()              //反转
  21. {
  22.         for(i=0;i<8;i++)
  23.         {
  24.                 P1=tabdowm[i];
  25.                 delay(1);
  26.         }
  27. }
  28. void delay (uint z)
  29. {
  30.         uint x,y;
  31.         for(x=z;x>0;x--)
  32.         for(y=110;y>0;y--);
  33. }
  34. void stop()
  35. {
  36.         P1=0xff;
  37. }
  38. void main(void)           
  39. {
  40.    TMOD=0x01;               //使用定时器T0的模式1
  41.    TR0=0;                   //给定时器T0赋初值并关闭T0
  42.    TH0=(65536-500)/256;     //定时器TH0赋初值为500
  43.    TL0=(65536-500)%256;     //定时器TL0赋初值为500
  44.    EA=1;                    //开总中断
  45.    ET0=1;                   //定时器T0中断允许
  46.    TR0=1;                   //启动定时器T0,这里必须要启动,因为大循环里                  
  47.    while(1)                 //要给keyval赋值,而赋值语句在中断服务函数里
  48.    {                  
  49.        switch(keyval)           //根据按键值keyval选择待执行的功能
  50.        {
  51.             case 1:moveup();  break;  //按键S1按下,正转                                          
  52.             case 2:movedowm(); break;  //按键S2按下,反转                                          
  53.             case 3:stop();     break;  //按键S3按下,停转                                                                                   
  54.        }                        
  55.    }
  56. }
  57. /*************************************************
  58. 函数功能:定时器T0的中断服务子程序
  59. **************************************************/
  60. void Time0_serve(void) interrupt 1  
  61. {
  62.    TH0=(65536-200)/256;         //定时器T0的高8位赋初值
  63.    TL0=(65536-200)%256;         //定时器T0的低8位赋初值
  64.    if((P3&0xff)!=0xff)          //检测是否有按键按下
  65.        {
  66.             delay(50);            //延时一段时间再去检测
  67.             if((P3&0xff)!=0xff)   //再次检测是否确实有按键按下
  68.             {
  69.                 if(S2==0)        //按键S1被按下
  70.                 keyval=1;        //给keyval赋值
  71.                 if(S3==0)        //按键S2被按下
  72.                 keyval=2;        //给keyval赋值
  73.                 if(S4==0)        //按键S3被按下
  74.                 keyval=3;        //给keyval赋值                                    
  75.             }
  76.        }
  77. }
复制代码
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:648281 发表于 2021-5-6 18:05 | 只看该作者
你好!
增加串口部分的程序,串口接收的时候赋值;

       keyval = SBUF;

       switch(keyval)           //根据按键值keyval选择待执行的功能
       {
            case 1:moveup();  break;      //按键S1按下,正转
            case 2:movedowm(); break;  //按键S2按下,反转                                          
            case 3:stop();     break;        //按键S3按下,停转
       }                        
回复

使用道具 举报

板凳
ID:889094 发表于 2021-5-6 21:49 | 只看该作者
想要串口控制,首先要启动串口,串口初始化,设置波特率,然后串口中断处理函数中可以用楼上的这一句:   keyval = SBUF;
然后你需要有一个串口连接,串口发送的上位机或是其它单片机来发送你想要的控制指令
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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