找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1099|回复: 5
收起左侧

51单片机倒计时程序 初学者求思路 中断函数还没有学

[复制链接]
ID:1002906 发表于 2022-1-21 19:20 | 显示全部楼层 |阅读模式

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

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

附上开发板原理图。


开发板原理图

开发板原理图
回复

使用道具 举报

ID:213173 发表于 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. }
复制代码
回复

使用道具 举报

ID:1002906 发表于 2022-1-21 23:09 | 显示全部楼层
wulin 发表于 2022-1-21 21:36
用你能理解的写法,用延时函数写了两位数码管动态显示10秒循环倒计时。

好的,谢谢
回复

使用道具 举报

ID:857072 发表于 2022-1-22 00:23 来自手机 | 显示全部楼层
中断不会,天问51了解一下。一键生成。
回复

使用道具 举报

ID:64068 发表于 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;


}简单吧


回复

使用道具 举报

ID:1002906 发表于 2022-1-22 10:14 | 显示全部楼层
kema 发表于 2022-1-22 09:55
给你个最笨的方法哈哈
i=10;

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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