前言
本实验基于STC89C52单片机,12MHz晶振,通过软件延时控制P2.0引脚LED,实现亮1s、灭1s循环闪烁。采用REGX52.H标准头文件,代码为基础IO输出入门案例,Keil C51编译后可直接烧录测试,适合新手理解IO电平操作与软件延时原理。
硬件原理图
51单片机P2口属于准双向IO口,开发板LED多为共阳极接法,引脚输出低电平时LED点亮,高电平熄灭。12MHz晶振下单片机机器周期为1us,利用双重for循环编写简易毫秒延时函数,控制高低电平维持时间,实现LED周期性闪烁。软件延时无需配置定时器,代码简单直观,是单片机入门经典实验。
proteus8.17仿真图
完整源码
#include <REGX52.H> /* 主函数*/ sbit LED = P2^0; void Delay_ms(unsigned int t) // 简单毫秒延时,12MHz晶振 { unsigned int i,j; for(i=t; i>0; i--) for(j=110; j>0; j--); } void main(void) { while(1) { LED = 0; Delay_ms(1000); // 点亮,保持1s LED = 1; Delay_ms(1000); // 熄灭,保持1s } }复制成功
代码解析
sbit LED = P2^0; 位定义,将LED映射至P2.0引脚。Delay_ms为通用毫秒延时函数,适配12MHz晶振,形参t设置延时毫秒。主函数while(1)无限循环:拉低P2.0点亮LED,延时1000ms;拉高P2.0熄灭LED,再次延时1000ms,不断重复。
问题排查
闪烁时间不准:软件延时属于粗略延时,12MHz晶振可微调j的数值修正。
LED不亮:检查电路,若是共阴极LED,需要互换LED=0与LED=1。
编译报错:Keil工程选择51系列芯片,确认REGX52.H头文件正常。
实现效果
预期效果:p20口led小灯 一秒闪烁一次
种瓜得瓜,种豆得豆!!!