矿石收音机论坛

 找回密码
 加入会员

QQ登录

只需一步,快速开始

搜索
查看: 12801|回复: 124

求助;51单片机独立按键长按加减键四位数码管就显示0000

[复制链接]
     
发表于 2019-8-20 20:03:12 | 显示全部楼层 |阅读模式
提示: 作者被禁止或删除 内容自动屏蔽
     
发表于 2019-8-20 21:21:01 | 显示全部楼层
单片机频率设置不对吧.
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2019-8-20 21:27:50 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

     
发表于 2019-8-20 21:40:20 | 显示全部楼层
注意,这个程序是AT89S52,12个时钟周期运行一条指令,如果你使用的是STC的1T系列MCU(1个时钟周期运行一条指令),所有的延时需要扩大12倍。
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2019-8-20 22:01:58 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

     
发表于 2019-8-20 22:38:53 | 显示全部楼层
如果是用的89C54这个是12T的
void t0(void) interrupt 1 using 0
{
ET0=0;
if(key_temp==1)
{
send_16data(f_data,modo); //向BH1415F发送数据
}
key_temp=0;
xianshi_turn(); //显示数据转换
xianshi();   
//key_temp=1;
TH0=0xEA;
TL0=0xD0;
ET0=1;
}
key_temp=1;不应该出现在这里
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2019-8-20 22:59:45 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

     
发表于 2019-8-20 23:02:32 | 显示全部楼层
key_temp=1; 这个注释掉
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2019-8-20 23:26:08 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

     
发表于 2019-8-21 08:22:35 | 显示全部楼层
本帖最后由 isoimg2130 于 2019-8-21 09:56 编辑

网上尽量别照搬照抄别人的程序,只要看别人思路就行。这是复制的你帖子的代码。
#define    LED_DATA   P1            // 数码管段码输出
        #define    LED_WEI    P2          // 数码管位码输出,扫描口
        sbit      key_fr_up      =P2^3;          //频率增加键
        sbit      key_fr_down    =P2^2;          //频率递减键
        sbit      key_LTS_KZ     =P2^1;          //立体声控制键


uchar  code   WEI[4]={0x1f,0x2f,0x4f,0x8f};    //数码管扫描控制

while(key_fr_up==0) //开始自动加频率   



LED_DATA=DATA[display[k]];      
        LED_WEI=WEI[k];          //先显示百位
               
数码管一显示按键状态变了。然后直接就从while(key_fr_up==0)跳出来了,还好不是 while(key_fr_up==1)否则掉循环里出不来了。。
改成下面的试试LED_DATA=DATA[display[k]];   
        LED_WEI&=0x0f;   
        LED_WEI|=WEI[k];          //先显示百位


