02-Timer0-Timer1-Timer2-Timer3-Timer4测试程序
1, 硬件连接方式:
2,烧录:
3. 查看例子说明
4. 查看原理图:
5. 实物对应位置:
例子 《03-用P6,P7口驱动8个数码管》
1. 硬件连接:
2. 烧写:
3. 原理图:
4.烧写完成后,可以查看实际效果:
5. 实际显示内容位一个数字时钟。
第一步:硬件连接:
第二步:烧写
第三步:查看例子说明
第4步:查看原理图
第5步:查看实物效果.
例子 17-NTC测温度数码管显示
1. 硬件连接: 略
2. 烧写:
3. 查看例子说明:
4.查看原理图:
5. 实物对照:
例子:25-高级PWM1-PWM2-PWM3-PWM4,驱动P6口呼吸灯实验程序
步骤1:硬件连接(略)
步骤2:烧写
步骤3:查看原理图:
步骤4:查看实物:
步骤5: 查看例子说明:
例子程序 29-红外遥控接收程序(NEC码)-数码管显示用户地址和键值
1、硬件连接:
2. 烧写
3、原理图 :
4. 查看例子说明
例子 15-IO行列扫描键盘数码管显示键值和调整时间
没有看懂下面这个读取方法
/*---------------------------------------------------------------------*/
/* --- STC MCU Limited ------------------------------------------------*/
/* --- STC 1T Series MCU Demo Programme -------------------------------*/
/* --- Mobile: (86)13922805190 ----------------------------------------*/
/* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/
/* --- Tel: 86-0513-55012928,55012929,55012966 ------------------------*/
/* --- Web: www.STCAI.com ---------------------------------------------*/
/* --- BBS: www.STCAIMCU.com-----------------------------------------*/
/* --- QQ:800003751 -------------------------------------------------*/
/* Èç¹ûÒªÔÚ³ÌÐòÖÐʹÓô˴úÂë,ÇëÔÚ³ÌÐòÖÐ×¢Ã÷ʹÓÃÁËSTCµÄ×ÊÁϼ°³ÌÐò */
/*---------------------------------------------------------------------*/
/*************¹¦ÄÜ˵Ã÷ **************
±¾Àý³Ì»ùÓÚSTC32GΪÖ÷¿ØÐ¾Æ¬µÄʵÑéÏä½øÐбàд²âÊÔ¡£
ʹÓÃKeil C251±àÒëÆ÷£¬Memory ModelÍÆ¼öÉèÖÃXSmallģʽ£¬Ä¬È϶¨Òå±äÁ¿ÔÚedata£¬µ¥Ê±ÖÓ´æÈ¡·ÃÎÊËٶȿ졣
edata½¨Òé±£Áô1K¸ø¶ÑջʹÓ㬿ռ䲻¹»Ê±¿É½«´óÊý×é¡¢²»³£ÓñäÁ¿¼Óxdata¹Ø¼ü×Ö¶¨Òåµ½xdata¿Õ¼ä¡£
ÓÃSTCµÄMCUµÄIO·½Ê½Çý¶¯8λÊýÂë¹Ü¡£
ÏÔʾЧ¹ûΪ: ÊýÂëʱÖÓ.
ʹÓÃTimer0µÄ16λ×Ô¶¯ÖØ×°À´²úÉú1ms½ÚÅÄ,³ÌÐòÔËÐÐÓÚÕâ¸ö½ÚÅÄÏÂ,Óû§ÐÞ¸ÄMCUÖ÷ʱÖÓÆµÂÊʱ,×Ô¶¯¶¨Ê±ÓÚ1ms.
×ó±ß4λLEDÏÔʾʱ¼ä(Сʱ,·ÖÖÓ), ÓÒ±ß×îºóÁ½Î»ÏÔʾ°´¼üÖµ.
ADC°´¼ü¼üÂëΪ1~16.
°´¼üÖ»Ö§³Öµ¥¼ü°´ÏÂ, ²»Ö§³Ö¶à¼üͬʱ°´ÏÂ, ÄÇÑù½«»áÓв»¿ÉÔ¤ÖªµÄ½á¹û.
¼ü°´Ï³¬¹ý1Ãëºó,½«ÒÔ10¼ü/ÃëµÄËÙ¶ÈÌá¹©ÖØ¼üÊä³ö. Óû§Ö»ÐèÒª¼ì²âKeyCodeÊÇ·ñ·Ç0À´ÅжϼüÊÇ·ñ°´ÏÂ.
µ÷Õûʱ¼ä¼ü:
¼üÂë1: Сʱ+.
¼üÂë2: Сʱ-.
¼üÂë3: ·ÖÖÓ+.
¼üÂë4: ·ÖÖÓ-.
ÏÂÔØÊ±, Ñ¡ÔñʱÖÓ 24MHZ (Óû§¿É×ÔÐÐÐÞ¸ÄÆµÂÊ).
******************************************/
#include "..\..\comm\STC32G.h"
#include "stdio.h"
#include "intrins.h"
typedef unsigned char u8;
typedef unsigned int u16;
typedef unsigned long u32;
#define MAIN_Fosc 24000000UL
//==========================================================================
#define Timer0_Reload (65536UL -(MAIN_Fosc / 1000)) //Timer 0 ÖÐ¶ÏÆµÂÊ, 1000´Î/Ãë
#define DIS_DOT 0x20
#define DIS_BLACK 0x10
#define DIS_ 0x11
u8 code t_display[]={ //±ê×¼×Ö¿â
// 0 1 2 3 4 5 6 7 8 9 A B C D E F
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
//black- H J K L N o P U t G Q r M y
0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e,
0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x46}; //0. 1. 2. 3. 4. 5. 6. 7. 8. 9. -1
u8 code T_COM[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //λÂë
u8LED8; //ÏÔʾ»º³å
u8display_index;//ÏÔʾλË÷Òý
bit B_1ms; //1ms±êÖ¾
u8ADC_KeyState,ADC_KeyState1,ADC_KeyState2,ADC_KeyState3; //¼ü״̬
u8ADC_KeyHoldCnt; //¼ü°´Ï¼ÆÊ±
u8KeyCode; //¸øÓû§Ê¹ÓõļüÂë, 1~16ÓÐЧ
u8cnt10ms;
u8SndKeyCode;
u8hour,minute,second; //RTC±äÁ¿
u16 msecond;
void CalculateAdcKey(u16 adc);
u16 Get_ADC12bitResult(u8 channel); //channel = 0~15
void DisplayRTC(void);
void RTC(void);
sbit P_IR_TX = P2^7; //????????
#define IR_TX_ON 0
#define IR_TX_OFF 1
void PWM_config(void);
void SendIrNec(void);
/**********************************************/
void main(void)
{
u8i;
u16 j;
WTST = 0;//ÉèÖóÌÐòÖ¸ÁîÑÓʱ²ÎÊý£¬¸³ÖµÎª0¿É½«CPUÖ´ÐÐÖ¸ÁîµÄËÙ¶ÈÉèÖÃΪ×î¿ì
EAXFR = 1; //À©Õ¹¼Ä´æÆ÷(XFR)·ÃÎÊʹÄÜ
CKCON = 0; //Ìá¸ß·ÃÎÊXRAMËÙ¶È
P0M1 = 0x30; P0M0 = 0x30; //ÉèÖÃP0.4¡¢P0.5Ϊ©¼«¿ªÂ·(ʵÑéÏä¼ÓÁËÉÏÀµç×èµ½3.3V)
P1M1 = 0x31; P1M0 = 0x30; //ÉèÖÃP1.4¡¢P1.5Ϊ©¼«¿ªÂ·(ʵÑéÏä¼ÓÁËÉÏÀµç×èµ½3.3V), P1.0 Ϊ ADC ¸ß×èÊäÈë¿Ú
P2M1 = 0x3c; P2M0 = 0x3c; //ÉèÖÃP2.2~P2.5Ϊ©¼«¿ªÂ·(ʵÑéÏä¼ÓÁËÉÏÀµç×èµ½3.3V)
P3M1 = 0x50; P3M0 = 0x50; //ÉèÖÃP3.4¡¢P3.6Ϊ©¼«¿ªÂ·(ʵÑéÏä¼ÓÁËÉÏÀµç×èµ½3.3V)
P4M1 = 0x3c; P4M0 = 0x3c; //ÉèÖÃP4.2~P4.5Ϊ©¼«¿ªÂ·(ʵÑéÏä¼ÓÁËÉÏÀµç×èµ½3.3V)
P5M1 = 0x0c; P5M0 = 0x0c; //ÉèÖÃP5.2¡¢P5.3Ϊ©¼«¿ªÂ·(ʵÑéÏä¼ÓÁËÉÏÀµç×èµ½3.3V)
P6M1 = 0xff; P6M0 = 0xff; //ÉèÖÃΪ©¼«¿ªÂ·(ʵÑéÏä¼ÓÁËÉÏÀµç×èµ½3.3V)
P7M1 = 0x00; P7M0 = 0x00; //ÉèÖÃΪ׼˫Ïò¿Ú
PWM_config();
P_IR_TX = IR_TX_OFF;
display_index = 0;
ADCTIM = 0x3f; //ÉèÖà ADC ÄÚ²¿Ê±Ðò£¬ADC²ÉÑùʱ¼ä½¨ÒéÉè×î´óÖµ
ADCCFG = 0x2f; //ÉèÖà ADC ʱÖÓΪϵͳʱÖÓ/2/16/16
ADC_CONTR = 0x80; //ʹÄÜ ADC Ä£¿é
AUXR = 0x80; //Timer0 set as 1T, 16 bits timer auto-reload,
TH0 = (u8)(Timer0_Reload / 256);
TL0 = (u8)(Timer0_Reload % 256);
ET0 = 1; //Timer0 interrupt enable
TR0 = 1; //Tiner0 run
EA = 1; //´ò¿ª×ÜÖжÏ
for(i=0; i<8; i++)LED8 = 0x10; //ÉϵçÏûÒþ
hour = 12; //³õʼ»¯Ê±¼äÖµ
minute = 0;
second = 0;
DisplayRTC();
ADC_KeyState= 0;
ADC_KeyState1 = 0;
ADC_KeyState2 = 0;
ADC_KeyState3 = 0;//¼ü״̬
ADC_KeyHoldCnt = 0; //¼ü°´Ï¼ÆÊ±
KeyCode = 0; //¸øÓû§Ê¹ÓõļüÂë, 1~16ÓÐЧ
cnt10ms = 0;
while(1)
{
if(B_1ms) //1msµ½
{
B_1ms = 0;
if(++msecond >= 1000) //1Ãëµ½
{
msecond = 0;
RTC();
DisplayRTC();
}
if(msecond == 500)DisplayRTC(); //СʱºóµÄСÊýµã×öÃëÉÁ
if(++cnt10ms >= 10) //10ms¶ÁÒ»´ÎADC
{
cnt10ms = 0;
j = Get_ADC12bitResult(0);//²ÎÊý0~15,²éѯ·½Ê½×öÒ»´ÎADC, ·µ»ØÖµ¾ÍÊǽá¹û, == 4096 Ϊ´íÎó
if(j < 4096) {
CalculateAdcKey(j); //¼ÆËã°´¼ü
}
}
if(KeyCode > 0) //Óмü°´ÏÂ
{
SndKeyCode=KeyCode;
KeyCode = 0;
LED8 = SndKeyCode / 10; //ÏÔʾ¼üÂë
LED8 = SndKeyCode % 10; //ÏÔʾ¼üÂë
SendIrNec();
if(SndKeyCode == 1) //hour +1
{
if(++hour >= 24) hour = 0;
DisplayRTC();
}
if(SndKeyCode == 2) //hour -1
{
if(--hour >= 24) hour = 23;
DisplayRTC();
}
if(SndKeyCode == 3) //minute +1
{
second = 0;
if(++minute >= 60)minute = 0;
DisplayRTC();
}
if(SndKeyCode == 4) //minute -1
{
second = 0;
if(--minute >= 60)minute = 59;
DisplayRTC();
}
}
}
}
}
/**********************************************/
/********************** ÏÔʾʱÖÓº¯Êý ************************/
void DisplayRTC(void)
{
if(hour >= 10)LED8 = hour / 10;
else LED8 = DIS_BLACK;
LED8 = hour % 10;
LED8 = minute / 10;
LED8 = minute % 10;
if(msecond >= 500) LED8 |= DIS_DOT; //СʱºóµÄСÊýµã×öÃëÉÁ
}
/********************** RTCÑÝʾº¯Êý ************************/
void RTC(void)
{
if(++second >= 60)
{
second = 0;
if(++minute >= 60)
{
minute = 0;
if(++hour >= 24) hour = 0;
}
}
}
//========================================================================
// º¯Êý: u16 Get_ADC12bitResult(u8 channel)
// ÃèÊö: ²éѯ·¨¶ÁÒ»´ÎADC½á¹û.
// ²ÎÊý: channel: Ñ¡ÔñҪת»»µÄADC.
// ·µ»Ø: 12λADC½á¹û.
// °æ±¾: V1.0, 2012-10-22
//========================================================================
u16 Get_ADC12bitResult(u8 channel)//channel = 0~15
{
ADC_RES = 0;
ADC_RESL = 0;
ADC_CONTR = (ADC_CONTR & 0xf0) | channel; //ÉèÖÃADCת»»Í¨µÀ
ADC_START = 1;//Æô¶¯ADCת»»
_nop_();
_nop_();
_nop_();
_nop_();
while(ADC_FLAG == 0); //wait for ADC finish
ADC_FLAG = 0; //Çå³ýADC½áÊø±êÖ¾
return(((u16)ADC_RES << 8) | ADC_RESL);
}
/***************** ADC¼üÅ̼ÆËã¼üÂë *****************************
µç·ºÍÈí¼þËã·¨Éè¼Æ: Coody
±¾ADC¼üÅÌ·½°¸Ôںܶàʵ¼Ê²úÆ·Éè¼ÆÖÐ, ÑéÖ¤ÁËÆäÎȶ¨¿É¿¿, ¼´Ê¹°´¼üʹÓõ¼µçĤ,¶¼ºÜ¿É¿¿.
16¸ö¼ü,ÀíÂÛÉϸ÷¸ö¼ü¶ÔÓ¦µÄADCֵΪ (4096 / 16) * k = 256 * k, k = 1 ~ 16, ÌØ±ðµÄ, k=16ʱ,¶ÔÓ¦µÄADCÖµÊÇ4095.
µ«ÊÇʵ¼Ê»áÓÐÆ«²î,ÔòÅжÏʱÏÞÖÆÕâ¸öÆ«²î, ADC_OFFSETΪ+-Æ«²î, ÔòADCÖµÔÚ (256*k-ADC_OFFSET) Óë (256*k+ADC_OFFSET)Ö®¼äΪ¼üÓÐЧ.
¼ä¸ôÒ»¶¨µÄʱ¼ä,¾Í²ÉÑùÒ»´ÎADC,±ÈÈç10ms.
ΪÁ˱ÜÃâżȻµÄADCÖµÎóÅÐ, »òÕß±ÜÃâADCÔÚÉÏÉý»òϽµÊ±ÎóÅÐ, ʹÓÃÁ¬Ðø3´ÎADCÖµ¾ùÔÚÆ«²î·¶Î§ÄÚʱ, ADCÖµ²ÅÈÏΪÓÐЧ.
ÒÔÉÏËã·¨, Äܱ£Ö¤¶Á¼ü·Ç³£¿É¿¿.
**********************************************/
#define ADC_OFFSET64
void CalculateAdcKey(u16 adc)
{
u8i;
u16 j;
if(adc < (256-ADC_OFFSET))
{
ADC_KeyState = 0; //¼ü״̬¹é0
ADC_KeyHoldCnt = 0;
}
j = 256;
for(i=1; i<=16; i++)
{
if((adc >= (j - ADC_OFFSET)) && (adc <= (j + ADC_OFFSET)))break;//ÅжÏÊÇ·ñÔÚÆ«²î·¶Î§ÄÚ
j += 256;
}
ADC_KeyState3 = ADC_KeyState2;
ADC_KeyState2 = ADC_KeyState1;
if(i > 16)ADC_KeyState1 = 0;//¼üÎÞЧ
else //¼üÓÐЧ
{
ADC_KeyState1 = i;
if((ADC_KeyState3 == ADC_KeyState2) && (ADC_KeyState2 == ADC_KeyState1) &&
(ADC_KeyState3 > 0) && (ADC_KeyState2 > 0) && (ADC_KeyState1 > 0))
{
if(ADC_KeyState == 0) //µÚÒ»´Î¼ì²âµ½
{
KeyCode= i; //±£´æ¼üÂë
ADC_KeyState = i; //±£´æ¼ü״̬
ADC_KeyHoldCnt = 0;
}
if(ADC_KeyState == i) //Á¬Ðø¼ì²âµ½Í¬Ò»¼ü°´×Å
{
if(++ADC_KeyHoldCnt >= 100) //°´ÏÂ1Ãëºó,ÒÔ10´ÎÿÃëµÄËÙ¶ÈRepeat Key
{
ADC_KeyHoldCnt = 90;
KeyCode= i; //±£´æ¼üÂë
}
}
else ADC_KeyHoldCnt = 0; //°´ÏÂʱ¼ä¼ÆÊý¹é0
}
}
}
/********************** ÏÔʾɨÃ躯Êý ************************/
void DisplayScan(void)
{
P7 = ~T_COM;
P6 = ~t_display];
if(++display_index >= 8) display_index = 0;//8λ½áÊø»Ø0
}
/********************** Timer0 1msÖжϺ¯Êý ************************/
void timer0 (void) interrupt 1
{
DisplayScan();//1msɨÃèÏÔʾһλ
B_1ms = 1; //1ms±êÖ¾
}
#define User_code 0xFE01 //???????
static u16 tx_cnt; //??????????(??38KHZ????,????), ?????38KHZ, ??26.3us
u8 TxTime; //????
/************* ?????? **************/
void IR_TxPulse(u16 pulse)
{
tx_cnt = pulse;
PWMA_CCER2 = 0x00; //? CCMRx ?????? CCxE ????
PWMA_CCMR4 = 0x60; //?? PWM4 ??1 ??
PWMA_CCER2 = 0x70; //?? CC4NE ??, ?????
PWMA_IER = 0x10; //????/?? 4 ??
while(tx_cnt);
}
/************* ?????? **************/
void IR_TxSpace(u16 pulse)
{
tx_cnt = pulse;
PWMA_CCER2 = 0x00; //? CCMRx ?????? CCxE ????
PWMA_CCMR4 = 0x40; //?? PWM4 ???????
PWMA_CCER2 = 0x70; //?? CC4NE ??, ?????
PWMA_IER = 0x10; //????/?? 4 ??
while(tx_cnt);
}
/************* ?????? **************/
void IR_TxOff(void)
{
PWMA_CCER2 = 0x00; //? CCMRx ?????? CCxE ????
PWMA_CCMR4 = 0x50; //?? PWM4 ???????
PWMA_CCER2 = 0x70; //?? CC4NE ??, ?????
}
/************* ???????? **************/
void IR_TxByte(u8 dat)
{
u8 i;
for(i=0; i<8; i++)
{
if(dat & 1) IR_TxSpace(63), TxTime += 2; //??1?? 1.6875 + 0.5625 ms
else IR_TxSpace(21), TxTime++; //??0?? 0.5625 + 0.5625 ms
IR_TxPulse(21); //????0.5625ms
dat >>= 1; //????
}
}
//========================================================================
// ??: void PWM_config(void)
// ??: PCA????.
// ??: None
// ??: none.
// ??: V1.0, 2012-11-22
//========================================================================
void PWM_config(void)
{
PWMA_CCER2 = 0x00; //? CCMRx ?????? CCxE ????
PWMA_CCMR4 = 0x60; //?? PWM4 ??1 ??
//PWMA_CCER2 = 0xB0; //?? CC4E ??, ?????
PWMA_ARRH = 0x02; //??????
PWMA_ARRL = 0x77;
PWMA_CCR4H = 0;
PWMA_CCR4L = 210; //???????
PWMA_PS = 0x40;//?? PWM ?? 4N ??????, 0x00:P1.7, 0x40:P2.7, 0x80:P6.7, 0xC0:P3.3
//PWMA_PS = 0x40;//?? PWM ?? 4P ??????, 0x00:P1.6, 0x40:P2.6, 0x80:P6.6, 0xC0:P3.4
PWMA_ENO = 0x80; //?? PWM4N ??
//PWMA_ENO = 0x40; //?? PWM4P ??
PWMA_BKR = 0x80; //?????
// PWMA_IER = 0x10; //????
PWMA_CR1 |= 0x81;//??ARR???,????
}
/******************* PWM???? ********************/
void PWMA_ISR() interrupt PWMA_VECTOR
{
if(PWMA_SR1 & 0X10)
{
PWMA_SR1 &=~0X10;
//PWMA_SR1 = 0;
if(--tx_cnt == 0)
{
PWMA_CCER2 = 0x00; //? CCMRx ?????? CCxE ????
PWMA_CCMR4 = 0x40; //?? PWM4 ???????
PWMA_CCER2 = 0x70; //?? CC4NE ??, ?????
PWMA_IER = 0x00; // ????
}
}
}
//========================================================================
// ??: void delay_ms(unsigned char ms)
// ??: ?????
// ??: ms,????ms?, ?????1~255ms. ???????.
// ??: none.
// ??: VER1.0
// ??: 2013-4-1
// ??:
//========================================================================
void delay_ms(u8 ms)
{
u16 i;
do{
i = MAIN_Fosc / 6000;
while(--i);
}while(--ms);
}
void StartIrNec()
{
}
void SendIrNec()
{
if(SndKeyCode != 0) //?????
{
hour = User_code/256;
minute = User_code%256;
second = SndKeyCode;
TxTime = 0;
//???????? = 9 + 4.5 + 0.5625 + 24 * 1.125 + 8 * 2.25 = 59.0625 ms
//???????? = 9 + 4.5 + 0.5625 + 8 * 1.125 + 24 * 2.25 = 77.0625 ms
IR_TxPulse(342); //??9ms,??? 9ms
IR_TxSpace(171); //??4.5ms,????? 4.5ms
IR_TxPulse(21); //?????? 0.5625ms
IR_TxByte(User_code%256); //???????
IR_TxByte(User_code/256); //???????
IR_TxByte(SndKeyCode); //???
IR_TxByte(~SndKeyCode); //?????
if(TxTime < 56) //?????77ms??, ????,???? 108ms
{
TxTime = 56 - TxTime;
TxTime = TxTime + TxTime / 8;
delay_ms(TxTime);
}
delay_ms(31);
IR_TxOff(); //??????
SndKeyCode = 0;
}
}
89-USB CDC转双串口-做自动停电上电烧录器
步骤1:硬件连接(用usb连接电脑)
步骤2:
步骤3:原理图和实物
步骤4:例子说明
步骤5:验证无效果,目前不清楚为什么?