- 打卡等级:初来乍到
- 打卡总天数:5
- 最近打卡:2024-09-24 09:38:07
注册会员
- 积分
- 109
|
我这边只有STC8H1K08的芯片,我想使用p3.3输出38k的波形,做红外发射。
下面是基于示例代码做的修改,p3.3发现无波形输出。
帮忙看看问题在哪里?
/* --- Web: www.STCAI.com ---------------------------------------------*/
/* --- BBS: www.STCAIMCU.com -----------------------------------------*/
/* Èç¹ûÒªÔÚ³ÌÐòÖÐʹÓô˴úÂë,ÇëÔÚ³ÌÐòÖÐ×¢Ã÷ʹÓÃÁËSTCµÄ×ÊÁϼ°³ÌÐò */
/*---------------------------------------------------------------------*/
/************* ±¾³ÌÐò¹¦ÄÜ˵Ã÷ **************
±¾Àý³Ì»ùÓÚSTC8H8K64UΪÖ÷¿ØÐ¾Æ¬µÄʵÑéÏä8½øÐбàд²âÊÔ£¬STC8HϵÁÐоƬ¿ÉͨÓòο¼.
Óû§¿ÉÒÔÔں궨ÒåÖиıäMCUÖ÷ʱÖÓÆµÂÊ. ·¶Î§ 8MHZ ~ 33MHZ.
ºìÍâ·¢Éä³ÌÐò¡£Ä£ÄâÊг¡ÉÏÓÃÁ¿×î´óµÄNECµÄ±àÂë¡£
Óû§¿ÉÒÔÔں궨ÒåÖÐÖ¸¶¨Óû§Âë.
ʹÓÃPWM4²úÉú38KHZÔØ²¨, 1/3Õ¼¿Õ±È, ÿ¸ö38KHZÖÜÆÚ·¢Éä¹Ü·¢Éä9us,¹Ø±Õ16.3us.
ʹÓÿª·¢°åÉϵÄ16¸öIOɨÃè°´¼ü, MCU²»Ë¯Ãß, Á¬ÐøÉ¨Ãè°´¼ü.
µ±¼ü°´ÏÂ, µÚһ֡ΪÊý¾Ý, ºóÃæµÄÖ¡ÎªÖØ¸´Ö¡,²»´øÊý¾Ý, ¾ßÌ嶨ÒåÇë×ÔÐвο¼NECµÄ±àÂë×ÊÁÏ.
¼üÊͷźó, Í£Ö¹·¢ËÍ.
ÏÂÔØÊ±, Ñ¡ÔñʱÖÓ 24MHZ (Óû§¿É×ÔÐÐÐÞ¸ÄÆµÂÊ).
******************************************/
#include "stc8h.h" //°üº¬´ËÍ·Îļþºó£¬²»ÐèÒªÔÙ°üº¬"reg51.h"Í·Îļþ
#include "intrins.h"
#define MAIN_Fosc 24000000UL //¶¨ÒåÖ÷ʱÖÓ
typedef unsigned char u8;
typedef unsigned int u16;
typedef unsigned long u32;
/************* ºìÍâ·¢ËÍÏà¹Ø±äÁ¿ **************/
#define User_code 0xFF00 //¶¨ÒåºìÍâÓû§Âë
sbit P_IR_TX = P3^3; //¶¨ÒåºìÍâ·¢ËͶ˿Ú
#define IR_TX_ON 0
#define IR_TX_OFF 1
u16 tx_cnt; //·¢ËÍ»ò¿ÕÏеÄÂö³å¼ÆÊý(µÈÓÚ38KHZµÄÂö³åÊý£¬¶ÔӦʱ¼ä), ºìÍâÆµÂÊΪ38KHZ, ÖÜÆÚ26.3us
u8 TxTime; //·¢ËÍʱ¼ä
u16 send_time_num = 0;
u8 KeyHoldCnt; //¼ü°´Ï¼ÆÊ±
u8 KeyCode; //¸øÓû§Ê¹ÓõļüÂë, 1~16ÓÐЧ
/************* ±¾µØº¯ÊýÉùÃ÷ **************/
void delay_ms(u8 ms);
void PWM_config(void);
void IR_TxPulse(u16 pulse);
void IR_TxSpace(u16 pulse);
void IR_TxByte(u8 dat);
/********************** Ö÷º¯Êý ************************/
void main(void)
{
P_SW2 |= 0x80; //À©Õ¹¼Ä´æÆ÷(XFR)·ÃÎÊʹÄÜ
#if 0
P1M1 = 0x30; P1M0 = 0x30; //ÉèÖÃP1.4¡¢P1.5Ϊ©¼«¿ªÂ·(ʵÑéÏä¼ÓÁËÉÏÀµç×èµ½3.3V)
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; //ÉèÖÃΪ׼˫Ïò¿Ú
#endif
PWM_config();
P_IR_TX = IR_TX_OFF;
EA = 1; //´ò¿ª×ÜÖжÏ
while(1)
{
delay_ms(60); //30ms
send_time_num++;
if(send_time_num == 200) //¼ì²âµ½¼üÂë
{
send_time_num = 0;
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(KeyCode); //·¢Êý¾Ý
IR_TxByte(~KeyCode); //·¢Êý¾Ý·´Âë
if(TxTime < 56) //Ò»Ö¡°´×î´ó77ms·¢ËÍ, ²»¹»µÄ»°,²¹³¥Ê±¼ä 108ms
{
TxTime = 56 - TxTime;
TxTime = TxTime + TxTime / 8;
delay_ms(TxTime);
}
delay_ms(31);
}
}
}
/**********************************************/
//========================================================================
// º¯Êý: void delay_ms(u8 ms)
// ÃèÊö: ÑÓʱº¯Êý¡£
// ²ÎÊý: ms,ÒªÑÓʱµÄmsÊý, ÕâÀïÖ»Ö§³Ö1~255ms. ×Ô¶¯ÊÊÓ¦Ö÷ʱÖÓ.
// ·µ»Ø: none.
// °æ±¾: VER1.0
// ÈÕÆÚ: 2021-3-9
// ±¸×¢:
//========================================================================
void delay_ms(u8 ms)
{
u16 i;
do{
i = MAIN_Fosc / 10000;
while(--i); //10T per loop
}while(--ms);
}
/************* ·¢ËÍÂö³åº¯Êý **************/
void IR_TxPulse(u16 pulse)
{
tx_cnt = pulse;
PWMA_CCER2 = 0x00; //д CCMRx ǰ±ØÐëÏÈÇåÁã CCxE ¹Ø±ÕͨµÀ
PWMA_CCMR4 = 0x68; //ÉèÖà 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_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 = 0x68; //ÉèÖà 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 |= 0x01; //¿ªÊ¼¼ÆÊ±
}
/******************* PWMÖжϺ¯Êý ********************/
void PWMA_ISR() interrupt 26
{
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; // ¹Ø±ÕÖжÏ
}
}
}
|
|