新人求助,单片机课程的问题
程序……………………
#include<reg51.h>
#include<intrins.h> //包含库文件
sbit smg1=P3^0; //定义第一位数码管
sbit smg2=P3^1; //定义第二位数码管
sbit smg3=P3^2; //定义第三位数码管
sbit smg4=P3^3; //定义第四位数码管
sbit zjs=P2^0; //定义正计时按键
sbit djs=P2^1; //定义倒计时按键
sbit ks=P2^2; //定义开始按键
sbit zt=P2^3; //定义暂停按键
sbit ql=P2^4; //定义清零按键
sbit spk=P2^5; //定义蜂鸣器
int js=0,djs0=0,djs1=0,flag=0; //临时变量
int table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //共阴极数码管段值
int table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0xf7}; //共阴极数码管带小数点的段值
/*****************************************************/
//以下是函数声明
void pzjs();
void pdjs();
/*****************************************************/
/* 函数名:delayms */
/* 功能:产生毫秒级延时 */
/*****************************************************/
void delayms(int x)
{
char i;
while(x--)
{
for(i=150;i>0;i--);
}
}
/*****************************************************/
/* 函数名:Timer0_init() */
/* 功能:定时器0初始化 */
/*****************************************************/
void Timer0_init()
{
js=0;
TMOD=0x01; //定义定时器0工作模式
TH0=0x4c; //赋初值高位
TL0=0x00; //赋初值低位
//TR0=1; //启动定时器
ET0=1; //开中断
EA=1; //开全局中断
}
/*****************************************************/
/* 函数名:timer0() interrupt 1 using 1 */
/* 功能:定时器0中断服务函数 */
/*****************************************************/
void timer0() interrupt 1 using 1
{
TF0=0;
TH0=0xf3;
TL0=0xff; //重新赋高地位初值
js++;
if(js==3)
{
js=0;
if(flag==0) //标志位flag来判断是正计时还是倒计时 flag=0表示正计时 flag=1表示倒计时
{
if(djs0>=99) //如果djs0大于99
{
djs0=0; //djs0清零
if(djs1>=99) djs1=0; //如果djs1大于99 则djs1清零
else djs1++; //否则 djs1加一
}
else djs0++; //否则 djs0加一
}
if(flag==1) //标志位flag来判断是正计时还是倒计时 flag=0表示正计时 flag=1表示倒计时
{
if(djs0<=0) //如果djs0小于0
{
djs0=99; //djs0重新赋值99
if(djs1<=0) djs1=99; //如果djs1小于0 则djs1赋值99
else djs1--; //否则 djs0减一
}
else djs0--; //否则 djs0减一
}
}
}
/*****************************************************/
/* 函数名:djsxs() */
/* 功能:数码管动态显示 */
/*****************************************************/
void djsxs()
{ int b1,b2,b3,b4;
b1=djs1/10; //将倒计时时间的高位赋予b1
b2=djs1%10; //将倒计时时间的低位赋予b2
b3=djs0/10; //将倒计时时间的高位赋予b1
b4=djs0%10; //将倒计时时间的低位赋予b2
P0=table[b1];
smg1=0;
delayms(3);
smg1=1; //显示b1
P0=table1[b2];
smg2=0;
delayms(3);
smg2=1; //显示b2
P0=table[b3];
smg3=0;
delayms(3);
smg3=1; //显示b1
P0=table[b4];
smg4=0;
delayms(3);
smg4=1; //显示b2
}
/*****************************************************/
/* 函数名:pzjs() */
/* 功能: 进入正计时 */
/*****************************************************/
void pzjs()
{
flag=0; //标志位置0
djs0=0; //djs0清零
djs1=0; //djs1清零
while(1)
{
djsxs(); //显示函数
if(djs1==95) spk=0; //如果djs1等于95时 蜂鸣器开始报警
if(djs1==99) spk=1; //如果djs1等于99时 蜂鸣器结束报警
if(ks==0) //开始按键按下
{
delayms(3);
if(ks==0) //延时去除按键抖动,重新判断按键是否安下
{
while(!ks); //松开按键后向下执行
TR0=1; //启动定时器
}
}
if(zt==0) //暂停按键按下
{
delayms(3);
if(zt==0) //延时去除按键抖动,重新判断按键是否安下
{
while(!zt); //松开按键后向下执行
TR0=0; //停止定时器
}
}
if(ql==0) //清零按键按下
{
delayms(3);
if(ql==0) //延时去除按键抖动,重新判断按键是否安下
{
while(!ql); //松开按键后向下执行
TR0=0; //停止定时器
djs0=0; //djs0清零
djs1=0; //djs1清零
}
}
if(djs==0) //倒计时按键按下
{
delayms(3); //延时去除按键抖动,重新判断按键是否安下
if(djs==0)
{
while(!djs); //松开按键后向下执行
TR0=0; //停止定时器
pdjs(); //进入倒计时函数
}
}
}
}
/*****************************************************/
/* 函数名:pdjs() */
/* 功能: 进入倒计时 */
/*****************************************************/
void pdjs()
{
flag=1; //标志位置1
djs0=99; //djs0赋值99
djs1=99; //djs1赋值99
while(1)
{
djsxs(); //显示函数
if(djs1==5) spk=0; //如果djs1等于5时 蜂鸣器开始报警
if(djs1==0) spk=1; //如果djs1等于0时 蜂鸣器结束报警
if(ks==0) //开始按键按下
{
delayms(3);
if(ks==0) //延时去除按键抖动,重新判断按键是否安下
{
while(!ks); //松开按键后向下执行
TR0=1; //启动定时器
}
}
if(zt==0) //暂停按键按下
{
delayms(3);
if(zt==0) //延时去除按键抖动,重新判断按键是否安下
{
while(!zt); //松开按键后向下执行
TR0=0; //停止定时器
}
}
if(ql==0) //清零按键按下
{
delayms(3);
if(ql==0) //延时去除按键抖动,重新判断按键是否安下
{
while(!ql); //松开按键后向下执行
TR0=0; //停止定时器
djs0=99; //djs0赋值99
djs1=99; //djs1赋值99
}
}
if(zjs==0) //倒计时按键按下
{
delayms(3); //延时去除按键抖动,重新判断按键是否安下
if(zjs==0)
{
while(!zjs); //松开按键后向下执行
TR0=0; //停止定时器
pzjs(); //进入倒计时函数
}
}
}
}
/*****************************************************/
/* 函数名:main() */
/* 功能: 主函数 */
/*****************************************************/
void main()
{
Timer0_init(); //定时器0初始化
while(1)
{
P0=0x40;
P3=0x00;
if(zjs==0) //正计时按键按下
{
delayms(3);
if(zjs==0) //延时去除按键抖动,重新判断按键是否安下
{
while(!zjs); //松开按键后向下执行
pzjs(); //进入正计时函数
}
}
if(djs==0) //倒计时按键按下
{
delayms(3);
if(djs==0) //延时去除按键抖动,重新判断按键是否安下
{
while(!djs); //松开按键后向下执行
pdjs(); //进入倒计时函数
}
}
}
}
#include<reg51.h>
#include<intrins.h> //包含库文件
sbit smg1=P3^0; //定义第一位数码管
sbit smg2=P3^1; //定义第二位数码管
sbit smg3=P3^2; //定义第三位数码管
sbit smg4=P3^3; //定义第四位数码管
sbit zjs=P2^0; //定义正计时按键
sbit djs=P2^1; //定义倒计时按键
sbit ks=P2^2; //定义开始按键
sbit zt=P2^3; //定义暂停按键
sbit ql=P2^4; //定义清零按键
sbit spk=P2^5; //定义蜂鸣器
int js=0,djs0=0,djs1=0,flag=0; //临时变量
int table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //共阴极数码管段值
int table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0xf7}; //共阴极数码管带小数点的段值
/*****************************************************/
//以下是函数声明
void pzjs();
void pdjs();
/*****************************************************/
/* 函数名:delayms */
/* 功能:产生毫秒级延时 */
/*****************************************************/
void delayms(int x)
{
char i;
while(x--)
{
for(i=150;i>0;i--);
}
}
/*****************************************************/
/* 函数名:Timer0_init() */
/* 功能:定时器0初始化 */
/*****************************************************/
void Timer0_init()
{
js=0;
TMOD=0x01; //定义定时器0工作模式
TH0=0x4c; //赋初值高位
TL0=0x00; //赋初值低位
//TR0=1; //启动定时器
ET0=1; //开中断
EA=1; //开全局中断
}
/*****************************************************/
/* 函数名:timer0() interrupt 1 using 1 */
/* 功能:定时器0中断服务函数 */
/*****************************************************/
void timer0() interrupt 1 using 1
{
TF0=0;
TH0=0xf3;
TL0=0xff; //重新赋高地位初值
js++;
if(js==3)
{
js=0;
if(flag==0) //标志位flag来判断是正计时还是倒计时 flag=0表示正计时 flag=1表示倒计时
{
if(djs0>=99) //如果djs0大于99
{
djs0=0; //djs0清零
if(djs1>=99) djs1=0; //如果djs1大于99 则djs1清零
else djs1++; //否则 djs1加一
}
else djs0++; //否则 djs0加一
}
if(flag==1) //标志位flag来判断是正计时还是倒计时 flag=0表示正计时 flag=1表示倒计时
{
if(djs0<=0) //如果djs0小于0
{
djs0=99; //djs0重新赋值99
if(djs1<=0) djs1=99; //如果djs1小于0 则djs1赋值99
else djs1--; //否则 djs0减一
}
else djs0--; //否则 djs0减一
}
}
}
/*****************************************************/
/* 函数名:djsxs() */
/* 功能:数码管动态显示 */
/*****************************************************/
void djsxs()
{ int b1,b2,b3,b4;
b1=djs1/10; //将倒计时时间的高位赋予b1
b2=djs1%10; //将倒计时时间的低位赋予b2
b3=djs0/10; //将倒计时时间的高位赋予b1
b4=djs0%10; //将倒计时时间的低位赋予b2
P0=table[b1];
smg1=0;
delayms(3);
smg1=1; //显示b1
P0=table1[b2];
smg2=0;
delayms(3);
smg2=1; //显示b2
P0=table[b3];
smg3=0;
delayms(3);
smg3=1; //显示b1
P0=table[b4];
smg4=0;
delayms(3);
smg4=1; //显示b2
}
/*****************************************************/
/* 函数名:pzjs() */
/* 功能: 进入正计时 */
/*****************************************************/
void pzjs()
{
flag=0; //标志位置0
djs0=0; //djs0清零
djs1=0; //djs1清零
while(1)
{
djsxs(); //显示函数
if(djs1==95) spk=0; //如果djs1等于95时 蜂鸣器开始报警
if(djs1==99) spk=1; //如果djs1等于99时 蜂鸣器结束报警
if(ks==0) //开始按键按下
{
delayms(3);
if(ks==0) //延时去除按键抖动,重新判断按键是否安下
{
while(!ks); //松开按键后向下执行
TR0=1; //启动定时器
}
}
if(zt==0) //暂停按键按下
{
delayms(3);
if(zt==0) //延时去除按键抖动,重新判断按键是否安下
{
while(!zt); //松开按键后向下执行
TR0=0; //停止定时器
}
}
if(ql==0) //清零按键按下
{
delayms(3);
if(ql==0) //延时去除按键抖动,重新判断按键是否安下
{
while(!ql); //松开按键后向下执行
TR0=0; //停止定时器
djs0=0; //djs0清零
djs1=0; //djs1清零
}
}
if(djs==0) //倒计时按键按下
{
delayms(3); //延时去除按键抖动,重新判断按键是否安下
if(djs==0)
{
while(!djs); //松开按键后向下执行
TR0=0; //停止定时器
pdjs(); //进入倒计时函数
}
}
}
}
/*****************************************************/
/* 函数名:pdjs() */
/* 功能: 进入倒计时 */
/*****************************************************/
void pdjs()
{
flag=1; //标志位置1
djs0=99; //djs0赋值99
djs1=99; //djs1赋值99
while(1)
{
djsxs(); //显示函数
if(djs1==5) spk=0; //如果djs1等于5时 蜂鸣器开始报警
if(djs1==0) spk=1; //如果djs1等于0时 蜂鸣器结束报警
if(ks==0) //开始按键按下
{