51单片机笔记(p13~p24)

LCD1602

液晶显示屏,可以显示2*16个字符,即1602,有16个管脚
LCD初始化

/*********************************************************/
// 1602液晶功能初始化
/*********************************************************/
void LcdInit()
{
	LcdWriteCmd(0x38);        // 16*2显示,5*7点阵,8位数据口
	LcdWriteCmd(0x0C);        // 开显示,不显示光标
	LcdWriteCmd(0x06);        // 地址加1,当写入数据后光标右移
	LcdWriteCmd(0x01);        // 清屏
}

使用LCD时要先初始化才能使用其他功能函数

LCD_Delay()
LCD_WriteCommand(unsigned char Command)
LCD_WriteData(unsigned char Data)
LCD_SetCursor(unsigned char Line,unsigned char Column)
LCD_Init()
LCD_ShowChar(unsigned char Line,unsigned char Column,char Char)
LCD_ShowString(unsigned char Line,unsigned char Column,char *String)
LCD_Pow(int X,int Y)
LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
LCD_ShowSignedNum(unsigned char Line,unsigned char Column,int Number,unsigned char Length)
LCD_ShowHexNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
{
LCD_ShowBinNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)

51单片机中经常使用LCD调试程序

矩阵键盘

sct89c52中的矩阵键盘为4*4十六个按键盘,由八个引脚控制(4行+4列)
51单片机内部为高电平,按下按键当某个按键则相当于接地,所处电平为低电平,io口为0
采用行列扫描法确定按下按键

#include <REGX52.H>
#include "Delay.h"
unsigned char Matrixkey()
{
	unsigned char Matrixnumber=0;
	P1=0xFF;
	P1_3=0;
	if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);Matrixnumber=1;}
	if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);Matrixnumber=5;}
	if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);Matrixnumber=9;}
	if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);Matrixnumber=13;}
	P1=0xFF;
	P1_2=0;
	if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);Matrixnumber=2;}
	if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);Matrixnumber=6;}
	if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);Matrixnumber=10;}
	if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);Matrixnumber=14;}
	P1=0xFF;
	P1_1=0;
	if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);Matrixnumber=3;}
	if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);Matrixnumber=7;}
	if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);Matrixnumber=11;}
	if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);Matrixnumber=15;}
	P1=0xFF;
	P1_0=0;
	if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);Matrixnumber=4;}
	if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);Matrixnumber=8;}
	if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);Matrixnumber=12;}
	if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);Matrixnumber=16;}
	return Matrixnumber;
}

定时器

stc89c52中有三个定时器t0,t1,t2

★通常使用t1,16位定时器/计数器。

工作原理:每过一个时间段给一个脉冲,对脉冲进行计数,计数达到某个值时程序跳进中断系统,运行中断系统中的程序
由于“某个值”是确定的(65535)所以我们可以先给一个初始值,由初始值计数到65535,实现不同时间的定时
定时计数器通过特殊功能寄存器TCON来启动

#include <REGX52.H>
void Timer0_Init(void)		//1000微秒@11.0592MHz
{
	TMOD &= 0xF0;			//设置定时器模式
	TMOD |= 0x01;			//设置定时器模式
	TL0 = 0x66;				//设置定时初始值
	TH0 = 0xFC;				//设置定时初始值
	TF0 = 0;				//清除TF0标志
	TR0 = 1;				//定时器0开始计时
	
	ET0 = 1;
	EA = 1;
	PT0 = 0;
}
//void Timer0_Rountine() interrupt 1
//{
//	static unsigned int count;
//	TL0 = 0x66;				//设置定时初始值
//	TH0 = 0xFC;	
//	count++;
//	if(count>=500){
//		count=0;
//		if(keymode==0){P2=_crol_(P2,1);}
//		if(keymode==1){P2=_cror_(P2,1);}
//	}
//	
//}


串口

串口即串行通信口,串行通信是数据通信的一种,串行通信是一位一位的按顺序的进行发送或接收的通信方式
sct89c52有1个UART,4种工作模式

通过定时器T1计时(仅提供波特率:串口通信的速率),需要配置串行控制寄存器SCON(对串行通信的工作模式进行控制),电源控制寄存器PCON(配置SMOD来控制波特率是否加倍,若SMOD=0,波特率不变。SMOD=1,波特率加倍。SMOD默认为0)
在这里插入图片描述

void Uart1_Init(void)	//4800bps@11.0592MHz
{
	PCON &= 0x7F;		//波特率不倍速
	SCON = 0x50;		//8位数据,可变波特率
	
	TMOD &= 0x0F;		//设置定时器模式
	TMOD |= 0x20;		//设置定时器模式
	TL1 = 0xFA;			//设置定时初始值
	TH1 = 0xFA;			//设置定时重载值
	ET1 = 0;			//禁止定时器中断
	TR1 = 1;			//定时器1开始计时
}

LED点阵屏

sct89c52LED点阵屏(1616)由4片74HC595芯片(44)拼成

在这里插入图片描述

共有8+8个引脚
74HC595是8位串行输入/输出或者并行输出移位寄存器
在这里插入图片描述
通过SER口输入串行的数据,当SRCLK有上升沿信号时,数据就往下移一位,当数据满了8位时,给RCLK上升沿信号时,8位数据就锁存到QA~QH,QH’连接到下一片74HC595,继续拓展16位、32位…

void _74HC595_Byte(unsigned char byte)
{
	unsigned char i;
	for(i=0;i<8;i++)
	{
		SER=byte&(0x80>>i);
		SCK=1;
		SCK=0;
	}
	RCK=1;
	RCK=0;
}
void MatrixLED_ShowColumn(unsigned char Column,Data)
{
	_74HC595_Byte(Data);
	
	P0=~(0x80>>Column);
	Delay(1);
	P0=0xFF;
}
	

DS1302实时时钟

DS1302 是 DALLAS 公司推出的涓流充电时钟芯片,内含有一个实时时钟/日历和 31 字节静态 RAM,通过简单的串行接口与单片机进行通信。实时时钟/日历电路提供秒、分、时、日、周、月、年的信息,每月的天数和闰年的天数可自动调整。
在这里插入图片描述
ds1302使用三根通信线CE,IO,SCLK
初始化:

void DS1302_Init(void)
{
	DS1302_CE=0;
	DS1302_SCLK=0;
}


BCD码

在这里插入图片描述

void DS1302_Byte(unsigned char Command,Data)
{
	unsigned char i;
	DS1302_CE=1;
	
	for(i=0;i<8;i++)
	{
		DS1302_IO=Command&(0x01<<i);
		DS1302_SCLK=1;
		DS1302_SCLK=0;
	}
	for(i=0;i<8;i++)
	{
		DS1302_IO=Data&(0x01<<i);
		DS1302_SCLK=1;
		DS1302_SCLK=0;
	}
	DS1302_CE=0;
}

unsigned char DS1302_Read(unsigned char Command)
{
	unsigned char Data=0x00,i;
	DS1302_CE=1;
	Command|=0x01;
	
	for(i=0;i<8;i++)
	{
		DS1302_IO=Command&(0x01<<i);
		DS1302_SCLK=0;
		DS1302_SCLK=1;
	}
	for(i=0;i<8;i++)
	{
		DS1302_SCLK=1;
		DS1302_SCLK=0;
		if(DS1302_IO)
		{
			Data|=(0x01<<i);
		}
		
	}
	DS1302_CE=0;
	DS1302_IO=0;
	return Data;
	
	
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值