- 打卡等级:常住居民I
- 打卡总天数:61
- 最近打卡:2025-10-15 19:44:33
高级会员
- 积分
- 501
|
发表于 2025-9-11 21:39:23
|
显示全部楼层
/*---------------------------------------------------------------------*/
/* --- 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}; //λÂë
u8 LED8[8]; //ÏÔʾ»º³å
u8 display_index; //ÏÔʾλË÷Òý
bit B_1ms; //1ms±êÖ¾
u8 ADC_KeyState,ADC_KeyState1,ADC_KeyState2,ADC_KeyState3; //¼ü״̬
u8 ADC_KeyHoldCnt; //¼ü°´Ï¼ÆÊ±
u8 KeyCode; //¸øÓû§Ê¹ÓõļüÂë, 1~16ÓÐЧ
u8 cnt10ms;
u8 SndKeyCode;
u8 hour,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)
{
u8 i;
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[6] = SndKeyCode / 10; //ÏÔʾ¼üÂë
LED8[7] = 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[0] = hour / 10;
else LED8[0] = DIS_BLACK;
LED8[1] = hour % 10;
LED8[2] = minute / 10;
LED8[3] = minute % 10;
if(msecond >= 500) LED8[1] |= 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_OFFSET 64
void CalculateAdcKey(u16 adc)
{
u8 i;
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[7-display_index];
P6 = ~t_display[LED8[display_index]];
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;
}
} |
|