提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 环境搭建
- KEIL-C51环境
- 单片机使用IO口
- (1)使用独立按键控制LED灯
- (2)外部中断1下降沿触发
- (3)不同频率闪烁多个led灯
- (4)外部中断0下降沿触发
- 总结
环境搭建
编译环境可以选择使用keil软件,VScode扩展Eide,或者在ubuntu下使用sdcc编译代码
KEIL-C51环境
搭建keilc51环境需要keil4软件和注册机,这里给出网盘地址链接:https://pan.baidu.com/s/1OYyuyw1xWrO7KoR5xQ5aAA
提取码:6161
单片机使用IO口
(1)使用独立按键控制LED灯
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
sbit KEY=P3^3; //定义按键输入端口
sbit LED=P1^2; //定义led输出端口
/*------------------------------------------------
主函数
------------------------------------------------*/
void main (void)
{
KEY=1; //按键输入端口电平置高
while (1) //主循环
{
if(!KEY) //如果检测到低电平,说明按键按下
{
LED=0;
}
else
{
LED=1; //这里使用if判断,如果按键按下led点亮,否则熄灭
}
//上述4句可以用一句替代 LED=KEY;
//主循环中添加其他需要一直工作的程序
}
}
(2)外部中断1下降沿触发
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
sbit LED=P1^0; //定义LED端口
void DelayUs2x(unsigned char t);//us级延时函数声明
void DelayMs(unsigned char t); //ms级延时
/*------------------------------------------------
主程序
------------------------------------------------*/
main()
{
LED=0; //LED灯点亮
EA=1; //全局中断开
EX1=1; //外部中断1开
IT1=1; //IT1=1表示边沿触发
while(1)
{
//在此添加其他程序
}
}
/*------------------------------------------------
外部中断程序
------------------------------------------------*/
void ISR_INT1(void) interrupt 2
{
if(!INT1)
{
DelayMs(10);//在此处可以添加去抖动程序,防止按键抖动造成错误
if(!INT1)
//while(!INT1);//等待按键释放
{
LED=!LED;
}
}
}
/*------------------------------------------------
uS延时函数,含有输入参数 unsigned char t,无返回值
unsigned char 是定义无符号字符变量,其值的范围是
0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
长度如下 T=tx2+5 uS
------------------------------------------------*/
void DelayUs2x(unsigned char t)
{
while(--t);
}
/*------------------------------------------------
mS延时函数,含有输入参数 unsigned char t,无返回值
unsigned char 是定义无符号字符变量,其值的范围是
0~255 这里使用晶振12M,精确延时请使用汇编
------------------------------------------------*/
void DelayMs(unsigned char t)
{
while(t--)
{
//大致延时1mS
DelayUs2x(245);
DelayUs2x(245);
}
}
(3)不同频率闪烁多个led
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
sbit LED0=P1^0;// 用sbit 关键字 定义 LED到P1.0端口,LED是自己任意定义且容易记忆的符号
sbit LED1=P1^1;
sbit LED2=P1^2;
sbit LED3=P1^3;
sbit LED4=P1^4;
sbit LED5=P1^5;
sbit LED6=P1^6;
sbit LED7=P1^7;
void Delay(unsigned int t); //函数声明
/*------------------------------------------------
主函数
------------------------------------------------*/
void main (void)
{
//此方法使用bit位对单个端口赋值
unsigned char i; //定义一个无符号字符型局部变量 i 取值范围 0~255
while (1) //主循环
{
for(i=0;i<10;i++) //加入 for循环,表明for循环大括号中
//的程序循环执行10次
{
LED0=0; //将P1.0口赋值 0,对外输出低电平
LED2=1;
LED4=0;
Delay(5000); //调用延时程序;更改延时数字可以更改延时长度;
//用于改变闪烁频率
LED0=1; //将P1.0口赋值 1,对外输出高电平
LED2=0;
LED4=1;
Delay(5000);
}
for(i=0;i<10;i++)
{
LED0=0; //将P1.0口赋值 0,对外输出低电平
LED2=1;
LED4=0;
Delay(60000); //调用延时程序;更改延时数字可以更改延时长度;
//用于改变闪烁频率
LED0=1; //将P1.0口赋值 1,对外输出高电平
LED2=0;
LED4=1;
Delay(60000);
}
//主循环中添加其他需要一直工作的程序
}
}
/*------------------------------------------------
延时函数,含有输入参数 unsigned int t,无返回值
unsigned int 是定义无符号整形变量,其值的范围是
0~65535
------------------------------------------------*/
void Delay(unsigned int t)
{
while(--t);
}
(4)外部中断0下降沿触发
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
/*------------------------------------------------
主程序
------------------------------------------------*/
main()
{
P1=0x55; //P1口初始值
EA=1; //全局中断开
EX0=1; //外部中断0开
IT0=1; //边沿触发
while(1)
{
//在此添加其他程序
}
}
/*------------------------------------------------
外部中断程序
------------------------------------------------*/
void ISR_Key(void) interrupt 0 using 1
{
P1=~P1; //s3按下触发一次,P1取反一次
}
总结
以上是51单片机关于IO口使用的代码,