#include <reg52.h> //包括一个52标准内核的头文件
#define uchar unsigned char //定义一下方便使用
#define uint unsigned int
#define ulong unsigned long
//************************************
//PGA2310接口定义
//************************************
sbit cs=P2^0; ///CS
sbit volbit=P2^1; //SDI
sbit clk=P2^2; //SCL
sbit war=P2^3; //ALRM
//************************************
//74HC595端口定义
//************************************
sbit SDI_595=P1^4;
sbit SHIFT_595=P1^5;
sbit OUT_595=P1^6;
sbit CE_595=P1^7;
//************************************
//全局变量定义
//************************************
uint vol; //音量
uchar dir; //编码器旋转方向
uchar State; //编码器状态
//16进制8段字形码表
uint NumTab[16]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09,0x11,0xc1,0x63,0x85,0x61,0x71};
//延时
void delay(uint t)
{
uchar i;
for (t;t>0;t--)
{
for (i=200;i>0;i--);
}
}
void warn() //极限标志
{
war=0;
delay(100);
war=1;
delay(100);
war=0;
}
void Get_State(void)//获取当前编码器状态
{
State=P2;
State=State&0xC0;
State=State>>=6;
}
void direct(void)//判断编码器旋转的方向
{
static uchar State_Old;//静态变量储存上一次记录的编码器状态
Get_State();//获取当前编码器状态
switch (State_Old)//根据此次状态和上次状态来判断编码器旋转方向
{
case 0x00:
if(State==0x01) dir=0; //编码器状态由00变为01判断为方向为负
else if(State==0x02) dir=1; //编码器状态由00变为02判断为方向为正
else dir=2; //编码器状态由00变为其他状态均被判断为无效
break;
case 0x01:
if(State==0x00) dir=1;
else if(State==0x03) dir=0;
else dir=2;
break;
case 0x02:
if(State==0x00) dir=0;
else if(State==0x03) dir=1;
else dir=2;
break;
case 0x03:
if(State==0x02) dir=0;
else if(State==0x01) dir=1;
else dir=2;
default:
dir=2;
break;
}
State_Old=State;
}
void sendvol(uint vol) //音量输出子程序
{
uchar i;
cs=0; //片选
for(i=16;i>0;i--) //发送16bit音量数据
{
clk=0;
if(vol&0X0001==0x0001)//判断是输出1还是0;
{
volbit=1;
}
else
{
volbit=0;
}
delay(1);
clk=1; //clk上升沿数据写入
vol>>=1; //右移一位
delay(1);
}
cs=1;
volbit=1;
}
void init(void)
{
P2=0xff;
Get_State();
sendvol(0x7f7f);
}
void volup() //音量加
{
if (vol==0Xffff) //判断是否达到最大音量
{
warn() ;//警报
}
if(vol < 0Xffff)
{
vol+=0X0101; //增加音量
sendvol(vol); //输出音量
}
}
void voldown() //音量减
{
if(vol > 0x0000) //判断是否达到最小音量
{
vol-=0X0101; //音量减
sendvol(vol); //音量输出
}
else
warn(); //警报
}
void sendnum(uchar num)//74HC595-8段数码管驱动子程序
{
uchar i;
OUT_595=0; //595输出禁止
CE_595=1; //595片选
for(i=8;i>0;i--) //连续送出8位码
{
SHIFT_595=0; //移位时钟拉低,等待数据就绪
SDI_595=(num&(0x80>>(i-1)));//数据送SDI引脚
delay(1); //稍作延时等待数据稳定
SHIFT_595=1; //上升沿移位
delay(1); //稍作延时等待数据稳定
}
OUT_595=1; //8位送完后使能595输出
CE_595=0; //取消595片选(此引脚同时连接CLR引脚,
} //取消片选同时清除移位寄存器)
void DisNum (void) //10进制显示子程序(带延时)
{
uint num1; //定义第一位
uint num2; //定义第二位
uint num3; //定义第三位
uint num4; //定义第四位
uint n;
num4=(vol/0x1000); //第四位:千位
num3=(vol%0x1000)/0x100; //第三位:百位
num2=(vol%0x100)/0x10; //第二位:十位
num1=vol%0x10; //第一位:个位
for(n=1;n>0;n--) //循环显示
{
P1=P1&0xF0; //P1口:段码
sendnum(NumTab[num1]);
P1=0x01|(P1&0xF0);
delay(10); //延时
P1=P1&0xF0; //清零消鬼影
//P0=NumTab[num2];
sendnum(NumTab[num2]);
P1=0x02|(P1&0xF0);
delay(10);
P1=P1&0xF0;
//P0=NumTab[num3];
sendnum(NumTab[num3]);
P1=0x04|(P1&0xF0);
delay(10);
//P0=0x11;
P1=P1&0xF0;
//P0=NumTab[num4];
sendnum(NumTab[num4]);
P1=0x08|(P1&0xF0);
delay(10);
}
}
void main() // 主程序
{
vol=0X7f7f;
delay(200);
init();
//fl=~fl;
while(1) //主程序循环
{
direct();
switch (dir)
{
case 0x01:
volup();
break;
case 0x00:
voldown();
break;
default:
break;
}
DisNum();
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
实现51单片机对PGA2310控制的源代码,可以通过4位数码管显示两个声道当前音量,可以通过旋转式编码器来控制音量加减,其中因为PGA2310和旋转编码器在protuse里面都没有仿真原件,所以2310只能使用示波器来观察时序对比PGA2310datasheet给出的时序观看仿真结果,而编码器则使用两只button代替,实际上的编码器也就是两只开关交替导通来产生“码”的(此部分可自行改为直接由按键控制)。
资源推荐
资源详情
资源评论
收起资源包目录
PGA2310.rar (19个子文件)
PGA2310
PGA2310 8KB
PGA2310_Uv2.Bak 2KB
PGA2310.M51 13KB
PGA2310.lnp 31B
PGA2310_uvopt.bak 59KB
PGA2310.plg 6KB
PGA2310.uvopt 56KB
PGA2310.OBJ 9KB
89c51-protuse文件
PGA2310.PWI 840B
Last Loaded PGA2310.DBK 91KB
PGA2310.DSN 97KB
PGA2310_uvproj.bak 13KB
PGA2310.c 4KB
PGA2310.uvproj 13KB
PGA2310_Opt.Bak 2KB
PGA2310.opt.bak 2KB
PGA2310.hex 2KB
PGA2310.Uv2.bak 2KB
PGA2310.LST 9KB
共 19 条
- 1
资源评论
- weixin_440101832023-01-03资源内容总结地很全面,值得借鉴,对我来说很有用,解决了我的燃眉之急。
- wangtong0992024-02-29资源很受用,资源主总结的很全面,内容与描述一致,解决了我当下的问题。
- kt88pp2022-05-07用户下载后在一定时间内未进行评价,系统默认好评。
- apple_627655282022-07-10非常有用的资源,可以直接使用,对我很有用,果断支持!
pudn01
- 粉丝: 48
- 资源: 4万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功