微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 求大神帮忙绘制程序框图

求大神帮忙绘制程序框图

时间:10-02 整理:3721RD 点击:
主机程序
/******************************************************************************************\
============================================================================================
* T905.c
*
* This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTYT;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*
*
* NOTES:
* This program is for the nRF905 with 232 interface;
* $write date: 2004.4.7 ;time 11:00$
* $Revision: 1 $
*
/*******************************************************************************************/
#include <at89x52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint  unsigned int
#define ulong  unsigned long
#define WC                0x00                        // Write configuration register command
#define RC                0x10                         // Read  configuration register command
#define WTP                0x20                         // Write TX Payload  command
#define RTP                0x21                        // Read  TX Payload  command
#define WTA                0x22                        // Write TX Address  command
#define RTA                0x23                        // Read  TX Address  command
#define RRP                0x24                        // Read  RX Payload  command
/*******************************************************************************************/
typedef struct RFConfig
{
        uchar n;
        uchar buf[10];
}RFConfig;
code RFConfig RxTxConf =
{
        10,
        0x01, 0x0c, 0x44, 0x20, 0x20, 0xcc, 0xcc, 0xcc,0xcc, 0x58       
};
// The content of this struct is nRF905's initialize data.初始化数据
// CH_NO=1;433MHZ;Normal Opration,No Retrans;RX,TX Address is 4 Bytes
// RX TX Payload Width is 32 Bytes;Disable Extern Clock;Fosc=16MHZ
// 8 Bits CRC And enable
/*******************************************************************************************/
uchar data TxBuf[32];                 //发送缓冲区
uchar data RxBuf[32];                 //接收缓冲区
uchar key,rsbrf,delayf,tf;
/*******************************************************************************************/
uchar bdata DATA_BUF;
sbit        flag        =DATA_BUF^7;
sbit        flag1        =DATA_BUF^0;
/***********************硬件管脚连接定义********************************************************************/
sbit        TX_EN        =P1^0;
sbit        TRX_CE        =P3^1;
sbit        PWR_UP        =P1^1;
sbit        MISO        =P1^7;
sbit        MOSI        =P1^4;
sbit        SCK                =P1^6;
sbit        CSN                =P1^5;
sbit        AM                =P3^0;
sbit        DR                =P1^3;
sbit        CD                =P1^2;
sbit    LED1    =P0^0;
sbit    LED2    =P0^1;
sbit    menu    =P3^2;        //菜单       
sbit    add     =P3^3;        //+
sbit    dec     =P3^4;        //-
sbit    test    =P3^5;         //当前轮号
sbit    speak   =P2^1;         //蜂鸣器
/***************************参数保存*****************************/
//--------------------定义操作命令-----------
#define RdCommand 0x01        //定义ISP操作
#define PrgCommand 0x02
#define EraseCommand 0x03
#define Error 1
#define OK 0
#define WaitTime 0x01        //定义CPU等待时间
sfr ISP_DATA=0xe2;                //寄存器声明
sfr ISP_ADDRH=0xe3;
sfr ISP_ADDRL=0xe4;
sfr ISP_Order=0xe5;
sfr ISP_TRIG=0xe6;
sfr ISP_CONTR=0xe7;
void InitTime();
//---------------打开ISP,IAP功能---------
void ISP_IAP_enable(void)
{
        EA=0;
        ISP_CONTR=ISP_CONTR&0x18;                //ISP_COUNT的B4,B3位
        ISP_CONTR=ISP_CONTR|WaitTime;
        ISP_CONTR=ISP_CONTR|0x80;                //ISPEN=1
}
//-------------关闭ISP,IAP功能-----------
void ISP_IAP_disable(void)
{
        ISP_CONTR=ISP_CONTR&0x7f;        //ISPEN=0
        ISP_TRIG=0x00;
        EA=1;                                                //开中断
}
//--------------公共触发代码---------
void ISPgoon(void)
{
        ISP_IAP_enable();                //打开ISP,IAP功能
        ISP_TRIG=0x46;                        //触发ISP_IAP命令字节1
        ISP_TRIG=0xb9;                        //触发ISP_IAP命令字节2
        _nop_();
}
//------------字节读--------------
unsigned char byte_read(uint byte_addr)
{
        ISP_ADDRH=(uchar)(byte_addr>>8);                //地址赋值
        ISP_ADDRL=(uchar)(byte_addr&0x00ff);
        ISP_Order=ISP_Order&0xf8;                        //清除低三位
        ISP_Order=ISP_Order|RdCommand;                //写入命令
        ISPgoon();                                                        //触发执行
        ISP_IAP_disable();                                        //关闭ISP,IAP功能
        return(ISP_DATA);                                        //返回读到的数据
}
//-------------EEPROM操作-------------
/*************扇区擦除****************/
void SectorErase(uint sector_addr)
{
        uint iSectorAddr;
        iSectorAddr=(sector_addr&0xfe00);        //取扇区地址
        ISP_ADDRH=(uchar)(iSectorAddr>>8);
        ISP_ADDRL=0x00;
        ISP_Order=ISP_Order&0xf8;                        //清空低3位
        ISP_Order=ISP_Order|EraseCommand;        //擦除命令3
        ISPgoon();                                                        //触发执行
        ISP_IAP_disable();                                        //关闭ISP,IAP功能
}
/*************写字节****************/
void byte_write(uint byte_addr,uchar original_data)
{
        ISP_ADDRH=(uchar)(byte_addr>>8);        //取地址
        ISP_ADDRL=(uchar)(byte_addr&0x00ff);
        ISP_Order=ISP_Order&0xf8;
        ISP_Order=ISP_Order|PrgCommand;                //写命令2
        ISP_DATA =original_data;                        //写入数据准备
        ISPgoon();                                                        //触发执行
        ISP_IAP_disable();                                        //关闭IAP功能
}
/*******************************************************************************************/
ulong press,temp; //压力 温度 变量定义
uint  H_T=40,H_P=105,L_T=10,L_P=90;          //温度40-10 压力105-90
sbit    d1=P2^7;
sbit    d2=P2^6;
sbit    d3=P2^5;
sbit    d4=P2^4;
sbit    d5=P2^3;
sbit    d6=P2^2;
sbit    point=P0^2;
uchar  s1num=0;
/*******************************************************************************************/
uchar code tab[]={0x14,0x77,0x4C,0x45,0x27,0x85,0x84,0x57,
                          0x04,0x05,0x06,0xA4,0x9C,0x64,0x8C,0x8E};  //共阳数码管不带小数点的0~9编码
