发新帖本帖赏金 1.00元(功能说明)我要提问
返回列表
打印
[程序源码]

单片机开发10年,单片机例程从易到难连载分享

[复制链接]
楼主: 吴鉴鹰
手机看帖
扫描二维码
随时随地手机跟帖
61
吴鉴鹰 发表于 2015-4-7 14:24
第一讲:一个电子工程师当小心为重——吴鉴鹰最近因为意志蜘蛛引发的惨重后果
少了一个铁钉,丢了一只马掌 ...

向楼主学习

使用特权

评论回复
62
pass1876| | 2015-4-13 22:10 | 只看该作者
写的很好,支持下楼主

使用特权

评论回复
63
吴鉴鹰|  楼主 | 2015-4-14 11:20 | 只看该作者
pass1876 发表于 2015-4-13 22:10
写的很好,支持下楼主

谢谢支持,互相学习,共同进步。

使用特权

评论回复
64
吴鉴鹰|  楼主 | 2015-4-14 11:22 | 只看该作者
吴鉴鹰 发表于 2015-4-7 14:33
第二讲:【愚人节特别奉献】今天被自己愚弄了一把,一个粗心大意引发的BUG,细节决定成败

导读今天吴鉴鹰 ...

如果程序上万行,怎么看,这是程序量小,很容易看出来。;P

使用特权

评论回复
65
吴鉴鹰|  楼主 | 2015-4-14 16:43 | 只看该作者
本帖最后由 吴鉴鹰 于 2015-5-22 17:31 编辑

第四讲:基于单片机的Modbus通讯程序设计(一)


/******************************************************
** 作品:吴鉴鹰单片机项目之基于Modbus协议的通讯程序                                                                 
** 申明:转载请标明作品来源 知识产权归作者本人所有!
** 这一讲的主要内容: 吴鉴鹰单片机项目之基于Modbus协议的通讯程序        

** 备注:晶振11.0592M
** 功能描述:0X1-0X8与LED0-LED7对应,LED分别代表屏相应的位的状态,对应输出为P1口
             6X1-6X8最后写入对应的值可以在数码管上显示,例如:6X1写入100数码管显示100,
             往6X3里面写入200数码管显示200 ,数码管显示最后一次修改的寄存器的值。                                                                                          
** 作 者:   吴鉴鹰
** 日 期:   15.03.26
**作者所属单位:鉴鹰电子工作室
**交流QQ群: 第一群:  198387118  第二群:239316959
** 微信公众号:单片机精讲吴鉴鹰
**申明:转载请标明作品来源 知识产权归作者吴鉴鹰所有!

备注:有什么错误的地方,欢迎各大读者指正

O(∩_∩)O~
*******************************************************/

#include<reg52.h>                          // 包含52单片机头文件,此头文件中包含52单片机中的资源定义,包括IO口,寄存器等
#include<intrins.h>                                          //nop延时头文件,在延时函数中用到,调用一个_nop_()代表延时1us。

/* 宏定义无符号字符型、整形、长整形 */
#define uchar unsigned char                            //8位
#define ulint unsigned long                            //32位
#define uint unsigned int                            //16位

uchar idata Send_buf[30];                            //发送数据数组
uchar idata Receive_buf[30];                    //接收数据数组
uint  idata disp[8]={0,0,0,0,0,0,0,0};  //字接收显示数组,用于存储6x1-6x8的十六位接收数据
uchar Data_Count=0,time=0;                                //count为收到数据的次数,time应用于发送03代码时,中间的字数量是多少个数值
uchar Receive_Finish_Flag=0,flag_led=0;        //是否接收完成位,flag_led暂时不用
uint  address_num=0;                                    //接收到字的数值
uint  begin_address=0,address_leg=0;    //数值字开始位,数值字长度
uchar Pd_Flag_7,Pd_Flag_6,Pd_Flag_5,Pd_Flag_4,Pd_Flag_3,Pd_Flag_2,Pd_Flag_1,Pd_Flag_0;//用于判定发送的8个位,即0x1-0x8的位状态

