STC8G 模拟电子琴ADC按键扫描、PWM输出

#include <STC8G.H>
#include "intrins.h"
#include <stdio.h>
#define FOSC 11059200UL
#define BRT (65536-FOSC/115200/4)
int code yl[12]={349,392,440,494,523,587,659,698,784,880,988,1046};
int code keys[12]={169,234,289,338,575,555,533,509,482,452,418,381};
sbit speaker=P5^4;
bit busy;

void Delay500ms(void)    //@11.0592MHz
{
    unsigned char data i, j, k;

    i = 29;
    j = 14;
    k = 54;
    do
    {
        do
        {
            while (--k);
        } while (--j);
    } while (--i);
}

void UartInit()
{
    SCON=0X50;
    AUXR|=0X40;
    TH1=BRT>>8;
    TL1=BRT;
    TR1=1;
    ES=1;
    EA=1;
    busy=0;
}

void UartIsr() interrupt 4
{
    if(RI)
    {
        RI=0;
    }
    if(TI)
    {
        TI=0;
        busy=0;
    }
}

void UartSend(char c)
{
    while(busy);
    busy=1;
    SBUF=c;
}

void UartSendStr(char *p)
{
    while(*p){
        UartSend(*p++);
    }
}
        
void TimerInit()
{
    TMOD=0X00;
    TH0=0X00;
    TL0=0X00;
    AUXR|=0X80;
    TR0=1;
}

void PWMInit()
{
    CCON=0X00;
    CMOD=0X04;
    CL=0X00;
    CH=0X00;
    CCAPM2=0X42;
    PCA_PWM2=0X80;
    
    CCAP2L=0x10;
    CCAP2H=0x10;
    
}

void ADCInit()
{
    P_SW2|=0X80;
    ADCTIM=0X3F;
    P_SW2&=0X7F;
    
    ADCCFG=0X2F;
    ADC_CONTR=0X83;
}

int ADCRead()
{
    int res;
    ADC_CONTR|=0X40;
    _nop_();
    _nop_();
    while(!(ADC_CONTR&0X20));
    ADC_CONTR&=~0X20;
    res=(ADC_RES<<8)|ADC_RESL;
    
    return res;
}

