刚接触单片机,现在实在没有独立写程序的能力,仅仅刚入门,所以只能在拿老师们的程序练习,现有问题请教各位老师:
下面这个程序,原来是999分钟倒计时,现在被我改成99分钟了,增加了暂停功能,暂停不影响继电器,继电器要在倒计时结束后才断电.
现在想添加两只led做指示,led1在计时开始的时候闪一下,(约0.5秒)led2在计时结束时闪一下(约0.5秒)或者在最后一分种的时候闪一下(约0.5秒)。请问老师们这该怎么改呢?先谢谢各位老师们了。
单片机源程序:
- //#include<reg52.h>
- #include<STC12C2052AD.h> //库文件
- #include<intrins.h>
- #define uchar unsigned char //宏定义字符型变量
- #define uint unsigned int //宏定义整型变量
- /*声明 SFR 相关 与 的 IAP*/
- sfr IAP_DATA = 0xE2;
- sfr IAP_ADDRH = 0xE3;
- sfr IAP_ADDRL = 0xE4;
- sfr IAP_CMD = 0xE5;
- sfr IAP_TRIG = 0xE6;
- sfr IAP_CONTR = 0xE7;
- /********************************************************************
- IO口定义
- ********************************************************************/
- uchar s1=0;
- bit write=0;
- uint txian,dxian;
- uchar txian1,txian2;
- uchar dxian1,dxian2;
- uchar T0RH=0,T0RL=0;
- uint ms=0;
- uchar A1,A2;
- uchar B1,B2;
- uchar C1,C2;
- uchar D1,D2;
- bit bz1=0;
- bit bz2=0;
- sbit P10=P1^0;//数码管段
- sbit P11=P1^1;//数码管段
- sbit P12=P1^2;//数码管段
- sbit P13=P1^3;//数码管段
- sbit P14=P1^4;//数码管段
- sbit P15=P1^5;//数码管段
- sbit P16=P1^6;//数码管段
- sbit AIN1=P1^7;//信号输入
- sbit P30=P3^0;//按键输入
- sbit P31=P3^1;//按键输入
- sbit P32=P3^2;//数码管位
- sbit P33=P3^3;//数码管位
- sbit LED1=P3^4;//?
- sbit LED2=P3^5;//?
- sbit OUT1=P3^7;//继电器输出
- bit ts=1; //
- bit yxbz=0; //
- uint xianshi;
- /********************************************************************
- 定义 ISP/IAP/EEPROM 命令
- *********************************************************************/
- #define CMD_IDLE 0
- #define CMD_READ 1
- #define CMD_PROGRAM 2
- #define CMD_ERASE 3
- #define ENABLE_IAP 0x83//SYSCLK<12MH
- #define IAP_ADDRESS 0x0000//存储地址
- /********************************************************************
- 禁用 ISP/IAP/EEPROM functionmake 单片机 在 一 安全 状态
- *********************************************************************/
- void IapIdle()
- {
- IAP_CONTR = 0; //
- IAP_CMD = 0; //
- IAP_TRIG = 0; //
- IAP_ADDRH = 0x80; //
- IAP_ADDRL = 0; //
- }
- /********************************************************************
- 读数据
- *********************************************************************/
- uchar IapReadByte(uint addr)
- {
- uchar dat;
- IAP_CONTR = ENABLE_IAP;
- IAP_CMD = CMD_READ;
- IAP_ADDRL = addr;
- IAP_ADDRH = addr >> 8;
- IAP_TRIG = 0x46;
- IAP_TRIG = 0xb9;
- _nop_();
- dat = IAP_DATA;
- IapIdle();
- return dat;
- }
- /********************************************************************
- 写数据
- *********************************************************************/
- void IapProgramByte(uint addr, uchar dat)
- {
- IAP_CONTR = ENABLE_IAP;
- IAP_CMD = CMD_PROGRAM;
- IAP_ADDRL = addr;
- IAP_ADDRH = addr >> 8;
- IAP_DATA = dat;
- IAP_TRIG = 0x46;
- IAP_TRIG = 0xb9;
- _nop_();
- IapIdle();
- }
- /********************************************************************
- 擦除数据
- *********************************************************************/
- void IapEraseSector(uint addr)
- {
- IAP_CONTR = ENABLE_IAP;
- IAP_CMD = CMD_ERASE;
- IAP_ADDRL = addr;
- IAP_ADDRH = addr >> 8;
- IAP_TRIG = 0x46;
- IAP_TRIG = 0xb9;
- _nop_();
- IapIdle();
- }
- /********************************************************************
- 初始定义
- *********************************************************************/
- code uchar seg7code[10]={0xfB,0x89,0xf5,0xdD,0x8F,0xdE,0xfE,0xc9,0xfF,0xdF}; //显示段码 数码管字跟
- /********************************************************************
- 延时函数
- *********************************************************************/
- void delay(uchar t)
- {
- uchar i,j;
- for(i=0;i<t;i++)
- {
- for(j=130;j>0;j--);
- { ;
- }
- }
- }
- /********************************************************************
- 显示函数 接通时间
- *********************************************************************/
- //void tong(uchar tdate) //显示函数
- void tong() //显示函数
- {
- C1=txian%100/10;
- C2=txian%10;
- P32=1;P33=1;
- P1=seg7code[C1];
- P32=0;P33=1;
- delay(80);
- P32=1;P33=1;
- P1=seg7code[C2];
- P32=1;P33=0;
- delay(80);
- }
-
- void key()
- {
- if(P30==0)
- {
- delay(80);
- if(P30==0)
- {
- s1++;
- if(s1>=4){s1=0;}
- while(!P30);
- }
- }}
- //定时器0初始化
- void t0_init(unsigned char ms0) //ms0最大71
- {
- /***********************************************
- 一个机器周期=12*时钟周期。
- 11059200为时钟周期,一共为11059200/12=921600,就是每秒为921600Hz,
- 八位定时器 最大计时 0.2777778ms
- 十六位定时器最大计时 71.111111ms
- 11.0592MHz除12为921600Hz,就是一秒921600次机器周期,10ms=9216次机器周期。
- 65536-9216=56320(dc00)
- TH0=0xdc,TL0=0x00
- ***********************************************/
- long tmp; //临时变量
- tmp = 11059200 / 12;
- tmp = (tmp * ms0) / 1000;
- tmp = 65536 - tmp;
- tmp = tmp + 3;
- T0RH = (unsigned char)(tmp>>8);
- T0RL = (unsigned char)tmp;
- TMOD &=0XF0;
- TMOD |=0X01; //方式一 一共四种方式 GATE0 C/T0 M0_1 M0_0 C/T0选择时钟计数还是外部计数 方式0是十三位定时器 ,方式1是十六位定时器,方式2是八位自动 方式4是两个八位
- TH0=T0RH;
- TL0=T0RL;
- ET0=1; //使能T0中断
- EA=1;
- TR0=1;
- }
- /********************************************************************
- 主函数
- *********************************************************************/
- void main()
- {
- unsigned char flag=1,flag2=0;;
- txian1 = IapReadByte(0x01); //读取0x01中的数据 并附给ca
- txian2 = IapReadByte(0x02); //读取0x01中的数据 并附给ca
- t0_init(10);
- P1M0=0X00;P1M1=0X7f;
- txian=txian1*10+txian2;
- xianshi=txian;
- OUT1=1;
- //ts=0;bz1=1;ms=0;OUT1=0;
- while(1)
- {
- key();
- if((AIN1==0)&&(bz1==0)&&(ts==0)){delay(80);
- if(AIN1==0){bz1=1;yxbz=!yxbz;}}
- if((AIN1==0)&&(bz1==0)&&(ts==1)){delay(80);
- if(AIN1==0){yxbz=1;ts=0;bz1=1;ms=0;OUT1=0;}}
- if((AIN1==1)&&(bz1==1)){bz1=0;}
- if(write==1)
- {
- TR0=0;
- write=0;
- IapEraseSector(0);
- IapProgramByte(0x01,txian1);
- IapProgramByte(0x02,txian2);
- TR0=1;
- xianshi=txian;
- }
- }
- }
- void t0(void) interrupt 1 using 0 //定时中断服务函数
- {
- TH0=T0RH;
- TL0=T0RL;
- switch (s1){
- case 0: tong();break;
- case 1:ts=1;P1=seg7code[A1];P32=0;P33=1;if(P31==0){A1++;if(A1>9)A1=0;while(!P31);}break;
- case 2: P1=seg7code[A2];P32=1;P33=0;if(P31==0){A2++;if(A2>9)A2=0;while(!P31);}break;
- case 3: txian1=A1;txian2=A2;txian=txian1*10+txian2;write=1;break;
- default: break;
- }
- if(yxbz==1)
- {
- ms++;
- if(ms==4800) //ms=80是1秒
- {
- ms=0;
- if(ts==0){txian--;if(txian<=0){bz1=0;OUT1=1;txian=txian1*10+txian2;ts=1;}}
- }
- }
- }
复制代码
|