📄 复件 main.c
字号:
/*通过音乐频谱来切换动画*/
/*包含的库文件*/
#pragma small
#pragma CODE DEBUG SYMBOLS OBJECTEXTEND
//#include "..\includes\TypeDef.h"
#include <reg52.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
//#include <tdp.h>
#include <string.h>
#define uchar unsigned char
#define ulint unsigned long int
#define uint unsigned int
/***********************************************/
static data uchar cc[16];
#define adress_num 0x08//分控总数
#define row 16//有多少行
#define list 16 //一行有多少个像素;
#define tset 1 //数码管RGB排列情况
//0是RGB RGB RGB
//1是RGBx RGBx RGBx
//2是xRGB xRGB xRGB
uint dpara,c_in,corx,corx1; //延迟的最小单位时间
uchar code color_data[8]={0,4,2,1,6,5,3,7};//黑,红,绿,蓝,黄,紫,青,白//阳码
//uchar code color_data[8]={7,3,5,6,1,2,4,0};//黑,红,绿,蓝,黄,紫,白//阴码
uchar code color_data01[6]={4,6,2,3,1,5};
uchar data adress;
/*********************************************************************
颜色组合 数组
*********************************************************************/
uchar code color_data333[28]={4,4,4,4,6,6,6,6,2,2,2,2,3,3,3,3,1,1,1,1,5,5,5,5 ,7,7,7,7};
#define length 24 // 颜色数组 的列数
#define width 0 // 颜色数组 的行数
/*********************************************************************/
#define wbyte list/8//一行要用多少个字节来表示字色
#define KEY P1
uint ts;
uint r_in; //延迟的最小单位时间
uint t_in; //延迟的最小单位时间
static data uchar rbuf[16];
/*定义颜色控制端口*/
sbit DQ_595=P1^3;/*蓝线 HS74HC595的数据输入*/
sbit CLK_595=P1^2;/*绿线 HS74HC595的时钟*/
sbit STB_595=P1^1;/*红线 HS74HC595的数据锁存*/
sbit EN_595=P1^0;/*黄线 HS74HC595的数据使能*/
sbit RE_DE=P3^3;/*MAX487的收发器控制,当RE_DE=1时当前487处于接收状态 当RE_DE=0时当前487处于发送状态*/
/*********************延时函数*************
函数原型:void dely(ulint timepara);
功 能:延时等待,参数timepara为延时时间*/
void delay(ulint timepara)
{ ulint mpara=0;
do
{
mpara=mpara+1;
}
while (mpara!=timepara);
}
/*********************延时函数*************
函数原型:void dely(ulint timepara);
功 能:延时等待,参数timepara为延时时间*/
void delays(ulint timepara)
{ulint i;
for(i=0;i<timepara;i++)
{
ts=1;
delay(dpara*ts);//12M ---207---0.010S=10ms
}
}
/*********************串口中断初始化*************/
/*设置串行口工作方式1,定时器1作为波特率发生器
波特率设置为 2400 ;*/
void comm (void)
{TMOD=0x20;/*设置定时器T1工作方式2*/
//TL1=0xff;/*定时器计数初值,1152Bps波特率 115.2KBps*/
//TH1=0xff;/*定时器重装值*/
TL1=0xfd;/*定时器计数初值,9600Bps波特率 115.2KBps*/
TH1=0xfd;/*定时器重装值*/
EA=1;/*允许总的中断*/
ES=1;/*允许串行中断*/
PCON=0x00;/*波特率不倍增*/
//PCON |=0x80;/*波特率倍增*/
SCON=0x50;/*设置串口工作方式1,REN = 1 允许接收*/
TR1=0x01;/*定时器开始工作*/
}
void gen(void)
{
ES=0;/*关闭串行中断*/
STB_595=1;//关闭指示灯
dpara=207;
delays(10);
STB_595=0;//打开指示灯
dpara=207;
delays(10);
ES=1;/*关闭串行中断*/
}
/*接收一个字符
void recv_byte(uchar recv)
{ RE_DE=1;//当前487处于接收状态
while(RI==0);//等待接收数据
RI=0;//清除接收标志位
recv=SBUF;
}*/
/*发送一个字符*/
void send_byte(uchar send)
{ RE_DE=0;/*当前487处于发送状态*/
SBUF=send;
while(TI==0); /*等待发送完毕*/
TI=0;/*清除发送中断标志*/
}
/*********************串口中断服务程序*************/
void comm_int() interrupt 4 using 2
{uchar i,j;
ES=0;/*关闭串行中断*/
EA=0;
RI=0;//清除接收标志位
for(j=0;j<15;j++)
if(SBUF==0xE5)
{while(!RI);//等待接收数据
RI=0;//清除接收标志位
if(SBUF==0xE5)
{while(!RI);//等待接收数据
RI=0;//清除接收标志位
if(SBUF==adress)//如果
{while(!RI);//等待接收数据
RI=0;//清除接收标志位
if(SBUF==0x03)
{gen();}
}
}
}
ES=1;EA=1;/*开启串行中断及总中断*/
}
/****主程序*******************/
void main(void)
{uchar i,j;
uchar sb[4]={0xe5,0xe5,0x02,0x03};
dpara=207;
delays(500);
//RE_DE=0;/*当前487处于发送状态*/
comm();
IE0=1;
IT0=0;
strat:
EN_595=0;
ES=0;EA=1;/*开启串行中断及总中断*/
for(adress=0;adress<adress_num;adress++)
{
for(i=0;i<4;i++)
{
send_byte(sb[i]);//发送控制字
}
send_byte(adress);//发送分控地址
while(1);
}
gen();
ES=0;EA=0;/*关闭串行中断及总中断*/
dpara=207;
delay(50);
goto strat;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -