欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
基于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.raoushi.com/bbs/)
Powered by Discuz! X3.1