找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3283|回复: 2
收起左侧

单片机程序问题 一个按键按一下,然后串口显示01,再按下为02

[复制链接]
ID:467518 发表于 2019-1-20 00:53 | 显示全部楼层 |阅读模式
以下是我编写的一个程序,目的是让单片机一个按键按一下,然后串口显示01,再按下为02,但是我写的这个程烧录到单片机上的时候一直按那个按键,单片机串口一直都显示01,从来都不变,有没有大佬帮忙看一下为什么呀

单片机代码:
  1. #include"reg52.h"
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit key=P3^1;

  5. uchar key_count;

  6. //串口初始化
  7. void UARTInit()
  8. {
  9.         EA = 1;        //打开总中断
  10.         ES = 1; //打开串口中断
  11.         SM0 = 0;        
  12.     SM1 = 1;//串口工作方式1,8位UART波特率可变
  13.         REN = 1;//串口允许接收
  14.         TR1 = 1;//启动定时器1
  15.         TMOD |= 0x20;//定时器1,工作模式2 8位自动重装
  16.         TH1 = 0xfd;
  17.         TL1 = 0xfd;//设置比特率9600
  18. }

  19. uchar  code duan[]={
  20. 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
  21. 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,
  22. 0x79,0x71};

  23. void  delayms(uint xms)//此为延时函数,就是前面的延时都是需要调用这一个函数
  24. {
  25.     uint  i,j;
  26.     for(i=xms;i>0;i--)
  27.       for(j=110;j>0;j--);
  28. }

  29.   void  keyscan()
  30.   {
  31.     key=1;
  32.     if(key==0)
  33.     {
  34.      delayms(50);
  35.     if(key==0)
  36.     {
  37.       key_count++;
  38.      if(key_count==10)
  39.        key_count=0;
  40.      while(!key);
  41.      }
  42.       }
  43.   }


  44.   void timer0Init()
  45. {
  46.         EA = 1;        //打开总中断
  47.         ET0 = 1;//打开定时器0中断
  48.         TR0 = 1;         //启动定时器0
  49.         REN = 1;//允许串口接收
  50.         TMOD |= 0X01; //定时器工作模式1,16位定时模式
  51.         TH0 = 0xED;
  52.         TL0 = 0xFF; //定时5ms
  53. }


  54. void  main()
  55. {
  56.   timer0Init();//定时器0初始化
  57.         UARTInit();//串口初始
  58.     keyscan();
  59.     while(1);

  60. }

  61. //定时器0中断函数
  62. void timer0() interrupt 1
  63. {
  64.         TH0 = 0xED;
  65.         TL0 = 0xFF; //定时5ms
  66.         
  67. }
  68. //串口中断函数
  69. void UART() interrupt 4
  70. {
  71.         uchar temp;
  72.         if(RI)//判断接收是否完成
  73.         {
  74.                 key_count = SBUF;//读SBUF,读出串口接收到的数据
  75.                 RI = 0;//软件清零接收标志位        
  76.                 temp = key_count;//
  77.                 SBUF = ++temp;//写SBUF,把要发送的数据送给发送缓存器
  78.         }
  79.         if(TI)//判断是否发送完成
  80.                 TI = 0;//清零发送完成标志位        
  81. }
复制代码


回复

使用道具 举报

ID:467518 发表于 2019-1-20 13:52 | 显示全部楼层
wulin 发表于 2019-1-20 08:21
如果只需要串口发送不需要串口接收就不必开串口接收中断。你的主要问题是按键扫描程序放在主循环外了。给你 ...

嗯嗯,这样可以实现了,非常感谢了
回复

使用道具 举报

ID:213173 发表于 2019-1-20 08:21 | 显示全部楼层
如果只需要串口发送不需要串口接收就不必开串口接收中断。你的主要问题是按键扫描程序放在主循环外了。给你改了下,无关的语句都屏蔽了,你试试。
#include"reg52.h"
#define uchar unsigned char
#define uint unsigned int
sbit key=P3^1;
/*
uchar  code duan[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,
0x79,0x71}; */
uchar key_count;
bit k;
//此为延时函数,就是前面的延时都是需要调用这一个函数
void  delayms(uint xms)
{
    uint  i,j;
    for(i=xms;i>0;i--)
      for(j=110;j>0;j--);
}
//串口初始化
void UARTInit()
{
        TMOD &= 0x0f;
        TMOD |= 0x20;//定时器1,工作模式2 8位自动重装
        TH1 = 0xfd;
        TL1 = 0xfd;//设置比特率9600
        TR1 = 1;//启动定时器1
        TR1 = 1;//启动定时器1
        SM0 = 0;        
        SM1 = 1;//串口工作方式1,8位UART波特率可变
//        EA = 1;        //打开总中断
//        ES = 1; //打开串口中断
}
//按键扫描
void  keyscan()
{
        key=1;
        if(key==0)
        {
                delayms(50);
                if(key==0)
                {
                        key_count++;
                        if(key_count==10)
                                key_count=0;
                        k=1;//允许发送标志置1
                        while(!key);
                }
        }
}
/*
void timer0Init()
{
        EA = 1;        //打开总中断
        ET0 = 1;//打开定时器0中断
        TR0 = 1;         //启动定时器0
        REN = 1;//允许串口接收
        TMOD |= 0X01; //定时器工作模式1,16位定时模式
        TH0 = 0xED;
        TL0 = 0xFF; //定时5ms
}*/
void  main()
{
//        timer0Init();//定时器0初始化
        UARTInit();//串口初始
        while(1)
        {
                keyscan();
                if(k==1)                //如果允许发送
                {
                        k=0;        //发送标志清0,防止重复发送
                        SBUF=key_count;        //发送数据
                        while(!TI);        //等待发送中断请求标志位为1(已发送)
                        TI=0;                //发送中断请求标志位清0
                }
        }
}
/*
//定时器0中断函数
void timer0() interrupt 1
{
        TH0 = 0xED;
        TL0 = 0xFF; //定时5ms
}
//串口中断函数
void UART() interrupt 4
{
        uchar temp;
        if(RI)//判断接收是否完成
        {
                key_count = SBUF;//读SBUF,读出串口接收到的数据
                RI = 0;//软件清零接收标志位        
                temp = key_count;//
                SBUF = ++temp;//写SBUF,把要发送的数据送给发送缓存器
        }
        if(TI)//判断是否发送完成
        TI = 0;//清零发送完成标志位        
}*/
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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