void main()
{
    P5M0 = 0x00; P5M1 = 0x00; 
    P3M0 = 0x00; P3M1 = 0x08; 

    TimerInit();
    UartInit();
    PWMInit();
    ADCInit();
    speaker=0;
    
    while(1)
    {
        char sendStr[30];
        int i,j;
        int res;
        int pwm;
        res=0;
        for(i=0;i<8;i++)
        {
            res+=ADCRead();
            
        }
        res>>=3;
        if(res<580)
        {
            
            if(res<keys[0]+5 && res>keys[0]-5)
            {
                j=0;
            }
            if(res<keys[1]+5 && res>keys[1]-5)
            {
                j=1;
            }
            if(res<keys[2]+5 && res>keys[2]-5)
            {
                j=2;
            }
            if(res<keys[3]+5 && res>keys[3]-5)
            {
                j=3;
            }
            if(res<keys[4]+5 && res>keys[4]-5)
            {
                j=4;
            }
            if(res<keys[5]+5 && res>keys[5]-5)
            {
                j=5;
            }
            if(res<keys[6]+5 && res>keys[6]-5)
            {
                j=6;
            }
            if(res<keys[7]+5 && res>keys[7]-5)
            {
                j=7;
            }
            if(res<keys[8]+5 && res>keys[8]-5)
            {
                j=8;
            }
            if(res<keys[9]+5 && res>keys[9]-5)
            {
                j=9;
            }
            if(res<keys[10]+5 && res>keys[10]-5)
            {
                j=10;
            }
            if(res<keys[11]+5 && res>keys[11]-5)
            {
                j=11;
            }
        }else{
            j=-1;
            TR0=0;
            CR=0;
            speaker=0;
            
        }
        if(j!=-1)
        {
            
            TH0=(65536-FOSC/64/yl[j])>>8;
            TL0=(65536-FOSC/64/yl[j]);
            TR0=1;
            CR=1;
            
        
        }
//        sprintf(sendStr,"ADC:%d PWM:%d\n",res,pwm);
//            UartSendStr(sendStr);

//        Delay500ms();
//        
    }
}
            
        
    
    
 

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要设置STC8G1K08的PWM输出,您需要按照以下步骤进行操作: 1. 首先,您需要在程序中初始化PWM模块。您可以使用STC-ISP或其他编程器将程序下载到芯片中,或者使用Keil或其他IDE进行编程。 2. 在程序中,您需要设置PWM的工作模式、频率和占空比等参数。您可以使用STC8G1K08的PWM寄存器来设置这些参数,例如PWMCON、PWMCFG、PWMCR等。 3. 然后,您需要将PWM输出引脚与外部电路连接,例如LED、电机或其他设备。您可以使用STC8G1K08的GPIO寄存器来配置PWM输出引脚的工作模式和电平等参数。 4. 最后,您需要在程序中编写PWM输出的控制代码,例如设置占空比、启动和停止PWM输出等操作。您可以使用STC8G1K08的PWM寄存器和GPIO寄存器来实现这些操作。 总之,要设置STC8G1K08的PWM输出,您需要了解PWM模块的工作原理和寄存器的使用方法,以及如何将PWM输出与外部电路连接和控制。 ### 回答2: STC8G1K08是一款8位单片机,内置了4个PWM输出通道。要进行PWM输出,需要进行以下步骤: 1. 设置PWM时钟源。STC8G1K08的PWM时钟源可以选择内部RC时钟或外部管脚输入。通过设置相应的寄存器,选择对应的时钟源。 2. 配置PWM计数器。PWM计数器的值决定了PWM波形周期的大小,可以通过设置寄存器来改变计数器的值。 3. 配置PWM通道。每个PWM通道都有独立的寄存器用于控制占空比和极性。占空比控制占空比的大小,范围为0-255,极性控制输出波形的极性。要使通道输出PWM波形,必须将对应的寄存器设置为使能状态。 4. 在主程序中,不断更新PWM占空比的值,以改变PWM输出波形。可以通过定时器或外部输入来控制PWM占空比的更新频率。 总体而言,STC8G1K08的PWM输出设置比较简单,只需要熟悉相应寄存器的设置即可。在实际应用中,还需要根据具体的需求进行相关设置,如选择合适的时钟源、计数器值和占空比范围等。 ### 回答3: STC8G1K08是一款常用的8位单片机,也支持PWM输出功能。通过PWM(脉宽调制)技术,STC8G1K08可以通过占空比来控制输出的电压,实现精密的控制。 首先,我们需要配置STC8G1K08的GPIO(通用IO口)和定时器,使其支持PWM输出。可以使用STC-ISP,STCMicro等在线调试工具进行代码编写和烧录。 下面是STC8G1K08的PWM输出配置代码: ``` #include <STC8.H> #define FOSC 24000000L //define cpu frequency //定时器1,2,3初始化 void InitPWM(void) { T2CON |= 0x30; //定时器2工作在PWM模式 T2MOD |= 0x80; //PWM时钟源为Fosc/4 RCAP2H = 0xFF; //PWM周期设为256 RCAP2L = 0x00; CCON |= 0x40; //启动定时器2 } //PWM占空比计算 void SetPWM(unsigned char dutyCycle) { unsigned long temp; temp = 256 * dutyCycle; temp = temp / 100; //计算占空比 CCAP2H = (unsigned char)(temp >> 8); CCAP2L = (unsigned char)temp; } //主函数 void main() { unsigned char dutyCycle = 50; //占空比初始化为50% InitPWM(); //定时器2初始化 while(1) { SetPWM(dutyCycle); //设置占空比,这里为50% } } ``` 以上代码中,使用定时器2的PWM输出模式,设置PWM周期为256,占空比由SetPWM函数计算得出,并通过CCAP2H和CCAP2L寄存器来进行设置。可以根据具体需求,调整占空比大小,实现精密控制。 总之,STC8G1K08支持PWM模式输出,能够实现精确的电压控制。需要在初始化的过程中进行GPIO和定时器的设置,并通过占空比来控制输出的电压。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值