找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6|回复: 3
收起左侧

STC8Hec11单片机控制电子音量M62429基础版刚调通 KEIL5程序

[复制链接]
ID:303735 发表于 2026-1-13 10:56 | 显示全部楼层 |阅读模式
单片机源程序如下:
#define KEY_COUNT_DESHAKING 15//按键消抖时间15MS
#define KEY_COUNT_LONGT 1500//长按按键判断时间1500MS
#define KEY_COUNT_DUAL 180//双击按键判断时间180MS
#define KEY_LONG_REPEAT 200//长按按键时响应的时间间隔200MS
#define I2C_SCL P3_2
#define I2C_SDA P3_3
#define led P5_4

#include <STC8HX.h>
uint32 sys_clk = 12000000;//设置PWM、定时器、串口、EEPROM频率参数
#include "Lib/EC11_51.h"//声明库头文件
#include "delay.h"

uint8 i = 0;
uint8 j = 0;
uint8 k = 20;
uint16 vol = 0;
uint8 flag = 0;
uint8 cnt = 0;
uint16 mylist[21]={0x88aa,0x8aa,0xa0aa,0x20aa,0x80aa,0xaa,0xaa2a,0x2a2a,0x8a2a,0xa2a,0xa22a, 0x222a,0x822a,0x22a,0xa82a,0xa282a,0x882a,0x82a,0xa02a,0x202a,0x802a};
uint8 dat = 0x2f;
uint16 scl_dat = 0xaa;
uint8 scl_dat2 = 0x01;
uint8 LR = 0x02;
uint8 jianhc_A1;
void sendbyte_LR();
void sendbyte_dat();
void sendbyte_3();

void Timer1Init(void)        //1000微秒@12.000MHz
{
  AUXR &= 0xbf;                //定时器时钟12T模式
  TMOD &= 0x0f;                //设置定时器模式
  TL1 = 0x18;                        //设定定时初值
  TH1 = 0xfc;                        //设定定时初值
}

void Timer0Init(void)        //1000微秒@12.000MHz
{
  AUXR &= 0x7f;                //定时器时钟12T模式
  TMOD &= 0xf0;                //设置定时器模式
  TL0 = 0x18;                        //设定定时初值
  TH0 = 0xfc;                        //设定定时初值
}

void T_IRQ0(void) interrupt 1 using 1{
  cnt = cnt + 1;
}

xdata tongdaoHC HC_A1 = {0,0,0,0,0,0,0};//声明A1通道全局结构体缓存
void T_IRQ1(void) interrupt 3 using 2{
   HC_A1.EC11_A_dq = P3_5;
   HC_A1.EC11_B_dq = P3_6;
   HC_A1.EC11_D_dq = P3_4;
   jianhc_A1 = Encoder_EC11_Scan(&HC_A1);
   switch ( jianhc_A1)
    {
      case 1:
         if(k >= 1){
      k = k - 1;
    }
    else{
      k = k - 0;
    }
       break;
      case 2:
         if(k >= 1){
      k = k - 1;
    }
    else{
      k = k - 0;
    }
       break;
      case 3:
         if(k <= 20){
      k = k + 1;
    }
    else{
      k = k + 0;
    }
       break;
      case 4:
         if(k <= 20){
      k = k + 1;
    }
    else{
      k = k + 0;
    }
       break;
      case 5:
         led = !led;
    if(k >= 1){
      k = k - 1;
    }
    else{
      k = k - 0;
    }
       break;
      case 6:
            break;
      case 7:
            break;
      case 8:
            break;
    }
}

/*描述该功能...
*/
void sendbyte_LR(){
  for (i = 0; i < 1; i = i + 1) {
    I2C_SDA = 1;
    delay5us();
    I2C_SCL = 1;
    delay5us();
    I2C_SDA = 0;
    delay5us();
    I2C_SCL = 0;
    delay5us();
    delay5us();
    I2C_SCL = 1;
    delay5us();
    delay5us();
    I2C_SCL = 0;
    delay5us();
  }
}

