WeChat:【嵌入式工程师成长日记】
https://mp.weixin.qq.com/s?__biz=Mzg4Mzc3NDUxOQ==&mid=2247484096&idx=2&sn=d3b736ae310c318b7316e5d92b8dd66e&chksm=cf430798f8348e8ed59d201120064b481a8b5e92ab979e471b781acee209d894e9ba86f77b3f&token=3445295&lang=zh_CN#rdhttps://mp.weixin.qq.com/s?__biz=Mzg4Mzc3NDUxOQ==&mid=2247484096&idx=2&sn=d3b736ae310c318b7316e5d92b8dd66e&chksm=cf430798f8348e8ed59d201120064b481a8b5e92ab979e471b781acee209d894e9ba86f77b3f&token=3445295&lang=zh_CN#rd
具体功能实现:
当按下开关时,蜂鸣器报警,同时LED旋转式亮灯。
使用器件:
AT89C51、按键、电阻、蜂鸣器(SOUNDER)、8只LED灯
Proteus仿真原理图及视频 :
仿真:
知识介绍:
Proteus布线:
为了让整个原理图看上去简洁明了,我们对元器件的导线进行标号,而不是直接和芯片相连。
定时中断系统简图:
定时器资源:
定时器个数:3个(T0,T1,T2),T0和T1与传统的51单片机兼容,T2是此型号单片机增加的资源。
(T0和T1的操作方式是所有51单片机共有的)
中断号:
外部中断0 interrupt 0
定时器0 interrupt 1
外部中断1 interrupt 2
定时器中断1 interrupt 3
串口中断 interrupt 4
中断系统:
执行现程序的过程中,出现某些急需处理的异常情况或特殊请求,CPU暂时中止现行程序,而转去对这些异常情况或特殊请求进行处理,在处理完毕后CPU又自动返回到现行程序的断点处,继续执行原程序。
主要代码(C语言)KEIL5实现:
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit SPK = P3^7;
uchar FRQ = 0x00;
void Delayms(uint ms)
{
uchar i;
while(ms--)
{
for(i=0;i<120;i++);
}
}
void main()
{
P2 = 0x00;
TMOD = 0x11;
TH0 = 0x00;
TL0 = 0xff;
IT0 = 1;
IE = 0x8b;
IP = 0x01;
TR0 = 0;
TR1 = 0;
while(1)
{
FRQ++;
Delayms(1);
}
}
void EX0_INT() interrupt 0
{
TR0 = !TR0;
TR1 = !TR1;
if(P2 == 0x00)
P2 = 0xe0;
else
P2 = 0x00;
}
void T0_INT() interrupt 1
{
TH0 = 0xfe;
TL0 = FRQ;
SPK = ~SPK;
}
void T1_INT() interrupt 3
{
TH0 = -45000/256;
TL0 = -45000%256;
P2 = _crol_(P2,1);
}
问题解答 :
Q:定时器计算如何快速得到?(无需计算)
打开51单片机烧录软件STC-ISP,找到“定时器计算器”,根据红色方框中的进行设置,可以快速得到定时器初始化代码,可直接使用。
Q:
在此项目中为什么LED灯高电平有效?
A:
LED灯的特性之一是单向导电性,阳极大于阴极才能够导通,阴极接地可以想象成0,所以阳极置1可以达到阳极大于阴极。