搜索
bottom↓
回复: 43

原来在21ICBBs很活跃的农民讲习所现在没有消息了,我现在编程思想还受到他的影响!

[复制链接]

出0入0汤圆

发表于 2009-9-2 09:02:16 | 显示全部楼层 |阅读模式
觉得他比较无私,就是脾气大点!那位还有他的消息啊?

阿莫论坛20周年了!感谢大家的支持与爱护!!

如果天空是黑暗的,那就摸黑生存;
如果发出声音是危险的,那就保持沉默;
如果自觉无力发光,那就蜷伏于牆角。
但是,不要习惯了黑暗就为黑暗辩护;
也不要为自己的苟且而得意;
不要嘲讽那些比自己更勇敢的人。
我们可以卑微如尘土,但不可扭曲如蛆虫。

出0入8汤圆

发表于 2009-9-2 09:07:01 | 显示全部楼层
我的程序结构也按他的建议写的,确实高人

出0入137汤圆

发表于 2009-9-2 09:09:04 | 显示全部楼层
youth和农民_运动讲习所以前都是c51bbs的老人。

出0入0汤圆

发表于 2009-9-2 09:22:53 | 显示全部楼层
农民_运动讲习所


还有他的帖子链接么?  发一个,学习一下!!看看眼界

出0入0汤圆

发表于 2009-9-2 09:38:27 | 显示全部楼层
还有他的帖子链接么?  发一个,学习一下!!看看眼界

出0入0汤圆

发表于 2009-9-2 09:44:26 | 显示全部楼层
同求!

出0入0汤圆

 楼主| 发表于 2009-9-2 10:24:09 | 显示全部楼层
这是原来在C51bbs发表的:
有一台机电设备,有两个按键,控制设备的两个不同部分。
现要求:
  每个按键按下,相应控制程序运行。但两个按键可以同时按下,就是说两个控制程序可能
需要同时运行。使用一个89C52,如何编写程序?(两个按键的动作可是随机的)

按键1有效:输出1HZ的方波,2S后停止。
按键2有效:一直输出1.2hz的方波,直到按键再次按

注:此程序不使用RTOS等操作系统。 相当放在两个CPU的程序放在一个里面

/*程序说明:
  一)产生波形可以使用中断中计数来产生精确的波形。
      本答案中为更能体现程序的多任务和资源复用问题,采用主程序循环产生。
  二)请特别注意,题意是两个程序在并发运行,实际按本答案可以扩展到N个不同任务同
时运行,在此就不讨论。
      (对大程序结构增加了很多其它的概念)
  三)因为在论坛上直接贴出,所以程序放在一个文件中。
      应该按Timer.c, Key.c, Const.h(存放常量定义),Task1, Task2, Answer.c存放
*/
#include <REG52.h>

/*Timer*/
bit fTimer0_2ms;   /*T0中断产生的标志,准备传递给主循环*/
bit fSYS_2ms;      /*系统T0中断产生的标志,12M,主循环使用*/
bit fSYS_20ms;     /*每20MS产生一次的消息*/

#define INT2MSCOUNT     10                      /*产生2MS所需要的时间次数*/
unsigned char data mTimer_2msReg=INT2MSCOUNT;   /*产生2MS所需要的寄存器*/
#define INT20MSCOUNT    10                      /*产生20MS所需要的时间次数,在
20MS基础上*/
unsigned char data mTimer_20msReg=INT20MSCOUNT; /*产生20MS所需要的寄存器,在20MS
基础上*/

/*KEY*/
unsigned char data mKey1SwapTask;    /***按键任务寄存器***/
unsigned char data mKey2SwapTask;    /***按键任务寄存器***/
sbit iKey1=P1^0;                     /*按键的输入口*/
sbit iKey2=P1^1;

bit fKey1;                          /*为简单化,没使用队列保存键值,使用标志*/
bit fKey2;                          /*为简单化,没使用队列保存键值,使用标志*/


/*Task1*/
unsigned char data mTask1Id;        /*任务一的任务号*/
unsigned char data mTask1_1HzReg;   /*1hz时间寄存器*/
unsigned int data mTask1_2SReg;     /*2S时间寄存器*/
sbit oTask1=P1^2;                   /*输出方波口*/

/*Task2*/
unsigned char data mTask2Id;        /*任务二的任务号*/
unsigned char data mTask2_1p2HzReg; /*1.2hz时间寄存器*/
sbit oTask2=P1^3;                   /*输出方波口*/

/*---------------------------------------------------------------------------*/
/*产生以1MS为基础的系统定时信号,T0作为基准定时器*/

/*************************************************
定时器T0初始化0.2MS,12M
*************************************************/
void Timer0_Init()
{
  TMOD|=0x2;            /*8位定时器*/

  TL0=TH0=~(200)+1;     /*12M*/

  TR0=1;
  ET0=1;
}

