看了挑战后,就想看看自己是否有60%了。但想好久都没有写,因c语言很久没用了,也因思路不清就放下了,看了下大虾们推荐的状态机,有了点思路。但最近要找实习单位就一直没写,今天突然想起就试试,调试下行了。哈哈。
还有我最近一直纠结于是选PLC还是单片机发展。不知道该走那条路呀?选择单片机,下学期就要实习了,已没时间深入了。工作后··········
//----------------------------------------
//第一个按键按下去时候,第一个LED以10Hz频率闪烁,
//再次按下时候,熄灭,再次按下时候,闪烁,依次循环。
//第二个按键按下去等到放开时候,第二个LED以100hz频率闪烁。
//再次按下放开,熄灭,第三次按下放开,闪烁,依次循
//第三个按键按下去时候,第三个Led
//以50Hz频率闪烁,放开时候LED熄灭。
//----------------------------------------
#include<reg51.h>
#define uint unsignedint
#define uchar unsignedchar
uint ky1=0; //按键1状态变量,初态为0
uint ky2=0; //按键2状态变量
uint ky3=0; //按键3状态变量
uint shi_ms=0; //计时变量
sbit led1=P3^0;//led灯
sbit led2=P3^1;
sbit led3=P3^2;
sbit key1=P1^0;//按键
sbit key2=P1^1;
sbit key3=P1^2;
bit ld1=0;//led1闪烁标志,为1时led1闪烁
bit ld2=0;//led2闪烁标志,为1时led2闪烁
bit ld3=0;//led3闪烁标志,为1时led3闪烁
void dingshi0_csh() //定时器0初始化
{
EA=1;
ET0=1;
TR0=1;
TMOD = 0x01; //设定时器0功能为计时
TH0=0xfc; //1ms中断一次
TL0=0x18;
}
void main()
{
dingshi0_csh();//定时器0初始化
while(1) //下面是按照状态机的思想编写的
{
switch(ky1) //按键1的状态处理
{
case 0: //在初态中等待按键按下
{
if(0==key1)
{ky1=1;} //按键按下转状态1
} break;
case 1: //在状态1中消抖
{
//延时未写
if(0==key1) //消抖后按键是按下
{
ky1=2; //状态转移
ld1=~ld1;//闪烁处理,原是熄灭,闪烁;原闪烁则熄灭
led1=1; //让灯熄灭,保证按下按键后灯是熄灭的
}
else //消抖后按键没有按下
ky1=0; //返回初状态
}break;
case 2: //在状态2中等待按键释放
{
if(1==key1)
{
ky1=3;
}
}break;
case 3: //判断按键是否释放
{
//延时
if(1==key1) //按键释放,跳状态0等待下一次按键
{
ky1=0;
}
else //按键没释放,跳状态2等待按键释放
ky1=2;
} break;
}
switch(ky2)
{
case 0:
{
if(0==key2)
{
ky2=1;
}
} break;
case 1:
{
if(0==key2)
{
ky2=2;
}
else
ky2=0;
} break;
case 2:
{
if(1==key2)
{
ky2=3;
}
}
case 3:
{
if(1==key2)
{
ky2=0;
ld2=~ld2;
led2=1;
}
else
ky2=2;
} break;
}
switch(ky3)
{
case 0:
{
if(0==key3)
{
ky3=1;
}
} break;
case 1:
{
if(0==key3)
{
ky3=2;
ld3=1;
}
else
ky3=0;
}
case 2:
{
if(1==key3)
{
ky3=3;
}
} break;
case 3:
{
if(1==key3)
{
ky3=0;
ld3=0;
led3=1;
}
else
ky3=2;
} break;
}
}
}
void Timer0Interrupt() interrupt 1
{
TH0 = 0x0FC;
TL0 = 0x18;
shi_ms++;
if(0==(shi_ms%100)&&ld1==1)//0.1s并来了led1标志位ld1为1
{ //led1以10HZ频率闪烁
led1=~led1;
}
if(0==(shi_ms%10)&&ld2==1)//0.01s并来了led1标志位ld1为1
{ //led1以100HZ频率闪烁
led2=~led2;
}
if(0==(shi_ms%20)&&ld3==1)//0.02s并来了led1标志位ld1为1
{ //led1以50HZ频率闪烁
led3=~led3;
}
if(200==shi_ms)
{
shi_ms=0;
}
}
|
相关推荐
单片机编程讲座.ppt 单片机编程讲座.ppt 单片机编程讲座.ppt 单片机编程讲座.ppt 单片机编程讲座.ppt
技小新,mqtt单片机编程
单片机的学习c的深化,有助于对单片机的快速把握,该书提供较为深刻的实战经验
单片机扩展技术,单片机应用技术,单片机学习,单片机编程,单片机扩展技术,单片机应用技术,单片机学习,单片机编程,单片机扩展技术,单片机应用技术,单片机学习,单片机编程,单片机扩展技术,单片机应用技术,...
单片机编程100问.。。。。。。。。。。。
单片机编程技巧单片机编程技巧单片机编程技巧单片机编程技巧单片机编程技巧
技小新-MQTT单片机编程小工具.rar
c51单片机编程工具,号称经典。c51单片机编程工具,号称经典。
这个系列单片机具有以下体现微控制器工业发展新趋势的特点:高速度、低工作电压、低功耗、I/O口直接驱动LED能力、低价位、小体积、指令简单易学易用等。内容包括:该系列主要芯片的系统结构和工作原理;片内各种丰富...
自己整理的资料 可控制U盘扇区的读写 单片机编程单片机编程
单片机编程100例教程文件.pdf
单片机编程使用的小工具,直接生成代码提高效率
ISPlay v单片机编程ISPlay v单片机编程ISPlay v单片机编程ISPlay v单片机编程单片机ISPlay v单片机编程
单片机的编程语言很多,最常见的为汇编语言和C 语言。本文对各种编程语言的优缺点作了比较详尽的 分析,为单片机技术的初学者指明单片机编程语言学习的方向。单片机的编程语言很多,最常见的为汇编语言和C 语言。...
只能用于单片机的编写,而不能做其他应用,这只是一个文件,若有议,可在百度上下载keil 5,其编程软件,个人觉的还不错。
单片机编程单片机编程
单片机编程器完整资料,包括学习和软件资料。是一本很好的单片机学习的资料
单片机编程魔法师之高级裸编程思想..
自己动手做51系列单片机编程器 自己动手做51系列单片机编程器
基于AVR单片机的红外壁障智能小车程序,该代码是AVR单片机编程的实例,初学者可以参考源码编写类似的其他程序