/*******************************************************************************************/
void InitIO(void);                                // Initialize IO port
void Inituart(void);                        // initialize 232 uart
void Config905(void);                        // Config nRF905 module配置NRF905模式
void SetTxMode(void);                        // Set nRF905 in Tx mode
void SetRxMode(void);                        // Set nRF905 in Rx mode
void TxPacket(void);                        // Send data by nRF905
void RxPacket(void);                        // Recive data by nRF905
void SpiWrite(uchar);                        // Write data to nRF905
uchar SpiRead(void);                        // Read data to nRF905
void Delay(uchar n);                        // Delay 100us
void Scankey(void);                                // Scan key
void TxData (uchar x);                        // Send key_value to CRT display
void comdebug(void);
/************************延时函数*******************************************************************/
void Delay(uchar n)
{
        uint i;
        while(n--)
        for(i=0;i<80;i++);       
}
//************************数码管显示函数*********************************
display()
{uchar times;
if(test==1&&s1num==0)          //正常进入无任何操作时显示温度和气压
{
for(times=20;times>0;times--)
{
P0=tab[temp/100%10];d1=0;Delay(1);d1=1;
P0=tab[temp/10%10];point=0;d2=0;Delay(1);d2=1;
P0=tab[temp%10];d3=0;Delay(1);d3=1;
P0=tab[press/100%10];d4=0;Delay(1);d4=1;
P0=tab[press/10%10];d5=0;Delay(1);d5=1;
P0=tab[press%10];d6=0;Delay(1);d6=1;
}
}
else if(test==1&&s1num==1)                //菜单键按下一次时显示温度上限
{
for(times=20;times>0;times--)
{
P0=0xac;d1=0;Delay(1);d1=1;
P0=tab[H_T/100%10];d3=0;Delay(1);d3=1;
P0=tab[H_T/10%10];point=0;d4=0;Delay(1);d4=1;
P0=tab[H_T%10];d5=0;Delay(1);d5=1;
}
}
else if(test==1&&s1num==2)          //菜单键按下两次时显示压力上限
{
for(times=20;times>0;times--)
{
P0=0x0e;d1=0;Delay(1);d1=1;
P0=tab[H_P/100%10];d3=0;Delay(1);d3=1;
P0=tab[H_P/10%10];d4=0;Delay(1);d4=1;
P0=tab[H_P%10];d5=0;Delay(1);d5=1;
}
}
else if(test==1&&s1num==3)                 //菜单键按下三次时显示温度下限
{
for(times=20;times>0;times--)
{
P0=0xac;point=0;d1=0;Delay(1);d1=1;
P0=tab[L_T/100%10];d3=0;Delay(1);d3=1;
P0=tab[L_T/10%10];d4=0;Delay(1);d4=1;
P0=tab[L_T%10];d5=0;Delay(1);d5=1;
}
}
else if(test==1&&s1num==4)        //菜单键按下四次时显示气压下限
{
for(times=20;times>0;times--)
{
P0=0x0e;point=0;d1=0;Delay(1);d1=1;
P0=tab[L_P/100%10];d3=0;Delay(1);d3=1;
P0=tab[L_P/10%10];d4=0;Delay(1);d4=1;
P0=tab[L_P%10];d5=0;Delay(1);d5=1;
}
}
else if(test==0&&s1num==0)                   //按下轮胎号键显示接收缓冲区的轮号
{
for(times=20;times>0;times--)
{
P0=tab[RxBuf[10]/100%10];d2=0;Delay(1);d2=1;
P0=tab[RxBuf[10]/10%10];d3=0;Delay(1);d3=1;
P0=tab[RxBuf[10]%10];d4=0;Delay(1);d4=1;
}
}
}
/*************************************************************************************/
/*********键盘程序************************/
void keyscan(void)
{                
        if(menu==0)
     {
       Delay(10);
           if(menu==0)                        //menu键按下一次s1num变量+1
           {
             while(!menu);          
                  s1num++;
                while(1)
            {  if(menu==0)
             {  Delay(10);
                    if(menu==0)
                      {
                                     while(!menu);
                         s1num++;
                          }
                 }
                if(s1num==1)                //当s1num==1时
                        {
                            if(add==0)        //add按下温度上线+10如果上限大于850上限等于850
                             {
                               Delay(10);
                               if(add==0)
                                 {         while(!add);
                               if(H_T>=850)
                                           H_T=850;
                                           else
                                           H_T+=10;
                                                                         
                                 }
                                  display();
                              }
                    if(dec==0) //        dec按下温度上线-10如果上限小于100上限等于100
                         {
                                Delay(10);
                                if(dec==0)
                                 {        while(!dec);
                                   if(H_T<=100)
                                           H_T=100;
                                           else
                                           H_T-=10;                             
                                 }
                                  display();
                              }
                         }
                        if(s1num==2)          //当s1num==2时
                        {
                            if(add==0)                 //add按下气压上线+1如果上限大于110上限等于110
                             {
                               Delay(10);
                               if(add==0)
                                 {         while(!add);
                               if(H_P>=110)
                                           H_P=110;
                                           else
                                           H_P+=1;                              
                                 }
                                  display();
                              }
                    if(dec==0)                   //dec按下气压上线-1如果上限小于20上限等于20
                         {
                               Delay(10);
                                if(dec==0)
                                 {        while(!dec);
                                   if(H_P<=20)
                                           H_P=20;
                                           else
                                           H_P-=1;                             
                                 }
                                  display();
                              }
                         }
                         if(s1num==3)          //当s1num==3时
                        {
                            if(add==0)                //add按下温度下线+10如果下限大于850下限等于850
                             {
                               Delay(10);
                               if(add==0)
                                 {         while(!add);
                               if(L_T>=850)
                                           L_T=850;
                                           else
                                           L_T+=10;                              
                                 }
                                  display();
                              }
                    if(dec==0)                                 //        dec按下温度下线-10如果下限小于20下限等于20
                         {
                               Delay(10);
                                if(dec==0)
                                 {        while(!dec);
                                   if(L_T<=20)
                                           L_T=20;
                                           else
                                           L_T-=10;                             
                                 }
                                  display();
                              }
                         }

                         if(s1num==4)                //当s1num==4时
                        {
                            if(add==0)                   //add按下气压下线+1如果下限大于110下限等于110
                             {
                               Delay(10);
                               if(add==0)
                                 {         while(!add);
                               if(L_P>=110)
                                           L_P=110;
                                           else
                                           L_P+=1;                              
                                 }
                                  display();
                              }
                    if(dec==0)                          //        dec按下气压下线-1如果下限小于20下限等于20
                         {
                               Delay(10);
                                if(dec==0)
                                 {        while(!dec);
                                   if(L_P<=20)
                                           L_P=20;
                                           else
                                           L_P-=1;                             
                                 }
                                  display();
                              }
                         }
                        if(s1num==5)                         //当s1num==5时        开始运行
                        {        s1num=0;//s1num清零//
                            SectorErase(0x2000);
       SectorErase(0x2200);
       byte_write(0x2000,H_T/256);                //存储写入临时数据           温度上限
       byte_write(0x2200,H_T%256);                //写入临时数据
            SectorErase(0x2400);
       SectorErase(0x2600);
       byte_write(0x2400,H_P/256);                //写入临时数据                气压上限
       byte_write(0x2600,H_P%256);                //写入临时数据
            SectorErase(0x2800);
       SectorErase(0x2a00);
       byte_write(0x2800,L_T/256);                //写入临时数据          温度下限
       byte_write(0x2a00,L_T%256);                //写入临时数据
       SectorErase(0x2c00);
       SectorErase(0x3000);
       byte_write(0x2c00,L_P/256);                //写入临时数据          气压下限
       byte_write(0x3000,L_P%256);                //写入临时数据

                                break;
                        }
                display();
                }
        }
        }
}
/*************************************************************************************/
void main()
{
        unsigned int cyc=0;
        unsigned int distan=0;

    //================NRF905初始化
        CSN=1;                                                // Spi         disable                                               
        SCK=0;                                                // Spi clock line init high
        DR=1;                                                // Init DR for input
        AM=1;                                                // Init AM for input
        PWR_UP=1;                                        // nRF905 power on
        TRX_CE=0;                                        // Set nRF905 in standby mode
        TX_EN=0;                                        // set radio in Rx mode       
        //================
        Config905();                                // Config nRF905 module
        TxBuf[0] = 1;
        TxBuf[1] = 1;
        SetTxMode();                                // Set Tx Mode
        TxPacket();                                // Transmit Tx buffer data
        LED1 = 0;
        LED2 = 0;
        Delay(500);                                // delay for led light       
        LED1 = 1;
        LED2 = 1;
        TxBuf[0] = 0xff;
        TxBuf[1] = 0xff;
                                        // led close
        SetRxMode();                                // Set nRF905 in Rx mode
        d1=0;
    H_T=byte_read(0x2000)*256+byte_read(0x2200);        //开机读取掉电前的温度上限如果>1000=1000
        if(H_T>1000)
        H_T=1000;
        H_P=byte_read(0x2400)*256+byte_read(0x2600);   //开机读取掉电前的气压上限如果>110=110
        if(H_P>110)
        H_P=110;
while(1)
{
         //=====================从键盘获得数据
                  
                   temp =RxBuf[2]+RxBuf[3]*256+RxBuf[4]*256*256+RxBuf[5]*256*256*256;         //温度数据
                  
                   press=RxBuf[6]+RxBuf[7]*256+RxBuf[8]*256*256+RxBuf[9]*256*256*256;         //气压数据
                   if(temp>H_T||press>H_P||temp<L_T||press<L_P)//温度>上限或<下限报警气压>上限或<下限报警
                   speak=0;
                   else
                   speak=1;
                   display();
                   keyscan();
                 //  if(KEY2 ==0 ) {        LED2 = 0; TxBuf[1] = 1 ;tf = 1 ; }
           if (tf==1)
             {       
               
                  //===============NRF905发送相应的按键          
                     SetTxMode();                                // Set Tx Mode
                     TxPacket();                                // Transmit Tx buffer data
                        TxBuf[0] = 0xff;
                        TxBuf[1] = 0xff;
                        SetRxMode();                                // Set nRF905 in Rx mode
                        tf=0;
                        Delay(500);
                        LED1 = 1;
                        LED2 = 1;
                  }
         //=====================等待NRF905接收
           if (DR)                        // If recive data ready...
           RxPacket();                        // ... recive data
}
}
/*******************************************************************************************/
/*******************************************************************************************/
//function Config905();
/*******************************************************************************************/
void Config905(void)
{
        uchar i;                                       
        CSN=0;                                                // Spi enable for write a spi command
        SpiWrite(WC);                                // Write config command写放配置命令
        for (i=0;i<RxTxConf.n;i++)        // Write configration words  写放配置字
        {
                SpiWrite(RxTxConf.buf[i]);
        }
        CSN=1;                                                // Disable Spi
}
/*******************************************************************************************/
//function SpiWrite();
/*******************************************************************************************/
void SpiWrite(uchar  byte)
{
        uchar i;       
        DATA_BUF=byte;                                // Put function's parameter into a bdata variable               
        for (i=0;i<8;i++)                        // Setup byte circulation bits
        {       
               
                if (flag)                                // Put DATA_BUF.7 on data line
                        MOSI=1;
                else
                        MOSI=0;
                SCK=1;                                        // Set clock line high
                DATA_BUF=DATA_BUF<<1;        // Shift DATA_BUF
                SCK=0;                                        // Set clock line low
        }       
}
/*******************************************************************************************/
//function SpiRead();
/*******************************************************************************************/
uchar SpiRead(void)
{
        uchar i;       
        for (i=0;i<8;i++)                        // Setup byte circulation bits
        {       
                DATA_BUF=DATA_BUF<<1;        // Right shift DATA_BUF
                SCK=1;                                        // Set clock line high
                if (MISO)
                        flag1=1;                        // Read data
                else
                        flag1=0;
                                                       
               
                SCK=0;                                        // Set clock line low
        }
        return DATA_BUF;                        // Return function parameter
}
/*******************************************************************************************/
//function TxPacket();
/*******************************************************************************************/
void TxPacket(void)
{
        uchar i;
        //Config905();                               
        CSN=0;                                                // Spi enable for write a spi command       
        SpiWrite(WTP);                                // Write payload command
        for (i=0;i<32;i++)
        {
                SpiWrite(TxBuf[i]);                // Write 32 bytes Tx data
        }
        CSN=1;                                                // Spi disable                                               
        Delay(1);
        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(RxTxConf.buf[i+5]);
        }       
        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
}
/*******************************************************************************************/
//function RxPacket();
/*******************************************************************************************/
void RxPacket(void)
{
        uchar i;       
        TRX_CE=0;                                        // Set nRF905 in standby mode       
        CSN=0;                                                // Spi enable for write a spi command
        SpiWrite(RRP);                                // Read payload command       
        for (i=0;i<32;i++)
        {
                RxBuf[i]=SpiRead();                // Read data and save to buffer               
        }
        CSN=1;                                                // Disable spi
        while(DR||AM);       
//        P0=        RxBuf[0];                                // Buffer[0] output from P0 port...
        TRX_CE=1;
        //xx=(RxBuf[0]>>4)&0x0f;
        //TxData(xx);
         //=====================
    LED1 = 0 ;
        Delay(500);                                        // ...light led
//        P0=0xff;                                        // Close led
      LED1 = 1 ;
          LED2 = 1 ;
                                                       
}
/*******************************************************************************************/
//function SetTxMode();
/*******************************************************************************************/
void SetTxMode(void)                               
{       
        TX_EN=1;
        TRX_CE=0;
        Delay(1);                                         // delay for mode change(>=650us)
}                               
/*******************************************************************************************/
//function SetRxMode();
/*******************************************************************************************/
void SetRxMode(void)
{
        TX_EN=0;
        TRX_CE=1;
        Delay(1);                                         // delay for mode change(>=650us)                               
}