/*************************************************
定时器0的中断服务,产生fTimer0_2ms
*************************************************/
void timer0(void) interrupt 1 /*T0中断*/
{
  mTimer_2msReg--;
  if(mTimer_2msReg==0){
    mTimer_2msReg=INT2MSCOUNT;  /*产生1MS所需要的寄存器*/
    fTimer0_2ms=1;
  }
}


答案2: [《农民_运动讲习所》所长] [248次] 03-5-15 14:25:56
/*************************************************
控制消息fSYS_2ms
*************************************************/
void Timer0_MainLoop()
{
  fSYS_2ms=0;
  fSYS_20ms=0;

  if(fTimer0_2ms){
    fTimer0_2ms=0;              /*接收中断过来的时间标志,转换为消息*/
    fSYS_2ms=1;                 /*此消息在一周内有效,被外部程序复用*/
    /*产生20MS的消息*/
    mTimer_20msReg--;
    if(mTimer_20msReg==0){
        mTimer_20msReg=INT20MSCOUNT;    /*产生20MS所需要的寄存器,在20MS基础上*/
        fSYS_20ms=1;
    }
  }
}

/*---------------------------------------------------------------------------*/
/*按键扫描,包含两个扫描任务*/
/**********************************************
每次系统时间进入一次,20ms.这里把20MS判断放进来,好看点
按键扫描循环
为简单化,没使用队列保存键值,使用标志
那些重复发出N键,在这个结构中非常容易加上
**********************************************/
void Key_MainLoop()
{
   if(fSYS_20ms==0)return;

   switch(mKey1SwapTask){
     case 0:/***有按键按下吗?***/
            if(iKey1==0){
              mKey1SwapTask=1;
            }
            break;
    case 1: /***键按下去抖延时***/
            mKey1SwapTask=2;                    /***延时一个系统时间***/
            break;
    case 2: /***键值判断***/
            if(iKey1==0){
              fKey1=1;                          /*按键有效*/
              mKey1SwapTask=3;                  /*去按键去抖*/
            }
            else mKey1SwapTask=0;               /*抖动*/
            break;
    case 3: /***有松开吗?***/
            if(iKey1==1){
              mKey1SwapTask=4;
            }
            break;
    case 4: /***键松开去抖延时***/
            mKey1SwapTask=5;                    /***延时一个系统时间***/
            break;
    case 5: /***键值判断***/
            if(iKey1==1){
              mKey1SwapTask=0;                  /*去按键检测开始*/
            }
            else mKey1SwapTask=3;               /*抖动*/
            break;
   }


   switch(mKey2SwapTask){
     case 0:/***有按键按下吗?***/
            if(iKey2==0){
              mKey2SwapTask=1;
            }
            break;
    case 1: /***键按下去抖延时***/
            mKey2SwapTask=2;                    /***延时一个系统时间***/
            break;
    case 2: /***键值判断***/
            if(iKey2==0){
              fKey2=1;                          /*按键有效*/
              mKey2SwapTask=3;                  /*去按键去抖*/
            }
            else mKey2SwapTask=0;               /*抖动*/
            break;
    case 3: /***有松开吗?***/
            if(iKey2==1){
              mKey2SwapTask=4;
            }
            break;
    case 4: /***键松开去抖延时***/
            mKey2SwapTask=5;                    /***延时一个系统时间***/
            break;
    case 5: /***键值判断***/
            if(iKey2==1){
              mKey2SwapTask=0;                  /*去按键检测开始*/
            }
            else mKey2SwapTask=3;               /*抖动*/
            break;
   }
}

/*---------------------------------------------------------------------------*/
/*任务一*/
/**********************************************
一个部分输出1HZ的方波,2S后停止。
**********************************************/
void Task1_MainLoop()
{
    switch(mTask1Id){
      case 0:   if(fKey1){
                     fKey1=0;                   /*接收该键值*/
                     mTask1_1HzReg=500/2;       /*1hz时间寄存器,500ms,以2MS为单
位*/
                     mTask1_2SReg=2000/2;       /*2S时间寄存器,500ms,以2MS为单
位*/
                     oTask1=0;
                     mTask1Id=1;
                }
                break;
      case 1:   if(fSYS_2ms){
                   mTask1_1HzReg--;
                   if(mTask1_1HzReg==0){
                       oTask1=~oTask1;
                       mTask1_1HzReg=500/2;     /*1hz时间寄存器,500ms,以2MS为单
位*/
                   }

                   mTask1_2SReg--;
                   if(mTask1_2SReg==0){
                       oTask1=1;                /*2S时间到*/
                       mTask1Id=0;
                   }
                }
                break;
    }
}


