代码来源见代码注释。

Table of Contents

实验1:点亮第一个LED

实验2:LED闪烁

实验3:LED流水灯

实验4:蜂鸣器

实验5:静态数码管显示

实验6:动态数码管显示

实验7:独立按键

实验8:矩阵按键

实验9:8X8LED点阵(点亮一个点)

实验10:8X8LED点阵(显示数字)

实验11:外部中断0

实验12:外部中断1

实验13:定时器0中断

实验14:定时器1中断

实验15:串口通信

实验16:EEPROM-IIC

main.c

i2c.h

i2c.c

实验17:DS18B20温度传感器

main.c

temp.h

temp.c

实验18:DS1302时钟

main.c

ds1302.h

ds1302.c

实验19:红外通信

实验20:AD模数转换

光敏电阻AD值

main.c

XPT2046.h

XPT2046.c

外部输入AD值

main.c

XPT2046.h

XPT2046.c

热敏电阻AD值

main.c

XPT2046.h

XPT2046.c

电位器AD值

main.c

XPT2046.h

XPT2046.c

实验21:DA数模转换

实验22:LCD1602液晶

main.c

lcd.h

lcd.c


实验1:点亮第一个LED

/**************************************************************************************
*                     点亮第一个LED实验                                                  *
实现现象:下载程序后D1指示灯点亮
注意事项:无
***************************************************************************************/#include "reg52.h"    //此文件中定义了单片机的一些特殊功能寄存器sbit led=P2^0;      //将单片机的P2.0端口定义为led/*******************************************************************************
* 函 数 名       : main
* 函数功能       : 主函数
* 输    入       : 无
* 输    出         : 无
*******************************************************************************/
void main()
{while(1){led=0;   //P2.0端口设置为低电平}
}

实验2:LED闪烁

/**************************************************************************************
*                     LED闪烁实验                                                 *
实现现象:下载程序后D1指示灯闪烁
注意事项:无
***************************************************************************************/#include "reg52.h"             //此文件中定义了单片机的一些特殊功能寄存器
typedef unsigned int u16;     //对数据类型进行声明定义
typedef unsigned char u8;sbit led=P2^0;         //将单片机的P2.0端口定义为led/*******************************************************************************
* 函 数 名         : delay
* 函数功能         : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(u16 i)
{while(i--);
}/*******************************************************************************
* 函 数 名       : main
* 函数功能       : 主函数
* 输    入       : 无
* 输    出         : 无
*******************************************************************************/
void main()
{while(1){led=0;delay(50000); //大约延时450msled=1;delay(50000); //大约延时450ms  }
}

实验3:LED流水灯

/**************************************************************************************
*                     LED流水灯实验                                                *
实现现象:下载程序后LED呈现流水灯效果进行左移右移滚动
注意事项:无
***************************************************************************************/#include "reg52.h"             //此文件中定义了单片机的一些特殊功能寄存器
#include<intrins.h>       //因为要用到左右移函数,所以加入这个头文件typedef unsigned int u16;    //对数据类型进行声明定义
typedef unsigned char u8;#define led P2    //将P2口定义为led 后面就可以使用led代替P2口/*******************************************************************************
* 函 数 名         : delay
* 函数功能         : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(u16 i)
{while(i--);
}/*******************************************************************************
* 函 数 名       : main
* 函数功能       : 主函数
* 输    入       : 无
* 输    出         : 无
*******************************************************************************/
void main()
{u8 i;led=0xfe;delay(50000); //大约延时450ms   while(1){
/*      for(i=0;i<8;i++){P2=~(0x01<<i);     //将1右移i位,然后将结果取反赋值到P2口delay(50000); //大约延时450ms}
*/      for(i=0;i<7;i++)   //将led左移一位{led=_crol_(led,1);delay(50000); //大约延时450ms    }for(i=0;i<7;i++) //将led右移一位{led=_cror_(led,1);delay(50000); //大约延时450ms }   }
}

实验4:蜂鸣器

/**************************************************************************************
*                     蜂鸣器实验                                               *
实现现象:下载程序后蜂鸣器发声
注意事项:无
***************************************************************************************/#include "reg52.h"             //此文件中定义了单片机的一些特殊功能寄存器
#include<intrins.h>       //因为要用到左右移函数,所以加入这个头文件typedef unsigned int u16;    //对数据类型进行声明定义
typedef unsigned char u8;sbit beep=P1^5;      /*******************************************************************************
* 函 数 名         : delay
* 函数功能         : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(u16 i)
{while(i--);
}/*******************************************************************************
* 函 数 名       : main
* 函数功能       : 主函数
* 输    入       : 无
* 输    出         : 无
*******************************************************************************/
void main()
{   while(1){   beep=~beep;delay(10); //延时大约100us   通过修改此延时时间达到不同的发声效果 }
}

实验5:静态数码管显示

/**************************************************************************************
*                     静态数码管显示实验                                               *
实现现象:下载程序后数码管静态显示0。
注意事项:如果不想让点阵模块显示,可以将74HC595模块上的JP595短接片拔掉。
***************************************************************************************/#include "reg52.h"             //此文件中定义了单片机的一些特殊功能寄存器typedef unsigned int u16;      //对数据类型进行声明定义
typedef unsigned char u8;sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值/*******************************************************************************
* 函 数 名       : main
* 函数功能       : 主函数
* 输    入       : 无
* 输    出         : 无
*******************************************************************************/
void main()
{   LSA=0;LSB=0;LSC=0;   //控制38译码器的Y0输出低电平P0=smgduan[0];while(1);
}

实验6:动态数码管显示

/**************************************************************************************
*                     动态数码管显示实验                                               *
实现现象:下载程序后数码管从右至左显示0-7。
注意事项:如果不想让点阵模块显示,可以将74HC595模块上的JP595短接片拔掉。
***************************************************************************************/#include "reg52.h"             //此文件中定义了单片机的一些特殊功能寄存器typedef unsigned int u16;      //对数据类型进行声明定义
typedef unsigned char u8;sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值/*******************************************************************************
* 函 数 名         : delay
* 函数功能         : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(u16 i)
{while(i--);
}/*******************************************************************************
* 函 数 名         : DigDisplay
* 函数功能         : 数码管动态扫描函数,循环扫描8个数码管显示
*******************************************************************************/
void DigDisplay()
{u8 i;for(i=0;i<8;i++){switch(i)   //位选,选择点亮的数码管,{case(0):LSA=0;LSB=0;LSC=0; break;//显示第0位case(1):LSA=1;LSB=0;LSC=0; break;//显示第1位case(2):LSA=0;LSB=1;LSC=0; break;//显示第2位case(3):LSA=1;LSB=1;LSC=0; break;//显示第3位case(4):LSA=0;LSB=0;LSC=1; break;//显示第4位case(5):LSA=1;LSB=0;LSC=1; break;//显示第5位case(6):LSA=0;LSB=1;LSC=1; break;//显示第6位case(7):LSA=1;LSB=1;LSC=1; break;//显示第7位  }P0=smgduan[i];//发送段码delay(100); //间隔一段时间扫描    P0=0x00;//消隐}
}/*******************************************************************************
* 函 数 名       : main
* 函数功能       : 主函数
* 输    入       : 无
* 输    出         : 无
*******************************************************************************/
void main()
{   while(1){   DigDisplay();  //数码管显示函数    }
}

实验7:独立按键

/**************************************************************************************
*                     独立按键实验                                                  *
实现现象:下载程序后按下K1按键可以对D1小灯状态取反。
注意事项:无
***************************************************************************************/#include "reg52.h"             //此文件中定义了单片机的一些特殊功能寄存器typedef unsigned int u16;      //对数据类型进行声明定义
typedef unsigned char u8;sbit k1=P3^1;  //定义P31口是k1
sbit led=P2^0;  //定义P20口是led/*******************************************************************************
* 函 数 名         : delay
* 函数功能         : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(u16 i)
{while(i--);
}/*******************************************************************************
* 函 数 名         : keypros
* 函数功能         : 按键处理函数,判断按键K1是否按下
*******************************************************************************/
void keypros()
{if(k1==0)          //检测按键K1是否按下{ delay(1000);   //消除抖动 一般大约10msif(k1==0)    //再次判断按键是否按下{led=~led;      //led状态取反}while(!k1);  //检测按键是否松开}
}/*******************************************************************************
* 函 数 名       : main
* 函数功能       : 主函数
* 输    入       : 无
* 输    出         : 无
*******************************************************************************/
void main()
{   while(1){   keypros();  //按键处理函数    }
}

实验8:矩阵按键

/**************************************************************************************
*                     矩阵按键实验                                                  *
实现现象:下载程序后数码管显示0,按下矩阵按键上的按键显示对应的数字S1-S4:0-3S5-S8:4-7S9-S12:8-BS13-S16:C-F。
注意事项:如果不想让点阵模块显示,可以将74HC595模块上的JP595短接片拔掉。
***************************************************************************************/#include "reg52.h"             //此文件中定义了单片机的一些特殊功能寄存器typedef unsigned int u16;      //对数据类型进行声明定义
typedef unsigned char u8;#define GPIO_DIG P0
#define GPIO_KEY P1sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;u8 KeyValue; //用来存放读取到的键值u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值/*******************************************************************************
* 函 数 名         : delay
* 函数功能         : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(u16 i)
{while(i--);
}/*******************************************************************************
* 函 数 名         : KeyDown
* 函数功能         : 检测有按键按下并读取键值
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void KeyDown(void)
{char a=0;GPIO_KEY=0x0f;if(GPIO_KEY!=0x0f)//读取按键是否按下{delay(1000);//延时10ms进行消抖if(GPIO_KEY!=0x0f)//再次检测键盘是否按下{    //测试列GPIO_KEY=0X0F;switch(GPIO_KEY){case(0X07):    KeyValue=0;break;case(0X0b):   KeyValue=1;break;case(0X0d): KeyValue=2;break;case(0X0e): KeyValue=3;break;}//测试行GPIO_KEY=0XF0;switch(GPIO_KEY){case(0X70): KeyValue=KeyValue;break;case(0Xb0):    KeyValue=KeyValue+4;break;case(0Xd0): KeyValue=KeyValue+8;break;case(0Xe0): KeyValue=KeyValue+12;break;}while((a<50)&&(GPIO_KEY!=0xf0))    //检测按键松手检测{delay(1000);a++;}}}
}/*******************************************************************************
* 函 数 名       : main
* 函数功能       : 主函数
* 输    入       : 无
* 输    出         : 无
*******************************************************************************/
void main()
{   LSA=0; //给一个数码管提供位选LSB=0;LSC=0;while(1){ KeyDown();         //按键判断函数GPIO_DIG=smgduan[KeyValue];   //}
}

实验9:8X8LED点阵(点亮一个点)

/*********************************************
**                   普中科技               **
**                   点阵实验               **
** 说明:P0控制行,输出低电平有效;           **
**       595输出控制列,输出高点平有效。   **
*********************************************/#include"reg51.h"
#include<intrins.h>sbit SRCLK=P3^6;
sbit RCLK=P3^5;
sbit SER=P3^4;/*******************************************************************************
* 函数名         : Hc595SendByte(unsigned char dat)
* 函数功能         : 想74H595发送一个字节的数据
* 输入           : 无
* 输出             : 无
*******************************************************************************/
void Hc595SendByte(unsigned char dat)
{unsigned char a;SRCLK=0;RCLK=0;for(a=0;a<8;a++){SER=dat>>7;dat<<=1;SRCLK=1;_nop_();_nop_();SRCLK=0;    }RCLK=1;_nop_();_nop_();RCLK=0;
}void main(void)
{   Hc595SendByte(0x00);while(1){       P0=0x7F;Hc595SendByte(0x80);       }
}

实验10:8X8LED点阵(显示数字)

/**************************************************************************************
*                     8*8LED点阵———显示数字实验                                               *
实现现象:下载程序后点阵上显示数字0注意事项:一定要将JOE短接片短接到GND端,如果不需要595后面的小灯点亮可以拔掉JP595短接片。
***************************************************************************************/#include "reg51.h"             //此文件中定义了单片机的一些特殊功能寄存器
#include<intrins.h>typedef unsigned int u16;    //对数据类型进行声明定义
typedef unsigned char u8;sbit SRCLK=P3^6;
sbit RCLK=P3^5;
sbit SER=P3^4;u8 ledduan[]={0x00,0x00,0x3e,0x41,0x41,0x41,0x3e,0x00};
u8 ledwei[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
/*******************************************************************************
* 函 数 名         : delay
* 函数功能         : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(u16 i)
{while(i--);
}/*******************************************************************************
* 函数名         : Hc595SendByte(u8 dat)
* 函数功能         : 向74HC595发送一个字节的数据
* 输入           : 无
* 输出             : 无
*******************************************************************************/
void Hc595SendByte(u8 dat)
{u8 a;SRCLK=0;RCLK=0;for(a=0;a<8;a++){SER=dat>>7;dat<<=1;SRCLK=1;_nop_();_nop_();SRCLK=0;   }RCLK=1;_nop_();_nop_();RCLK=0;
}/*******************************************************************************
* 函 数 名       : main
* 函数功能       : 主函数
* 输    入       : 无
* 输    出         : 无
*******************************************************************************/
void main()
{           u8 i;while(1){P0=0x7f;for(i=0;i<8;i++){P0=ledwei[i];          //位选Hc595SendByte(ledduan[i]);    //发送段选数据delay(100);        //延时Hc595SendByte(0x00);  //消隐}  }
}

实验11:外部中断0

/**************************************************************************************
*                     外部中断0实验                                                 *
实现现象:下载程序后按下K3按键可以对D1小灯状态取反。
注意事项:无。
***************************************************************************************/#include "reg52.h"             //此文件中定义了单片机的一些特殊功能寄存器typedef unsigned int u16;      //对数据类型进行声明定义
typedef unsigned char u8;sbit k3=P3^2;  //定义按键K3
sbit led=P2^0;  //定义P20口是led/*******************************************************************************
* 函 数 名         : delay
* 函数功能         : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(u16 i)
{while(i--);
}/*******************************************************************************
* 函 数 名         : Int1Init()
* 函数功能         : 设置外部中断1
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void Int0Init()
{//设置INT0IT0=1;//跳变沿出发方式(下降沿)EX0=1;//打开INT0的中断允许。   EA=1;//打开总中断
}/*******************************************************************************
* 函 数 名       : main
* 函数功能       : 主函数
* 输    入       : 无
* 输    出         : 无
*******************************************************************************/
void main()
{   Int0Init();  // 设置外部中断0while(1);
}/*******************************************************************************
* 函 数 名         : Int0()    interrupt 0
* 函数功能         : 外部中断0的中断函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/void Int0() interrupt 0     //外部中断0的中断函数
{delay(1000);    //延时消抖if(k3==0){led=~led;}
}

实验12:外部中断1

/**************************************************************************************
*                     外部中断1实验                                                 *
实现现象:下载程序后按下K4按键可以对D1小灯状态取反。
注意事项:无。
***************************************************************************************/#include "reg52.h"             //此文件中定义了单片机的一些特殊功能寄存器typedef unsigned int u16;      //对数据类型进行声明定义
typedef unsigned char u8;sbit k4=P3^3;  //定义按键K4
sbit led=P2^0;  //定义P20口是led/*******************************************************************************
* 函 数 名         : delay
* 函数功能         : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(u16 i)
{while(i--);
}/*******************************************************************************
* 函 数 名         : Int1Init()
* 函数功能         : 设置外部中断1
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void Int1Init()
{//设置INT1IT1=1;//跳变沿出发方式(下降沿)EX1=1;//打开INT1的中断允许。   EA=1;//打开总中断
}/*******************************************************************************
* 函 数 名       : main
* 函数功能       : 主函数
* 输    入       : 无
* 输    出         : 无
*******************************************************************************/
void main()
{   Int1Init();  // 设置外部中断1while(1);
}/*******************************************************************************
* 函 数 名         : Int1()    interrupt 2
* 函数功能         : 外部中断0的中断函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/void Int1() interrupt 2     //外部中断1的中断函数
{delay(1000);    //延时消抖if(k4==0){led=~led;}
}

实验13:定时器0中断

/**************************************************************************************
*                     定时器0实验                                                  *
实现现象:下载程序后D1小灯循环点亮1秒,熄灭1秒。使用单片机内部定时器可以实现准确延时。
注意事项:无。
***************************************************************************************/#include "reg52.h"             //此文件中定义了单片机的一些特殊功能寄存器typedef unsigned int u16;      //对数据类型进行声明定义
typedef unsigned char u8;sbit led=P2^0;     //定义P20口是led/*******************************************************************************
* 函 数 名         : Timer0Init
* 函数功能         : 定时器0初始化
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void Timer0Init()
{TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。TH0=0XFC;   //给定时器赋初值,定时1msTL0=0X18;    ET0=1;//打开定时器0中断允许EA=1;//打开总中断TR0=1;//打开定时器
}/*******************************************************************************
* 函 数 名       : main
* 函数功能       : 主函数
* 输    入       : 无
* 输    出         : 无
*******************************************************************************/
void main()
{   Timer0Init();  //定时器0初始化while(1);
}/*******************************************************************************
* 函 数 名         : void Timer0() interrupt 1
* 函数功能         : 定时器0中断函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void Timer0() interrupt 1
{static u16 i;TH0=0XFC;    //给定时器赋初值,定时1msTL0=0X18;i++;if(i==1000){i=0;led=~led; }
}

实验14:定时器1中断

/**************************************************************************************
*                     定时器1实验                                                  *
实现现象:下载程序后数码管最后一位间隔一秒循环显示0-F。使用单片机内部定时器可以实现准确延时。
注意事项:如果不想让点阵模块显示,可以将74HC595模块上的JP595短接片拔掉。
***************************************************************************************/#include "reg52.h"             //此文件中定义了单片机的一些特殊功能寄存器typedef unsigned int u16;      //对数据类型进行声明定义
typedef unsigned char u8;sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值
u8 n=0;
/*******************************************************************************
* 函 数 名         : Timer1Init
* 函数功能         : 定时器1初始化
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void Timer1Init()
{TMOD|=0X10;//选择为定时器1模式,工作方式1,仅用TR1打开启动。TH1=0XFC;   //给定时器赋初值,定时1msTL1=0X18;    ET1=1;//打开定时器1中断允许EA=1;//打开总中断TR1=1;//打开定时器
}/*******************************************************************************
* 函 数 名       : main
* 函数功能       : 主函数
* 输    入       : 无
* 输    出         : 无
*******************************************************************************/
void main()
{   LSA=0;LSB=0;LSC=0;Timer1Init();  //定时器1初始化while(1);
}/*******************************************************************************
* 函 数 名         : void Timer1() interrupt 3
* 函数功能         : 定时器0中断函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void Timer1() interrupt 3
{static u16 i;TH1=0XFC;    //给定时器赋初值,定时1msTL1=0X18;i++;if(i==1000){i=0;P0=smgduan[n++];if(n==16)n=0;    }
}

实验15:串口通信

/**************************************************************************************
*                     串口通信实验                                                  *
实现现象:下载程序后打开串口调试助手,将波特率设置为4800,选择发送的数据就可以显示在串口助手上。
注意事项:无。
***************************************************************************************/#include "reg52.h"             //此文件中定义了单片机的一些特殊功能寄存器typedef unsigned int u16;      //对数据类型进行声明定义
typedef unsigned char u8;/*******************************************************************************
* 函数名         :UsartInit()
* 函数功能         :设置串口
* 输入           : 无
* 输出             : 无
*******************************************************************************/
void UsartInit()
{SCON=0X50;            //设置为工作方式1TMOD=0X20;           //设置计数器工作方式2PCON=0X80;         //波特率加倍TH1=0XF3;               //计数器初始值设置,注意波特率是4800的TL1=0XF3;ES=1;                       //打开接收中断EA=1;                      //打开总中断TR1=1;                  //打开计数器
}/*******************************************************************************
* 函 数 名       : main
* 函数功能       : 主函数
* 输    入       : 无
* 输    出         : 无
*******************************************************************************/
void main()
{   UsartInit();  //    串口初始化while(1);
}/*******************************************************************************
* 函数名         : Usart() interrupt 4
* 函数功能        : 串口通信中断函数
* 输入           : 无
* 输出             : 无
*******************************************************************************/
void Usart() interrupt 4
{u8 receiveData;receiveData=SBUF;//出去接收到的数据RI = 0;//清除接收中断标志位SBUF=receiveData;//将接收到的数据放入到发送寄存器while(!TI);            //等待发送数据完成TI=0;                        //清除发送完成标志位
}

实验16:EEPROM-IIC

main.c

/**************************************************************************************
*                     EEPROM-IIC实验                                                *
实现现象:下载程序后数码管后4位显示0,按K1保存显示的数据,按K2读取上次保存的数据,按K3显示数据加一,按K4显示数据清零。最大能写入的数据是255.
注意事项:由于P3.2口跟红外线共用,所以做按键实验时为了不让红外线影响实验效果,最好把红外线先取下来。
***************************************************************************************/#include "reg52.h"             //此文件中定义了单片机的一些特殊功能寄存器
#include "i2c.h"  typedef unsigned int u16;     //对数据类型进行声明定义
typedef unsigned char u8;sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;sbit k1=P3^1;
sbit k2=P3^0;
sbit k3=P3^2;
sbit k4=P3^3;   //定义按键端口char num=0;
u8 disp[4];
u8 code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};/*******************************************************************************
* 函 数 名         : delay
* 函数功能         : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(u16 i)
{while(i--);
}/*******************************************************************************
* 函数名         :Keypros()
* 函数功能       :按键处理函数
* 输入           : 无
* 输出             : 无
*******************************************************************************/
void Keypros()
{if(k1==0){delay(1000);  //消抖处理if(k1==0){At24c02Write(1,num);   //在地址1内写入数据num}while(!k1);}if(k2==0){delay(1000);  //消抖处理if(k2==0){num=At24c02Read(1);   //读取EEPROM地址1内的数据保存在num中}while(!k2);}if(k3==0){delay(100);  //消抖处理if(k3==0){num++;     //数据加1if(num>255)num=0;}while(!k3);}if(k4==0){delay(1000);  //消抖处理if(k4==0){num=0;       //数据清零}while(!k4);}
}/*******************************************************************************
* 函数名         :datapros()
* 函数功能       :数据处理函数
* 输入           : 无
* 输出             : 无
*******************************************************************************/
void datapros()
{disp[0]=smgduan[num/1000];//千位disp[1]=smgduan[num%1000/100];//百位disp[2]=smgduan[num%1000%100/10];//个位disp[3]=smgduan[num%1000%100%10];
}/*******************************************************************************
* 函数名         :DigDisplay()
* 函数功能       :数码管显示函数
* 输入           : 无
* 输出             : 无
*******************************************************************************/
void DigDisplay()
{u8 i;for(i=0;i<4;i++){switch(i)   //位选,选择点亮的数码管,{case(0):LSA=0;LSB=0;LSC=0; break;//显示第0位case(1):LSA=1;LSB=0;LSC=0; break;//显示第1位case(2):LSA=0;LSB=1;LSC=0; break;//显示第2位case(3):LSA=1;LSB=1;LSC=0; break;//显示第3位  }P0=disp[3-i];//发送数据delay(100); //间隔一段时间扫描 P0=0x00;//消隐}
}/*******************************************************************************
* 函 数 名       : main
* 函数功能       : 主函数
* 输    入       : 无
* 输    出         : 无
*******************************************************************************/
void main()
{   while(1){Keypros();  //按键处理函数datapros();     //数据处理函数DigDisplay();//数码管显示函数     }
}

i2c.h

#ifndef __I2C_H_
#define __I2C_H_#include <reg52.h>sbit SCL=P2^1;
sbit SDA=P2^0;void I2cStart();
void I2cStop();
unsigned char I2cSendByte(unsigned char dat);
unsigned char I2cReadByte();
void At24c02Write(unsigned char addr,unsigned char dat);
unsigned char At24c02Read(unsigned char addr);#endif

i2c.c

#include"i2c.h"/*******************************************************************************
* 函数名         : Delay10us()
* 函数功能         : 延时10us
* 输入           : 无
* 输出             : 无
*******************************************************************************/void Delay10us()
{unsigned char a,b;for(b=1;b>0;b--)for(a=2;a>0;a--);}
/*******************************************************************************
* 函数名         : I2cStart()
* 函数功能       : 起始信号:在SCL时钟信号在高电平期间SDA信号产生一个下降沿
* 输入           : 无
* 输出             : 无
* 备注           : 起始之后SDA和SCL都为0
*******************************************************************************/void I2cStart()
{SDA=1;Delay10us();SCL=1;Delay10us();//建立时间是SDA保持时间>4.7usSDA=0;Delay10us();//保持时间是>4usSCL=0;          Delay10us();
}
/*******************************************************************************
* 函数名         : I2cStop()
* 函数功能       : 终止信号:在SCL时钟信号高电平期间SDA信号产生一个上升沿
* 输入           : 无
* 输出             : 无
* 备注           : 结束之后保持SDA和SCL都为1;表示总线空闲
*******************************************************************************/void I2cStop()
{SDA=0;Delay10us();SCL=1;Delay10us();//建立时间大于4.7usSDA=1;Delay10us();
}
/*******************************************************************************
* 函数名         : I2cSendByte(unsigned char dat)
* 函数功能       : 通过I2C发送一个字节。在SCL时钟信号高电平期间,保持发送信号SDA保持稳定
* 输入           : num
* 输出             : 0或1。发送成功返回1,发送失败返回0
* 备注           : 发送完一个字节SCL=0,SDA=1
*******************************************************************************/unsigned char I2cSendByte(unsigned char dat)
{unsigned char a=0,b=0;//最大255,一个机器周期为1us,最大延时255us。        for(a=0;a<8;a++)//要发送8位,从最高位开始{SDA=dat>>7;   //起始信号之后SCL=0,所以可以直接改变SDA信号dat=dat<<1;Delay10us();SCL=1;Delay10us();//建立时间>4.7usSCL=0;Delay10us();//时间大于4us        }SDA=1;Delay10us();SCL=1;while(SDA)//等待应答,也就是等待从设备把SDA拉低{b++;if(b>200)     //如果超过2000us没有应答发送失败,或者为非应答,表示接收结束{SCL=0;Delay10us();return 0;}}SCL=0;Delay10us();return 1;
}
/*******************************************************************************
* 函数名         : I2cReadByte()
* 函数功能         : 使用I2c读取一个字节
* 输入           : 无
* 输出             : dat
* 备注           : 接收完一个字节SCL=0,SDA=1.
*******************************************************************************/unsigned char I2cReadByte()
{unsigned char a=0,dat=0;SDA=1;          //起始和发送一个字节之后SCL都是0Delay10us();for(a=0;a<8;a++)//接收8个字节{SCL=1;Delay10us();dat<<=1;dat|=SDA;Delay10us();SCL=0;Delay10us();}return dat;
}/*******************************************************************************
* 函数名         : void At24c02Write(unsigned char addr,unsigned char dat)
* 函数功能         : 往24c02的一个地址写入一个数据
* 输入           : 无
* 输出             : 无
*******************************************************************************/void At24c02Write(unsigned char addr,unsigned char dat)
{I2cStart();I2cSendByte(0xa0);//发送写器件地址I2cSendByte(addr);//发送要写入内存地址I2cSendByte(dat);   //发送数据I2cStop();
}
/*******************************************************************************
* 函数名         : unsigned char At24c02Read(unsigned char addr)
* 函数功能         : 读取24c02的一个地址的一个数据
* 输入           : 无
* 输出             : 无
*******************************************************************************/unsigned char At24c02Read(unsigned char addr)
{unsigned char num;I2cStart();I2cSendByte(0xa0); //发送写器件地址I2cSendByte(addr); //发送要读取的地址I2cStart();I2cSendByte(0xa1); //发送读器件地址num=I2cReadByte(); //读取数据I2cStop();return num;
}

实验17:DS18B20温度传感器

main.c

/**************************************************************************************
*                     DS18B20温度传感器实验                                                  *
实现现象:下载程序后,在温度传感器接口处,按照丝印方向插好温度传感器,数码管就会显示检测的温度值,
注意事项:
***************************************************************************************/#include "reg52.h"             //此文件中定义了单片机的一些特殊功能寄存器
#include"temp.h"  typedef unsigned int u16;     //对数据类型进行声明定义
typedef unsigned char u8;sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;char num=0;
u8 DisplayData[8];
u8 code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};/*******************************************************************************
* 函 数 名         : delay
* 函数功能         : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(u16 i)
{while(i--);
}/*******************************************************************************
* 函 数 名         : datapros()
* 函数功能         : 温度读取处理转换函数
* 输    入         : temp
* 输    出         : 无
*******************************************************************************/void datapros(int temp)
{float tp;  if(temp< 0)              //当温度值为负数{DisplayData[0] = 0x40;     //   -//因为读取的温度是实际温度的补码,所以减1,再取反求出原码temp=temp-1;temp=~temp;tp=temp;temp=tp*0.0625*100+0.5; //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点//后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就//算加上0.5,还是在小数点后面。}else{         DisplayData[0] = 0x00;tp=temp;//因为数据处理有小数点所以将温度赋给一个浮点型变量//如果温度是正的那么,那么正数的原码就是补码它本身temp=tp*0.0625*100+0.5;    //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点//后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就//算加上0.5,还是在小数点后面。}DisplayData[1] = smgduan[temp / 10000];DisplayData[2] = smgduan[temp % 10000 / 1000];DisplayData[3] = smgduan[temp % 1000 / 100] | 0x80;DisplayData[4] = smgduan[temp % 100 / 10];DisplayData[5] = smgduan[temp % 10];
}/*******************************************************************************
* 函数名         :DigDisplay()
* 函数功能       :数码管显示函数
* 输入           : 无
* 输出             : 无
*******************************************************************************/
void DigDisplay()
{u8 i;for(i=0;i<6;i++){switch(i)   //位选,选择点亮的数码管,{case(0):LSA=0;LSB=0;LSC=0; break;//显示第0位case(1):LSA=1;LSB=0;LSC=0; break;//显示第1位case(2):LSA=0;LSB=1;LSC=0; break;//显示第2位case(3):LSA=1;LSB=1;LSC=0; break;//显示第3位case(4):LSA=0;LSB=0;LSC=1; break;//显示第4位case(5):LSA=1;LSB=0;LSC=1; break;//显示第5位    }P0=DisplayData[5-i];//发送数据delay(100); //间隔一段时间扫描  P0=0x00;//消隐}
}/*******************************************************************************
* 函 数 名       : main
* 函数功能       : 主函数
* 输    入       : 无
* 输    出         : 无
*******************************************************************************/
void main()
{   while(1){datapros(Ds18b20ReadTemp());    //数据处理函数DigDisplay();//数码管显示函数     }
}

temp.h

#ifndef __TEMP_H_
#define __TEMP_H_#include<reg52.h>
//---重定义关键词---//
#ifndef uchar
#define uchar unsigned char
#endif#ifndef uint
#define uint unsigned int
#endif//--定义使用的IO口--//
sbit DSPORT=P3^7;//--声明全局函数--//
void Delay1ms(uint );
uchar Ds18b20Init();
void Ds18b20WriteByte(uchar com);
uchar Ds18b20ReadByte();
void  Ds18b20ChangTemp();
void  Ds18b20ReadTempCom();
int Ds18b20ReadTemp();#endif

temp.c

#include"temp.h"
/*******************************************************************************
* 函 数 名         : Delay1ms
* 函数功能         : 延时函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/void Delay1ms(uint y)
{uint x;for( ; y>0; y--){for(x=110; x>0; x--);}
}
/*******************************************************************************
* 函 数 名         : Ds18b20Init
* 函数功能         : 初始化
* 输    入         : 无
* 输    出         : 初始化成功返回1,失败返回0
*******************************************************************************/uchar Ds18b20Init()
{uchar i;DSPORT = 0;            //将总线拉低480us~960usi = 70; while(i--);//延时642usDSPORT = 1;            //然后拉高总线,如果DS18B20做出反应会将在15us~60us后总线拉低i = 0;while(DSPORT)  //等待DS18B20拉低总线{Delay1ms(1);i++;if(i>5)//等待>5MS{return 0;//初始化失败}}return 1;//初始化成功
}/*******************************************************************************
* 函 数 名         : Ds18b20WriteByte
* 函数功能         : 向18B20写入一个字节
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/void Ds18b20WriteByte(uchar dat)
{uint i, j;for(j=0; j<8; j++){DSPORT = 0;              //每写入一位数据之前先把总线拉低1usi++;DSPORT = dat & 0x01;  //然后写入一个数据,从最低位开始i=6;while(i--); //延时68us,持续时间最少60usDSPORT = 1;  //然后释放总线,至少1us给总线恢复时间才能接着写入第二个数值dat >>= 1;}
}
/*******************************************************************************
* 函 数 名         : Ds18b20ReadByte
* 函数功能         : 读取一个字节
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/uchar Ds18b20ReadByte()
{uchar byte, bi;uint i, j;  for(j=8; j>0; j--){DSPORT = 0;//先将总线拉低1usi++;DSPORT = 1;//然后释放总线i++;i++;//延时6us等待数据稳定bi = DSPORT;   //读取数据,从最低位开始读取/*将byte左移一位,然后与上右移7位后的bi,注意移动之后移掉那位补0。*/byte = (byte >> 1) | (bi << 7);                         i = 4;       //读取完之后等待48us再接着读取下一个数while(i--);}              return byte;
}
/*******************************************************************************
* 函 数 名         : Ds18b20ChangTemp
* 函数功能         : 让18b20开始转换温度
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/void  Ds18b20ChangTemp()
{Ds18b20Init();Delay1ms(1);Ds18b20WriteByte(0xcc);      //跳过ROM操作命令      Ds18b20WriteByte(0x44);        //温度转换命令//Delay1ms(100);    //等待转换成功,而如果你是一直刷着的话,就不用这个延时了}
/*******************************************************************************
* 函 数 名         : Ds18b20ReadTempCom
* 函数功能         : 发送读取温度命令
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/void  Ds18b20ReadTempCom()
{   Ds18b20Init();Delay1ms(1);Ds18b20WriteByte(0xcc);    //跳过ROM操作命令Ds18b20WriteByte(0xbe);  //发送读取温度命令
}
/*******************************************************************************
* 函 数 名         : Ds18b20ReadTemp
* 函数功能         : 读取温度
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/int Ds18b20ReadTemp()
{int temp = 0;uchar tmh, tml;Ds18b20ChangTemp();               //先写入转换命令Ds18b20ReadTempCom();          //然后等待转换完后发送读取温度命令tml = Ds18b20ReadByte();     //读取温度值共16位,先读低字节tmh = Ds18b20ReadByte();       //再读高字节temp = tmh;temp <<= 8;temp |= tml;return temp;
}

实验18:DS1302时钟

main.c

/**************************************************************************************
*                     DS1302时钟实验                                                  *
实现现象:下载程序后,数码管显示时钟数据
注意事项:
***************************************************************************************/#include "reg52.h"             //此文件中定义了单片机的一些特殊功能寄存器
#include"ds1302.h"    typedef unsigned int u16;     //对数据类型进行声明定义
typedef unsigned char u8;sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;char num=0;
u8 DisplayData[8];
u8 code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};/*******************************************************************************
* 函 数 名         : delay
* 函数功能         : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(u16 i)
{while(i--);
}/*******************************************************************************
* 函 数 名         : datapros()
* 函数功能         : 时间读取处理转换函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/void datapros()
{Ds1302ReadTime();DisplayData[0] = smgduan[TIME[2]/16];                //时DisplayData[1] = smgduan[TIME[2]&0x0f];              DisplayData[2] = 0x40;DisplayData[3] = smgduan[TIME[1]/16];              //分DisplayData[4] = smgduan[TIME[1]&0x0f]; DisplayData[5] = 0x40;DisplayData[6] = smgduan[TIME[0]/16];               //秒DisplayData[7] = smgduan[TIME[0]&0x0f];
}/*******************************************************************************
* 函数名         :DigDisplay()
* 函数功能       :数码管显示函数
* 输入           : 无
* 输出             : 无
*******************************************************************************/
void DigDisplay()
{u8 i;for(i=0;i<8;i++){switch(i)   //位选,选择点亮的数码管,{case(0):LSA=0;LSB=0;LSC=0; break;//显示第0位case(1):LSA=1;LSB=0;LSC=0; break;//显示第1位case(2):LSA=0;LSB=1;LSC=0; break;//显示第2位case(3):LSA=1;LSB=1;LSC=0; break;//显示第3位case(4):LSA=0;LSB=0;LSC=1; break;//显示第4位case(5):LSA=1;LSB=0;LSC=1; break;//显示第5位case(6):LSA=0;LSB=1;LSC=1; break;//显示第6位case(7):LSA=1;LSB=1;LSC=1; break;//显示第7位  }P0=DisplayData[7-i];//发送数据delay(100); //间隔一段时间扫描  P0=0x00;//消隐}
}/*******************************************************************************
* 函 数 名       : main
* 函数功能       : 主函数
* 输    入       : 无
* 输    出         : 无
*******************************************************************************/
void main()
{   Ds1302Init();while(1){datapros();    //数据处理函数DigDisplay();//数码管显示函数     }
}

ds1302.h

#ifndef __DS1302_H_
#define __DS1302_H_//---包含头文件---//
#include<reg52.h>
#include<intrins.h>//---重定义关键词---//
#ifndef uchar
#define uchar unsigned char
#endif#ifndef uint
#define uint unsigned int
#endif//---定义ds1302使用的IO口---//
sbit DSIO=P3^4;
sbit RST=P3^5;
sbit SCLK=P3^6;//---定义全局函数---//
void Ds1302Write(uchar addr, uchar dat);
uchar Ds1302Read(uchar addr);
void Ds1302Init();
void Ds1302ReadTime();//---加入全局变量--//
extern uchar TIME[7];   //加入全局变量#endif

ds1302.c

#include"ds1302.h"//---DS1302写入和读取时分秒的地址命令---//
//---秒分时日月周年 最低位读写位;-------//
uchar code READ_RTC_ADDR[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d};
uchar code WRITE_RTC_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};//---DS1302时钟初始化2016年5月7日星期六12点00分00秒。---//
//---存储顺序是秒分时日月周年,存储格式是用BCD码---//
uchar TIME[7] = {0, 0, 0x12, 0x07, 0x05, 0x06, 0x16};/*******************************************************************************
* 函 数 名         : Ds1302Write
* 函数功能         : 向DS1302命令(地址+数据)
* 输    入         : addr,dat
* 输    出         : 无
*******************************************************************************/void Ds1302Write(uchar addr, uchar dat)
{uchar n;RST = 0;_nop_();SCLK = 0;//先将SCLK置低电平。_nop_();RST = 1; //然后将RST(CE)置高电平。_nop_();for (n=0; n<8; n++)//开始传送八位地址命令{DSIO = addr & 0x01;//数据从低位开始传送addr >>= 1;SCLK = 1;//数据在上升沿时,DS1302读取数据_nop_();SCLK = 0;_nop_();}for (n=0; n<8; n++)//写入8位数据{DSIO = dat & 0x01;dat >>= 1;SCLK = 1;//数据在上升沿时,DS1302读取数据_nop_();SCLK = 0;_nop_();    }   RST = 0;//传送数据结束_nop_();
}/*******************************************************************************
* 函 数 名         : Ds1302Read
* 函数功能         : 读取一个地址的数据
* 输    入         : addr
* 输    出         : dat
*******************************************************************************/uchar Ds1302Read(uchar addr)
{uchar n,dat,dat1;RST = 0;_nop_();SCLK = 0;//先将SCLK置低电平。_nop_();RST = 1;//然后将RST(CE)置高电平。_nop_();for(n=0; n<8; n++)//开始传送八位地址命令{DSIO = addr & 0x01;//数据从低位开始传送addr >>= 1;SCLK = 1;//数据在上升沿时,DS1302读取数据_nop_();SCLK = 0;//DS1302下降沿时,放置数据_nop_();}_nop_();for(n=0; n<8; n++)//读取8位数据{dat1 = DSIO;//从最低位开始接收dat = (dat>>1) | (dat1<<7);SCLK = 1;_nop_();SCLK = 0;//DS1302下降沿时,放置数据_nop_();}RST = 0;_nop_();    //以下为DS1302复位的稳定时间,必须的。SCLK = 1;_nop_();DSIO = 0;_nop_();DSIO = 1;_nop_();return dat;
}/*******************************************************************************
* 函 数 名         : Ds1302Init
* 函数功能         : 初始化DS1302.
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/void Ds1302Init()
{uchar n;Ds1302Write(0x8E,0X00);         //禁止写保护,就是关闭写保护功能for (n=0; n<7; n++)//写入7个字节的时钟信号:分秒时日月周年{Ds1302Write(WRITE_RTC_ADDR[n],TIME[n]);  }Ds1302Write(0x8E,0x80);         //打开写保护功能
}/*******************************************************************************
* 函 数 名         : Ds1302ReadTime
* 函数功能         : 读取时钟信息
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/void Ds1302ReadTime()
{uchar n;for (n=0; n<7; n++)//读取7个字节的时钟信号:分秒时日月周年{TIME[n] = Ds1302Read(READ_RTC_ADDR[n]);}}

实验19:红外通信

/**************************************************************************************
*                     红外通信实验                                                  *
实现现象:下载程序后,数码管显示红外遥控键值数据
注意事项:    红外遥控器内的电池绝缘片一定要抽掉
***************************************************************************************/#include "reg52.h"             //此文件中定义了单片机的一些特殊功能寄存器typedef unsigned int u16;      //对数据类型进行声明定义
typedef unsigned char u8;sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;sbit IRIN=P3^2;u8 IrValue[6];
u8 Time;u8 DisplayData[8];
u8 code smgduan[17]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0X76};
//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F、H的显示码/*******************************************************************************
* 函 数 名         : delay
* 函数功能         : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(u16 i)
{while(i--);
}/*******************************************************************************
* 函数名         :DigDisplay()
* 函数功能       :数码管显示函数
* 输入           : 无
* 输出             : 无
*******************************************************************************/
void DigDisplay()
{u8 i;for(i=0;i<3;i++){switch(i)   //位选,选择点亮的数码管,{case(0):LSA=0;LSB=0;LSC=0; break;//显示第0位case(1):LSA=1;LSB=0;LSC=0; break;//显示第1位case(2):LSA=0;LSB=1;LSC=0; break;//显示第2位 }P0=DisplayData[2-i];//发送数据delay(100); //间隔一段时间扫描  P0=0x00;//消隐}
}/*******************************************************************************
* 函数名         : IrInit()
* 函数功能         : 初始化红外线接收
* 输入           : 无
* 输出             : 无
*******************************************************************************/void IrInit()
{IT0=1;//下降沿触发EX0=1;//打开中断0允许EA=1;   //打开总中断IRIN=1;//初始化端口
}/*******************************************************************************
* 函 数 名       : main
* 函数功能       : 主函数
* 输    入       : 无
* 输    出         : 无
*******************************************************************************/
void main()
{   IrInit();while(1){  DisplayData[0] = smgduan[IrValue[2]/16];DisplayData[1] = smgduan[IrValue[2]%16];DisplayData[2] = smgduan[16];DigDisplay();       }
}/*******************************************************************************
* 函数名         : ReadIr()
* 函数功能         : 读取红外数值的中断函数
* 输入           : 无
* 输出             : 无
*******************************************************************************/void ReadIr() interrupt 0
{u8 j,k;u16 err;Time=0;                     delay(700);    //7msif(IRIN==0)      //确认是否真的接收到正确的信号{    err=1000;             //1000*10us=10ms,超过说明接收到错误的信号/*当两个条件都为真是循环,如果有一个条件为假的时候跳出循环,免得程序出错的时侯,程序死在这里*/    while((IRIN==0)&&(err>0))  //等待前面9ms的低电平过去         {           delay(1);err--;} if(IRIN==1)          //如果正确等到9ms低电平{err=500;while((IRIN==1)&&(err>0))       //等待4.5ms的起始高电平过去{delay(1);err--;}for(k=0;k<4;k++)       //共有4组数据{               for(j=0;j<8;j++)  //接收一组数据{err=60;       while((IRIN==0)&&(err>0))//等待信号前面的560us低电平过去{delay(1);err--;}err=500;while((IRIN==1)&&(err>0))    //计算高电平的时间长度。{delay(10);    //0.1msTime++;err--;if(Time>30){return;}}IrValue[k]>>=1;    //k表示第几组数据if(Time>=8)          //如果高电平出现大于565us,那么是1{IrValue[k]|=0x80;}Time=0;        //用完时间要重新赋值                         }}}if(IrValue[2]!=~IrValue[3]){return;}}
}

实验20:AD模数转换

光敏电阻AD值

main.c

/**************************************************************************************
*                     光敏电阻AD实验                                                *
实现现象:下载程序后数码管后4位显示光敏电阻检测的AD值。
注意事项:如果不想让点阵模块显示,可以将74HC595模块上的JP595短接片拔掉。
***************************************************************************************/#include "reg52.h"             //此文件中定义了单片机的一些特殊功能寄存器
#include"XPT2046.h"   typedef unsigned int u16;     //对数据类型进行声明定义
typedef unsigned char u8;sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;u8 disp[4];
u8 code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};/*******************************************************************************
* 函 数 名         : delay
* 函数功能         : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(u16 i)
{while(i--);
}/*******************************************************************************
* 函数名         :datapros()
* 函数功能       :数据处理函数
* 输入           : 无
* 输出             : 无
*******************************************************************************/
void datapros()
{u16 temp;static u8 i;if(i==50){i=0;temp = Read_AD_Data(0xA4);      //   AIN2 光敏电阻}i++;disp[0]=smgduan[temp/1000];//千位disp[1]=smgduan[temp%1000/100];//百位disp[2]=smgduan[temp%1000%100/10];//个位disp[3]=smgduan[temp%1000%100%10];
}/*******************************************************************************
* 函数名         :DigDisplay()
* 函数功能       :数码管显示函数
* 输入           : 无
* 输出             : 无
*******************************************************************************/
void DigDisplay()
{u8 i;for(i=0;i<4;i++){switch(i)   //位选,选择点亮的数码管,{case(0):LSA=0;LSB=0;LSC=0; break;//显示第0位case(1):LSA=1;LSB=0;LSC=0; break;//显示第1位case(2):LSA=0;LSB=1;LSC=0; break;//显示第2位case(3):LSA=1;LSB=1;LSC=0; break;//显示第3位  }P0=disp[3-i];//发送数据delay(100); //间隔一段时间扫描 P0=0x00;//消隐}
}/*******************************************************************************
* 函 数 名       : main
* 函数功能       : 主函数
* 输    入       : 无
* 输    出         : 无
*******************************************************************************/
void main()
{   while(1){datapros();     //数据处理函数DigDisplay();//数码管显示函数     }
}

XPT2046.h

#ifndef    __XPT2046_H_
#define   __XPT2046_H_//---包含头文件---//
#include<reg52.h>
#include<intrins.h>//---重定义关键词---//
#ifndef uchar
#define uchar unsigned char
#endif#ifndef uint
#define uint  unsigned int
#endif#ifndef ulong
#define ulong  unsigned long
#endif//---定义使用的IO口---//
sbit DOUT = P3^7;    //输出
sbit CLK  = P3^6;    //时钟
sbit DIN  = P3^4;    //输入
sbit CS   = P3^5;    //片选uint Read_AD_Data(uchar cmd);
uint SPI_Read(void);
void SPI_Write(uchar dat);#endif

XPT2046.c

#include"XPT2046.h"
/****************************************************************************
*函数名:TSPI_Start
*输  入:无
*输  出:无
*功  能:初始化触摸SPI
****************************************************************************/void SPI_Start(void)
{CLK = 0;CS  = 1;DIN = 1;CLK = 1;CS  = 0;
}
/****************************************************************************
*函数名:SPI_Write
*输  入:dat:写入数据
*输  出:无
*功  能:使用SPI写入数据
****************************************************************************/void SPI_Write(uchar dat)
{uchar i;CLK = 0;for(i=0; i<8; i++){DIN = dat >> 7;   //放置最高位dat <<= 1;CLK = 0;           //上升沿放置数据CLK = 1;}
}
/****************************************************************************
*函数名:SPI_Read
*输  入:无
*输  出:dat:读取 到的数据
*功  能:使用SPI读取数据
****************************************************************************/uint SPI_Read(void)
{uint i, dat=0;CLK = 0;for(i=0; i<12; i++)      //接收12位数据{dat <<= 1;CLK = 1;CLK = 0;dat |= DOUT;}return dat;
}/****************************************************************************
*函数名:Read_AD_Data
*输  入:cmd:读取的X或者Y
*输  出:endValue:最终信号处理后返回的值
*功  能:读取触摸数据
****************************************************************************/
uint Read_AD_Data(uchar cmd)
{uchar i;uint AD_Value;CLK = 0;CS  = 0;SPI_Write(cmd);for(i=6; i>0; i--);     //延时等待转换结果CLK = 1;   //发送一个时钟周期,清除BUSY_nop_();_nop_();CLK = 0;_nop_();_nop_();AD_Value=SPI_Read();CS = 1;return AD_Value;
}

外部输入AD值

main.c

/**************************************************************************************
*                     外部输入AD实验                                                *
实现现象:下载程序后数码管后4位显示外部输入IN3通道检测的AD值,模拟信号电压范围在0-5V
注意事项:如果不想让点阵模块显示,可以将74HC595模块上的JP595短接片拔掉。
***************************************************************************************/#include "reg52.h"             //此文件中定义了单片机的一些特殊功能寄存器
#include"XPT2046.h"   typedef unsigned int u16;     //对数据类型进行声明定义
typedef unsigned char u8;sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;u8 disp[4];
u8 code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};/*******************************************************************************
* 函 数 名         : delay
* 函数功能         : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(u16 i)
{while(i--);
}/*******************************************************************************
* 函数名         :datapros()
* 函数功能       :数据处理函数
* 输入           : 无
* 输出             : 无
*******************************************************************************/
void datapros()
{u16 temp;static u8 i;if(i==50){i=0;temp = Read_AD_Data(0xE4);      //   AIN3 外部输入}i++;disp[0]=smgduan[temp/1000];//千位disp[1]=smgduan[temp%1000/100];//百位disp[2]=smgduan[temp%1000%100/10];//个位disp[3]=smgduan[temp%1000%100%10];
}/*******************************************************************************
* 函数名         :DigDisplay()
* 函数功能       :数码管显示函数
* 输入           : 无
* 输出             : 无
*******************************************************************************/
void DigDisplay()
{u8 i;for(i=0;i<4;i++){switch(i)   //位选,选择点亮的数码管,{case(0):LSA=0;LSB=0;LSC=0; break;//显示第0位case(1):LSA=1;LSB=0;LSC=0; break;//显示第1位case(2):LSA=0;LSB=1;LSC=0; break;//显示第2位case(3):LSA=1;LSB=1;LSC=0; break;//显示第3位  }P0=disp[3-i];//发送数据delay(100); //间隔一段时间扫描 P0=0x00;//消隐}
}/*******************************************************************************
* 函 数 名       : main
* 函数功能       : 主函数
* 输    入       : 无
* 输    出         : 无
*******************************************************************************/
void main()
{   while(1){datapros();     //数据处理函数DigDisplay();//数码管显示函数     }
}

XPT2046.h

#ifndef    __XPT2046_H_
#define   __XPT2046_H_//---包含头文件---//
#include<reg52.h>
#include<intrins.h>//---重定义关键词---//
#ifndef uchar
#define uchar unsigned char
#endif#ifndef uint
#define uint  unsigned int
#endif#ifndef ulong
#define ulong  unsigned long
#endif//---定义使用的IO口---//
sbit DOUT = P3^7;    //输出
sbit CLK  = P3^6;    //时钟
sbit DIN  = P3^4;    //输入
sbit CS   = P3^5;    //片选uint Read_AD_Data(uchar cmd);
uint SPI_Read(void);
void SPI_Write(uchar dat);#endif

XPT2046.c

#include"XPT2046.h"
/****************************************************************************
*函数名:TSPI_Start
*输  入:无
*输  出:无
*功  能:初始化触摸SPI
****************************************************************************/void SPI_Start(void)
{CLK = 0;CS  = 1;DIN = 1;CLK = 1;CS  = 0;
}
/****************************************************************************
*函数名:SPI_Write
*输  入:dat:写入数据
*输  出:无
*功  能:使用SPI写入数据
****************************************************************************/void SPI_Write(uchar dat)
{uchar i;CLK = 0;for(i=0; i<8; i++){DIN = dat >> 7;   //放置最高位dat <<= 1;CLK = 0;           //上升沿放置数据CLK = 1;}
}
/****************************************************************************
*函数名:SPI_Read
*输  入:无
*输  出:dat:读取 到的数据
*功  能:使用SPI读取数据
****************************************************************************/uint SPI_Read(void)
{uint i, dat=0;CLK = 0;for(i=0; i<12; i++)      //接收12位数据{dat <<= 1;CLK = 1;CLK = 0;dat |= DOUT;}return dat;
}/****************************************************************************
*函数名:Read_AD_Data
*输  入:cmd:读取的X或者Y
*输  出:endValue:最终信号处理后返回的值
*功  能:读取触摸数据
****************************************************************************/
uint Read_AD_Data(uchar cmd)
{uchar i;uint AD_Value;CLK = 0;CS  = 0;SPI_Write(cmd);for(i=6; i>0; i--);     //延时等待转换结果CLK = 1;   //发送一个时钟周期,清除BUSY_nop_();_nop_();CLK = 0;_nop_();_nop_();AD_Value=SPI_Read();CS = 1;return AD_Value;
}

热敏电阻AD值

main.c

/**************************************************************************************
*                     热敏电阻AD实验                                                *
实现现象:下载程序后数码管后4位显示热敏电阻检测的AD值.
注意事项:如果不想让点阵模块显示,可以将74HC595模块上的JP595短接片拔掉。
***************************************************************************************/#include "reg52.h"             //此文件中定义了单片机的一些特殊功能寄存器
#include"XPT2046.h"   typedef unsigned int u16;     //对数据类型进行声明定义
typedef unsigned char u8;sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;u8 disp[4];
u8 code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};/*******************************************************************************
* 函 数 名         : delay
* 函数功能         : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(u16 i)
{while(i--);
}/*******************************************************************************
* 函数名         :datapros()
* 函数功能       :数据处理函数
* 输入           : 无
* 输出             : 无
*******************************************************************************/
void datapros()
{u16 temp;static u8 i;if(i==50){i=0;temp = Read_AD_Data(0xD4);      //   AIN1 热敏电阻}i++;disp[0]=smgduan[temp/1000];//千位disp[1]=smgduan[temp%1000/100];//百位disp[2]=smgduan[temp%1000%100/10];//个位disp[3]=smgduan[temp%1000%100%10];
}/*******************************************************************************
* 函数名         :DigDisplay()
* 函数功能       :数码管显示函数
* 输入           : 无
* 输出             : 无
*******************************************************************************/
void DigDisplay()
{u8 i;for(i=0;i<4;i++){switch(i)   //位选,选择点亮的数码管,{case(0):LSA=0;LSB=0;LSC=0; break;//显示第0位case(1):LSA=1;LSB=0;LSC=0; break;//显示第1位case(2):LSA=0;LSB=1;LSC=0; break;//显示第2位case(3):LSA=1;LSB=1;LSC=0; break;//显示第3位  }P0=disp[3-i];//发送数据delay(100); //间隔一段时间扫描 P0=0x00;//消隐}
}/*******************************************************************************
* 函 数 名       : main
* 函数功能       : 主函数
* 输    入       : 无
* 输    出         : 无
*******************************************************************************/
void main()
{   while(1){datapros();     //数据处理函数DigDisplay();//数码管显示函数     }
}

XPT2046.h

#ifndef    __XPT2046_H_
#define   __XPT2046_H_//---包含头文件---//
#include<reg52.h>
#include<intrins.h>//---重定义关键词---//
#ifndef uchar
#define uchar unsigned char
#endif#ifndef uint
#define uint  unsigned int
#endif#ifndef ulong
#define ulong  unsigned long
#endif//---定义使用的IO口---//
sbit DOUT = P3^7;    //输出
sbit CLK  = P3^6;    //时钟
sbit DIN  = P3^4;    //输入
sbit CS   = P3^5;    //片选uint Read_AD_Data(uchar cmd);
uint SPI_Read(void);
void SPI_Write(uchar dat);#endif

XPT2046.c

#include"XPT2046.h"
/****************************************************************************
*函数名:TSPI_Start
*输  入:无
*输  出:无
*功  能:初始化触摸SPI
****************************************************************************/void SPI_Start(void)
{CLK = 0;CS  = 1;DIN = 1;CLK = 1;CS  = 0;
}
/****************************************************************************
*函数名:SPI_Write
*输  入:dat:写入数据
*输  出:无
*功  能:使用SPI写入数据
****************************************************************************/void SPI_Write(uchar dat)
{uchar i;CLK = 0;for(i=0; i<8; i++){DIN = dat >> 7;   //放置最高位dat <<= 1;CLK = 0;           //上升沿放置数据CLK = 1;}
}
/****************************************************************************
*函数名:SPI_Read
*输  入:无
*输  出:dat:读取 到的数据
*功  能:使用SPI读取数据
****************************************************************************/uint SPI_Read(void)
{uint i, dat=0;CLK = 0;for(i=0; i<12; i++)      //接收12位数据{dat <<= 1;CLK = 1;CLK = 0;dat |= DOUT;}return dat;
}/****************************************************************************
*函数名:Read_AD_Data
*输  入:cmd:读取的X或者Y
*输  出:endValue:最终信号处理后返回的值
*功  能:读取触摸数据
****************************************************************************/
uint Read_AD_Data(uchar cmd)
{uchar i;uint AD_Value;CLK = 0;CS  = 0;SPI_Write(cmd);for(i=6; i>0; i--);     //延时等待转换结果CLK = 1;   //发送一个时钟周期,清除BUSY_nop_();_nop_();CLK = 0;_nop_();_nop_();AD_Value=SPI_Read();CS = 1;return AD_Value;
}

电位器AD值

main.c

/**************************************************************************************
*                     电位器AD实验                                                 *
实现现象:下载程序后数码管后4位显示电位器检测的AD值,范围是0-4095,一般达不到最大,这个受你供电电压的影响.
注意事项:如果不想让点阵模块显示,可以将74HC595模块上的JP595短接片拔掉。
***************************************************************************************/#include "reg52.h"             //此文件中定义了单片机的一些特殊功能寄存器
#include"XPT2046.h"   typedef unsigned int u16;     //对数据类型进行声明定义
typedef unsigned char u8;sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;u8 disp[4];
u8 code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};/*******************************************************************************
* 函 数 名         : delay
* 函数功能         : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(u16 i)
{while(i--);
}/*******************************************************************************
* 函数名         :datapros()
* 函数功能       :数据处理函数
* 输入           : 无
* 输出             : 无
*******************************************************************************/
void datapros()
{u16 temp;static u8 i;if(i==50){i=0;temp = Read_AD_Data(0x94);      //   AIN0 电位器}i++;disp[0]=smgduan[temp/1000];//千位disp[1]=smgduan[temp%1000/100];//百位disp[2]=smgduan[temp%1000%100/10];//个位disp[3]=smgduan[temp%1000%100%10];
}/*******************************************************************************
* 函数名         :DigDisplay()
* 函数功能       :数码管显示函数
* 输入           : 无
* 输出             : 无
*******************************************************************************/
void DigDisplay()
{u8 i;for(i=0;i<4;i++){switch(i)   //位选,选择点亮的数码管,{case(0):LSA=0;LSB=0;LSC=0; break;//显示第0位case(1):LSA=1;LSB=0;LSC=0; break;//显示第1位case(2):LSA=0;LSB=1;LSC=0; break;//显示第2位case(3):LSA=1;LSB=1;LSC=0; break;//显示第3位  }P0=disp[3-i];//发送数据delay(100); //间隔一段时间扫描 P0=0x00;//消隐}
}/*******************************************************************************
* 函 数 名       : main
* 函数功能       : 主函数
* 输    入       : 无
* 输    出         : 无
*******************************************************************************/
void main()
{   while(1){datapros();     //数据处理函数DigDisplay();//数码管显示函数     }
}

XPT2046.h

#ifndef    __XPT2046_H_
#define   __XPT2046_H_//---包含头文件---//
#include<reg52.h>
#include<intrins.h>//---重定义关键词---//
#ifndef uchar
#define uchar unsigned char
#endif#ifndef uint
#define uint  unsigned int
#endif#ifndef ulong
#define ulong  unsigned long
#endif//---定义使用的IO口---//
sbit DOUT = P3^7;    //输出
sbit CLK  = P3^6;    //时钟
sbit DIN  = P3^4;    //输入
sbit CS   = P3^5;    //片选uint Read_AD_Data(uchar cmd);
uint SPI_Read(void);
void SPI_Write(uchar dat);#endif

XPT2046.c

#include"XPT2046.h"/****************************************************************************
*函数名:SPI_Write
*输  入:dat:写入数据
*输  出:无
*功  能:使用SPI写入数据
****************************************************************************/void SPI_Write(uchar dat)
{uchar i;CLK = 0;for(i=0; i<8; i++){DIN = dat >> 7;   //放置最高位dat <<= 1;CLK = 0;           //上升沿放置数据CLK = 1;}
}
/****************************************************************************
*函数名:SPI_Read
*输  入:无
*输  出:dat:读取 到的数据
*功  能:使用SPI读取数据
****************************************************************************/uint SPI_Read(void)
{uint i, dat=0;CLK = 0;for(i=0; i<12; i++)      //接收12位数据{dat <<= 1;CLK = 1;CLK = 0;dat |= DOUT;}return dat;
}/****************************************************************************
*函数名:Read_AD_Data
*输  入:cmd:读取的X或者Y
*输  出:endValue:最终信号处理后返回的值
*功  能:读取触摸数据
****************************************************************************/
uint Read_AD_Data(uchar cmd)
{uchar i;uint AD_Value;CLK = 0;CS  = 0;SPI_Write(cmd);for(i=6; i>0; i--);     //延时等待转换结果CLK = 1;   //发送一个时钟周期,清除BUSY_nop_();_nop_();CLK = 0;_nop_();_nop_();AD_Value=SPI_Read();CS = 1;return AD_Value;
}

实验21:DA数模转换

/**************************************************************************************
*                     DA-PWM输出实验                                                  *
实现现象:下载程序后DA模块上的指示灯呈呼吸灯效果,由暗变亮再由亮变暗
注意事项:要将AD/DA模块上的短接片将OUT和LED短接,板子丝印上有。如果不想让点阵模块显示,可以将74HC595模块上的JP595短接片拔掉。
***************************************************************************************/#include "reg52.h"             //此文件中定义了单片机的一些特殊功能寄存器typedef unsigned int u16;      //对数据类型进行声明定义
typedef unsigned char u8;//--定义使用的IO口--//
sbit PWM=P2^1;
bit DIR;//--定义一个全局变量--//
u16 count,value,timer1;/*******************************************************************************
* 函 数 名         : Timer1Init
* 函数功能         : 定时器1初始化
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void Timer1Init()
{TMOD|=0X10;//选择为定时器1模式,工作方式1,仅用TR1打开启动。TH1 = 0xFF; TL1 = 0xff;   //1usET1=1;//打开定时器1中断允许EA=1;//打开总中断TR1=1;//打开定时器
}/*******************************************************************************
* 函 数 名       : main
* 函数功能       : 主函数
* 输    入       : 无
* 输    出         : 无
*******************************************************************************/
void main()
{   Timer1Init();  //定时器1初始化while(1){if(count>100)                           {  count=0;if(DIR==1)                       //DIR控制增加或减小{value++;}         if(DIR==0){value--;}}if(value==1000){DIR=0;}if(value==0){DIR=1;}    if(timer1>1000)  //PWM周期为1000*1us{timer1=0;}if(timer1 <value)    {PWM=1;}else{PWM=0;}      }
}/*******************************************************************************
* 函 数 名       : Time1
* 函数功能       : 定时器1的中断函数
* 输    入       : 无
* 输    出       : 无
*******************************************************************************/void Time1(void) interrupt 3    //3 为定时器1的中断号  1 定时器0的中断号 0 外部中断1 2 外部中断2  4 串口中断
{TH1 = 0xFF; TL1 = 0xff;   //1ustimer1++; count++;}

实验22:LCD1602液晶

main.c

/**************************************************************************************
*                     LCD1602液晶显示实验                                               *
实现现象:下载程序后插上LCD1602液晶在开发板上,即可显示
注意事项:如果不想让点阵模块显示,可以将74HC595模块上的JP595短接片拔掉。
***************************************************************************************/#include "reg52.h"             //此文件中定义了单片机的一些特殊功能寄存器
#include "lcd.h"typedef unsigned int u16;   //对数据类型进行声明定义
typedef unsigned char u8;u8 Disp[]=" Pechin Science ";/*******************************************************************************
* 函 数 名         : main
* 函数功能         : 主函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void main(void)
{u8 i;LcdInit();for(i=0;i<16;i++){LcdWriteData(Disp[i]);  }while(1);
}

lcd.h

#ifndef __LCD_H_
#define __LCD_H_
/**********************************
当使用的是4位数据传输的时候定义,
使用8位取消这个定义
**********************************/
//#define LCD1602_4PINS/**********************************
包含头文件
**********************************/
#include<reg52.h>//---重定义关键词---//
#ifndef uchar
#define uchar unsigned char
#endif#ifndef uint
#define uint unsigned int
#endif/**********************************
PIN口定义
**********************************/
#define LCD1602_DATAPINS P0
sbit LCD1602_E=P2^7;
sbit LCD1602_RW=P2^5;
sbit LCD1602_RS=P2^6;/**********************************
函数声明
**********************************/
/*在51单片机12MHZ时钟下的延时函数*/
void Lcd1602_Delay1ms(uint c);   //误差 0us
/*LCD1602写入8位命令子函数*/
void LcdWriteCom(uchar com);
/*LCD1602写入8位数据子函数*/
void LcdWriteData(uchar dat)    ;
/*LCD1602初始化子程序*/
void LcdInit();                       #endif

lcd.c

#include "lcd.h"/*******************************************************************************
* 函 数 名         : Lcd1602_Delay1ms
* 函数功能         : 延时函数,延时1ms
* 输    入         : c
* 输    出         : 无
* 说    名         : 该函数是在12MHZ晶振下,12分频单片机的延时。
*******************************************************************************/void Lcd1602_Delay1ms(uint c)   //误差 0us
{uchar a,b;for (; c>0; c--){for (b=199;b>0;b--){for(a=1;a>0;a--);}      }}/*******************************************************************************
* 函 数 名         : LcdWriteCom
* 函数功能         : 向LCD写入一个字节的命令
* 输    入         : com
* 输    出         : 无
*******************************************************************************/
#ifndef     LCD1602_4PINS    //当没有定义这个LCD1602_4PINS时
void LcdWriteCom(uchar com)   //写入命令
{LCD1602_E = 0;     //使能LCD1602_RS = 0;      //选择发送命令LCD1602_RW = 0;    //选择写入LCD1602_DATAPINS = com;     //放入命令Lcd1602_Delay1ms(1);        //等待数据稳定LCD1602_E = 1;           //写入时序Lcd1602_Delay1ms(5);      //保持时间LCD1602_E = 0;
}
#else
void LcdWriteCom(uchar com)   //写入命令
{LCD1602_E = 0;     //使能清零LCD1602_RS = 0;  //选择写入命令LCD1602_RW = 0;    //选择写入LCD1602_DATAPINS = com; //由于4位的接线是接到P0口的高四位,所以传送高四位不用改Lcd1602_Delay1ms(1);LCD1602_E = 1;     //写入时序Lcd1602_Delay1ms(5);LCD1602_E = 0;LCD1602_DATAPINS = com << 4; //发送低四位Lcd1602_Delay1ms(1);LCD1602_E = 1;     //写入时序Lcd1602_Delay1ms(5);LCD1602_E = 0;
}
#endif
/*******************************************************************************
* 函 数 名         : LcdWriteData
* 函数功能         : 向LCD写入一个字节的数据
* 输    入         : dat
* 输    出         : 无
*******************************************************************************/
#ifndef     LCD1602_4PINS
void LcdWriteData(uchar dat)            //写入数据
{LCD1602_E = 0;    //使能清零LCD1602_RS = 1;  //选择输入数据LCD1602_RW = 0;    //选择写入LCD1602_DATAPINS = dat; //写入数据Lcd1602_Delay1ms(1);LCD1602_E = 1;   //写入时序Lcd1602_Delay1ms(5);   //保持时间LCD1602_E = 0;
}
#else
void LcdWriteData(uchar dat)            //写入数据
{LCD1602_E = 0;      //使能清零LCD1602_RS = 1;      //选择写入数据LCD1602_RW = 0;    //选择写入LCD1602_DATAPINS = dat;    //由于4位的接线是接到P0口的高四位,所以传送高四位不用改Lcd1602_Delay1ms(1);LCD1602_E = 1;      //写入时序Lcd1602_Delay1ms(5);LCD1602_E = 0;LCD1602_DATAPINS = dat << 4; //写入低四位Lcd1602_Delay1ms(1);LCD1602_E = 1;     //写入时序Lcd1602_Delay1ms(5);LCD1602_E = 0;
}
#endif
/*******************************************************************************
* 函 数 名       : LcdInit()
* 函数功能       : 初始化LCD屏
* 输    入       : 无
* 输    出       : 无
*******************************************************************************/
#ifndef     LCD1602_4PINS
void LcdInit()                        //LCD初始化子程序
{LcdWriteCom(0x38);  //开显示LcdWriteCom(0x0c);  //开显示不显示光标LcdWriteCom(0x06);  //写一个指针加1LcdWriteCom(0x01);  //清屏LcdWriteCom(0x80);  //设置数据指针起点
}
#else
void LcdInit()                        //LCD初始化子程序
{LcdWriteCom(0x32);  //将8位总线转为4位总线LcdWriteCom(0x28);     //在四位线下的初始化LcdWriteCom(0x0c);  //开显示不显示光标LcdWriteCom(0x06);  //写一个指针加1LcdWriteCom(0x01);  //清屏LcdWriteCom(0x80);  //设置数据指针起点
}
#endif

51单片机基础实验例程相关推荐

  1. 单片机STC89C51入门学习笔记--基础实验例程(一)

    文章目录 前言 1. 点亮第一个LED 1.1 代码 1.2 编译 1.3 程序下载 1.4 结果展示 1.5 常见问题及解决办法 2. LED灯闪烁 2.1 代码 2.2 编译 2.3 程序下载 2 ...

  2. 51单片机汇编语言实验(三)-----定时/计数器实验(附参考代码及注释)

       本系列共6篇文章,本文作为本系列的第三篇文章,介绍实验三 :定时/计数器实验,本系列文章基于Dais-52PRO实验箱. 本系列文章链接: --------------------------- ...

  3. 51单片机汇编语言实验(五)-----A/D 0809模数转换和DA0832数模转换实验(附参考代码及注释)

       本系列共6篇文章,本文作为本系列的第五篇文章,介绍实验五 :A/D 0809模数转换和DA0832数模转换实验,本系列文章基于Dais-52PRO实验箱. 本系列文章链接: ---------- ...

  4. 51单片机——I2C-EEPROM实验,小白讲解,相互学习

    I2C介绍 I2C(Inter-Integrated Circuit)总线是由 PHILIPS 公司开发的两线式 串行总线,用于连接微控制器及其外围设备.是微电子通信控制领域广泛采用的 一种总线标准. ...

  5. 51单片机 | 蜂鸣器实验

    文章目录 一. 蜂鸣器介绍 二.硬件设计 三.软件设计 四.实验现象   通过单片机的一个 IO 口控制 板载无源蜂鸣器,实现蜂鸣器控制. 一. 蜂鸣器介绍   蜂鸣器是一种一体化结构的电子讯响器,采 ...

  6. (三)51单片机基础——独立按键与数码管

    从小就对电器元件比较感兴趣吧,经常拿坏的电器里面的芯片拆下来玩,甚至那些没坏的电器,比如我家的电视,也会希望它能坏掉,我好去看看里面是什么样子的,为什么能播放节目--,所以我第一眼看到51单片机的时候 ...

  7. 51单片机 | 直流电机实验

    文章目录 一.直流电机介绍 二.ULN2003芯片介绍 三.硬件设计 四.软件设计 五.实验现象   在未学习 PWM 之前,我们先简单使用 GPIO 来控制电机的旋转和停止. GPIO 不能直接使用 ...

  8. 51单片机定时器中断怎么用-------51单片机基础篇

    首先,什么时定时器,简单来说可以比喻为一个闹钟,当你把他打开以后,他就会每秒动一下,+1,+1,+1,+1,如果你设置了某一个时间点闹钟会向以后,那么当闹钟的时间点+1,+1,+1,+到了你设置的时间 ...

  9. (五)51单片机基础——矩阵键盘

    矩阵键盘介绍: 在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式 采用逐行或逐列的"扫描",就可以读出任何位置按键的状态 扫描: 数码管扫描(输出扫描) 原 ...

  10. 51单片机汇编学习例程(9)——ADC0809篇

    ASM9_ADC0808:    ADC0808采集ADC参数,数码管显示 (注意代码显示不全,最下面有Keil源码和Proteus工程) /** ************************** ...

最新文章

  1. GPT-3:被捧上天的流量巨星,却有重大缺陷,很危险...
  2. android 定义date对象,如何从Date对象设置Android Chronometer基准时间?
  3. mysql pt_mysql之pt工具之pt-fifo-split用法介绍
  4. pb mysql odbc_PB 连接Mysql ODBC/JDBC
  5. 如何集成Spring和Struts(实例说明)
  6. stl取出字符串中的字符_在C ++ STL中使用比较运算符比较两个字符串
  7. SQLite_Android
  8. 【数值分析】—— 对数函数、指数函数(数值稳定性)
  9. JDBC连接数据库经验技巧集萃
  10. Spring Cloud Sleuth 之Greenwich版本全攻略
  11. Kafka AKHQ 安装部署
  12. 软件测试常见的用例设计方法
  13. Zipf law 定律
  14. 笔记本上网显示连接不到服务器,笔记本无线网络连接不上
  15. XML文件内容格式化与语法错误自动检查
  16. CC00056.bigdatajava——|Java分支结构.V06|——|Java.v06|ifelseifelse.v02|个人所得税计算方式一|
  17. java面向对象抽象类和接口
  18. 使用D3D8实现2D图形显示技术
  19. 血族服务器暂时无法登录,天之炼狱归来服务端7.01架设教程问题解答
  20. 虹科Automation softPLC | 虹科KPA MoDK运行环境与搭建步骤(3)——MoDK例程测试

热门文章

  1. 飞控计算机的作用,自动飞控计算机测试系统
  2. endnote修改正文中参考文献标注_如何用endnote修改毕业论文后参考文献格式为毕业手册要求格式...
  3. 免费的短信验证码接口
  4. 机械类有哪些好投一些的核心期刊?
  5. mysql分页查询非常慢_MySQL分页查询慢的原因及解决方案
  6. 控制台接收信息转发_微信多群转播能够起到什么作用?微信群聊录制课程语音转发多群怎么操作?...
  7. python实现GPS经纬度转换
  8. 关于黑莓手机 三键重启的操作方法
  9. 苹果手机六位数密码忘记了用计算机,忘记iPhone锁屏密码?三种方法帮你顺利解决!...
  10. JavaWeb毕业生就业管理系统项目实战教程