#include <reg52.h>    
#define uchar unsigned char
#define uint  unsigned int
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
sbit wela=P2^7;
sbit dula=P2^6;
sbit test=P1^7;
sbit Trig=P1^0;
sbit Echo=P3^2;
sbit succeed_flag=P1^2;
uint time,timeH,timeL ;
//
void delay(uint z)
{
uint x,y;
  for(x=z;x>0;x–)
  for(y=110;y>0;y–);
}
//
void delay_20us()
{
    uchar a ;
    for(a=0;a<100;a++);
}

第一个问题  昨天晚上调试了程序,for语句的时间是没变化的,

如何通过串口修改时钟的时间
请问大神们如何在这个程序里添加串口来改变时钟啊
#include
#include
#define uchar unsigned char
#define uint unsigned int
/*七段共阴管显示定义*/
//此表为 LED 的字模, 共阴数码管 0-9 –
uchar code dispcode[] =
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //段码控制
/*定义并初始化变量*/
uchar seconde=0;//秒
uchar minite=0;//分
uchar hour=12; //时
uchar mstcnt=0;//定时器计数,定时50ms,mstcnt满20,秒加1
uchar shi=0;//闹铃功能
uchar fen=0;
uchar bjcs;//报警次数
sbit P1_0=P1^0; //second 调整定义
sbit P1_1=P1^1; //minite调整定义
sbit P1_2=P1^2; //hour调整定义
sbit P1_5=P3^0; //整点报时
sbit P1_3=P1^3; //闹铃功能,调整时间
sbit P1_6=P1^6; //调整时
sbit P1_7=P1^7; //调整分
sbit P1_4=P1^4; //关闭闹铃

//***************************************************************
//显示数据转换程序
void display(uint temp)
{
    uchar ge,shi,bai;
    bai=temp/100;
    shi=(temp%100)/10;  
    ge=temp%10;  

for(a=5000;a>0;a--)

/*函数声明*/
void delay; //延时子程序
void time_pro; //时间处理子程序
void display; //显示子程序
void keyscan; //键盘扫描子程序

    wela=1;
    P0=0xf7;
    wela=0;
    dula=1;
    P0=table[bai];
    dula=0;
    delay(1);
    dula=1;
    P0=0x00;   //关位码
    dula=0;

for(b=c;b>0;b--);

/*延时子程序*/
void delay
{
uchar j;
while
{
for(j=0;j<125;j++)
{;}
}
}

    wela=1;
    P0=0xef;
    wela=0;
    dula=1;
    P0=table[shi];
    dula=0;
    delay(1);
    dula=1;
    P0=0x00;   //关位码
    dula=0;

不管是把c放在第一个for中还是放在循环体中,时间都是一样的。

/*时间处理子程序*/
void time_pro
{
if(seconde==60)
{
seconde=0;
minite++;
if(minite==60)
{
minite=0;
hour++;
if
{
hour=0;
}
}
}
}
/*显示子程序*/
void display
{
if
{
P2=0XFE;
P0=dispcode[seconde%10];//秒个位
delay;
澳门新葡萄京官网注册 ,P2=0XFD;
P0=dispcode[seconde/10];//秒十位
delay;
P2=0XFB;
P0=dispcode[10];//间隔符 –
delay;
P2=0XF7;
P0=dispcode[minite%10];//分个位
delay;
P2=0XEF;
P0=dispcode[minite/10];//分十位
delay;
P2=0XDF;
P0=dispcode[10];//间隔符 –
delay;
P2=0XBF;
P0=dispcode[hour%10];//时个位
delay;
P2=0X7F;
P0=dispcode[hour/10];//时十位
delay;
}
}
/*键盘扫描子程序*/
void keyscan
{
if//秒位的调整
{
delay;
if
{
seconde++;
if(seconde==60)
{
seconde=0;
}
}
delay;
}
if//分位的调整
{
delay;
if
{
minite++;
if(minite==60)
{
minite=0;
}
}
delay;
}
if//时位的调整
{
delay;
if
{
hour++;
if
{
hour=0;
}
}
delay;
}
}
/*整点报警*/
void zhengdian
{
if((seconde==0)&(minite==0))//整点报时
{
P1_5=0;
delay;
P1_5=1;
}
}
/*定时闹钟*/
void dingshi
{
if//按住P1_3BU不松,显示闹铃设置界面,分别按P1_6、P1_7设置闹铃时间。
{
P2=0XFE;
P0=dispcode[0];//秒个位
delay;
P2=0XFD;
P0=dispcode[0];//秒十位
delay;
P2=0XFB;
P0=dispcode[10];//间隔符 –
delay;
P2=0XF7;
P0=dispcode[fen%10];//分个位
delay;
P2=0XEF;
P0=dispcode[fen/10];//分十位
delay;

    dula=1;
    P0=table[ge];
    dula=0;
    wela=1;
    P0=0xdf;
    wela=0;
    delay(1);
    dula=1;
    P0=0x00;   //关位码
    dula=0;

第二个问题是关于位定位的问题,一般要给一个位变量来接收一个位口,例如
sbit wela=P2^7;这样才可以。

P2=0XDF;
P0=dispcode[10];//间隔符 –
delay;

}
//***************************************************************
void main()  
{
    uint distance;
    test =0;
    Trig=0;       //首先拉低脉冲输入引脚
    EA=1;         //打开总中断0

第三个问题就是调试的时候容易出错误,要考虑变量名和空间的大小,我昨晚出错就是没有把声名函数后面加一个“;”,最主要的是要学会看调试提示,这样就是解决问题就会快很多。下次把出错的内容翻译一下。

P2=0XBF;
P0=dispcode[shi%10];//时个位
delay;
P2=0X7F;
P0=dispcode[shi/10];//时十位
delay;
}
if//设定时
{
delay;
if
{
shi++;
if
{
shi=0;
}
}
delay;
}
if//设定分
{
delay;
if
{
fen++;
if
{
fen=0;
}
}
delay;
}
if((hour==shi)&(minite==fen)&(seconde==0))//闹铃时间到,报警六十次。
{
for(bjcs=0;bjcs<60;bjcs++)
{
P1_5=0;
delay;
P1_5=1;
delay;
}
}
}
/*主函数*/
void main
{
P1=0XFF;
TMOD = 0x11; //time0为定时器,方式1
TH0=0x3c; //预置计数初值,50ms
TL0=0xb0;
EA=1; //总中断开
ET0=1; //允许定时器0中断
TR0=1; //开启定时器0
while
{

    TMOD=0x10;    //定时器1,16位工作方式
    while(1)        
    {
        EA=0;           //关总中断
        Trig=1;         //超声波输入端
        delay_20us();   //延时20us
        Trig=0;         //产生一个20us的脉冲
        while(Echo==0); //等待Echo回波引脚变高电平
        succeed_flag=0;
//清测量成功标志
        EA=1;
        EX0=1;          //打开外部中断0
        TH1=0;          //定时器1清零
        TL1=0;          //定时器1清零
        TF1=0;          //计数溢出标志
        TR1=1;          //启动定时器1
        delay(20);      //等待测量的结果
        TR1=0;          //关闭定时器1
        EX0=0;          //关闭外部中断0
       if(succeed_flag==1)
       {  
          time=timeH*256+timeL;
          distance=time*0.172;  //厘米
          display(distance);
       }                        
      if(succeed_flag==0)
       {
          distance=0;                    //没有回波则清零
          test = !test;                  //测试灯变化
        }              
    }
}
//***************************************************************
//外部中断0,用做判断回波电平
void exter()  interrupt 0   //
外部中断0是0号
{  
     timeH =TH1;    //取出定时器的值
     timeL =TL1;    //取出定时器的值
     succeed_flag=1;//至成功测量的标志
     EX0=0;         //关闭外部中断
}
//****************************************************************
//定时器1中断,用做超声波测距计时
void timer1() interrupt 3  //
    {
         TH1=0;
         TL1=0;
     }

昨天刚把消影给学会了,可管与管之间的问题怎么解决!这中间有消影没?实事上没有!单独一个管的段选和位选是要消影,这个消的是不让其它管子有闪亮。等到把外部除影玩再除去内部的。

keyscan(); //按键扫描
dingshi();//定时闹钟
zhengdian();//整点报时
display(); //显示时间
}
}

