找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2363|回复: 1
打印 上一主题 下一主题
收起左侧

让我的STC单片机发挥余热

[复制链接]
跳转到指定楼层
楼主
ID:91350 发表于 2015-10-1 00:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
     10年前学习单片机记得是从AT89C51开始的,回想起那时候做遥控器解码等很多东西用到它,用到TR1,很多接触单片机的人我想对这个语句非常的收悉,TR1 = 1; 或 SETB TR1   .这是当年用Keil编译器的语句,10年后的我改变了对Keil的看法,觉得它太肆无忌惮了,虽然很方便,语句也很简洁,可是我感觉计算机语言不应该那么随意,应该规范化,这样才容易移植.自从我接触AVR单片机,一直用的是IAR编译器,自从IAR编译器后,我才知道什么才是计算机语言.比如刚才那句TR1 = 1; 应该这样写TCON_bit.TR1 = 1;至少在IAR中是这么约定的,TCON_bit代表一个结构,TR1是它的一个成员,这样更容易理解而且如果移植到其他平台上,TR1发生冲突的几率至少会少很多以下是我回到8051写的timer1
程序,它设定了一个时间,MCU_OSC在宏里已经定义,它指定了MCU的工作频率,MCU_SPEED指定了MCU的工作速度,STC有两种模式6T和12T,nReship_timer1是一个全局变量,它指定了timer1的重装值,在timer1的中断函数里重新装载到TR1里.我准备再做一个音频指示灯,10年前的作品现在重新做一次,我手头还有很多STC12C2052AD,让他们发挥出当年的色彩.
/***********  设定定时器1为定时器    ***********************/

bool set_timer1_us(unsigned long time)
{
   float scale = 1000000.0 / MCU_OSC * MCU_SPEED;//  计算分辨率(us)

   if(scale * 0xFFFF < time)
   {
      err0 = 1;//          标记错误
      err1 = 0;
      return false;
   }

   TMOD_bit.M01 = 1;
   TMOD_bit.M11 = 0;//  设置为16位定时器模式
   nReship_timer1 = 0x10000 - (unsigned int)(time / scale);//计算重装载值
   IE_bit.ET1 = 1;//    打开定时器1中断
   TCON_bit.TR1 = 1;//  打开定时器1

   return true;
}




分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:88707 发表于 2015-10-1 13:44 | 只看该作者
向前辈学习
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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