求助哪位大哥解釋一下
#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秒閃爍一次指示
// }
}
|