#include<reg52.h>

void timer0 interrupt 1 //定时器0方式1,50ms中断一次
{
TH0=0x3c; //手动加载计数脉冲次数
TL0=0xb0;
TMOD=0x11;
mstcnt++; //用于计算时间,每隔50ms加1
if(mstcnt==20)//mstcnt满20即为一秒
{
seconde++;//秒+1
time_pro; //时间处理
mstcnt=0; //对计数单元的清零,重新开始计数
}

#define uint unsigned int

}

#define uchar unsigned char

sbit dula=P2^6;

sbit wela=P2^7;

uchar code
table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

uchar ms,a,b,ccc,aa=0;ff,c;

uint zi;

void desplay(uchar bai,uchar shi,uchar ge );

void delay(uchar ms);

void init();

void main()

{

init();

while(1)

{

desplay(ccc,ff,c);

}

}

void desplay(uchar bai,uchar shi,uchar ge)

{

wela=1;

P0=0xff;

wela=0;

dula=1;

P0=table[bai];

dula=0;

P0=0xff;

wela=1;

P0=0xfe;

wela=0;

delay(10);

wela=1;

P0=0xff;

wela=0;

dula=1;

P0=table[shi];

dula=0;

P0=0xff;

wela=1;

P0=0xfd;

wela=0;

delay(10);

wela=1;

P0=0xff;

wela=0;

dula=1;

P0=table[ge];

dula=0;

P0=0xff;

wela=1;

P0=0xfb;

wela=0;

delay(10);

}

void delay(uchar ms)

{

for(a=ms;a>0;a–)

for(b=110;b>0;b–);

}

void init()

{

/*TMOD=0x01;

EA=1;

ET0=1;

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

TR0=1;*/

TMOD=0x01;

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

TH1=(65536-50000)/256;

TL1=(65536-50000)%256;

EA=1;

ET0=1;

TR0=1;

}

void time0() interrupt 1

{

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

aa++;

if(aa==1000)

aa=0;

ccc=aa/100;

ff=aa%100/10;

c=aa%10;

}

消影

程序的调试有错误怎么办?

澳门新葡萄京官网注册 1

 说明有“:”分号错误

经过查找发现是没有等号的原故。