大家好,又见面了,我是你们的朋友全栈君。
三个按键:A按键启动、B按键控制不同流水速度(低中高)、C按键
设计思路一(未用中断):
8个LED灯正极解电源,负极接单片机I/O口。
死循环:设置P2口为11111110,使用左移函数,循环七次。
同时每次位移中间加入延时函数。
三个按键:A按键启动、B按键控制不同流水速度(低中高)、C按键控制流水灯暂停蜂鸣器长响:
思路一:设置一个变量i,起初为0,按下A键后为1;当i为1进入死循环
设置变量j,按下B,j++,当j大于3,j=j-3;使用j*1000,来空置循环函数的延时时间。设置bit变量s=0,按下按键C,s++,当s=1,j进入循环蜂鸣器响,s=0退出循环。
在每次延时时检查按键
#include<reg52.h>
#include<intrins.h>
typedef unsigned int u16;
typedef unsigned char u8;
u8 j=1;
#define LED P2
sbit K1=P3^1;
sbit K2=P3^0;
sbit K3=P3^2;
sbit BUZ=P1^5;
void delayk(u16 i) //延时函数快,
{
while(i--);
}
void delay() //延时函数
{
void key2();
void key3();
u16 y;
switch(j)
{
case 1:for(y=10000;y>0;y--){key2();key3();}break;
case 2:for(y=20000;y>0;y--){key2();key3();}break;
case 3:for(y=40000;y>0;y--){key2();key3();}break;
}
}
void key2()
{
if(K2==0)
{
delayk(1000);
if(K2==0)
{
++j;
}
if(j>3) { j=j-3;}
}
while(!K2);
}
void key3()
{
u8 i;
if(K3==0)
{
delayk(1000);
if(K3==0)
{
i=1;
while(i)
{
BUZ=0;
while(K3==1&&i==1)
{
if(K3==0)
{
delayk(1000);
if(K3==0)
{
i=0;BUZ=1;while(!K3);
}
}
}
}
}
}
}
void pamadeng()
{
u8 i;
while(1)
{
key2();
key3();
LED=0XFE; //1111 1110
delay();
for(i=0;i<7;i++)
{
key2();
key3();
LED=_crol_(LED,1);
delay();
}
}
}
void main()
{
while(1)
{
if(K1==0)
{
delayk(1000);
if(K1==0)
{
pamadeng();
}
}
}
}
设计思路二:(使用中断)
设置一个变量i,起初为0,按下A键后为1;当i为1进入死循环
设置变量j,按下B,进入中断2,当j大于3,j=j-3;使用j*1000,来空置循环函数的暂停时间。设置bit变量s=0,按下按键C,进入外部中断0,s++,当s=1,j进入循环蜂鸣器响,s=0退出循环。
#include<reg52.h>
#include<intrins.h>
typedef unsigned int u16;
typedef unsigned char u8;
typedef bit u1;
#define LED P2
sbit K1=P3^0; //2号开关
sbit K2=P3^3; //4号开关
sbit K3=P3^2; //3号开关
sbit BUZ=P1^5; //蜂鸣器
u8 j=1; //用于记录K2按键
void delay(u16 i)
{
while(i--);
}
void open02() //打开外部中断0,2
{
EA=1; //总中断
EX0=1; //打开外部中断0
IT0=1; //边沿触发方式
EX1=1; //打开外部中断1
IT1=1; //边沿触发
}
void pamadeng() //控制跑马灯跑动
{
u8 i;
while(1)
{
LED=0XFE; //1111 1110
delay((j*20000));
for(i=0;i<7;i++)
{
LED=_crol_(LED,1);
delay((j*20000));
}
}
}
void main()
{
open02();
while(1)
{
if(K1==0)
{
delay(1000);
if(K1==0)
{
pamadeng();
}
}
}
}
void key2() interrupt 2 //外部中断1,记录按键2次数
{
delay(1000); //消抖
if(K2==0)
++j;
if(j>3)
j=j-3;
}
void key3() interrupt 0 //外部中断0,跑马灯暂停
{
delay(1000); //消抖
if(K3==0)
{
u1 k=1; //用于记录K3按键
BUZ=0;
while(k)
{
while(K3==1&&k==1)
{
if(K3==0)
{
delay(1000); //消抖
if(K3==0)
{
k=~k;BUZ=1; //关闭蜂鸣器
while(!K3); //确认按键松开
}
}
}
}
}
}
学习收获:
单片机:集成电路芯片;计算机部件集成;
模电:
半导体:原子最外层电子4个(既易得电子又易失电子,硅、锗),
二极管:掺杂正极性P,掺杂负极性N。LED,掺杂加入通电发光物质,长脚正,短脚负,正极里面东西小,负极大;稳压管,反接稳压。P中空穴多,P中电子多。但是电场方向是N指向P。
三极管:NPN,B高电平连通(箭头指向外);PNP,B低电平连通。C高,E低(箭头指向内)
场效应管:FET
芯片:www.alldatasheetcn.com
运算放大器,比较器
上面有一横低电平有效,无一横高电平有效
数电:
TTL:5高0低(大于2高,小于0.8低)
COMS:
HVCMOS:3.3高0低(大于1.7高,小于0.7低)
LVCMOS:2.5高0低
RS232电平通信:
负逻辑:+12低电平,-12高电平
Long 32位(51) 32位VC与int无区别 int 16位 short 16位 char 8位
float 32位 double 64位
sbit:特殊功能位声明
bit:位变量声明
ROM 掉电不丢失(只读不写)
RAM 掉电丢失
P3.0 RXD串行口输入
P3.1 TXD串行口输出
(通信)
P3.2 INT0外部中断0输入
P3.3 INT1外部中断1输入
P3.4 T0定时器0外部输入
P3.5 T1定时器1外部输入
P3.6 WR外部写控制
P3.7 RD外部读控制
震荡周期,时钟周期:晶振提供
状态周期:时钟周期的两倍
机器周期:CPU完成一个独立操作;六个状态周期,十二个震动周期
指令周期:CPU完成一条指令所需要的全部时间;每条指令执行时间都是由一个或几个机器周期组成,MCS-51有单,双,四周期指令
对I/O口的控制
上(下)拉电阻,将不确定的信号全部转化高(低)电平
电源电路:
复位电路:高电平复位(上电复位(启动复位),手动复位)
复位电路中电容作用:
电容主要对于上电复位:单片机上电,给电容充电,电路导通,RST高电平,电容充满后,电路不导通,RST 低电平。完成复位
时钟电路:
下载电路:
I/O口
延时函数:
Void delay(unsigned int i)
{
While(i–)
}
当i=1时大概是10微秒
中断:
外部中断0,INT0 P3.2
定时器中断0,T0 P3.4
外部中断1,INT1 P3.3
定时器中断1,T1 P3.5
RX,TX P3.0 P3.1
后期计划:
继续巩固51的学习,同时进入STM32的学习
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/135637.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...