//* LED亮灭情况表示相应的位状态,LED0-LED7分别对于0x1-0x8*//
sbit LED_OUT_0=P1^0;                                                  
sbit LED_OUT_1=P1^1;
sbit LED_OUT_2=P1^2;
sbit LED_OUT_3=P1^3;
sbit LED_OUT_4=P1^4;
sbit LED_OUT_5=P1^5;
sbit LED_OUT_6=P1^6;
sbit LED_OUT_7=P1^7;
sbit KEY_OUT_3=P3^2;
sbit KEY_OUT_4=P3^3;


/**************************数码管显示相关,DuanMa是显示0-9*****************************/
uchar code DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~9

/*****16位CRC检验表,低位在前,高位在后*******/

/*********CRC校验 高位表************/
uchar code auchCRCHi[] = {
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,
0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01,
0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81,
0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01,
0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,
0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01,
0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,
0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01,
0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,
0x40
} ;

/*********CRC校验 低位表************/
uchar code auchCRCLo[] = {
0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06, 0x07, 0xC7, 0x05, 0xC5, 0xC4,
0x04, 0xCC, 0x0C, 0x0D, 0xCD, 0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09,
0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A, 0x1E, 0xDE, 0xDF, 0x1F, 0xDD,
0x1D, 0x1C, 0xDC, 0x14, 0xD4, 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,
0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, 0xF2, 0x32, 0x36, 0xF6, 0xF7,
0x37, 0xF5, 0x35, 0x34, 0xF4, 0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A,
0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29, 0xEB, 0x2B, 0x2A, 0xEA, 0xEE,
0x2E, 0x2F, 0xEF, 0x2D, 0xED, 0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,
0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60, 0x61, 0xA1, 0x63, 0xA3, 0xA2,
0x62, 0x66, 0xA6, 0xA7, 0x67, 0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F,
0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68, 0x78, 0xB8, 0xB9, 0x79, 0xBB,
0x7B, 0x7A, 0xBA, 0xBE, 0x7E, 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,
0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, 0x70, 0xB0, 0x50, 0x90, 0x91,
0x51, 0x93, 0x53, 0x52, 0x92, 0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C,
0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B, 0x99, 0x59, 0x58, 0x98, 0x88,
0x48, 0x49, 0x89, 0x4B, 0x8B, 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,
0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42, 0x43, 0x83, 0x41, 0x81, 0x80,
0x40
} ;


/*****************************************************************************
** 函数名称: uint crc16(uchar *puchMsg,uchar usDataLen)         
** 功能描述:  16位CRC校验函数,查表法*
** 输 入:    uchar *puchMsg,uchar usDataLen
**            校验的数组首地址  校验的数据个数   
**        
** 输 出:
**         
** 全局变量:
** 调用模块:
**
** 作 者:    吴鉴鹰
** 日 期:     14.03.26
******************************************************************************/
uint crc16(uchar *puchMsg,uchar usDataLen)         
{                                                                                         
        uchar uchCRCHi = 0xFF ;                                 
        uchar uchCRCLo = 0xFF ;                                 
        uint uIndex ;                                                         
        while (usDataLen--)                                         
        {
                uIndex = uchCRCHi ^ *puchMsg++ ;         
                uchCRCHi = uchCRCLo ^ auchCRCHi[uIndex] ;
                uchCRCLo = auchCRCLo[uIndex] ;
        }
        return (((uint)(uchCRCLo) << 8) | uchCRCHi) ;
}

/*****************************************************************************
** 函数名称:  void delay_us(int n)        
** 功能描述:  延时子程序,延迟N us
** 输 入:    int n 延时的时间
**            
**        
** 输 出:
**         
** 全局变量:
** 调用模块:
**
** 作 者:    吴鉴鹰
** 日 期:     15.03.26
******************************************************************************/
/********延时子程序,延迟N us*************/
void delay_us(int n)
{
        int i;
        for(i=n;n>0;n--)
        _nop_();
}

