本帖最后由 wzhllqwzc 于 2012-4-29 23:52 编辑
程序贴出来,高手指点!!
//**************************//
//MCU:STC11F02
//FREQ:内部
//程序功能:倒计时开关
//编写:
//编写日期:2011.11.06
//调试:
//修改时间:
//***********************************//
#include <reg51.h>
#define unchar unsigned char
#define unint unsigned int
//*************
sbit key_enter =P3^3; //按键:"确定" 外部中断1
sbit key_min =P3^4; //按键:"减"
sbit key_add =P3^5; //按键:"加"
sbit wei_min =P3^0; //位选秒百位
sbit wei_sec1 =P3^1; //位选秒十位
sbit wei_sec0 =P3^2; //位选秒个位
sbit ctr =P3^7; //控制端
sbit beep =P1^0; //声音控制位
unchar t0_con,t0_con1; //T0计时器内部累加
unchar num; //定义键盘输入值
//*******共阳极七段数码管数组******//
unchar code seg7[10]={0x02,0x9e,0x24,0x0c,0x98,0x48,0x40,0x1e,0x00,0x08};
//*************//
//*****初始显示数组*******//
unchar code ready[3]={0x02,0x00,0xfc};
//*************//
/*************************************************************
* 毫秒级延时函数 *
调用函数必须给延时函数一个0~65535的延时值对应0MS到65535MS
/*************************************************************/
void delay (unint a){ //需要输入变量值0~65535
unsigned char i;
while( --a != 0){ //i 从0加到125,CPU大概就耗时1毫秒
for(i = 0; i < 125; i++); //空指令循环125次
}
}
/*************************************************************
/**********显示程序***********************/
void display(unsigned char num,unsigned char t0_con1)
{
unint k,m,n;
k=t0_con1;
m=(num%100)/10;
n=(num%100)%10;
wei_min=0;
wei_sec1=0;
wei_sec0=0;
wei_min=1;
wei_sec1=0;
wei_sec0=0;
P1=seg7[k];
delay(10);
wei_min=0;
wei_sec1=0;
wei_sec0=0;
wei_min=0;
wei_sec1=1;
wei_sec0=0;
P1=seg7[m];
delay(10);
wei_min=0;
wei_sec1=0;
wei_sec0=0;
wei_min=0;
wei_sec1=0;
wei_sec0=1;
P1=seg7[n];
delay(10);
wei_min=0;
wei_sec1=0;
wei_sec0=0;
}
/*****************************************************************************/
void display1(void)
{
wei_min=0;
wei_sec1=0;
wei_sec0=0;
delay(1);
wei_min=1;
wei_sec1=1;
wei_sec0=1;
P1=ready[0];
delay(1000);
wei_min=0;
wei_sec1=0;
wei_sec0=0;
delay(10);
wei_min=1;
wei_sec1=1;
wei_sec0=1;
P1=ready[1];
delay(1000);
wei_min=0;
wei_sec1=0;
wei_sec0=0;
delay(10);
wei_min=1;
wei_sec1=1;
wei_sec0=1;
P1=ready[2];
delay(1000);
}
/*******************
//*****************************************************************************/
/*****************************************************************************/
/*****************************************************************************/
//外部中断处理(扫描)//
void int1() interrupt 2 using 2
{
if(INT1==0)
{ TR0=1;
ctr=1;
}
}
/*****************************************************************************/
/*****************************************************************************/
//时间发生程序(计数器中断T0)//
void t0_init (void) {//T0定时器初始化//
TH0 = 0x3c;//载入初值 50ms(12MHZ)
TL0 = 0xb0;
TMOD = 0x01;//定时计数器0工作方式1
ET0 = 1;//开定时器中断
TR0 = 0;//启动定时器
// EA = 1;//开总中断
t0_con = 10;//1s
}
//********************
void t0 (void) interrupt 1 using 1{//定时器中断处理程序//
unchar i;
TH0 = 0x3c;//载入初值 15536
TL0 = 0xb0;
t0_con--; //到50ms计数减1
if(t0_con <= 0){//到1s的处理
t0_con = 10;
num--;
if(num<=0&&t0_con1>0)
{
num=60;
t0_con1--;
if(num<=0&&t0_con1<=0)
{
num=0;
t0_con1=0;
}
}
if (t0_con1==0&&num==0)
{ ctr=0;
TR0=0;
EA=0;
display(num,t0_con1);
for (i=0;i<5;i++)
{beep=1;
delay(1000);
}
}
}
}
/*****************************************************************************/
/*****************************************************************************/
void init1(void)
{
IT0=1;
IT1=1;
EX0=1;
EX1=1;
// EA=1;
PX1=1;
}
/*****************************************************************************/
//主程序//
void main(void){
unchar i;
init1();
t0_init();
beep=1;
delay(10000);
for (i=0;i<5;i++)
{
display1();
}
ctr=0;
delay(100);
while(1){
display(num,t0_con1);
if(key_add==0) // 时间调整加
{ delay(10);
if(key_add==0)
{delay(10);
EA=1;
if(num<60&&t0_con1<=9)
{ num++;
if(num>=60&&t0_con1<9)
{
num=0;
t0_con1++;
if(t0_con1>=9&&num>=60)
{
t0_con1=9;
num=60;
}
}
}
}
}
if(key_min==0) // 时间调整减
{ delay(10);
if(key_min==0)
delay(10);
if(num>0&&t0_con1>=0)
{ num--;
if(num<=0&&t0_con1>0)
{
t0_con1--;
num=60;
if(num<=0&&t0_con1<=0)
num=0;
t0_con1=0;
EA=0;
}
}
}
}
}
图片发不上来,稍后上图
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>