51单片机基础实验例程
代码来源见代码注释。
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单片机基础实验例程相关推荐
- 单片机STC89C51入门学习笔记--基础实验例程(一)
文章目录 前言 1. 点亮第一个LED 1.1 代码 1.2 编译 1.3 程序下载 1.4 结果展示 1.5 常见问题及解决办法 2. LED灯闪烁 2.1 代码 2.2 编译 2.3 程序下载 2 ...
- 51单片机汇编语言实验(三)-----定时/计数器实验(附参考代码及注释)
本系列共6篇文章,本文作为本系列的第三篇文章,介绍实验三 :定时/计数器实验,本系列文章基于Dais-52PRO实验箱. 本系列文章链接: --------------------------- ...
- 51单片机汇编语言实验(五)-----A/D 0809模数转换和DA0832数模转换实验(附参考代码及注释)
本系列共6篇文章,本文作为本系列的第五篇文章,介绍实验五 :A/D 0809模数转换和DA0832数模转换实验,本系列文章基于Dais-52PRO实验箱. 本系列文章链接: ---------- ...
- 51单片机——I2C-EEPROM实验,小白讲解,相互学习
I2C介绍 I2C(Inter-Integrated Circuit)总线是由 PHILIPS 公司开发的两线式 串行总线,用于连接微控制器及其外围设备.是微电子通信控制领域广泛采用的 一种总线标准. ...
- 51单片机 | 蜂鸣器实验
文章目录 一. 蜂鸣器介绍 二.硬件设计 三.软件设计 四.实验现象 通过单片机的一个 IO 口控制 板载无源蜂鸣器,实现蜂鸣器控制. 一. 蜂鸣器介绍 蜂鸣器是一种一体化结构的电子讯响器,采 ...
- (三)51单片机基础——独立按键与数码管
从小就对电器元件比较感兴趣吧,经常拿坏的电器里面的芯片拆下来玩,甚至那些没坏的电器,比如我家的电视,也会希望它能坏掉,我好去看看里面是什么样子的,为什么能播放节目--,所以我第一眼看到51单片机的时候 ...
- 51单片机 | 直流电机实验
文章目录 一.直流电机介绍 二.ULN2003芯片介绍 三.硬件设计 四.软件设计 五.实验现象 在未学习 PWM 之前,我们先简单使用 GPIO 来控制电机的旋转和停止. GPIO 不能直接使用 ...
- 51单片机定时器中断怎么用-------51单片机基础篇
首先,什么时定时器,简单来说可以比喻为一个闹钟,当你把他打开以后,他就会每秒动一下,+1,+1,+1,+1,如果你设置了某一个时间点闹钟会向以后,那么当闹钟的时间点+1,+1,+1,+到了你设置的时间 ...
- (五)51单片机基础——矩阵键盘
矩阵键盘介绍: 在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式 采用逐行或逐列的"扫描",就可以读出任何位置按键的状态 扫描: 数码管扫描(输出扫描) 原 ...
- 51单片机汇编学习例程(9)——ADC0809篇
ASM9_ADC0808: ADC0808采集ADC参数,数码管显示 (注意代码显示不全,最下面有Keil源码和Proteus工程) /** ************************** ...
最新文章
- GPT-3:被捧上天的流量巨星,却有重大缺陷,很危险...
- android 定义date对象,如何从Date对象设置Android Chronometer基准时间?
- mysql pt_mysql之pt工具之pt-fifo-split用法介绍
- pb mysql odbc_PB 连接Mysql ODBC/JDBC
- 如何集成Spring和Struts(实例说明)
- stl取出字符串中的字符_在C ++ STL中使用比较运算符比较两个字符串
- SQLite_Android
- 【数值分析】—— 对数函数、指数函数(数值稳定性)
- JDBC连接数据库经验技巧集萃
- Spring Cloud Sleuth 之Greenwich版本全攻略
- Kafka AKHQ 安装部署
- 软件测试常见的用例设计方法
- Zipf law 定律
- 笔记本上网显示连接不到服务器,笔记本无线网络连接不上
- XML文件内容格式化与语法错误自动检查
- CC00056.bigdatajava——|Java分支结构.V06|——|Java.v06|ifelseifelse.v02|个人所得税计算方式一|
- java面向对象抽象类和接口
- 使用D3D8实现2D图形显示技术
- 血族服务器暂时无法登录,天之炼狱归来服务端7.01架设教程问题解答
- 虹科Automation softPLC | 虹科KPA MoDK运行环境与搭建步骤(3)——MoDK例程测试
热门文章
- 飞控计算机的作用,自动飞控计算机测试系统
- endnote修改正文中参考文献标注_如何用endnote修改毕业论文后参考文献格式为毕业手册要求格式...
- 免费的短信验证码接口
- 机械类有哪些好投一些的核心期刊?
- mysql分页查询非常慢_MySQL分页查询慢的原因及解决方案
- 控制台接收信息转发_微信多群转播能够起到什么作用?微信群聊录制课程语音转发多群怎么操作?...
- python实现GPS经纬度转换
- 关于黑莓手机 三键重启的操作方法
- 苹果手机六位数密码忘记了用计算机,忘记iPhone锁屏密码?三种方法帮你顺利解决!...
- JavaWeb毕业生就业管理系统项目实战教程