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)
I2C时序
- 起始条件:SCL高电平,SDA从高到低
- 终止条件:SCL高电平,SDA从低到高
- 发送一个字节
-
接受一个字节(主机在接收之前释放SDA线是为了把控制权交给从机)
-
发送应答:接收完之后发送应答(从机给主机发送是否应答,主体是从机)
-
接收应答:发送完之后接收应答(主机给从机发送是否应答,主体是主机)
I2C数据帧
第一个字节数据一定要发从机地址和加上读写位(找谁)
一个字节是八位,前七位是地址,最后一位是读写标志位(W写是0,R读是1)
前四位是固定端(A6,A5,A4,A3)(24C02是固定为1010)
后三位可配置(A2,A1,A0)