南邮基于8255的8LED显示语音播放机设计Word格式文档下载.docx
- 文档编号:1541358
- 上传时间:2023-04-30
- 格式:DOCX
- 页数:17
- 大小:823.18KB
南邮基于8255的8LED显示语音播放机设计Word格式文档下载.docx
《南邮基于8255的8LED显示语音播放机设计Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《南邮基于8255的8LED显示语音播放机设计Word格式文档下载.docx(17页珍藏版)》请在冰点文库上搜索。
#include<
reg52.h>
absacc.h>
/***********************************宏定义**********************************/
#defineuintunsignedint
#defineucharunsignedchar
/*****************************芯片端口地址定义*****************************/
#defineCOM8255XBYTE[0X7FFF]//8255的命令口
#definePA8255XBYTE[0X1FFF]//8255的PA
#definePB8255XBYTE[0X3FFF]//8255的PB
#definePC8255XBYTE[0X5FFF]//8255的PC
#defineDAC0832XBYTE[0XEFFF]//DAC0832口
uchardis_buf[]={0xc0,0x40,0xc0,0xff,0xc0,0x40,0xc0,0xc0};
//数码管显示缓存,格式为MM-NN-SS
ucharcodedu_code[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,};
//8段共阳极数码管显示码值
ucharcodebit_code[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
//数码管显示的位值
/*********************************系统引脚定义******************************/
sbitkey1=P3^0;
//key1
sbitkey2=P3^1;
//key2
sbitCON=P3^3;
//74HC573的锁存端
/*********************************定义系统变量*****************************/
ucharnum=0,second=0;
//定义时间变量
bitflag1=0,flag2=0;
//定义状态标志位
ucharcount;
ucharmax=0,min=0;
//定义幅值的最大值和最小值
uintm_x=0xe000;
ucharcodemusic[]={0x0F,0x01,0x15,0x02,0x16,0x02,0x17,0x66,0x18,0x03,
0x17,0x02,0x15,0x02,0x16,0x01,0x15,0x02,0x10,0x02,
0x15,0x00,0x0F,0x01,0x15,0x02,0x16,0x02,0x17,0x02,
0x17,0x03,0x18,0x03,0x19,0x02,0x15,0x02,0x18,0x66,
0x17,0x03,0x19,0x02,0x16,0x03,0x17,0x03,0x16,0x00,
0x17,0x01,0x19,0x02,0x1B,0x02,0x1B,0x70,0x1A,0x03,
0x1A,0x01,0x19,0x02,0x19,0x03,0x1A,0x03,0x1B,0x02,
0x1A,0x0D,0x19,0x03,0x17,0x00,0x18,0x66,0x18,0x03,
0x19,0x02,0x1A,0x02,0x19,0x0C,0x18,0x0D,0x17,0x03,
0x16,0x01,0x11,0x02,0x11,0x03,0x10,0x03,0x0F,0x0C,
0x10,0x02,0x15,0x00,0x1F,0x01,0x1A,0x01,0x18,0x66,
0x19,0x03,0x1A,0x01,0x1B,0x02,0x1B,0x03,0x1B,0x03,
0x1B,0x0C,0x1A,0x0D,0x19,0x03,0x17,0x00,0x1F,0x01,
0x1A,0x01,0x18,0x66,0x19,0x03,0x1A,0x01,0x10,0x02,
0x10,0x03,0x10,0x03,0x1A,0x0C,0x18,0x0D,0x17,0x03,
0x16,0x00,0x0F,0x01,0x15,0x02,0x16,0x02,0x17,0x70,
0x18,0x03,0x17,0x02,0x15,0x03,0x15,0x03,0x16,0x66,
0x16,0x03,0x16,0x02,0x16,0x03,0x15,0x03,0x10,0x02,
0x10,0x01,0x11,0x01,0x11,0x66,0x10,0x03,0x0F,0x0C,
0x1A,0x02,0x19,0x02,0x16,0x03,0x16,0x03,0x18,0x66,
0x18,0x03,0x18,0x02,0x17,0x03,0x16,0x03,0x19,0x00,
0x00,0x00};
//两只蝴蝶
/****************************延时子程序*******************************/
voiddelayms(ucharx)//ms延时函数
{
uchary;
for(;
x>
0;
x--)
for(y=110;
y>
y--);
}
/************************键盘扫描程序*****************************/
voidkeyscan()
if(key1==0)//判断key1是否被按下
{
delayms(20);
//延时消抖
if(key1==0)//判断key2是否被按下
{
if(flag1==1)
{
if(m_x<
0xFffe)
TR0=~TR0;
//计时开关取反
}
}
while(!
key1);
//等待key1松开
}
if(key2==0)//判断key2是否被按下
{delayms(20);
if(key2==0)//判断key2是否被按下
{flag1=~flag1;
//状态标志位取反
if(flag1==1)TR0=1;
elseTR0=0;
//计时开关
num=0;
second=0;
max=0;
min=0;
m_x=0xe000;
key2);
//等待key2松开
voidtrans_data()
if(flag2==0)
{dis_buf[0]=du_code[max/100];
dis_buf[1]=du_code[max%100/10];
dis_buf[2]=du_code[max%10];
else
{dis_buf[0]=du_code[min/100];
dis_buf[1]=du_code[min%100/10];
dis_buf[2]=du_code[min%10];
dis_buf[4]=du_code[second/10];
dis_buf[5]=du_code[second%10]&
0x7f;
dis_buf[6]=du_code[num/10];
dis_buf[7]=du_code[num%10];
/*************************系统初始化程序********************************/
voidInitial()
uinti=0;
for(i=0;
i<
8192;
i++)
XBYTE[m_x]=music[i];
m_x++;
m_x=0xE000;
CON=1;
//锁存器地址锁存
COM8255=0x89;
//定义8255的A口为输出,B口和C口为输入
CON=0;
TMOD=0x11;
//定义定时器的工作方式
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
//给T0装初值
TH1=(65536-500)/256;
TL1=(65536-500)%256;
//给T1装初值
ET0=1;
//开T0的中断
ET1=1;
//开T1的中断
EA=1;
//开总中断
TR0=0;
//关闭T0
TR1=1;
/************************************主程序***********************************/
voidmain()
{
uchartemp;
Initial();
//系统初始化
while
(1)
{
keyscan();
trans_data();
while(flag1==1)//判断状态标志位
{
if(TR0==1)//判断计时是否开始
temp=XBYTE[m_x];
//读取SRAM的值
CON=1;
DAC0832=temp;
//D/A转换
CON=0;
delayms
(1);
//延时
m_x++;
//地址值加1
if(m_x==0xfffe)
{
m_x=0xe000;
//RAM地址越界,初始化
}
if(temp>
max)
max=temp;
//提取幅值最大值
if(temp<
min)
min=temp;
//提取幅值最小值
keyscan();
}
/*********************定时器0中断程序************************************/
voidtimer0()interrupt1
//给定时器0装初值,定义时间精度为0.01s
num++;
//计数器加1
if(num==100)//判断1s时间是否到
num=0;
//计数器清零
second++;
//秒加1
if(second%2)
flag2=1;
else
flag2=0;
if(second==60)//判断1分钟是否到
//秒清零
voidtimer1()interrupt3
//给T1装初值
PB8255=bit_code[count];
//显示位值
PA8255=dis_buf[count];
//显示码值
count++;
if(count==8)//判断计数器的值是否超过范围
count=0;
四、设计草图
各部分电路图:
整体电路图:
五、设计结果
Proteus7.4中运行结果:
示波器的显示:
开始后显示的最小值:
开始后显示的最大值:
按下暂停键后的显示:
按下开关键后关闭时的显示:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 8255 LED 显示 语音 播放机 设计