多通道采集:
Uint32_t Get_ADC_Val(char channels)//获取ADC通道ADC值
{
uint32_t ADC;
// CKDIV=0x02;
switch(channels)
{
case 4:
Enable_ADC_AIN4;
break;
case 5:
Enable_ADC_AIN5;
break;
case 6:
Enable_ADC_AIN6;
break;
case 7:
Enable_ADC_AIN7;
break;
}
clr_ADCF;
set_ADCS; // ADC start trig signal
while(ADCF == 0);
ADC=(ADCRH<<4)+ADCRL;
clr_ADCF;
// CKDIV=0x00;
return ADC;
}
小节总结:ADC的使用相信各位大神已经是使用的滚瓜烂熟了,我这种新手就不多提了,哈哈
附上一篇截图官方文档的ADC使用资料:
定时器模块:官方库中有各个定时器各个模式的sample Code附图:
简单附上定时器0模式1(部分执行代码)的官方代码:
/************************************************************************************************************
* TIMER 1 interrupt subroutine
************************************************************************************************************/
void Timer1_ISR (void) interrupt 3 //interrupt address is 0x001B
{
TH1 = u8TH1_Tmp;
TL1 = u8TL1_Tmp;
P03 = ~P03; //P0.3 toggle when interrupt
}
/************************************************************************************************************
* Main function
************************************************************************************************************/
void main (void)
{
Set_All_GPIO_Quasi_Mode;
TIMER0_MODE1_ENABLE;
TIMER1_MODE1_ENABLE;
clr_T1M;
//set_T1M;
u8TH0_Tmp = (65536-TH0_INIT)/256;
u8TL0_Tmp = (65536-TL0_INIT)%256;
u8TH1_Tmp = (65536-TH1_INIT)/256;
u8TL1_Tmp = (65536-TL1_INIT)%256;
TH0 = u8TH0_Tmp;
TL0 = u8TL0_Tmp;
TH1 = u8TH1_Tmp;
TL1 = u8TL1_Tmp;
set_ET0; //enable Timer0 interrupt
set_ET1; //enable Timer1 interrupt
set_EA; //enable interrupts
set_TR0; //Timer0 run
set_TR1; //Timer1 run
while(1);
}
附上我自己(基于新唐官方库)修改后的使用定时器执行代码:
void Timer0_Init(void)//
{
//TMOD = 0XFF;
CKDIV=0X0C;
TIMER0_MODE1_ENABLE; //Timer 0 and Timer 1 mode configuration
// TIMER1_MODE2_ENABLE;
clr_T0M;
u8TH0_Tmp =TIMER_DIV12_VALUE_1ms>>8; //12分频初值
u8TL0_Tmp =TIMER_DIV12_VALUE_1ms; //
TH0 = u8TH0_Tmp;
TL0 = u8TL0_Tmp;
set_ET0; //enable Timer0 interrupt
//set_ET1; //enable Timer1 interrupt
set_EA; //enable interrupts
set_TR0; //Timer0 run
//set_TR1; //Timer1 run
CKDIV=0X00;
}
void Timer0_ISR (void) interrupt 1
{
TH0 = u8TH0_Tmp;
TL0 = u8TL0_Tmp;
time_count++;
key_handle=1;
if(time_count==1000)
{
time_count=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi==24)
{
shi=0;
}
}
}
}
TF0=0;
}
附上一张官方文档:
小节总结:官方提供的sample CODE 覆盖了整个定时器模块,给新人使用还是很有参考价值的,这次我也是第一次使用新唐的单片机,个人感觉还是挺方便的, N76E003 纯C51风格开发,(但就是定时器的使用让我思考起来人生),下载了官方库下来参考,看工程,咦!代码风格不一般,内设使用起来这么方便(库都已近定义好了),这不是Ctrl+c\Ctrl+v就能解决了吗!
这样新手 用起来就难堪了,我怎么调试定时中断时间都不对,难道是初值算错了,于是又找度娘,看看定时器初值怎么计算。改了改溢出值(还是不对,能力不够或者是解决问题的方向不对)于是又滑动鼠标滚轮看起了规格书(还好新唐的规格书是中文,不然就尴尬了)
规格书介绍的也挺简单的呀,看了看又调试,还是不行。于是又回到了官方库sample Code
附上一张官方库的文件图片:(提供的图片没什么用,就看看)
在官方库中的定时器模块没有找到解决方法。
哎,再仔细看看官方的库
有这么一个源文件:
看到有以下这些像是定时器的延时代码,想会不会是这些。
void Timer0_Delay100us(UINT32 u32CNT)
{
clr_T0M; //T0M=0, Timer0 Clock = Fsys/12
TMOD |= 0x01; //Timer0 is 16-bit mode
set_TR0; //Start Timer0
while (u32CNT != 0)
{
TL0 = LOBYTE(TIMER_DIV12_VALUE_100us); //Find define in "Function_define.h" "TIMER VALUE"
TH0 = HIBYTE(TIMER_DIV12_VALUE_100us);
while (TF0 != 1); //Check Timer0 Time-Out Flag
clr_TF0;
u32CNT --;
}
clr_TR0; //Stop Timer0
}
//------------------------------------------------------------------------------
void Timer0_Delay1ms(UINT32 u32CNT)
{
clr_T0M; //T0M=0, Timer0 Clock = Fsys/12
TMOD |= 0x01; //Timer0 is 16-bit mode
set_TR0; //Start Timer0
while (u32CNT != 0)
{
TL0 = LOBYTE(TIMER_DIV12_VALUE_1ms); //Find define in "Function_define.h" "TIMER VALUE"
TH0 = HIBYTE(TIMER_DIV12_VALUE_1ms);
while (TF0 != 1); //Check Timer0 Time-Out Flag
clr_TF0;
u32CNT --;
}
clr_TR0; //Stop Timer0
}
像延时一样,填上定时器初值看看定时中断对不对,调试又不对
TL0 = Timer0_Delay1ms(1);//1ms定时中断 初值
TH0 = Timer0_Delay1ms(1);
不对,,,,,,,还是不对。
再找找看看怎么解决,(又回到了下面的文件里,定时器初值的定义),填上去试试对不对,还是不对,呀呀呀呀呀。
仔细思考了一会,#define TIMER_DIV12_VALUE_1ms 65536-1334//1334*12/16000000 = 1 mS, // Timer divider = 12
这个初值是要对定时器模块进行相关的分频后的初值吗?
于是又看起了官方库,没有相关的定时器分频的使用参考呀,于是再回到了规格书:
找分频的使用介绍看看:附上图片:
看到这些资料,试试对定时器进行时钟分频调调看:于是就又了以下代码:
前面已经贴出,这里贴图片只做经验介绍总结。这里箭头和圈圈的就是我的解决方法了,定时器1ms中断实现了
|