微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 51单片机学习总结实例

51单片机学习总结实例

时间:11-19 来源:互联网 点击:

5.2 12864显示子函数

#include
#include
#include

#define uchar unsigned char
#define uint unsigned int

#define LCD_data P0;//数据口

sbit LCD_RS=P3^5; //数据选择输入
sbit LCD_RW=P3^6; //液晶读写控制
sbit LCD_EN=P3^4; //液晶使能控制端
sbit LCD_PSB=P3^7; //串并方式控制

void delay_1ms(uint )
{
uint i,j;
for(j=0jfor(i=0;i<110;i++);
}
/*PS=L,RW=L,E=高脉冲,D0~D7=指令码*/
void write_cmd(uchar cmd)
{
LCD_RS=0;
LCD_RW=0;
LCD_EN=0;
P0=cmd;
delay_1ms(5);
LCD_EN=0;
}
/*写显示数据到LCD*/
/*RS=H,RW=L,E=高脉冲,D0~D7=数据
void write_dat(uchar dat)
{
LCD_RS=1;
LCD_RW=0;
LCD_EN=0;
P0=dat;
delay_1ms(5);
LCD_EN=1;
dealy_1ms(5);
LCD_EN=0;
}
/*设定显示位置*/
void LCD_pos(uchar X,uchar Y)
{
uchar pos;
if(X==0)
{X=0x80;}
else if(X==1);
{X=0x90;}
else if(x==2)
{X=0x88;}
else if(X==3)
{X=0x98;}
pos=X+Y;
write_cmd(pos);//显示地址
}

/*LCD初始化设置*/
void lcd_init()
{
LCD_PSB=1; //并口方式
write_cmd(0x30);//基本指令操作
delay_1ms(5);
write_cmd(0x0C);//先是开,关光标
delay_1ms(5);
write_cmd(0x01);//清除LCD的显示内容
delay_1ms(5);
}

6.定时器中断

/*用定时器0的方式1实现第一个发光管以1s亮灭*/
定时器/计数器4种工作方式
1,方式0 13位计数器 高8位和低5位
2,方式1 16位计数器
3,方式2 自动恢复初值 8位
4,方式3 只适用于T0,不适用于T1 8位

45872初值的计算
晶振:11.0592M
机器周期:计数一次的时间=12*(1/11.0592M)51单片机是12个时钟周期为一个机器周期
=1.09US 指令周期由整数个机器周期组成
45872 =50Ms/1.09us

//
#include
#define uchar unsigned char
#define uint unsigned int
sbit led1=P1^0;
uchar num;
void main()
{
TMOD=0x01;//设置定时器0工作方式1
TH0=(65535-45872)/256;//装初值11.0592M晶振定时50ms为45872
TL0=(65535-45872)%256;
EA=1; //开总中断
ET0=1; //开定时器0中断
TR0=1; //启动定时器0
while(1) //程序停在这里等待中断的发生
}

void T0_time() interrupt 1
{
TH0=(65535-45872)/256;
TL0=(65535-45872)%256;
num++;
if(num==20)
{
num=0;
led1=~led1;
}
}

7.串口通信

//
上位机通过串口调试助手发送一个字符x,单片机收到字符后返回给上位机“I get x”
串口波特率设置为9600bps。
#include
#define uchar unsigned char
#define uint unsigned int
uchar flag,a,i;
uchar code table[]="I get";
void init()
{
TMOD=0x20;//设置T1定时器工作方式为2 8位初值自动重装的8位定时器
TH1=0xfd;//T1定时器装初值(高八位) 控制串口通信的波特率(由定时器1的溢出率控制)
TL1=0xfd;///T1定时器装入初值(低八位)
TR1=1; //定时器1运行控制位 置一启动定时器
REN=1; //允许串口接收
SM0=0;
SM1=1; //设置串口工作方式为一
EA=1; //全局中断允许位 置一开全局中断
ES=1; //串口中断允许位
}

void main()
{
init();
` while(1)
{
if(flag==1)
{
ES=0;
for(i=0;i<6;i++)
{
SBUF=table[i];
while(!TI)
TI=0;//发送中断标志 发送数据完成后触发中断 硬件置一 必须软件清零
}
SBUF=a;// 串口发送数据
while(!TI);
TI=0;
ES=1;
flag=0;
}

}

void ser() interrupt 4 //串口中断服务程序
{
RI=0; // 收到数据硬件置一,由软件清零
a=SBUF; //将寄存器的值 赋给a
flag=1; //标志位
}
注意:51单片机的特殊之处在于,SBUF既是串口接收寄存器也是串口发送寄存器,取决于
SBUF所在赋值符号“=”左右的位置

此程序中共用的串口中断,

定时器1中断 特殊功能寄存器SBUF

中断响应的条件

中断源有中断请求 此中断源允许位为1 cpu开中断(即EA=1)以上三个条件同时满足

串口通信设置

确定串口通信波特率(编程TMOD寄存器定时器工作方式寄存器)

计算定时器初值转载THX TLX

确定串行口工作方式(编程SCON寄存器串行口控制方式寄存器)

串行口工作在中断方式时,要进行中断设置如TI,RI软件清零

8.I2C总线通信模拟子函数

/*/
因为51单片机没有I2C总线,所以采用模拟I2C通信
1,总线初始化
void init()
{
SCL=1;
delay();
SDA=1;
delay();
}
2,启动信号
void start()
{
SDA=1;
delay(1);
SCL=1;
delay();
SDA=0;
delay();
}
3,应答信号
void respons()
{
uchar i=0;
SCL=1;
delay();
while((SDA==1)&&(i<255))
i++;
SCL=0;
delay();
}
4,停止信号
void stop()
{
SDA=0;
delay();
SCL=1;
delay();
SDA=1;
delay();
}
5,写一个字节
void writebyte(uchar date)
{
uchar i,temp;
temp=date;
for(i=0;i<8;i++)
{
temp=temp<1;
SCL=0;
delay();
SDA=CY;
delay();
SCL=1;
delay();
}
SCL=0;
delay();
SDA=1;
delay();
}
6,读一个字节
uchar readbyte()
{
uchar i,k;
SCL=0;
delay();
SDA=1;
for(i=0;i<8;i++)
{
SCL=1;
delay();
k=(k<1)|SDA;
SCL=0;
delay();
}
delay();
return k;
}

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

网站地图

Top