1.最小单片机系统:晶振,电源,复位电路
2.点亮led灯:
#include<reg51.h>
sbit LED =P2^0;//声明引脚,P是大写
void main()
{
LED=0;//引脚输出低电平
while(1);//程序停止在这里
}
3.led流水灯左右移程序
#include<reg51.h>
#include<intrins.h>
#define led P2
void delay (int i)
{
while(i--);
}
int main()
{
int count=0,i=0;
while(1)
{
for(i=0;i<=16;i++)
{
if(i<=8)
{
led=(0xfe<<count);//11111110=fe
delay(5000);
count++;
if(count>=8)
{
count=0;
}
}
else
{
led=(0x7f>>count);//11101111=7f
delay(5000);
count++;
if(count>=8)
{
count=0;
i=0;
}
}
}
}
return 0;
}
移位运算:右移左补0,左移右补0;
例如:1111 1110 ——左移1位:1111 1100
右移1为:0111 1111
3.定时器
Ⅰ.时钟周期:时钟周期是时序中的最小单位,时钟周期=1/时钟源频率(晶振频率)
Ⅱ.机器周期:机器周期是指完成一条指令的时间,机器周期=12x时钟周期
Ⅲ.定时器寄存器
定时器:T0,T1
TCON:定时器控制寄存器
tcon.PNG
tcon控制寄存器描述
注意:当只要能够有硬件置1或者清0的,单片机可自动完成; 只有软件清0的,只能用程序完成;
TMOD -定时器寄存器模式的位分配
TMOD -定时器寄存器模式的位分配
TMOD寄存器描述
TMOD寄存器描述
TMOD寄存器工作模式
TMOD寄存器工作模式
注意:TCON可以直接位寻址,TMOD不可以直接位寻址;
例子:TR1=1;允许操作
M1=1; 不允许操作
定时器模式1电路示意图
定时器模式1电路示意图
使用定时器步骤:
1.设置TMOD,配置好工作模式
2.设置计数寄存器 TH0和TL0初值;
3.设置TCON,通过TR0=1来让定时器计数;
4.判断TCON寄存器TF0位,检测定时器溢出情况;
定时器初值设置:(以晶振12M为例)
时钟周期=1/1200 0000;机器周期=12x时钟周期=12/120 0000=0.000001 s
定时20ms=0.02s
s(机器周期个数)x 机器周期 = 0.02s
s=0.02/0.000001 =20,000次
16位定时器的终值=2^16=65536
经过20000后,到达终值65536,那么初值65536-20000=45536;
45536的16进制为:B1E0;
所以高8位THn=0xB1,低8位:TLn=0xE0;
程序:使用定时器点亮流水灯
#include<reg51.h>
#define LED P2
int main()
{
unsigned int count=0;
unsigned int i=0;//必须写道定时器设置前面 DSQ.C(10): error C141: syntax error near 'unsigned'
TMOD=0x01; //1.设定计数器工作模式
TH0=0xB1; //2.给定初值
TL0=0xE0;
TR0=1; //3.打开计时器
while(1)
{
if(TF0==1)
{
TF0=0;
TH0=0xB1;
TL0=0xE0;
i++;
}
if(i>=50) //定时1s
{
if(count<8)
{
i=0;
LED=(0xfe<<count);
count++;
}
else
{
count=0;
}
}
}
return 0;
}
4.数码管
数码管
#include<reg51.h>
#define nu P0
sbit LSA=P2^2;//不能直接赋值,赋值必须用sbit进行位限制
sbit LSB=P2^3;
sbit LSC=P2^4;
int ch[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//共阴极
void delay(int i)
{
while(i--);
}
int main()
{
int i=0;
LSA=0;
LSB=0;
LSC=0;
while(1)
{ for(i=0;i<=16;i++)
{
nu=ch[i];
delay(50000);
}
i=0;
}
}
网友评论