/*****************************************************************************
** 函数名称:  void delay_ms(int n)
** 功能描述:  延时子程序,延迟N ms
** 输 入:    int n 延时的时间
**            
**        
** 输 出:
**         
** 全局变量:
** 调用模块:
**
** 作 者:    吴鉴鹰
** 日 期:     15.03.26
******************************************************************************/
void delay_ms(int n)
{
        int i,j;
        for(i=n;i>0;i--)
                for(j=141;j>0;j--);
}

/*****************************************************************************
** 函数名称:  void Led_Display_Fuc(uint Num)  
** 功能描述:  数码管显示函数,最多显示五位数,数值仅限于0-9,
              该函数根据实际情况选择使用
** 输 入:    uint Num  要显示的数字
**            
**        
** 输 出:
**         
** 全局变量:
** 调用模块:
**
** 作 者:    吴鉴鹰
** 日 期:     15.03.26
******************************************************************************/
void Led_Display_Fuc(uint Num)           
{
        uint i;
        for (i=0;i<5; i++)
        {
                P2 = 0;                       //清除显示,防止数字重影
                P0 = DuanMa[Num%10];           //显示最低一位数
                delay_us(10);
                P2 = 0x80>>i;                         //显示第一位数时点亮第一个数码管,第二位时点亮第二个数码管,以此类推。
                Num = Num/10;                         //将变量除以10处理将显示下一位数        
                   delay_ms(1);
        }
}



使用特权

评论回复
66
吴鉴鹰|  楼主 | 2015-4-14 16:44 | 只看该作者
第五讲:基于单片机的Modbus通讯程序设计(二)


/*****************************************************************************
** 函数名称: void init_uart(void)
** 功能描述: 串口初始化函数
** 输 入: int n 延时的时间
**
**
** 输 出:
**
** 全局变量:
** 调用模块:
** 备注:设定的参数为9600,N,8,1
串口模式为2,即8位数据位,停止位为1,无校验
** 作 者: 吴鉴鹰
** 日 期: 15.03.26
******************************************************************************/
void init_uart(void)
{
TH1 = 0xfa;
TL1 = 0xfa; // 波特率设为9600
TMOD = 0x21; // 使用T1定时器,模式2
PCON = PCON | 0x80; // 启用波特率加强位
SCON = 0x50; // 串口模式为2,即8位数据位,停止位为1,无校验
PS = 1; // 设定串口中断优先级为最高
TR1 = 1; // 开始定时
ES = 1;         // 打开串口中断
EA = 1; // 打开总中断
}

/*****************************************************************************
** 函数名称: void Send_Data_Fuc(uchar num)
** 功能描述: 发送函数
发送一个字符即一个字节
** 输 入: uchar num 发送的数据或者字符
**
**
** 输 出:
**
** 全局变量:
** 调用模块:
** 备注:设定的参数为9600,N,8,1
串口模式为2,即8位数据位,停止位为1,无校验
** 作 者: 吴鉴鹰
** 日 期: 15.03.26
******************************************************************************/
void Send_Data_Fuc(uchar num)
{
SBUF=num;         //把字符放到发送数据缓存区SBUF,num可以是字符也可以是一个字节数据
while(!TI);         //当发送完之后,TI自动置位,即TI=1,表示发送完成
TI = 0;         //当发送完之后TI不会自动置0,所以需手动将其置0,表示还没发送完数据
}


/*****************************************************************************
** 函数名称: void send_word(uchar *mydata,uchar num)
** 功能描述: 发送函数
发送字符串或者一连串的字节数据
** 输 入: uchar *mydata,uchar num
** mydata表示要发送的字符串数组,num表示数组长度
**
** 输 出:
**
** 全局变量:
** 调用模块:
** 备注:设定的参数为9600,N,8,1
串口模式为2,即8位数据位,停止位为1,无校验
** 作 者: 吴鉴鹰
** 日 期: 15.03.26
******************************************************************************/
void send_word(uchar *mydata,uchar num)
{
int i;
for(i=0;i<num;i++)
{
Send_Data_Fuc(*(mydata+i));
}
Data_Count = 0;
}

