标题: 51单片机倒计时程序 初学者求思路 中断函数还没有学 [打印本页]

作者: AnRan_    时间: 2022-1-21 19:20
标题: 51单片机倒计时程序 初学者求思路 中断函数还没有学

刚学单片机一周,布置的任务是让数码管从10变化到0,每次变化间隔1秒。我知道怎么从9变化到0,但是如何让10变化到9呢?我只知道如何让数码管一直显示10,但是不知道怎么让10显示1秒并且变成9。单片机用的清翔的开发板,有没有大佬给个思路,非常感谢。

中断函数没有学,目前只学了延时函数,有没有办法用延时函数做到这个功能?

附上开发板原理图。


开发板原理图.png (100.19 KB, 下载次数: 32)

开发板原理图

开发板原理图

作者: wulin    时间: 2022-1-21 21:36
用你能理解的写法,用延时函数写了两位数码管动态显示10秒循环倒计时。

  1. #include <reg51.h>

  2. sbit dula=P2^6;                        //段
  3. sbit wela=P2^7;                        //位

  4. unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴数码管段码
  5. unsigned int i;//无符号整型变量
  6. bit sign;//位变量
  7. char num;//有符号字符型变量

  8. void delay(unsigned int t)//延时函数
  9. {                                               
  10.         unsigned int i,j;
  11.         for(i=t;i>0;i--)
  12.                 for(j=110;j>0;j--);
  13. }

  14. void main(void)
  15. {
  16.         num=10;//赋初值
  17.         sign=0;//赋初值
  18.         while(1)
  19.         {
  20.                 sign=~sign;//取反
  21.                 if(sign==0)       
  22.                 {
  23.                         P0=0xfe;//送位码
  24.                         wela=1;//位码锁存
  25.                         wela=0;
  26.                         P0=table[num/10];//送十位段码
  27.                         dula=1;//段码锁存
  28.                         dula=0;
  29.                 }
  30.                 if(sign==1)       
  31.                 {
  32.                         P0=0xfd;//送位码
  33.                         wela=1;//位码锁存
  34.                         wela=0;
  35.                         P0=table[num%10];//送个位段码
  36.                         dula=1;//段码锁存
  37.                         dula=0;
  38.                 }
  39.                 i++;
  40.                 if(i==1000)//约1秒
  41.                 {       
  42.                         i=0;
  43.                         num--;
  44.                         if(num<0)
  45.                         {
  46.                                 num=10;
  47.                         }
  48.                 }
  49.                 delay(1);//延时约1ms,以此控制主循环周期
  50.         }
  51. }
复制代码

作者: AnRan_    时间: 2022-1-21 23:09
wulin 发表于 2022-1-21 21:36
用你能理解的写法,用延时函数写了两位数码管动态显示10秒循环倒计时。

好的,谢谢
作者: a185980800    时间: 2022-1-22 00:23
中断不会,天问51了解一下。一键生成。
作者: kema    时间: 2022-1-22 09:55
本帖最后由 kema 于 2022-1-22 09:59 编辑

给你个最笨的方法哈哈
i=10;

while(1)
{
if(i==10)
{
你会让他显示10
}

if(i==9)
{显示9}

if(i==8)
{显示8}
……

delay(1秒);
i--;
if(i==0)
i=10;


}简单吧



作者: AnRan_    时间: 2022-1-22 10:14
kema 发表于 2022-1-22 09:55
给你个最笨的方法哈哈
i=10;

让他显示10我会,但是不是得让这个10一直刷新持续1s么?因为这个10我只会用动态显示。你这个方法不能让10持续显示1s吧




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1