标题:
基于stc51单片机的广告牌程序+PCB原理图文件
[打印本页]
作者:
pumpkin3456
时间:
2020-1-8 19:23
标题:
基于stc51单片机的广告牌程序+PCB原理图文件
基于stc51的广告牌,语音播报,超声波检查到人停了,变回电机转动
Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)
51hei.png
(15.33 KB, 下载次数: 39)
下载附件
2020-1-14 14:29 上传
51hei.png
(14.51 KB, 下载次数: 32)
下载附件
2020-1-14 14:29 上传
单片机源程序如下:
#include <reg51.h>
#include <stdio.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define MotorData P0 //步进电机控制接口定义,使用P0的0123
uchar phasecw[4] ={0x08,0x04,0x02,0x01};//正转 电机导通相序 D-C-B-A
uchar phaseccw[4]={0x01,0x02,0x04,0x08};//反转 电机导通相序 A-B-C-D
/**************超声波相关参数定义******************************/
unsigned int time=0;
unsigned int timer=0;
float S=0; //超声波距离
float a;
bit flag =0; //标志位
sbit RX = P1^1;
sbit TX = P1^2;
uchar nBkm = 0x00;
/***************语音模块相关参数定义******************************/
#define HEADLEN 5 //数据包头的长度
#define BKM_OFFSET 4 //背景音乐命令偏移
#define LEN_OFFSET 2 //长度字节的偏移量(一般不会超过255字节,因此只使用1字节长度)
#define BKM_MAX 15 //背景音乐数量
//数据包头(0xFD + 2字节长度 + 1字节命令字 + 1字节命令参数)
uchar head[HEADLEN] = {0xfd,0x00,0x00,0x01,0x00};
//延时
void Delay(uint n)
{
uchar i=112;
while(n--)
{
while(i--);
}
}
/******************以下为语音模块相关代码***************************************/
void delayms(unsigned int ms)
{
unsigned char i=100,j;
for(;ms;ms--)
{
while(--i)
{
j=10;
while(--j);
}
}
}
//串口初始化,波特率为9600bps。
void UART_Init(void)
{
SCON=0xD8 ;
TMOD=0x20 ;
PCON=0x00 ;
TH1 = 0xFD; //晶振为11.059MHZ时,设定串口波特率为9600bit/s,方式3
TR1=1;
TMOD=0x21; //设T0为方式1,GATE=1;
SCON=0x50;
TH1=0xFD;
TL1=0xFD;
TH0=0;
TL0=0;
TR0=1;
ET0=1; //允许T0中断
TR1=1; //开启定时器
TI=1;
EA=1; //开启总中断
}
//串口发送数据
void SendChar(uchar n)
{
SBUF = n;
while (TI==0);//发送数据
TI=0;
}
//背景音乐(参数为0表示关闭背景音乐)
void BkMusic(uchar num)
{
num %= BKM_MAX + 1;
nBkm = num;
}
//发声程序
void Speech(uchar *buf)
{
uchar i = 0; //循环计数变量
uchar xor = 0x00; //校验码初始化
uchar ch = 0x00;
uchar len = 0x00;
while(buf[len++]);
//发送数据包头(0xFD + 2字节长度 + 1字节命令字 + 1字节命令参数)
for(i = 0; i < HEADLEN; i++)
{
if(i == BKM_OFFSET)
ch = nBkm << 3; //写入背景音乐
else if(i == LEN_OFFSET)
ch = len + 3;
else
ch = head[i];
xor ^= ch;
SendChar(ch);
Delay(1);
}
//发送文字内容
for(i = 0; i < len; i++)
{
xor ^= buf[i];
SendChar(buf[i]);
Delay(1);
}
SendChar(xor); //发送校验位
Delay(50);
//while(BUSY); //等待合成结束
Delay(50);
}
/*************超声波测距代码**********************/
void StartModule() //启动模块
{
TX=1; //800MS 启动一次模块
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
TX=0;
}
float Conut(void)
{
time=TH0*256+TL0;
TH0=0;
TL0=0;
S=(time*1.87)/100; //算出来是CM
if(flag==1) //超出测量
{
flag=0;
}
return S;
}
/****************以下为步进电机代码*********************************/
void Delay_xms(uint x)
{
uint i,j;
for(i=0;i<x;i++)
for(j=0;j<112;j++);
}
//顺时针转动
void MotorCW(void)
{
uchar i;
for(i=0;i<4;i++)
{
MotorData=phasecw[i];
Delay_xms(4);//转速调节
}
}
//逆时针转动
void MotorCCW(void)
{
uchar i;
for(i=0;i<4;i++)
{
MotorData=phaseccw[i];
Delay_xms(4);//转速调节
}
}
//停止转动
void MotorStop(void)
{
MotorData=0x00;
}
//主函数
void main()
{
uint i;
uchar nBkm = 0x01; //演示背景音乐编号
UART_Init(); //初始化串口为 9600bps
BkMusic(1); //关闭背景音乐
Delay(3000);
Speech("初始化完成"); //系统初始化
while(1)
{
StartModule(); //启动超声波
while(!RX); //当RX为零时等待
TR0=1; //开启计数
while(RX); //当RX为1计数并等待
TR0=0; //关闭计数
a=Conut(); //计算
if(a<=150.0) //判断是否有人靠近
{
Speech("检测到行人");
delayms(300); //延时
StartModule(); //再次启动检测
while(!RX); //当RX为零时等待
TR0=1; //开启计数
while(RX); //当RX为1计数并等待
TR0=0; //关闭计数
a=Conut(); //计算
if(a<=150.0) //若行人停留
{
Speech("开始播放广告"); //开始播放广告
for(i=0;i<500;i++) //步进电机转动
{
MotorCW(); //顺时针转动
}
MotorStop(); //停止转动
Delay_xms(500);
}
}
delayms(100); //100MS
}
}
复制代码
所有资料51hei提供下载:
代码PCB设计资料.rar
(3.07 MB, 下载次数: 22)
2020-1-8 19:23 上传
点击文件名下载附件
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1