找回密码
 立即注册

QQ登录

只需一步,快速开始

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

小白再次帮友求助 “4位数据管,从0000到9999,每0.5s增加1”程序设计

[复制链接]
ID:214428 发表于 2017-6-26 11:36 | 显示全部楼层 |阅读模式
“4位数据管,从0000到9999,每0.5s增加1”程序设计
回复

使用道具 举报

ID:214905 发表于 2017-6-26 20:20 | 显示全部楼层
大概是这样的,开定时器1,工作方式1,初值设置到50毫秒一中断,if判断十次中断进行一次处理
断选和位选分成两个数组,这个具体就看你的硬件怎么连接的了,然后int个数,在每十次中断里将它+1,分别取这个数的千百十个位,对应数组元素送入段选。
开定时器0,2毫秒一中断,中断中进行动态显示
回复

使用道具 举报

ID:211467 发表于 2017-6-26 22:17 | 显示全部楼层
不许用开定时器0了吧?
回复

使用道具 举报

ID:123289 发表于 2017-6-26 22:36 | 显示全部楼层
本帖最后由 yzwzfyz 于 2017-6-26 22:58 编辑

开启T0中断,每4ms中断一次。
设置一个变量R_9999(0-9999)做计数用。用法:每0.5秒R_9999+1。
设置一个扫描计数器R_SC(=0-3)。用法:每次T0中断R_SC+1,当R_SC=4时回0。
设置一个0.5秒计时器R_05(=0-124)。用法:每次T0中断,R_05+1,R_05=125时回0。

每次T0中断依序做以下动作:

自动+1:
1、R_05+1,当R_05=125时做以下动作(否则不处理):
   1.1、R_05=0;
   1.2、R_9999+1。
扫描显示:
2、R_SC+1(为切换显示指明显示位),如果R_SC=4则回0(只有4个LED),再做以下动作(无论R_SC=?):
  2.1、根据R_SC的值,取R_9999之中的一个位(R_SC:0-3各对应个、十、百、千位)放入A中;
  2.2、将A进行译码(事先做一个表10个字节:对应LED段码显示0-9的段表达明暗的字节形式);
  2.3、关闭4个LED;(以下改变显示内容时不会出现错字闪动);
  2.4、将译码后的A值通过IO口送到LED的8个段显示上(只用七段就够了,因为已关断,所以这时无显示,也就无所畏对错);
  2.5、接通显示的这个LED(三个关闭一个开通,这时才正式显示一个LED,完成扫描显示一位)。

如果自己还不会写,也不想自己写,就改行吧。
回复

使用道具 举报

ID:164602 发表于 2017-6-27 07:24 | 显示全部楼层
看看我编的程序对不对。对应的电路如图。
#include<reg51.h>

#define smg P0

sbit a=P2^2;
sbit b=P2^3;          
sbit c=P2^4;

unsigned char code xs[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,
0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
unsigned char i=0,t=0;
unsigned int j=0;

void Delay(unsigned char c);
void play(void);
void TimeConfig();

void main(void)
{
        TimeConfig();
        t=10;
        smg=0x00;
        while(1)
        {       
                if (i>=10)
                {
                        j++;
                }
                if (j==9999)
                {
                        j=0;
                }
                        play();
        }               
}

void play(void)
{
        c=1;b=0;a=0;
        smg=xs[j/1000];
        Delay(t);
        smg=0x00;
        Delay(t);

        c=0;b=1;a=1;
        smg=xs[(j%1000)/100];
        Delay(t);
        smg=0x00;
        Delay(t);

        c=0;b=1;a=0;
        smg=xs[(j%100)/10];
        Delay(t);
        smg=0x00;
        Delay(t);

        c=0;b=0;a=1;
        smg=xs[(j%10)/1];
        Delay(t);
        smg=0x00;
        Delay(t);
}

void Delay(unsigned char c)
{
    unsigned char b;
    for(c;c>0;c--)
        for(b=10;b>0;b--);
}

void TimeConfig()
{
    TMOD = 0x01;
    TH0 = 0x3c;         //设置初始值,定时50ms
    TL0 = 0xb0;
    EA = 1;                 //总中断开启
    ET0 = 1;         //定时器0中断开启
    TR0 = 1;         //启动定时器0
}

void Time0() interrupt 1//定时器0中断服务函数
{
        TH0 = 0x3c;         //重装初值
    TL0 = 0xb0;
        i++;
}


1.jpg
2.jpg
回复

使用道具 举报

ID:164602 发表于 2017-6-27 11:11 | 显示全部楼层
刚才发的程序,有一点错误!抱歉!
就是这里:
  if (i>=10)
                {
                        j++;
                }
应该加一句:
  if (i>=10)
                {
                        j++;
                       i=0;
                }
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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