找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机新手写了一个关于秒表的小程序,遇到了一些问题,想请教一下

[复制链接]
跳转到指定楼层
楼主
ID:433107 发表于 2019-3-7 16:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我这个程序功能很简单:通过tx-1c实验班的第一个矩阵键盘按键开始计时

1、烧写在板子上按键下去可以计时,但是数码管只有当个位数变动时,十位数的显示就闪一下,
     就是说个位数的数字显示正常,但是十位数的数字一秒闪一次,想请教一下是什么问题?

2、我想让按键能实现开始和暂停的功能,请问我应该怎么改?

3、还有想问一个小知识点,keil中的bit关键字定义的变量如果没有初始化,那么这个变量初始值是1还是0呢?

刚开始学单片机,很多东西不是很懂,希望各位大佬能帮我解答一下,如果我的代码写得不好也希望能给我一些小建议吧,谢谢了。

单片机源程序如下:
  1. #include <reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. uchar code led[]={0x3f,0x06,0x5b,0x4f,0x66,
  5.                            0x6d,0x7d,0x07,0x7f,0x6f};             //数码管段选信息
  6. uchar single, tenth;
  7. uchar flag;
  8. sbit dula=P2^6;
  9. sbit wela=P2^7;
  10. uint num=1;
  11. void delay(uchar ms)
  12. {
  13.     uchar i,j;
  14.     for(i=ms;i>0;i--)
  15.    for(j=110;j>0;j--) ;
  16. }
  17. void display(uchar tenth, uchar single)                  //数码管显示函数
  18. {
  19.     dula=1;
  20.     P0=led[tenth];
  21.     dula=0;
  22.     P0=0xff;
  23.     wela=1;
  24.     P0=0xfe;
  25.     wela=0;
  26.     delay(5);

  27.     dula=1;
  28.     P0=led[single];
  29.     dula=0;
  30.     P0=0xff;
  31.     wela=1;
  32.     P0=0xfd;
  33.     wela=0;
  34.     delay(5);
  35. }
  36. void keyscan()                             //键盘检测
  37. {
  38.     uchar temp;
  39.     P3=0xfe;
  40.     temp=P3;
  41.     temp=temp&0xf0;
  42.     if(temp!=0xf0)
  43.     {
  44.    delay(10);
  45.    if(temp!=0xf0)
  46.    {
  47.     temp=P3;
  48.     switch(temp)
  49.     {
  50.      case 0xee:  flag=1;
  51.            break;
  52.             
  53.     }
  54.    
  55.     while(temp!=0xf0)
  56.      {
  57.       temp=P3;
  58.       temp=0xf0;
  59.      }
  60.    }
  61.   }
  62. }
  63. void main()
  64. {
  65.     single=0;
  66.     tenth=0;
  67.    display(tenth,single);
  68.     TMOD=0x02;                          //利用定时器0方式2计数
  69.     TL0=6;                                  //方式2为初值自动重装的8位定时器
  70.     TH0=6;
  71.     keyscan();                            //检测按键是否被按下
  72.    EA=1;
  73.    ET0=1;
  74.     TR0=1;
  75. while(flag)                                   //当检测按键被按下开始计时
  76. {
  77.     if(num==3686)                         //中断3686次相当于1s
  78.   {   
  79.    num=1;
  80.    single++;
  81.    if(single==10)
  82.    {
  83.     single=0;
  84.     tenth++;
  85.    }
  86.    display(tenth,single);
  87.   }
  88.   
  89.   }

  90. }
  91. void T0_time() interrupt 1              //中断函数
  92. {
  93.     num++;
  94. }
复制代码




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

使用道具 举报

沙发
ID:158956 发表于 2019-3-7 20:47 | 只看该作者
中断关闭就可以暂停了
回复

使用道具 举报

板凳
ID:158956 发表于 2019-3-7 20:50 | 只看该作者
keil中的bit关键字定义的变量如果没有初始化,那么这个变量初始值是0
回复

使用道具 举报

地板
ID:473186 发表于 2019-3-7 22:42 | 只看该作者
变量没有初始化
回复

使用道具 举报

5#
ID:123289 发表于 2019-3-8 08:35 | 只看该作者
变量初始值是1还是0?
养成好习惯,先做初始化。否则会吃苦头的!!!即使板凳说明完全正确,也不要轻信!
回复