/*****************************************************************************
** 函数名称: void Com_Data_Receive() interrupt 4 using 1
** 功能描述: 中断接收函数
当数据接收完时,进入串口中断将接收的值放入数组
** 输 入:
**
** 输 出:
**
** 全局变量:
** 调用模块:
** 作 者: 吴鉴鹰
** 日 期: 15.03.26
******************************************************************************/
void Com_Data_Receive() interrupt 4 using 1
{
if(RI)         //当接收完一个字节的数据后,RI会自动置位,即RI=1
{
uchar a;
RI=0;         //接受中断标志软件清零
a=SBUF;         //把缓存在单片机的数据给a
Receive_buf[Data_Count]=a;        //将接受数据放入预置数组
Data_Count++;         //数组自动递增,用于存储下一个数据
if(Data_Count == 8)         //当接收完8个MODBUS的功能码之后,自动清0,从新接收(支持的01、05、03、06命令读取或者写入每次都发送8个字节)
{
Data_Count = 0;
Receive_Finish_Flag = 1;         //接受完8个MODBUS功能码的标志位
}
}
}

/*****************************************************************************
** 函数名称: void Com_Data_Mng(void)
** 功能描述: MODBUS功能码处理
能识别01,03,05,06功能码,可以实现一对多通讯
** 输 入:
**
** 输 出:
**
** 全局变量:
** 调用模块:
** 作 者: 吴鉴鹰
** 日 期: 15.03.26
******************************************************************************/
void Com_Data_Mng(void)
{
//uint begin_address=0,address_leg=0,crc_end;
uint crc_end,legg;         //CEC校验值和03功能码发送的位的长度
char hi_type,low_type;         //03、06功能码发送字节高低位
if(Receive_buf[0]== 0xa1) //判断机器号码
{
if(Receive_buf[1] == 0x01)         //01功能码
{
//begin_address=Receive_buf[2]<<8+Receive_buf[3];
//address_leg=Receive_buf[4]<<8+Receive_buf[5];
crc_end = crc16(Receive_buf,6);         //校验
if(crc_end == Receive_buf[6]<<8 | Receive_buf[7])//当校验通过时时
{
hi_type=0;         //高位状态
low_type=Pd_Flag_0 | Pd_Flag_1 | Pd_Flag_2 | Pd_Flag_3 | Pd_Flag_4 | Pd_Flag_5 | Pd_Flag_6 | Pd_Flag_7;         //低位状态
//low_type=~P0;
Send_buf[0] = Receive_buf[0];         //站号
Send_buf[1] = Receive_buf[1];         //功能码
Send_buf[2] = 0x02;         //字节数
Send_buf[3] = low_type;         //低位状态,即LED开关情况
Send_buf[4] = hi_type;         //高位状态
crc_end = crc16(Send_buf,5);         //校验
Send_buf[5] = crc_end%256;         //校验低位
Send_buf[6] = crc_end>>8;         //校验高位
send_word(Send_buf,7);         //发送返回屏
}
}
if(Receive_buf[1] == 0x05)         //05功能码
{
begin_address=Receive_buf[3];         //开始地址
crc_end=crc16(Receive_buf,6);         //校验
if(crc_end==Receive_buf[6]<<8|Receive_buf[7])         //校验正确时
{
if(Receive_buf[4]==0xff)         //当为强制打开时
{
switch(begin_address)         //对应的地址
{
case 0x00: LED_OUT_0 = 0; Pd_Flag_0 = 0x01; break;        //相应的LED点亮,记录下相应的P0位状态
case 0x01: LED_OUT_1 = 0; Pd_Flag_1 = 0x02; break;
case 0x02: LED_OUT_2 = 0; Pd_Flag_2 = 0x04; break;
case 0x03: LED_OUT_3 = 0; Pd_Flag_3 = 0x08; break;
case 0x04: LED_OUT_4 = 0; Pd_Flag_4 = 0x10; break;
case 0x05: LED_OUT_5 = 0; Pd_Flag_5 = 0x20; break;
case 0x06: LED_OUT_6 = 0; Pd_Flag_6 = 0x40; break;
case 0x07: LED_OUT_7 = 0; Pd_Flag_7 = 0x80; break;
}        
}
else         //当强制为OFF时
{
//flag_led=0;
switch(begin_address)
{
case 0x00: LED_OUT_0=1; Pd_Flag_0=0; break;         //相应的LED熄灭,记录下相应的P0位状态
case 0x01: LED_OUT_1=1; Pd_Flag_1=0; break;
case 0x02: LED_OUT_2=1; Pd_Flag_2=0; break;
case 0x03: LED_OUT_3=1; Pd_Flag_3=0; break;
case 0x04: LED_OUT_4=1; Pd_Flag_4=0; break;
case 0x05: LED_OUT_5=1; Pd_Flag_5=0; break;
case 0x06: LED_OUT_6=1; Pd_Flag_6=0; break;
case 0x07: LED_OUT_7=1; Pd_Flag_7=0; break;
}
}        
Send_buf[0]=Receive_buf[0];         //站号
Send_buf[1]=Receive_buf[1];         //功能码
Send_buf[2]=Receive_buf[2];         //起始高位
Send_buf[3]=Receive_buf[3];         //起始低位
Send_buf[4]=Receive_buf[4];         //返回状态
Send_buf[5]=Receive_buf[5];         //返回状态
crc_end=crc16(Send_buf,6);         //校验
Send_buf[6]=crc_end%256;         //校验低位
Send_buf[7]=crc_end>>8;         //校验高位
send_word(Send_buf,8);         //发送返回屏
}
}        
if(Receive_buf[1]==0x03)         //03功能码
{
crc_end=crc16(Receive_buf,6);         //校验
if(crc_end == Receive_buf[6]<<8|Receive_buf[7])        //校验一致
{
begin_address=Receive_buf[2]<<8|Receive_buf[3];
address_leg=Receive_buf[4]<<8 | Receive_buf[5];         //总寄存器长度
hi_type=0;
Send_buf[0]=Receive_buf[0];         //站号
Send_buf[1]=Receive_buf[1];         //功能码
legg=(uint)address_leg*2;         //字节数
Send_buf[2]=address_leg*2;;         //字节数
for(time=0;time<legg;time++)         //发送相应字节
{
if(!(time%2))         //字高位为0
Send_buf[time+3] = disp[time/2+begin_address]/256;         //字高字节
else
Send_buf[time+3] = disp[time/2+begin_address]%256;         //字低字节
}
crc_end=crc16(Send_buf,legg+3);         //校验
Send_buf[legg+3]=crc_end%256;         //校验低位
Send_buf[legg+4]=crc_end>>8;         //校验高位
send_word(Send_buf,legg+5);         //返回屏
}
}
if(Receive_buf[1]==0x06)         //06功能码
{
begin_address=Receive_buf[2]<<8|Receive_buf[3]; //写入地址
address_num=Receive_buf[4]<<8|Receive_buf[5];        //寄存器值
crc_end=crc16(Receive_buf,6);         //校验
if(crc_end==Receive_buf[6]<<8|Receive_buf[7])        //校验正确
{
disp[begin_address]=address_num;         //存入数组,给03功能码调用数值
Send_buf[0]=Receive_buf[0];         //站号
Send_buf[1]=Receive_buf[1];         //功能码
Send_buf[2]=Receive_buf[2];         //开始高位
Send_buf[3]=Receive_buf[3];         //开始低位
Send_buf[4]=Receive_buf[4];         //字高位
Send_buf[5]=Receive_buf[5];         //字低位
crc_end=crc16(Send_buf,6);         //校验
Send_buf[6]=crc_end%256;         //校验低位
Send_buf[7]=crc_end>>8;         //校验高位
send_word(Send_buf,8);         //返回屏

}
}
}
}

