51study

Hello World

江科大自化协(AT89C51)

八位数码管静态显示

unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
void Nixie(unsigned char Location,Number)
{
    switch(Location)
    {
        case 1:P2_4=1;P2_3=1;P2_2=1;break;
        case 2:P2_4=1;P2_3=1;P2_2=0;break;
        case 3:P2_4=1;P2_3=0;P2_2=1;break;
        case 4:P2_4=1;P2_3=0;P2_2=0;break;
        case 5:P2_4=0;P2_3=1;P2_2=1;break;
        case 6:P2_4=0;P2_3=1;P2_2=0;break;
        case 7:P2_4=0;P2_3=0;P2_2=1;break;
        case 8:P2_4=0;P2_3=0;P2_2=0;break;
    }
    P0=NixieTable[Number];
}
Nixie[2,3];//第二位数码管显示数字3

LCD1602调试工具

使用LCD1602液晶屏作为调试窗口,提供类似printf函数的功能,可实时观察单片机内部数据的变换情况,便于调试和演示。

函数 作用
LCD_Init(); 初始化
LCD_ShowChar(1,1,'A'); 显示一个字符
LCD_ShowString(1,3,"Hello"); 显示字符串
LCD_ShowNum(1,9,123,3); 显示十进制数字
LCD_ShowSignedNum(1,13,-66,2); 显示有符号十进制数字
LCD_ShowHexNum(2,1,0xA8,2); 显示十六进制数字
LCD_ShowBinNum(2,4,0xAA,8); 显示二进制数字

AT89C52(冬令营)

11.0592MHS的延时1ms函数

void delay_ms(unsigned int n)
{
	unsigned char i;
    while(n--)
        for(i = 0; i < 113; i++);
}

数码管显示

#define DUANXUAN P3
sbit WEI1 = P2^6;
sbit WEI2 = P2^7;
int nums[10] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};
void delay_ms(unsigned int n)//延时1ms函数
{
	unsigned char i;
    while(n--)
        for(i = 0; i < 113; i++);
}
void display_num(int num)
{
	WEI1 = 0; 
	DUANXUAN = nums[num / 10]; //显示个位
	delay_ms(25);
	WEI1 = 1; 
	WEI2 = 0;  
	DUANXUAN = nums[num % 10]; //显示十位
	delay_ms(25);
	WEI2 = 1; 
}

数码管阴阳极

共阴极数码管:位选高电平有效,段选低电平有效

共阳极数码管:位选低电平有效,段选高电平有效

中断相关的寄存器

定时/计数控制寄存器(TCON)

定 时器中断 外部中断
D7 D6 D5 D4 D3 D2 D1 D0
功能 TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
详细 定时器1中断标志位 打开定时计数器1 定时器0中断标志位 打开定时计数器1 外部中断1标志位 外部中断1触发方式 外部中断0标志位 外部中断0触发方式

注释:外部中断触发方式(IT0/IT1)为1时负跳变触发,为0时低电平触发。

定时器工作方式寄存器(TMOD)

定时器1 定时器0
D7 D6 D5 D4 D3 D2 D1 D0
功能 GATE C/T M1 M0 GATE C/T M1 M0
决定定时器的开启方式。当其等于0时,定时器完全由TRx决定。当其等于1时,定时器由TRx和INTx(外部中断引脚,高电平)决定 选择频率的来源。=0时-定时器-12/晶振频率。=1时-计数器-外部脉冲频率。 M1与M0选择定时/计数器的工作方式,详见下表。定时器0与定时器1一致。 GATE C/T M1 M0

M1与M0(定时计数器工作方式)

M1 M0 工作方式
0 0 方式0:计数器大小是13bit(Thx与低5bit的Tlx)
0 1 方式1:计数器大小是16bit
1 0 方式2:计数器大小是8bit
1 1 方式3:T0分为两个独立的计数器,T1没有工作方式

中断允许寄存器(IE)

D7 D6 D5 D4 D3 D2 D1 D0
功能 EA ES ET1 EX1 ET0 EX0
详细 总中断允许位。=0时CPU屏蔽所有中断。=1时CPU接收所有中断。 串口中断允许位。=0时禁止串口中断。=1时允许串口中断。 定时计数器中断1允许位。=0时禁止。=1时允许 外部中断1允许位。=0时禁止。=1时允许 定时计数器中断0允许位。=0时禁止。=1时允许 外部中断0允许位。=0时禁止。=1时允许

中断地址

中断编号 中断源 入口地址
0 外部中断0 0003H
1 定时计数器中断0 000BH
2 外部中断1 0013H
3 定时计数器中断1 001BH
4 串口中断 0023H

外部中断的开启步骤及举例

1.设置外部中断的触发方式(IT0/IT1)

2.开启外部中断允许位(EX0/EX1)

3.开启总中断(EA)

例子:

void INTconfiuration()
{
	IT1=0;//设置外部中断1的触发方式为低电平触发
	EX1=1;//开启外部中断1允许位
	EA=1;//开启总中断允许位
}

定时计数器中断的开启步骤及举例

1.选择工作方式(M0,M1)

2.选择控制方式(设置GATE)

3.选择计数还是定时模式(设置C/T)

4.给定时计数器赋初值(设置THx和TLx)(x为0或1)

5.开启定时计数器中断允许位

6.开启总中断允许位

7开启定时计数器(设置TR1/TR0)

定时/计数器中断举例

void TimeConfiguration()//定时器0对红绿灯进行操作
{
	TMOD = 0x01;//定时计数器0设置为工作方式1
	TL0 = 0x66;	//设置定时器初值
	TH0 = 0xFC;	//设置定时器初值 11.0592MHz  延时1ms
	ET0 = 1;//开启定时计数器0中断
    EA = 1;	//开启总中断
	TR0 = 1;//开启定时计数器0
}

中断函数举例(外部中断/定时计数器中断)

void LED_change() interrupt 1 //返回值必须为空
{
    //具体代码~~
}

频率周期

晶振频率:fosc=11.0592MHZ

晶振周期:T晶振=1/fosc=1/11.0592MHZ

把晶振周期定义为一个节拍,记为P,2个节拍作为状态周期S=2P。

机器周期:芯片内部时间的最小单位,其他所有事件的执行时间都是它的整数倍。T机器=6S=12P=12/11.0592MHZ~~1.085us=1us.

运用举例:用于计数器初值的计算:用12MHZ的晶振频率,对应的机器周期时1us.此时若定时1ms的初值即要运行1000次的机器周期(计数1000次)。

AT24C02

通讯接口:I2C总线

容量:256字节

I2C总线

两根通信线:SCL(Serial clock),SDA(Serial data)

img

img

img

I2C时序

  • 起始条件:SCL高电平,SDA从高到低
  • 终止条件:SCL高电平,SDA从低到高

img

  • 发送一个字节

img

  • 接受一个字节(主机在接收之前释放SDA线是为了把控制权交给从机)

    img

  • 发送应答:接收完之后发送应答(从机给主机发送是否应答,主体是从机)

  • 接收应答:发送完之后接收应答(主机给从机发送是否应答,主体是主机)

img

I2C数据帧

img

第一个字节数据一定要发从机地址和加上读写位(找谁)

一个字节是八位,前七位是地址,最后一位是读写标志位(W写是0,R读是1)

前四位是固定端(A6,A5,A4,A3)(24C02是固定为1010)

后三位可配置(A2,A1,A0)

img

img

img

img

posted @ 2024-12-26 13:23  燊楽  阅读(5)  评论(0编辑  收藏  举报