高手帮我看看错在哪里
2016年06月10日 点击:
编辑: 数码爱好者
#include <reg52.h>
typedef unsigned char u8;
typedef unsigned short int u16;
typedef unsigned long int u32;
sbit RELAY = P1^4; //定义继电器使用的IO口
sbit K1 = P0^0; //定义按键使用的IO口
//定时器1重载值:10毫秒@11.0592MHz
#define TL1_ReloadValue 0x00
#define TH1_ReloadValue 0xDC
void Timer1Init(void)
{
AUXR &= 0xBF; //定时器时钟12T模式
TMOD &= 0x0F; //设置定时器模式
TMOD |= 0x10; //设置定时器模式
TL1 = TL1_ReloadValue; //设置定时初值
TH1 = TH1_ReloadValue; //设置定时初值
TF1 = 0; //清除TF1标志
TR1 = 1; //定时器1开始计时/
}
void Timer1_Handler(void) interrupt 3 //定时器1中断服务程序
{
//重装定时1:
TL1 = TL1_ReloadValue;
TH1 = TH1_ReloadValue;
TF1=0;//清除定时器1中断标记
cnt10ms++;//累加1个10ms计数器,供主程序使用
}
void main()
{
u8 step=0;//状态机
Timer1Init();//10毫秒@11.0592MHz
ET1=1; //允许定时器1中断
EA=1; //允许总中断
cnt10ms=0;//10ms计数器清零
while(1)//大循环
{
//处理按键和继电器状态机:
switch(step)
{
case 0://等待按键启动
{
if(K1 == 0)//如果按键按下,则启动一个继电器动作
{
RELAY = 0; //打开继电器
cnt10ms=0;//10ms计数器清零
step = 1;//下一步:继电器动作,并保持设定的时间
}
else
{
RELAY = 1; //关闭继电器
}
break;
}
case 1://继电器动作,并保持设定的时间
{
if(cnt10ms < (3600*100))//还没到1小时
{
RELAY = 0; //打开继电器
}
else//超过1小时
{
RELAY = 1; //关闭继电器
step = 0;//回到等待按键启动状态
}
break;
}
default://错误状态,只要硬件不出错,永远不会执行到这里
{
step = 0;//回到等待按键启动状态
break;
}
}
}
}
相关文章
- · 新到手 蓝牙大师10代PLUS 红外波形(没买的建议不要买了,与老9代高端差不多。) 2018-06-14
- · 06CD复制机黑屏求救 2017-02-14
- · 在某宝买了点单片机资料,不知道有没有用 2016-11-15
- · 已传完 疯狂STM32实战讲学录 2017-10-26
- · 已传完 跟我学单片机 2017-10-18
- · stm8实战 已传完 2017-10-13
- · 已传完:PROTEUS 原理图设计与电路仿真 就这么简单 2017-09-13
- · 单片机入门学习电子书(适合新手基础入门学习,仅共个人学习使用。) 2019-06-12
- · 已传完 从零开始学C语言+资源包 2018-04-08
- · 经典80C51单片机快速进阶与实作 已传完 2018-04-16