/*****************************************************************************
** 函数名称: void main(void)
** 功能描述: 主函数

** 输 入:
**
**
** 输 出:
**
** 全局变量:
** 调用模块:
** 作 者: 吴鉴鹰
** 日 期: 15.03.26
******************************************************************************/
void main(void)
{
init_uart();         //初始化串口
while(1)
{
Led_Display_Fuc(address_num);         //在开发板数码管上显示相应位的数值,发送或者接受数据会暂停显示(数码管闪烁)
//按钮输入
if(!KEY_OUT_3) //判断按钮是否按下
{
delay_ms(2);         //延时
while (!KEY_OUT_3);
//delay_ms(2);
LED_OUT_2=!LED_OUT_2;
if(LED_OUT_2)
{
Pd_Flag_2=0x0;
}
else
{
Pd_Flag_2=0x4;
}        
}
if(!KEY_OUT_4)
{
delay_ms(2);
while (!KEY_OUT_4);
//delay_ms(2);
LED_OUT_3=!LED_OUT_3;
if(LED_OUT_3)
{
Pd_Flag_3=0x0;
}
else
{
Pd_Flag_3=0x8;
}
}
while(Receive_Finish_Flag)         //当接收完成时
{
Com_Data_Mng();         //识别相应的功能码
Receive_Finish_Flag=0;         //重新接收        
}        
}        
}