void KEY(void)
{
uint ii=0,jj=0;  //记录频率增加的个数,若ii>4,f以5为增量增加
uchar key_data;  //若jj>4,f以5为增量减小
P2=0x0F;
P1=0x0F;  //键盘扫描口断码输出初始化//

这句删了,P1和按键没任何关系,反而每执行一次按键函数就改变一次数码管状态。。。

这程序最好自己写。别人的只能做参考,有的时候,别人的能行到了自己那就是不行的。总感觉这个程序很怪。。
其他的暂时没看出问题。。。

回复 支持 反对

使用道具 举报

     
发表于 2019-8-21 09:59:55 | 显示全部楼层
顺便问一下,你的电路是不是如下图,数码管部分省略三极管和限流电阻
QQ截图20190820144855.png
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2019-8-21 10:32:52 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2019-8-21 10:35:32 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

     
发表于 2019-8-21 11:39:36 | 显示全部楼层
  1. #include  "reg52.h"

  2. typedef unsigned char u8;
  3. typedef unsigned int u16;

  4. #define p2 P2                                                   //把大写改成小写,打字累
  5. #define p1 P1                                                   //按Caps Lock键也是要花力气的

  6. sbit      jia      =P2^3;                                       //频率增加键
  7. sbit      jian    =P2^2;                                  //频率递减键

  8. u16 pinlv=875;                                                //频率,请看拼音
  9. bit jishi;                                                        //延时用

  10. char chufa;                                                  //按键触发值
  11. int zijia;                                                         //消抖计时
  12. bit zisuo;                                                          //按键自锁,短按避免重复触发
  13. bit changanbiaozhi;                                        //长按标志

  14. #define duanan 10                                        //100毫秒为短按
  15. #define changan 100                                           //1秒以上为长按
  16. #define lianxuchufa 5                                        //连续触发时间为50毫秒一次

  17. unsigned char code shuju[11]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};

  18. void yanshi(int a)
  19. {
  20.         while(a)
  21.         {
  22.                 if(jishi)
  23.                 {
  24.                         jishi=0;
  25.                         a--;
  26.                 }                                               
  27.         }
  28. }

  29. void xianshi(void)
  30. {
  31.         p2&=0x0f;                                                  //先关位选
  32.         if(pinlv/1000)                                        //如果频率超过100兆赫兹就显示
  33.         {       
  34.                 p1=shuju[pinlv/1000%10];        
  35.                 p2|=0x10;                         
  36.         }
  37.         yanshi(10);
  38.         p2&=0x0f;
  39.         p1=shuju[pinlv/100%10];
  40.         p2|=0x20;       
  41.         yanshi(10);
  42.         p2&=0x0f;
  43.         p1=shuju[pinlv/10%10]+0x80;
  44.         p2|=0x40;
  45.         yanshi(10);
  46.         p2&=0x0f;
  47.         p1=shuju[pinlv%10];
  48.         p2|=0x80;
  49.         yanshi(10);
  50. }

  51. void anjian(void)
  52. {
  53.         if(jia&&jian)                                          //如果没按键按下
  54.         {
  55.                 zijia=0;                                           //清除自加计时
  56.                 zisuo=0;                                          //置零按键自锁
  57.                 changanbiaozhi=0;                         //清除长按标志
  58.         }
  59.         else if(zisuo==0)                                  //如果有按键按下
  60.         {
  61.                 zijia++;                                          //消抖计时自加
  62.                 if(zijia>duanan)                                   //如果加到设定时间
  63.                 {
  64.                         zijia=0;                                 //置零自加计时
  65.                         if(!jia)
  66.                         chufa=1;                                //触发1号键
  67.                         if(!jian)
  68.                         chufa=2;                                //触发2号键
  69.                         zisuo=1;                                   //按键自锁
  70.                 }
  71.         }
  72.         else if(changanbiaozhi)                            //如果连续触发为1
  73.         {       
  74.                 zijia++;                                        //消抖计时自加       
  75.                 if(zijia>lianxuchufa)                         //如果消抖时间达到连续触发时间
  76.                 {
  77.                         zijia=0;
  78.                         if(!jia)
  79.                         chufa=1;                                //触发1号键
  80.                         if(!jian)
  81.                         chufa=2;                                //触发2号键
  82.                 }
  83.         }
  84.         else
  85.         {
  86.                 zijia++;                                                                                                                       
  87.                 if(zijia>changan)                         //如果自加超过设定的长按时间
  88.                 zijia=0,
  89.                 changanbiaozhi=1;                         //开启长按标志
  90.         }
  91. }

  92. void main(void)
  93. {
  94.         TMOD=0x01;  
  95.         TH0=0xfc;
  96.         TL0=0x18;                                                                                                   
  97.         TR0=1;
  98.         ET0=1;
  99.         EA=1;
  100.         while(1)
  101.         {
  102.                 if(chufa==1)
  103.                 {
  104.                         chufa=0;
  105.                         pinlv++;
  106.                         if(pinlv>1080)
  107.                         pinlv=875;
  108.                 }
  109.                 else if(chufa==2)
  110.                 {
  111.                         chufa=0;
  112.                         pinlv--;
  113.                         if(pinlv<875)
  114.                         pinlv=1080;
  115.                 }
  116.                 xianshi();
  117.         }
  118. }

  119. void dingshiqi(void) interrupt 1
  120. {
  121.         static char a;
  122.         TH0=0xfc;
  123.         TL0=0x18;
  124.         jishi=1;
  125.         a++;
  126.         if(a>10)
  127.         a=0,
  128.         anjian();
  129. }

复制代码
jxjie1314 发表于 2019-8-21 10:35
不加三极管数码管亮度不够,在日光灯下都看不清显示的是什么字


我给你重新写一个。但是调频发射那个就要自己去加上去了。这不困难吧。。。
到时你可能要根据数码管亮度调整下延时。。

评分

1

查看全部评分

回复 支持 反对

使用道具 举报

     
发表于 2019-8-21 11:43:16 | 显示全部楼层
还是直接发程序和仿真文件给你吧。自加看实际情况稍微改下延时。
毕竟实物和仿真是不一样的。有可能仿真正常,但实际上显示闪烁之类的。。。

数码管显示按键长短按.rar

42.48 KB, 下载次数: 73

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入会员

本版积分规则

小黑屋|手机版|矿石收音机 ( 蒙ICP备05000029号-1 )

蒙公网安备 15040402000005号

GMT+8, 2024-4-24 19:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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