大家好:
今天我基于STC89C52单片机制作了一个公交车自动报站系统的设计。
1, 实物照片
2报站;接收模块原理图及PCB
3,发送信号整机程序
- #include <reg52.h>
- #define uint unsigned int
- #define uchar unsigned char
- uchar SUM = 0;
- #define BYTE_BIT0 0x01
- #define BYTE_BIT1 0x02
- #define BYTE_BIT2 0x04
- #define BYTE_BIT3 0x08
- #define BYTE_BIT4 0x10
- #define BYTE_BIT5 0x20
- #define BYTE_BIT6 0x40
- #define BYTE_BIT7 0x80
- ////////////SPI指令
- #define WC 0x00
- #define RC 0x10
- #define WTP 0x20
- #define RTP 0x21
- #define WTA 0x22
- #define RTA 0x23
- #define RRP 0x24
- bdata unsigned char DATA_BUF;
- #define DATA7 ((DATA_BUF&BYTE_BIT7) != 0)
- #define DATA0 ((DATA_BUF&BYTE_BIT0) != 0)
- sbit flag =DATA_BUF^7;
- sbit flag1 =DATA_BUF^0;
- #define TxRxBuf_Len 1
- unsigned char TxRxBuf[TxRxBuf_Len]=
- {
- 0x29
- };
- //配置口定义//
- sbit TXEN=P2^4;
- sbit TRX_CE=P2^3;
- sbit PWR=P2^5;
- sbit MISO=P2^1;
- sbit MOSI=P2^6;
- sbit SCK=P2^0;
- sbit CSN=P2^7;
- /////////////////////////////////////////////////////
- sbit AM=P2^2;
- sbit DR=P1^3;
- ///////////////////////////////////////////////////////
- sbit led1=P2^2;
- sbit led0=P2^3;
- sbit led2=P2^1;
- sbit led3=P2^0;
- ///////////////////////////////////////////////////////
- sbit KEY0=P1^0;
- sbit KEY1=P1^1;
- uchar seg[10]={0xC0,0xCF,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //0~~9段码
- //RF寄存器配置//
- unsigned char idata RFConf[11]=
- {
- 0x00, //配置命令//
- 0x4c, //CH_NO,配置频段在423MHZ
- 0x0c, //输出功率为10db,不重发,节电为正常模式
- 0x44, //地址宽度设置,为4字节
- 0x04,0x04, //接收发送有效数据长度为32字节
- 0xCC,0xCC,0xCC,0xCC, //接收地址
- 0x58, //CRC充许,8位CRC校验,外部时钟信号不使能,16M晶振
- };
- bit lcdbit;
- code TxAddress[4]={0xcc,0xcc,0xcc,0xcc};
- ///////////延时/////////////////
- static void Delay(uchar n)
- {
- uint i;
- while(n--)
- for(i=0;i<80;i++);
- }
- void SpiWrite(unsigned char send)
- {
- unsigned char i;
- DATA_BUF=send;
- for (i=0;i<8;i++)
- {
- if (DATA7) //总是发送最高位
- {
- MOSI=1;
- }
- else
- {
- MOSI=0;
- }
- SCK=1;
- DATA_BUF=DATA_BUF<<1;
- SCK=0;
- }
- }
- ////////////////初始化nRF905///////////////////
- void nRF905Init(void)
- {
- CSN=1; // Spi disable
- SCK=0; // Spi clock line init low
- DR=0; // Init DR for input
- AM=0; // Init AM for input
- // CD=0; // Init CD for input
- PWR=1; // nRF905 power on
- TRX_CE=0; // Set nRF905 in standby mode
- TXEN=0; // set radio in Rx mode
- }
- ////////初始化寄存器
- void Config905(void)
- {
- uchar i;
- CSN=0; // Spi enable for write a spi command
- //SpiWrite(WC); // Write config command写放配置命令
- for (i=0;i<11;i++) // Write configration words 写放配置字
- {
- SpiWrite(RFConf[i]);
- }
- CSN=1; // Disable Spi
- }
- /////////////发送数据
- void TxPacket(uchar *TxRxBuf)
- {
- uchar i;
- //Config905();
- CSN=0;
- SpiWrite(WTP); // Write payload command
- SpiWrite(TxRxBuf[0]); // Write 32 bytes Tx data
- CSN=1;
- Delay(1); // Spi disable
- CSN=0; // Spi enable for write a spi command
- SpiWrite(WTA); // Write address command
- for (i=0;i<4;i++) // Write 4 bytes address
- {
- SpiWrite(TxAddress[i]);
- }
- CSN=1; // Spi disable
- TRX_CE=1; // Set TRX_CE high,start Tx data transmission
- Delay(1); // while (DR!=1);
- TRX_CE=0; // Set TRX_CE low
- }
- ////////////////////////////////////////////////////
- void SetTxMode(void)
- {
- TRX_CE=0;
- TXEN=1;
- Delay(1); // delay for mode change(>=650us)
- }
- void main(void)
- {
- uchar i;
- nRF905Init();
- Config905();
- while(1)
- {
- if(KEY0==0) //有键按下
- {
- Delay(20);
- if(KEY0 == 0)
- {
- while(!KEY0); //等待按键松开 RED
- SUM++;
- if(SUM == 5) SUM = 1;
- if(SUM == 1)
- {
- TxRxBuf[0]=0x11;
- for(i=0;i<2;i++)
- {
- SetTxMode();// Set nRF905 in Tx mode
- TxPacket(TxRxBuf);// Send data by nRF905
- }
- }
- else if(SUM == 2)
- {
- TxRxBuf[0]=0x12;
- for(i=0;i<2;i++)
- {
- SetTxMode();// Set nRF905 in Tx mode
- TxPacket(TxRxBuf);// Send data by nRF905
- }
- }
- else if(SUM == 3)
- {
- TxRxBuf[0]=0x13;
- for(i=0;i<2;i++)
- {
- SetTxMode();// Set nRF905 in Tx mode
- TxPacket(TxRxBuf);// Send data by nRF905
- }
- }
- else if(SUM == 4)
- {
- TxRxBuf[0]=0x14;
- for(i=0;i<2;i++)
- {
- SetTxMode();// Set nRF905 in Tx mode
- TxPacket(TxRxBuf);// Send data by nRF905
- }
- }
- }
- }
- }
- }
- 4,接受信号整机程序
- #include <regx52.h>
- #define uchar unsigned char
- #define uint unsigned int
- /*------------LCD12864相关声明-----------------------------*/
- #define com_byte 0
- #define dat_byte 1
- sbit cs =P0^0;
- sbit sid=P0^1;
- sbit sck=P0^2;
- uchar lcdPosX, lcdPosY; //X,Y坐标
- uchar halfScr, halfLineCnt, basicBlock; //半屏,半屏行数,N*8块
- uchar code TAB1[]={"20 年 月 上行"};//第一行初始化.
- uchar code TAB2[]={" : : ℃"};
- uchar code TAB3[]={"0123456789: "};
- /**************************************************************/
- //===============================================
- void delay_Ms (uchar ms)
- {
- uchar i;
- while (--ms)
- {
- for (i = 0; i < 125; i++);
- }
- }
- /**************************************************************
- 函数名称:void w_12864byte(uchar byte)
- 函数功能: 写字节
- **************************************************************/
- void w_12864byte(uchar byte)
- {
- uchar i;
- for(i=0;i<8;i++)
- {
- sck=0;
- byte<<=1;
- sid=CY;
- sck=1;
- }
- }
- /**************************************************************
- 函数名称:uchar r_12864byte(void)
- 函数功能: 读字节
- ***************************************************************/
- uchar r_12864byte(void)
- {
- uchar i,temp1,temp2;
- temp1 = 0;
- temp2 = 0;
- for(i=0;i<8;i++)
- {
- temp1=temp1<<1;
- sck = 0;
- sck = 1;
- sck = 0;
- if(sid) temp1++;
- }
- for(i=0;i<8;i++)
- {
- temp2=temp2<<1;
- sck = 0;
- sck = 1;
- sck = 0;
- if(sid) temp2++;
- }
- return ((0xf0&temp1)+(0x0f&temp2));
- }
- /**************************************************************
- 函数名称:void c_12864busy( void )
- 函数功能: 检测忙函数
- **************************************************************/
- void c_12864busy( void )
- {
- do
- w_12864byte(0xfc); //11111,RW(1),RS(0),0
- while(0x80&r_12864byte());
- }
- /**************************************************************
- 函数名称:void w_12864(bit dat_byte_com_byte,uchar byt)
- 函数功能: 写入函数
- ***************************************************************/
- void w_12864(bit dat_byte_com_byte,uchar byt)
- {
- uchar temp;
- if(dat_byte_com_byte==0) //为零,写入指令
- temp=0xf8; //11111,RS(0),RW(0),0
- else //否则,写入数据
- temp=0xfa; //11111,RS(1),RW(0),0
- cs=1;
- c_12864busy();
- w_12864byte(temp);
- w_12864byte(byt&0xf0); //写入高四位
- w_12864byte(byt<<4); //写入低四位
- cs=0;
- }
- void lcdClear (void)
- {
- w_12864(com_byte,0x01);
- }
- void wrPosition (void)
- {
- w_12864(com_byte,0x34);
- w_12864(com_byte,lcdPosY);
- w_12864(com_byte,lcdPosX);
- w_12864(com_byte,0x30);
- }
- //===============================================
- void displayPhoto (uchar *bmp, uchar bmpCls)
- {
- lcdPosX = 0x80;
- halfScr = 2;
-
- for (;halfScr != 0; halfScr--)
- {
- lcdPosY = 0x80;
- halfLineCnt = 32;
-
- for (;halfLineCnt != 0; halfLineCnt--)
- {
- basicBlock = 16;
- wrPosition ();
-
- for (; basicBlock != 0; basicBlock--)
- {
- if (bmpCls == 0)
- {
- w_12864(dat_byte, *bmp++);
- }
- else if (bmpCls == 1)
- {
- w_12864(dat_byte,0x00);
- }
- }
- lcdPosY++;
- }
- lcdPosX = 0x88;
- }
- w_12864(com_byte,0x36);
- w_12864(com_byte,0x30);
- }
- //字符反白显示
- //输入参数:CX=要反白字符的行(0-3)
- //CY=要反白字符的列(0-7)
- //width=要反白字符的长度(1-16)
- //===============================================
- void convertChar (uchar CX, CY, width)
- {
- displayPhoto(0,1);
- lcdPosY = 0x80;
- if (CX == 0)
- {
- CX = 0x80;
- halfLineCnt = 16;
- }
- else if (CX == 1)
- {
- CX = 0x80;
- halfLineCnt = 32;
- }
- else if (CX == 2)
- {
- CX = 0x88;
- halfLineCnt = 16;
- }
- else if (CX == 3)
- {
- CX = 0x88;
- halfLineCnt = 32;
- }
- lcdPosX = CX + CY;
-
- for (; halfLineCnt != 0; halfLineCnt--)
- {
- basicBlock = width;
- wrPosition();
-
- for (;basicBlock != 0; basicBlock--)
- {
- if (halfLineCnt > 16)
- {
- w_12864(dat_byte,0x00);
- }
- else
- {
- w_12864(dat_byte,0xff);
- }
- }
- lcdPosY++;
- }
- w_12864(com_byte,0x36);
- w_12864(com_byte,0x30);
- }
- void dispString(uchar X,uchar Y,uchar speed, uchar *msg)
- {
- if (X == 0)
- {
- X = 0x80;
- }
- else if (X == 1)
- {
- X = 0x90;
- }
- else if (X == 2)
- {
- X = 0x88;
- }
- else if (X == 3)
- {
- X = 0x98;
- }
- Y = X + Y;
- w_12864(com_byte,Y);
- while (*msg)
- {
- w_12864(dat_byte,*msg++);
- delay_Ms(speed);
- }
- }
- //=============================================================
- /**************************************************************
- 函数名称:void init_12864(void)
- 函数功能:初始化12864
- ***************************************************************/
- void init_12864(void)
- {
- uint i;
- w_12864(com_byte,0x30); //基本指令功能.
- w_12864(com_byte,0x0c); //显示打开,关光标,反白关.
- w_12864(com_byte,0x01); //清屏指令.
- w_12864(com_byte,0x06); //AC自动加一
- w_12864(com_byte,0x80);
- for(i=0;i<16;i++)
- w_12864(dat_byte,TAB1[i]);
- w_12864(com_byte,0x90);
- for(i=0;i<16;i++)
- w_12864(dat_byte,TAB2[i]);
- dispString(2,0,1,"欢迎乘学院路公交");
- dispString(3,0,1,"志华站=>财经学院");
- }
- 5,时钟程序
- #ifndef _CLOCK_H_
- #define _CLOCK_H_
- #include <regx52.h>
- //#define PortDisplayData P0 //定义数码管数据和位选择输出口
- //#define PortDisplayBit P1
- unsigned char ucClockStatu; //时钟状态
- #define RUNING 0x00
- #define MODIFY_YEA 0x01
- #define MODIFY_MON 0x02
- #define MODIFY_DAY 0x03
- #define MODIFY_HOU 0x04
- #define MODIFY_MIN 0x05
- #define MODIFY_SEC 0x06
- //定义跟DS1302相关的数据
- sbit SCLK = P3^4; //实时时钟端口定义
- sbit SDAT = P3^6;
- sbit SRST = P3^7;
- //定义跟键盘有关的端口
- sbit FUNTION_KEY = P1^6;
- sbit INCREASE_KEY = P1^7;
- sbit DECREASE_KEY = P1^5;
- sbit WENXING_KEY =P1^4;
- sbit PLAY_KEY = P1^3;
- sbit UP_DOWN__KEY = P1^2;//上下行切换键
- #define W_OP 0x00 //定义写操作
- #define R_OP 0x01 //定义读操作
- #define SEC 0x80 //秒寄存器地址
- #define MIN 0x82 //分寄存器地址
- #define HOU 0x84 //小时寄存器地址
- #define WEK 0x8a //星期寄存器地址
- #define DAY 0x86 //日寄存器地址
- #define MON 0x88 //月寄存器地址
- #define YER 0x8c //年寄存器地址
- #define CHARGER 0x90 //充电控制寄存器地址
- //充电控制寄存器结构:TCS为控制位,当它的值为1010时开启充电功能,其它值都禁止充电,芯片上电时禁止充电.
- //DS为二极管选择位,选择串在VCC1和VCC2之间的二极管个数,当值为01时选择一个二极管,为10时选择两个二极管,其它值为禁止充电.
- //RS为电阻选择寄存器,选择串在VCC1和VCC2之间的电阻值,当值为00时不选择任何电阻,而且禁止充电,01时为2K,10时为4K,11时为8K
- //_____________________________
- //|TCS|TCS|TCS|TCS|DS|DS|RS|RS|
- //|___|___|___|___|__|__|__|__|
- #define WPR 0x8e //写保护寄存器地址
- #define DISABLE 0x80 //开启写保护
- #define ENABLE 0x00 //关闭写保护
- unsigned char OldSecond;
- unsigned char OldMinute;
- unsigned char OldHour;
- unsigned char NewSecond;
- unsigned char NewMinute;
- unsigned char NewHour;
- unsigned char TempSecond;
- unsigned char TempMinute;
- unsigned char TempHour;
- unsigned char OldDay;
- unsigned char OldMonth;
- unsigned char OldYear;
- unsigned char NewDay;
- unsigned char NewMonth;
- unsigned char NewYear;
- unsigned char TempDay;
- unsigned char TempMonth;
- unsigned char TempYear;
- unsigned int uiTimerHalfSecond;
- unsigned char ucTimerKeyChange;
- unsigned char ucTimerDelay;
- bit bFlagFlshTime;
- #endif
复制代码
6,以上就是我做的公交车自动报站系统,站点名字可以更改 如果解决了你的问题 请帮我评论 赞一个 谢谢了
全部资料51hei下载地址:
公交无线自动报站【增加温度显示,增加日期,上下行功能,模拟4站】_2017.10.19.rar
(8.56 MB, 下载次数: 140)
|