求助哪位大哥解释一下
#include "STC15F2Kxx.h"
#include "Delay.h"
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int
#define ADC_POWER 0x80 //ADC电源控制位
#define ADC_FLAG 0x10 //ADC完成标志
#define ADC_START 0x08 //ADC起始控制位
#define ADC_SPEEDLL 0x00 //540个时钟
#define ADC_SPEEDL 0x20 //360个时钟
#define ADC_SPEEDH 0x40 //180个时钟
#define ADC_SPEEDHH 0x60 //90个时钟
void InitADC();
void Init();
uchar ADC_Value=0,Set,seconds=0,Minutes=10,tt;
uchar code Tab0[] =
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//0、1、2、3、4、5、6、7、8、9的显示码
uchar code Tab1[]= //定义数码管数组,小数点
{0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF};
sbit KS1 = P1^0; //数码管1位选
sbit KS2 = P1^1; //数码管2位选
sbit KS3 = P1^2; //数码管3位选
sbit KS4 = P1^3; //数码管4位选
sbit LED = P5^5; //LED指示灯
/*------------------------------------------------
mS延时函数,含有输入参数 unsigned char t,无返回值
unsigned char 是定义无符号字符变量,其值的范围是
0~255 这里使用晶振12M,精确延时请使用汇编
------------------------------------------------*///
void Delay(unsigned int x) ///////1ms延时
{
unsigned char i,j;
for(;x>0;x--)
{
for(i=10;i>0;i--)
for(j=10;j>0;j--);
}
}
void Display0() //显示时钟
{
if(Set==0)
{
P3=Tab0[ADC_RES/10]; //显示秒的个位
KS1=0; //段选
Delay(10); //延时
KS1=1; //消隐
P3=Tab0[ADC_RES%10]; //显示秒的十位
KS2=0; //段选
Delay(10); //延时
KS2=1; //消隐
P3=Tab0[Minutes/10]; //显示分的个位,需要加上小数点做分隔符
KS3=0; //段选
Delay(10); //延时
KS3=1; //消隐
P3=Tab0[Minutes%10]; //显示分的十位
KS4=0; //段选
Delay(10); //延时
KS4=1; //消隐
}
else
{
P3=Tab1[seconds/10]; //显示秒的个位
KS1=0; //段选
Delay(10); //延时
KS1=1; //消隐
P3=Tab1[seconds%10]; //显示秒的十位
KS2=0; //段选
Delay(10); //延时
KS2=1; //消隐
P3=Tab1[Minutes/10]; //显示分的个位,需要加上小数点做分隔符
KS3=0; //段选
Delay(10); //延时
KS3=1; //消隐
P3=Tab1[Minutes%10]; //显示分的十位
KS4=0; //段选
Delay(10); //延时
KS4=1; //消隐
}
}
/*******************************************************************************
* 函数名 : main
* 描述 : 主函数,用户程序从main函数开始运行
* 输入 : 无
* 输出 : 无
* 返回值 : 无
* 说明 : 无
*******************************************************************************/
void main(void)
{
P3M1 &= 0x00;
P3M0 |= 0x00;
P1M1 &= 0x00;
P1M0 |= 0x00;
P5M1 &= 0x00;
P5M0 |= 0xFF;
Init();
Timer0_Init_Config(); //定时器0 16位自动重载模式初始配置
InitADC(); //初始化ADC
// Display0();
while(1)
{
// LED=!LED;
Delay_Nms(200);
}
}
/*******************************************************************************
* 函数名 : InitADC
* 描述 : 初始化ADC
* 输入 : 无
* 输出 : 无
* 返回值 : 无
* 说明 : 无
*******************************************************************************/
void InitADC()
{
unsigned char ch;
ch=0;
P1ASF = 0x10; //设置P1.0口为AD口
ADC_RES = 0; //清除结果寄存器
ADC_CONTR = 0;
ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch;
Delay_Nms(5);//延时500ms//ADC上电并延时
EADC = 1;//使能ADC中断
EA=1;//使能总中断
}
/*******************************************************************************
* 函数名 : ADC_ISR
* 描述 : ADC中断服务函数
* 输入 : 无
* 输出 : 无
* 返回值 : 无
* 说明 : 无
*******************************************************************************/
void ADC_ISR() interrupt 5
{
unsigned char ch;
ADC_CONTR &= !ADC_FLAG; //清除ADC中断标志
if(ADC_RES > 100)//A/D转换结果高8位
{
//LED=1; //点亮LED.P21
}
else
{
//LED=0; //关闭LED.P21
}
ch=0;
ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch;
}
/*************************************************************************
**************************************************************************
******************************* 中断初始化函数*****************************
**************************************************************************
***********************************************************************////
void Init() //中断初始化函数
{
EA=1; //开总中断
TMOD=0X11; //定时器工作方式选择,定时器0和定时器1都选择第1种工作方式
TH0=(65536-10000)/256; //定时器0装初值,定时50ms
TL0=(65536-10000)%256;
ET0=1; //开定时器0开关
TR0=1; //开定时器0小开关
TH1=(65536-10000)/256; //定时器1装初值,定时50ms
TL1=(65536-10000)%256;
ET1=1; //开定时器1开关
TR1=1; //关定时器1小开关
}
/*************************************************************************
******************************* 定时器1***********************************
***********************************************************************////
void Time1() interrupt 3 //定时器1函数
{
TH1=(65536-10000)/256; //重装初值
TL1=(65536-10000)%256;
Display0(); //数码管在定时器1里时时显示时间
tt++;
if(tt>50) //每溢出10次Time0_bit取反一次
{
Set=1;
LED=1; //0.5秒闪烁一次指示
}
if(tt>100) //每溢出10次Time0_bit取反一次
{
tt=0;
Set=0;
LED=0; //0.5秒闪烁一次指示
}
}
/*************************************************************************
******************************* 定时器0***********************************
***********************************************************************////
void Time0() interrupt 1 //定时器0函数
{
TH0=(65536-1000)/256; //重装初值
TL0=(65536-1000)%256;
// tt++;
// if(tt>20) //每溢出10次Time0_bit取反一次
// {
// Set=1;
// LED=1; //0.5秒闪烁一次指示
// }
// if(tt>40) //每溢出10次Time0_bit取反一次
// {
// tt=0;
// Set=0;
// LED=0; //0.5秒闪烁一次指示
// }
}
|