|
【聲明】此程序僅用于學習與參考,引用請注明版權和作者信息!
*********************************************************************
*********************************************************************/
#include "STC8G1K08A.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 //210 個時鐘周期轉換一次
#define ADC_SPEEDL 0x20 //420 個時鐘周期轉換一次
#define ADC_SPEEDH 0x40 //630 個時鐘周期轉換一次
#define ADC_SPEEDHH 0x60 //840 個時鐘周期轉換一次
/********************************************************************
初始定義
*********************************************************************/
uint tcnt=0;
uint sec=0;
uint dat=0;
uint dat1=0;
uint dat2=0;
/********************************************************************
I/O定義
*********************************************************************/
sbit PWM1=P3^2; //PWM輸出端
sbit PWM2=P3^3; //PWM輸出端
uchar CLK=0;//脈沖計數
/********************************************************************
定時器T0初始化
*********************************************************************/
void timer0_init()
{
AUXR &= 0x7F; //定時器時鐘12T模式
TMOD &= 0xF0; //設置定時器模式
TMOD |= 0x02; //設置定時器模式
//TL0 = 0x9D; //設置定時初始值
//TH0 = 0x9D; //設置定時重載值
TL0 = 0xF6; //設置定時初始值
TH0 = 0xF6; //設置定時重載值
TR0=1; //開始定時
ET0=1;
EA=1;
}
void InitADC()
{
ADC_RES = 0; //AD數據寄存器清空
ADC_CONTR = ADC_POWER | ADC_SPEEDLL;//打開AD電源,轉換周期210
_nop_(); //延時一個機器周期
_nop_();
_nop_(); //延時一個機器周期
}
/********************************************************************
主函數
*********************************************************************/
void main()
{
P3M0 = 0x0c; P3M1 = 0x00;
P5M0 = 0x00; P5M1 = 0x10;
InitADC(); //AD初始化
ADCCFG = 0x0f; //設置ADC時鐘為系統時鐘/2/16/16
ADC_CONTR = 0x80; //使能ADC模塊
timer0_init();
while(1)
{
ADC_CONTR |= 0x44; //啟動AD轉換 選擇P5.4口
_nop_();
_nop_();
while (!(ADC_CONTR & 0x20)); //查詢ADC完成標志
ADC_CONTR &= ~0x20; //清完成標志
dat = ADC_RES; //讀取ADC結果高8位
//dat1=ADC_RESL;
dat1=ADC_RES/2.5;
//if(dat1<=1){dat1=1;}
if(dat1>=100){dat1=100;}
dat2=dat1+100;
}
}
/********************************************************************
定時器T0中斷服務函數
*********************************************************************/
void t0(void) interrupt 1 using 0 //定時中斷服務函數
{
tcnt++; //每過250ust tcnt 加一
if(tcnt==1000) //數值越大閃爍越慢 數值越小閃爍越快
{
tcnt=0;
P30=!P30;
}
sec++;
if(sec==100){PWM1=0;}
if(sec==dat2){PWM2=0;}
if(sec==2000){PWM1=1;PWM2=1;sec=0;}
}
//}
/********************************************************************
結束
*********************************************************************/
|
評分
-
查看全部評分
|