普中开源电子分享网

 找回密码
 立即注册
搜索
查看: 3709|回复: 6

A2的板子,请大佬看看程序为什么不正常运行

[复制链接]

1

主题

2

帖子

7

积分

新手上路

Rank: 1

积分
7
发表于 2021-2-5 15:19:42 | 显示全部楼层 |阅读模式
#include "reg52.h"
#include "intrins.h"
/****************************************效果:利用定时器和数码管实现:数码管前三位显示7、6、5,后三位显示从432按秒递减到398,然后停止***********************************************/
typedef unsigned char u8;
typedef unsigned char u16;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
u16 temp,t0,t1,bai,shi,ge;
u8 code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
u8 shu=432;
void init()
{
        temp=0xfe;
        P2=temp;
        shu=432;
        TMOD=0x11;        //俩定时器同时设置
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        EA=1;
        ET1=1;
        ET0=1;
        TR0=1;
        TR1=1;

}

void delay(u8 z)
{
    u8 x,y;
    for(x=z; x>0; x--)
    {
        for(y=70; y>0; y--);//用于动态数码管延时
    }
}

void display(u16 aa,u16 bb,u16 cc,u16 bai,u16 shi,u16 ge)        //显示函数
{
       
        while(1)
        {
                LSA=1; LSB=1; LSC=1;
                P0=smgduan[aa];
                delay(10);

                LSA=0; LSB=1; LSC=1;
                P0=smgduan[bb];
                delay(10);

                LSA=1; LSB=0; LSC=1;
                P0=smgduan[cc];
                delay(10);
               
                LSA=0; LSB=0; LSC=1;
                P0=smgduan[bai];
                delay(10);

                LSA=1; LSB=1; LSC=0;
                P0=smgduan[shi];
                delay(10);

                LSA=0; LSB=1; LSC=0;
                P0=smgduan[ge];
                delay(10);
       
                P0=0x00;
        }

}

void timer0() interrupt 1
{
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        t0++;
        if(t0==10)
        {
                t0=0;
                temp=_crol_(temp,1);

        }
}

void timer1() interrupt 3
{
        TH1=(65536-50000)/256;
        TL1=(65536-50000)%256;
        t1++;
        if(t1==2)
        {
                t1=0;
                shu--;
                bai=shu/100;                 //拆分各位
                shi=shu%100/10;
                ge=shu-100*bai-10*shi;
                if(shu==398)
                {
                        TR0=0;
                        TR1=0;                //停掉定时器
                }

        }
}

void main()
{
        init();
        while(1)
        {
                display(7,6,5,bai,shi,ge);
        }
}
/**************************************************************************************分割线******************************************************************************************/
#include "reg52.h"
/*********************************************效果:利用定时器和数码管实现0到100秒的计时器*********************************************************/
typedef unsigned char u8;
typedef unsigned char u16;

sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;


u16 temp,bai,shi,ge,aa;
u8 code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};  //段选字码,存在数组中

void delay(u8 z)
{
    u8 x,y;
    for(x=z; x>0; x--)
    {
        for(y=70; y>0; y--);//用于动态数码管延时
    }
}

void Display(u16 bai,u16 shi,u16 ge)        //显示函数
{
       
        while(1)
        {
                LSA=1; LSB=1; LSC=1;
                P0=smgduan[bai];
                delay(10);
                P0=0x00;

                LSA=0; LSB=1; LSC=1;
                P0=smgduan[shi];
                delay(10);
                P0=0x00;

                LSA=1; LSB=0; LSC=1;
                P0=smgduan[ge];
                delay(10);
       
                P0=0x00;
        }

}
void time0()                //一毫秒,定时器初始化函数
{
        temp=0;
        TMOD=0x01;  //设置定时器0为工作方式1
    TH0=(65536-50000)/256;
    TL0=(65536-50000)%256;
    EA=1;      
    ET0=1;      
        TR0=1;      

}
void main()                                 //主函数
{
        time0();
        while(1){
        if(aa==20)                                //定时1秒(一次计时5ms,重复20次开中断
                {       
                        aa=0;
                        temp++;
                        if(temp==101)
                                {temp=0;}
                bai=temp/100;                 //拆分各位
                shi=temp%100/10;
                ge=temp-100*bai-10*shi;
                }
                Display(bai,shi,ge);       
        }               
}

void timer0() interrupt 1//定时器中断
{
        TH0=(65536-50000)/256;
    TL0=(65536-50000)%256;
        aa++;
       
}

两个程序都是一样的问题,数码管该变化的地方始终保持000不变


回复

使用道具 举报

0

主题

48

帖子

194

积分

注册会员

Rank: 2

积分
194
发表于 2021-2-19 01:23:00 | 显示全部楼层
eirc 发表于 2021-2-5 15:21
照郭天祥教程学的,用的普中A2板子。
两个程序都是一样的问题,数码管该变化的地方始终保持000不变。
求 ...

电路不一样的呀,郭天祥板子是数码管段码和位选各用74HC573锁存器控制的,而普中A2的则是P0口接74HC245控制数码管段码、74HC138译码器控制位选,电路不一样,程序也会不一样。
回复 支持 1 反对 0

使用道具 举报

1

主题

2

帖子

7

积分

新手上路

Rank: 1

积分
7
 楼主| 发表于 2021-2-5 15:21:53 | 显示全部楼层
照郭天祥教程学的,用的普中A2板子。
两个程序都是一样的问题,数码管该变化的地方始终保持000不变。
求教
回复 支持 反对

使用道具 举报

2

主题

9

帖子

20

积分

新手上路

Rank: 1

积分
20
发表于 2021-2-12 18:00:23 | 显示全部楼层
本帖最后由 ots 于 2021-2-12 18:01 编辑
eirc 发表于 2021-2-5 15:21
照郭天祥教程学的,用的普中A2板子。
两个程序都是一样的问题,数码管该变化的地方始终保持000不变。
求 ...

你这个100s计时程序有两处错误:
1.显示函数Display()中的while(1)应该去掉,如果加上while当你第一次调用显示函数就跳不出来了,这也是你烧出来一直显示000的原因;
2.其次,你这个aa应该等于1000,因为定时器初值给的是1ms,计时器计数1000次才是1s。aa=20烧出来显示是特别快的。


希望对你有帮助!
回复 支持 反对

使用道具 举报

2

主题

9

帖子

20

积分

新手上路

Rank: 1

积分
20
发表于 2021-2-13 12:41:36 | 显示全部楼层
你这756432这个倒计时程序有以下几个错误:
1.应该定义各一个char类型和int型;
2.432大于255,因为char是8个字节,最大为255,而shu初值为432,所以shu得定义成int型;
3.还是要将显示函数display中的while去掉,因为当while存在时,你第一次调用显示函数就无法跳出了,从而无法进行下一次的显示。


回复 支持 反对

使用道具 举报

1

主题

3

帖子

11

积分

新手上路

Rank: 1

积分
11
发表于 2021-3-18 15:21:17 | 显示全部楼层
从一个循环坑跳进另一个循环坑,被0X00给套住了!
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

站长推荐上一条 /1 下一条

Archiver|手机版|小黑屋|普中开源电子分享网 粤ICP备16123577号-2

GMT+8, 2024-4-25 16:42 , Processed in 0.088157 second(s), 34 queries .

Powered by 论坛搭建 X3.4

Copyright © 2001-2021, Tencent Cloud.

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