51做 十六制计数器和流水灯
小记
本文重点在使用了 51单片机的计时中断,和在proteus中仿真要注意的代码。
十六进制计数器
题目要求:用P0.0- P0.03设计一个在0-15之间自动计数的十六进制计数器,每个数值保持0.2s。
代码
#include<reg52.h>
void Timer0Init(void) //20微秒@12.000MHz
{
TMOD = 0x02; //设置定时器模式
TL0 = 0x10; //设置定时初值
TH0 = 0x10; //设置定时重载值
EA=1; //开总中断
ET0=1; //开定时器中断
TR0=1; //启动定时器0
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
}
int num=0;
int cnt=0;
void T0_time() interrupt 1
{
++num;
if(num==10000)
{
num=0;
cnt=(cnt+1)%16;
P0=cnt;
}
}
void main()
{
Timer0Init();
while(1);
}
电路图
代码解释
setp1: 定时部分代码可以使用 stc-isp生成,但是还要再修改
step2:
.但是AUXR是一个扩展的寄存器,是51的增强型才有,而proteus中没有,故要删除这行。
step3: 添加中断
(from 手册里的8位自动重装)
知道要打开 中断1,添加
EA=1; //开总中断
ET0=1; //开定时器中断
step4:计算 0.2s由 几个 20 μ s 20\mu s 20μs 组成
用8位自动重载生成10微秒中断。
1
μ
s
=
1
0
−
6
s
1
m
s
=
1
0
−
3
s
因
此
0.2
s
=
200
m
s
=
2
∗
1
0
5
μ
s
=
1
0
4
∗
20
μ
s
1\mu s=10^{-6}s\\ 1 ms =10^{-3}s\\ 因此 0.2s=200ms=2*10^5\mu s=10^4*20\mu s
1μs=10−6s1ms=10−3s因此0.2s=200ms=2∗105μs=104∗20μs
流水灯
代码
#include<reg52.h>
void delay(int a)
{
a=a*10;
while(a--);
}
void main()
{
int cnt=0;
int arr[]={1,2,4,8,16,32,64,128};
while(1)
{
P0=arr[cnt];
cnt=(cnt+1)%8;
delay(1000);
}
}
easy,不解释
在上面的基础上再添加了一排灯,总图为
杂(可以不看)
stc89c51和AT89C51区别?
它们两统称为51单片机
为什么课本学的是15单片机,而使用的是51单片机。、
单片机手册可以区stc官网找
参考博客:传送门1-讲到外接存储器部分
老师使用面包板对 15单片机的4个模式进行测试,
在不同的解法和输出下,观察led灯的亮暗知道不同模式的电流大小。
STC15F2K60S2单片机的所有I/O口均有4种工作模式::准双向口(传统8051单片机I/O模式)、推挽输出、仅为输入(高阻状态)与开漏模式
但是proteus不支持15单片机的仿真,而 51单片机是远古单片机,只有准双向口这种输出模式(就是普通的开漏输出加上拉)故而不能在proteus上测试这4种模式的效果。
小。
STC15F2K60S2单片机的所有I/O口均有4种工作模式::准双向口(传统8051单片机I/O模式)、推挽输出、仅为输入(高阻状态)与开漏模式
但是proteus不支持15单片机的仿真,而 51单片机是远古单片机,只有准双向口这种输出模式(就是普通的开漏输出加上拉)故而不能在proteus上测试这4种模式的效果。