/*描述该功能...
*/
void sendbyte_dat(){
  EA = 0;
  sendbyte_LR();
  for (j = 0; j < 16; j = j + 1) {
    if((vol&0x8000) != 0){
      P3_3 = 1;
    }
    else{
      P3_3 = 0;
    }
    vol = (vol<<1);
    delay1us();
    delay1us();
    if((scl_dat&0x8000) != 0){
      P3_2 = 1;
    }
    else{
      P3_2 = 0;
    }
    scl_dat = (scl_dat<<1);
    delay5us();
  }
  sendbyte_3();
  EA = 1;
}

/*描述该功能...
*/
void sendbyte_3(){
  I2C_SCL = 0;
  delay1us();
  delay1us();
  I2C_SDA = 1;
  delay1us();
  delay1us();
  I2C_SCL = 1;
  delay5us();
  I2C_SDA = 1;
  delay5us();
  I2C_SCL = 0;
  delay1us();
  delay1us();
  I2C_SDA = 0;
  delay5us();
}

void setup()
{
  P3M1&=~0x04;P3M0|=0x04;//推挽输出
  P3M1&=~0x08;P3M0|=0x08;//推挽输出
  P3M1&=~0x10;P3M0&=~0x10;//双向IO口
  P5M1&=~0x10;P5M0|=0x10;//推挽输出
  P3_3 = 0;
  P5_4 = 1;
  Timer1Init();
  EA = 1; // 控制总中断
  ET1 = 1; // 控制定时器中断
  TR1 = 1;// 定时器1开始计时
  Timer0Init();
  EA = 1; // 控制总中断
  ET0 = 1; // 控制定时器中断
  TR0 = 1;// 定时器0开始计时
  P3M1|=0x10;P3M0&=~0x10;//P3_4高阻输入
  P3M1|=0x40;P3M0&=~0x40;//P3_6高阻输入
  P3M1|=0x20;P3M0&=~0x20;//P3_5高阻输入
}

void loop()
{
  if(cnt >= 200){
    cnt = 0;
    vol = mylist[(int)(k)];
    scl_dat = 0xaaaa;
    sendbyte_dat();
  }
}

void main(void)
{
  setup();
  while(1){
    loop();
  }
}

以上代码下载: M62429.zip (143.64 KB, 下载次数: 0)
回复

使用道具 举报

ID:303735 发表于 2026-1-13 11:00 | 显示全部楼层
开始时序没弄好一直没反应,还有数据转换一直没办法,只能写数组调用,先将就21个档用吧,如果网友有更好的办法欢迎指导
回复

使用道具 举报

ID:303735 发表于 2026-1-13 11:12 | 显示全部楼层
现在能控制音量,首次上电音量最小,可以按按键P3.4慢慢增加到-0dB音量最大。后续再增加功能。
回复

使用道具 举报

ID:303735 发表于 2026-1-13 13:49 | 显示全部楼层
EC11反转写的有误作修改
xdata tongdaoHC HC_A1 = {0,0,0,0,0,0,0};//声明A1通道全局结构体缓存
void T_IRQ1(void) interrupt 3 using 2{
   HC_A1.EC11_A_dq = P3_5;
   HC_A1.EC11_B_dq = P3_6;
   HC_A1.EC11_D_dq = P3_4;
   jianhc_A1 = Encoder_EC11_Scan(&HC_A1);
   switch ( jianhc_A1)
    {
      case 1:
         if(k >= 1){
      k = k - 1;
    }
    else{
      k = k - 0;
    }
       break;
      case 2:
         if(k <= 20){
      k = k + 1;
    }
    else{
      k = k + 0;
    }
       break;
      case 3:
         if(k >= 1){
      k = k - 1;
    }
    else{
      k = k - 0;
    }
       break;
      case 4:
         if(k <= 20){
      k = k + 1;
    }
    else{
      k = k + 0;
    }
       break;
      case 5:
         led = !led;
    if(k >= 1){
      k = k - 1;
    }
    else{
      k = k - 0;
    }
       break;
      case 6:
            break;
      case 7:
            break;
      case 8:
            break;
    }
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表