OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3869|回复: 7

各位大师,给指点一二,使程序更加完善。多谢

[复制链接]

6

主题

21

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
217
金钱
217
注册时间
2016-8-2
在线时间
27 小时
发表于 2016-8-3 06:43:39 | 显示全部楼层 |阅读模式
1金钱
[mw_shl_code=c,true]/***************************
        独立按键控制继电器
***************************/
#include <reg52.h>

#define uchar unsigned char

sbit KEY = P1 ^ 0;
sbit RelayEN = P0 ^ 0;                                   //定义继电器开启信号

void Timer0Init();                                           //声明定时器0初始化函数
void RelayProcess();                                   //声明断电器处理函数

uchar count = 0;                                           //计秒数

void main()                                                           //主函数
{
        RelayEN = 1;                                           //开机时关闭继电器,否则一上电继电器有动作;

        Timer0Init();
        RelayProcess();
       
}

void Timer0Init()                                           //定时器初始化函数
{
        TMOD |= 0x01;                                           //“|”使用多个定时器时不受影响
        TH0 = 0xFC;                                                   //定时1MS
        TL0 = 0x67;
        EA = 1;                                                           //开启总中断
        ET0 = 1;                                                   //开启定时器0中断
}

void RelayProcess()                                          //继电器处理函数
{
        KEY = 0x01;                                                  //读外部状态时,先使端口输出高电平;
        while (1)
        {
                if(!KEY)                                          //判定有无按键按下
                {
                        TR0 = 1;                                  //按键按下开启定时器0,溢出后开启中断
                       
                        if (count >= 20)                  //判定秒数是否达到20MS,即去抖
                        {
                                count = 0;
                                if (!KEY)
                                {
                                        RelayEN = ~RelayEN;//当按键按下时,改变继电器的状态
                                        while(!KEY)    count = 0;           //等待按键释放,当count=20时,定时器也在计数,达到1MS时,count++,TR0=0;下一次按键count会从1开始计数;
                                }
                        }
                }
        }
       
}

void Timer0() interrupt 1          //定时器0中断函数
{
        count++;                                  //计秒数
        TR0 =0;                                          //关闭定时器,否则无按键按下也计数;
        TH0 = 0xFC;                                  //重新赋值给定时器0
        TL0 = 0x67;
                                                                        
}[/mw_shl_code]

最佳答案

查看完整内容[请看2#楼]

你说的话我看懂了,但是程序看得一知半解。不过还是要谢谢你。希望以后多多指点。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

21

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
217
金钱
217
注册时间
2016-8-2
在线时间
27 小时
 楼主| 发表于 2016-8-3 06:43:40 | 显示全部楼层
你说的话我看懂了,但是程序看得一知半解。不过还是要谢谢你。希望以后多多指点。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165353
金钱
165353
注册时间
2010-12-1
在线时间
2108 小时
发表于 2016-8-3 20:19:48 | 显示全部楼层
都不知道你想干嘛。。。
回复

使用道具 举报

6

主题

21

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
217
金钱
217
注册时间
2016-8-2
在线时间
27 小时
 楼主| 发表于 2016-8-4 05:42:39 | 显示全部楼层
正点原子 发表于 2016-8-3 20:19
都不知道你想干嘛。。。

我有注释啊。自学的。不知道这样的程序是否可以用在实际中,如果是单独演示肯定没有问题。
回复

使用道具 举报

17

主题

587

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4467
金钱
4467
注册时间
2013-6-27
在线时间
565 小时
发表于 2016-8-4 08:48:22 | 显示全部楼层
我的按键只是定时中断的一个进程,main只要判断是否有按键,有按键值是多少就行了,其他去斗计数判断按下执行,释放执行,长按执行在中断函数处理完成。

定时中断处理进程

定时中断处理进程
让我们的思维驾驭在电的速度之上!
回复

使用道具 举报

36

主题

249

帖子

0

精华

高级会员

Rank: 4

积分
680
金钱
680
注册时间
2015-12-13
在线时间
243 小时
发表于 2016-8-4 12:46:38 | 显示全部楼层
本帖最后由 HER107 于 2016-8-4 12:49 编辑

这个定时器开来有什么用???
回复

使用道具 举报

36

主题

249

帖子

0

精华

高级会员

Rank: 4

积分
680
金钱
680
注册时间
2015-12-13
在线时间
243 小时
发表于 2016-8-4 12:57:46 | 显示全部楼层
本帖最后由 HER107 于 2016-8-4 13:00 编辑

演示用的话,这么写就不需要浪费个定时器了!实际使用的话,就得换个写法了,空延时太浪费CPU资源了!并且while(KEY==0);是个陷阱,搞不好会死循环。。比如按键坏了!


[mw_shl_code=c,true]void main(void)
{
         unsigned int i;
         RelayEN=1;
         KEY=1;
        while(1)
        {
        if(KEY==0)
           {
            i=3000;
            while(i--);
             if(KEY==0)
                  {
                   RelayEN=~RelayEN;
                   while(KEY==0);
                   }
              }      
        }
}[/mw_shl_code]


回复

使用道具 举报

6

主题

21

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
217
金钱
217
注册时间
2016-8-2
在线时间
27 小时
 楼主| 发表于 2016-8-5 07:28:23 | 显示全部楼层
HER107 发表于 2016-8-4 12:57
演示用的话,这么写就不需要浪费个定时器了!实际使用的话,就得换个写法了,空延时太浪费CPU资源了!并且w ...

给个建议了。不知道,如何写,才请教大神们啊。定时器用来计时啊,前沿消抖得有时间啊。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-27 09:29

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表