使用道具 举报

6#
ID:433107 发表于 2019-3-9 14:48 | 只看该作者

请问具体是哪一个位置没有初始化呢,可以给我指点一下吗?
回复

使用道具 举报

7#
ID:433107 发表于 2019-3-9 14:56 | 只看该作者
hufeng 发表于 2019-3-7 20:47
中断关闭就可以暂停了

我的思路也是这样,但是怎么让单片机第二次检测按键被按下呢?这个地方不太会写
回复

使用道具 举报

8#
ID:213173 发表于 2019-3-9 21:38 | 只看该作者
给你改这样试试
  1. #include <reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit dula=P2^6;
  5. sbit wela=P2^7;
  6. uchar code led[]={0x3f,0x06,0x5b,0x4f,0x66,
  7.                   0x6d,0x7d,0x07,0x7f,0x6f};//数码管段选信息
  8. //uchar single, tenth;
  9. uchar flag=0,sec=0;
  10. uint num=0;
  11. bit sign1=0;

  12. void delay(uchar ms)
  13. {
  14.         uchar i,j;
  15.         for(i=ms;i>0;i--)
  16.                 for(j=110;j>0;j--) ;
  17. }
  18. void display()//数码管显示函数
  19. {
  20.         static bit k=0;

  21.     P0=0x00;//消隐
  22.     dula=1;
  23.     dula=0;
  24.         if(k==0)
  25.         {
  26.                 P0=0xfe;
  27.                 wela=1;
  28.                 wela=0;
  29.                
  30.                 P0=led[sec/10];
  31.                 dula=1;
  32.                 dula=0;
  33.                 k=1;
  34.         }
  35.         else
  36.         {
  37.                 P0=0xfd;
  38.                 wela=1;
  39.                 wela=0;
  40.                
  41.                 P0=led[sec%10];
  42.                 dula=1;
  43.                 dula=0;
  44.                 k=0;
  45.         }
  46. }
  47. void keyscan() //键盘检测
  48. {
  49.         static bit sign;
  50. //        uchar temp;
  51.         P3=0xf0;
  52.         if(P3!=0xf0)
  53.         {
  54.                 delay(10);
  55.                 if((P3==0xe0)&&(sign==0))
  56.                 {
  57.                         sign=1;//自锁
  58.                         flag++;
  59.                         if(flag==3)flag=0;
  60.                         if(flag==0){sec=0;num=0;}//清0
  61.                         if(flag==1)sign1=1;//启动
  62.                         if(flag==2)sign1=0;//停止
  63.                 }
  64.         }
  65.         else sign=0;//按键抬起
  66. }
  67. void Timer0Init(void)//1毫秒@11.0592MHz
  68. {
  69.         TMOD = 0x01;        //设置定时器模式
  70.         TL0 = 0x66;                //设置定时初值
  71.         TH0 = 0xFC;                //设置定时初值
  72.         TR0 = 1;                //定时器0开始计时
  73.         EA=1;
  74.         ET0=1;
  75. }

  76. void main()
  77. {
  78.         Timer0Init();
  79.         while(1)               //当检测按键被按下开始计时
  80.         {
  81.                 keyscan();                            //检测按键是否被按下
  82.         }
  83. }
  84. void T0_time() interrupt 1 //中断函数
  85. {
  86.         TL0 = 0x66;                //设置定时初值
  87.         TH0 = 0xFC;                //设置定时初值
  88.         if(sign1==1)
  89.         {
  90.                 num++;
  91.                 if(num>=1000)
  92.                 {
  93.                         num=0;
  94.                         sec++;
  95.                         if(sec>=100)
  96.                                 sec=0;
  97.                 }
  98.         }
  99.         display();//动态显示
  100. }
复制代码
回复

使用道具 举报

9#
ID:234075 发表于 2019-3-10 00:40 | 只看该作者
变量的定义如果是全局变量(函数初始就定义了,在整个函数里都能使用),初始值=0;
如果是局部变量(在子函数中定义,只能在子函数中调用),初始值是随机的

评分

参与人数 1黑币 +5 收起 理由
菜用鸡 + 5 赞一个!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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