使用特权

评论回复
67
xiamisz| | 2015-4-15 14:33 | 只看该作者
帖子真的很有用,学习了

使用特权

评论回复
68
solarddd| | 2015-4-15 15:34 | 只看该作者
学习了!!

使用特权

评论回复
69
nkzou| | 2015-4-15 16:38 | 只看该作者
谢谢分享,先收藏了!

使用特权

评论回复
70
supaopcb| | 2015-4-15 17:06 | 只看该作者
:)

使用特权

评论回复
71
吴鉴鹰|  楼主 | 2015-4-16 10:06 | 只看该作者
xiamisz 发表于 2015-4-15 14:33
帖子真的很有用,学习了

谢谢鼓励,我会一直分享下去的。

使用特权

评论回复
72
吴鉴鹰|  楼主 | 2015-4-17 08:48 | 只看该作者

使用特权

评论回复
73
supaopcb| | 2015-4-17 15:39 | 只看该作者
有客户介绍下  谢谢

使用特权

评论回复
74
吴鉴鹰|  楼主 | 2015-4-18 22:46 | 只看该作者
xiamisz 发表于 2015-4-15 14:33
帖子真的很有用,学习了

谢谢鼓励和支持,有一点点帮助我就心满意足了。

使用特权

评论回复
75
longxingshi| | 2015-4-19 17:01 | 只看该作者
言之有理

使用特权

评论回复
76
吴鉴鹰|  楼主 | 2015-4-19 20:10 | 只看该作者
supaopcb 发表于 2015-4-17 15:39
有客户介绍下  谢谢

大家共同进步,多多交流

使用特权

评论回复
77
吴鉴鹰|  楼主 | 2015-4-19 20:11 | 只看该作者

多多交流,互相探讨技术难题:handshake

使用特权

评论回复
78
Dongfangyuxiao| | 2015-4-19 22:57 | 只看该作者
高质量C++/C编程指南
文件标识:
当前版本:1.0
作    者:林锐 博士
文件状态  [  ] 草稿文件 [√] 正式文件 [  ] 更改正式文件  
完成日期: 2001年7月24日

使用特权

评论回复
79
吴鉴鹰|  楼主 | 2015-4-20 10:32 | 只看该作者
Dongfangyuxiao 发表于 2015-4-19 22:57
高质量C++/C编程指南
文件标识:
当前版本:1.0

这个格式蛮好的,你可以为大家分享一下。

使用特权

评论回复
80
吴鉴鹰|  楼主 | 2015-4-21 17:44 | 只看该作者

这个话有歧义:1、让我等着,让我好看  2、等着我的分享:lol

使用特权

评论回复
发新帖 本帖赏金 1.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则