发送机程序
* BMP085模块
*
* 用途:BMP085模块IIC测试程序
*
* 作者                                        日期                                备注
* Huafeng Lin                        2010/12/10                        新增
* Huafeng Lin                        2010/12/11                        修改
*
*/
#include  <REG51.H>          
#include  <math.h>    //Keil library  
#include  <stdlib.h>  //Keil library  
#include  <stdio.h>   //Keil library       
#include  <INTRINS.H> //Keil library  
#define   uchar unsigned char
#define   uint unsigned int       
sbit        SCL=P2^1;      //IIC时钟引脚定义
sbit        SDA=P2^0;      //IIC数据引脚定义
sbit    d1=P2^7;
sbit    d2=P2^6;
sbit    d3=P2^5;
sbit    d4=P2^4;
sbit    d5=P2^3;
sbit    d6=P2^2;
sbit    point=P0^2;
long  temperature;
long  pressure;
/***************************************905**********************************************/
#define WC                0x00                        // Write configuration register command
#define RC                0x10                         // Read  configuration register command
#define WTP                0x20                         // Write TX Payload  command
#define RTP                0x21                        // Read  TX Payload  command
#define WTA                0x22                        // Write TX Address  command
#define RTA                0x23                        // Read  TX Address  command
#define RRP                0x24                        // Read  RX Payload  command
/*******************************************************************************************/
typedef struct RFConfig
{
        uchar n;
        uchar buf[10];
}RFConfig;
code RFConfig RxTxConf =
{
        10,
        0x01, 0x0c, 0x44, 0x20, 0x20, 0xcc, 0xcc, 0xcc,0xcc, 0x58       
};
// The content of this struct is nRF905's initialize data.初始化数据
// CH_NO=1;433MHZ;Normal Opration,No Retrans;RX,TX Address is 4 Bytes
// RX TX Payload Width is 32 Bytes;Disable Extern Clock;Fosc=16MHZ
// 8 Bits CRC And enable
/*******************************************************************************************/
uchar xdata TxBuf[32];
uchar xdata RxBuf[32];
uchar key,rsbrf,delayf,tf;
/*******************************************************************************************/
uchar bdata DATA_BUF;
sbit        flag        =DATA_BUF^7;
sbit        flag1        =DATA_BUF^0;
/*******************************************************************************************/
sbit        TX_EN        =P1^0;
sbit        TRX_CE        =P3^1;
sbit        PWR_UP        =P1^1;
sbit        MISO        =P1^7;
sbit        MOSI        =P1^4;
sbit        SCK                =P1^6;
sbit        CSN                =P1^5;
sbit        AM                =P3^0;
sbit        DR                =P1^3;
sbit        CD                =P1^2;
/*******************************************************************************************/
void InitIO(void);                                // Initialize IO port
void Inituart(void);                        // initialize 232 uart
void Config905(void);                        // Config nRF905 module配置NRF905模式
void SetTxMode(void);                        // Set nRF905 in Tx mode
void SetRxMode(void);                        // Set nRF905 in Rx mode
void TxPacket(void);                        // Send data by nRF905
void RxPacket(void);                        // Recive data by nRF905
void SpiWrite(uchar);                        // Write data to nRF905
uchar SpiRead(void);                        // Read data to nRF905
void Delay(uchar n);                        // Delay 100us
void Scankey(void);                                // Scan key
void TxData (uchar x);                   

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top