微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 麻烦大神帮我看下这个程序哪不对了

麻烦大神帮我看下这个程序哪不对了

时间:10-02 整理:3721RD 点击:
#include <reg52.h>
#include <intrins.h>
unsigned char code DispLED[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共阴极
                            // 0    1    2    3    4    5    6    7    8    9   
sbit LS138A = P2^2;          //定义138译码器的输入A脚由P2.2控制            74LS138译码器方式
sbit LS138B = P2^3;            //定义138译码器的输入脚B由P2.3控制
sbit LS138C = P2^4;         //定义138译码器的输入脚C由P2.4控制
sbit been=P1^5;
sbit led=P1^1;
void scan();
void delayus(unsigned char i);        //微妙级别延时函数
void InitT();
unsigned char t=0;
unsigned int num=0;
void scan()
{                        
   //显示时间
        delayus(13000);
        P0=DispLED[t];        //个位
        LS138A=1;           //选择到底用哪一个七段数码管来显示这位数据
        LS138B=1;
        LS138C=1;
}
void delayus(unsigned int i)
{
        unsigned int x;
        for(x=i;x!=0;x--)
        {
                _nop_;
        }
}
void InitT()
{
        TMOD=0x01;       //定时器0,工作方式1:16位手动动灌装,定时器1,工作方式0:13位手动灌装
        TH0=(65536-50000)/256;                 //装初值12Mhz晶振,定时50ms计数50000次
        TL0=(65536-50000)%256;
        EA=1;                           //开总中断
        ET0=1;                           //开定时器0中断
        TR0=1;            //启动定时器0
}


void T0_time() interrupt 1                   //T0中断服务函数
{
        TH0=(65536-50000)/256;                 
        TL0=(65536-50000)%256;
        num++;
        if(num==20)        //           1秒到
        {
                num=0;
                if(t==9)                  //
                {
                        t=0;
                }
                else
                        t++;       
        }
}
void main()
{
        InitT(); //对定时器进行初始化
        while(1)
        {
                switch(t)
                                {
                                        case 0:
                                                been=0;          // 开启蜂鸣器
                                                delayus(300);
                                                been=1;                 //关闭蜂鸣器
                                                delayus(300);
                                                break;
                                        case 9:
                                                led=1;        //把led灯点亮
                                                delayus(300);
                                                led=0;          //把led灯关闭
                                                delayus(300);
                                                break;
                                        default:
                                                break;
                                }
                scan(t);
        }                       
}
做到的效果是到0响声,到9led亮,有什么地方不对麻烦了。

延时函数问题。
void delayus(unsigned int i)
{
        unsigned int x;
        for(x=i;x!=0;x--)
        {
                _nop_();
        }
}
//经过调试,在12M晶振条件下,
执行一次delayus(1);时间为19us,
执行一次delayus(2);时间为28us,
由此可以计算出调用delayus(n);
的时间为:(19-(28-19) ) +(28-19)*n=10+n*9;
在你的数码管程序中出现了delayus(13000);
可以计算出延时长为13000*9+10=117010us;
我们除去其他延时,可估计数码管扫描频率只有不到10hz,
蜂鸣器驱动驱动不到频率5hz。
所以最终导致数码管闪烁,或者根本不亮,蜂鸣器不发声。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top