/*---------------------------------------------------------------------------*/
/*任务二*/
/**********************************************
一个一直输出1.2hz的方波,直到按键再次按
**********************************************/
void Task2_MainLoop()
{
    switch(mTask2Id){
      case 0:   if(fKey2){
                     fKey2=0;                   /*接收该键值*/
                     mTask2_1p2HzReg=416/2;     /*1hz时间寄存器,832/2ms,以2MS为
单位*/
                     oTask2=0;
                     mTask2Id=1;
                }
                break;
      case 1:   if(fKey2){
                  fKey2=0;
                  oTask2=1;
                  mTask2Id=0;
                }
                else {
                   if(fSYS_2ms){
                       mTask2_1p2HzReg--;
                       if(mTask2_1p2HzReg==0){
                           oTask2=~oTask1;
                           mTask2_1p2HzReg=416/2;   /*1hz时间寄存器,832/2ms,以
2MS为单位*/
                       }
                   }
                }
                break;
    }
}

/*---------------------------------------------------------------------------*/
/*主程序*/
void main(){
   Timer0_Init();
   EA=1;

   while(1){
       Timer0_MainLoop();
       Key_MainLoop();
       Task1_MainLoop();
       Task2_MainLoop();
   }
}

出0入0汤圆

发表于 2009-9-2 10:38:46 | 显示全部楼层
youth、农民_运动讲习所、兽性大发的小白兔,都是当年C51BBS里的天才级人物啊,所以工作时有幸跟高手共事就很幸运了!!

出0入0汤圆

发表于 2009-9-2 10:53:00 | 显示全部楼层
MARK

出0入0汤圆

发表于 2009-9-2 10:55:21 | 显示全部楼层
mark

出0入4汤圆

发表于 2009-9-2 11:01:17 | 显示全部楼层
记号

出0入0汤圆

发表于 2009-9-2 11:02:46 | 显示全部楼层
记号

出0入0汤圆

发表于 2009-9-2 11:14:39 | 显示全部楼层
农民兄弟来听课

出0入170汤圆

发表于 2009-9-2 11:45:29 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-9-2 12:53:49 | 显示全部楼层
记号

出0入46汤圆

发表于 2009-9-2 13:57:28 | 显示全部楼层
03年的售后经常看农民_运动讲习所的文章,收益很大

出0入0汤圆

发表于 2009-9-2 13:58:41 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-9-2 13:59:36 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-9-2 14:12:36 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-9-2 17:07:12 | 显示全部楼层
以前看过一篇 - -b  抱歉,没有看的懂 ...... 随意没有受影响 :-)

现在的编程思想基本是从开源代码里面读代码然后学的。

出0入0汤圆

发表于 2009-9-2 18:09:02 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-9-2 19:32:22 | 显示全部楼层
mark~

出0入10汤圆

发表于 2009-9-2 19:49:45 | 显示全部楼层
N年前也经常上C51bbs,这几个人都是牛人,现在没去过了

出0入0汤圆

发表于 2009-9-2 20:34:44 | 显示全部楼层
好多年没有上C51BBS,当年我是比较早注册的,刚查了下,在1000名之内

出0入0汤圆

发表于 2009-9-2 20:47:56 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-9-2 21:02:45 | 显示全部楼层
ARMOK

出0入0汤圆

发表于 2009-9-2 22:33:45 | 显示全部楼层
记号下
头像被屏蔽

出0入0汤圆

发表于 2009-9-2 23:24:06 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

出0入0汤圆

发表于 2009-9-2 23:27:02 | 显示全部楼层
讲习所是高手,hotpower是怪才。
如果讲习所能出书的话,我肯定会买,要学习他的思想。

出0入0汤圆

发表于 2010-6-19 17:28:53 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-6-19 22:59:39 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-6-23 16:50:34 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-1-27 20:33:17 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-1-27 22:24:05 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-1-28 00:37:17 | 显示全部楼层
MARK

出0入0汤圆

发表于 2012-1-30 10:39:04 | 显示全部楼层
这么老的玩意也能被你们翻出来啊。
C51BBS已经消失了,曾经的人物已经随风而去。。。。。。

对于上面的例子,可以改进的地方:
  1、在程序里的除法,可以用移位的方法,或者干脆直接定义为常数;
  2、按键的判断那里可以合并。

出0入0汤圆

发表于 2012-2-20 10:16:23 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-2-20 11:59:10 | 显示全部楼层
mark

出0入0汤圆

发表于 2014-8-9 15:57:32 | 显示全部楼层
学习中。。。。。。。

出0入0汤圆

发表于 2014-8-16 20:24:14 来自手机 | 显示全部楼层
8051时间触发嵌入式操作系统 大概这个名字,有系统的讲解

出0入0汤圆

发表于 2014-8-16 21:51:06 | 显示全部楼层
曾经受C51BBS影响用了KEIL C 一开始用汇编的,受村长影响会点状态机,惭愧没有什么发展。一直在小县城没什么作为,今年刚辞职,想自己做点东西。奋斗中。。

出0入0汤圆

发表于 2014-10-9 15:13:53 | 显示全部楼层
谢谢,对我太有用了

出0入0汤圆

发表于 2017-7-14 20:21:30 | 显示全部楼层
你好,我想和您交流一下嵌入式软件方面的知识,可以留个联系方式吗

出0入0汤圆

发表于 2017-7-14 21:49:08 | 显示全部楼层
老了吗 开始怀念了
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-9-27 06:09

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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