找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2340|回复: 6
收起左侧

这个程序可用在stc15f104e单片机,但104w没有t1定时器,如何修改?

[复制链接]
ID:399179 发表于 2019-3-21 11:49 | 显示全部楼层 |阅读模式
这个可以用在stc15f104e上,但不能用在104w。104w没有t1定时器,请问怎么改?谢谢!
  1. #include<reg52.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char

  4. sbit fmq=P3^5;//定义P0.0口为蜂鸣器信号输出
  5. uint z;          //用来控制音节
  6. sbit key=P3^3;
  7. sbit led=P3^4;
  8. //uint code tone[8]={0xfc44,0xfcac,0xfd09,0xfd34,0xfd82,0xfdc8,0xfe06,0xfe22};//对应每个单

  9. 调的计数初值
  10. uchar code keymode[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//按键值,对应

  11. //io:0,1,2,3,4,5,6,7
  12. uint code tab[]= {
  13. 64021,64103,64260,64400,
  14. 64524,64580,64684,64777,
  15. 64820,64898,64698,65030,
  16. 65058,65110,65157,65178};

  17. void zdkg()
  18. {
  19.           if(key==1)
  20.         {
  21.                 P1=0xff;
  22.                 TR1=0;//如果没有按键按下,就关闭定时器中断
  23.                 fmq=1;//同时也关闭蜂鸣器
  24.         }
  25.         else          //否则就进入中断
  26.         {
  27.                 TR1=1;
  28.         }
  29. }

  30. void main()
  31. {
  32.         EA=1;//开总中断
  33.         ET1=1;//定时器T1中断允许
  34.         TMOD=0x10;//使用定时器T1的模式1
  35.         TH1=(65536-500)/256;//定时器T1的高8位重新赋初值
  36.         TL1=(65536-500)%256;//定时器T1的低8位重新赋初值
  37.         P1=0xff;//先关所有LED灯

  38.         while(1)
  39.         {
  40.                   key =1;
  41.                 led =1;
  42.                    if(key==0)
  43.         {
  44.                 z=tab[0]; //控制音节
  45.                 led=0;
  46.         }
  47.          
  48.           zdkg();
  49.                   
  50.         }

  51. }

  52. void Time1(void) interrupt 3 using 1//
  53. {        fmq=~fmq; //每进入一次中断就取反一次,快速的进入退出中断,就会听到蜂鸣器发出的音调
  54.         TH1=z/256;//定时器T1的高8位重新赋初值
  55.         TL1=z%256;//定时器T1的低8位重新赋初值
  56. }
复制代码


回复

使用道具 举报

ID:213173 发表于 2019-3-21 14:52 | 显示全部楼层
void Timer2Init()                //500微秒@12.000MHz
{
        AUXR &= 0xFB;                //定时器时钟12T模式16位自动重载
        T2L = 0x0C;                        //设置定时初值
        T2H = 0xFE;                        //设置定时初值
        AUXR |= 0x10;                //定时器2开始计时
//        AUXR &= 0xef;                //定时器2关闭计时
        EA=1;                                //开总中断
        ET1=1;                                //定时器T1中断允许
}
回复

使用道具 举报

ID:399179 发表于 2019-3-21 18:22 来自手机 | 显示全部楼层
wulin 发表于 2019-3-21 14:52
void Timer2Init()                //500微秒@12.000MHz
{
        AUXR &= 0xFB;                //定时器时钟12T模式16位自动重载

谢谢!看不懂,只会照着抄,呵呵!
回复

使用道具 举报

ID:213173 发表于 2021-5-15 20:45 | 显示全部楼层
快乐眼泪 发表于 2019-3-21 18:22
谢谢!看不懂,只会照着抄,呵呵!

void Timer2Init()                //500微秒@12.000MHz
{
        AUXR &= 0xFB;                //定时器时钟12T模式16位自动重载
        T2L = 0x0C;                        //设置定时初值
        T2H = 0xFE;                        //设置定时初值
        AUXR |= 0x10;                //定时器2开始计时
//        AUXR &= 0xef;                //定时器2关闭计时
        EA=1;                                //开总中断
        ET2=1;                                //定时器T2中断允许
}
回复

使用道具 举报

ID:101869 发表于 2021-5-15 21:30 来自手机 | 显示全部楼层
wulin 发表于 2021-5-15 20:45
void Timer2Init()                //500微秒@12.000MHz
{
        AUXR &= 0xFB;                //定 ...

请教老师为什么我用STC15的头文件 打开T2定时器  ET2=1  会出现编译错误呢
回复

使用道具 举报

ID:155507 发表于 2021-5-15 22:05 | 显示全部楼层
非凡科技 发表于 2021-5-15 21:30
请教老师为什么我用STC15的头文件 打开T2定时器  ET2=1  会出现编译错误呢

改成这样


  1. #include <reg52.h>
  2. #define uint  unsigned int
  3. #define uchar unsigned char
  4. sfr P1M1 = 0x91;
  5. sfr P1M0 = 0x92;

  6. sfr IE2       = 0xaf;               //中断使能寄存器2
  7. sfr AUXR      = 0x8e;               //辅助寄存器
  8. sfr T2H       = 0xD6;               //定时器2高8位
  9. sfr T2L       = 0xD7;               //定时器2低8位


  10. sbit fmq=P3^5; //定义P0.0口为蜂鸣器信号输出
  11. uint z;          //用来控制音节
  12. sbit key=P3^3;
  13. sbit led=P3^4;
  14. //uint code tone[8]={0xfc44,0xfcac,0xfd09,0xfd34,0xfd82,0xfdc8,0xfe06,0xfe22};//对应每个单调的计数初值
  15. uchar code keymode[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//按键值,对应

  16. //io:0,1,2,3,4,5,6,7
  17. uint code tab[]= {
  18.         64021,64103,64260,64400,
  19.         64524,64580,64684,64777,
  20.         64820,64898,64698,65030,
  21.         65058,65110,65157,65178};

  22. void zdkg()
  23. {
  24.         if(key==1)
  25.         {
  26.                 P1=0xff;
  27.                 IE2 &= ~0x04;                   //若需要手动清除中断标志,可先关闭中断,此时系统会自动清除内部的中断标志

  28.                 //TR1=0;//如果没有按键按下,就关闭定时器中断
  29.                 fmq=1;//同时也关闭蜂鸣器
  30.         }
  31.         else          //否则就进入中断
  32.         {
  33.                 //TR1=1;
  34.             IE2 |= 0x04;                    //然后再开中断即可
  35.         }
  36. }

  37. void main()
  38. {
  39.         P1M0 = 0x00;
  40.     P1M1 = 0x00;
  41.        
  42.         EA=1;//开总中断
  43.         //ET1=1;//定时器T1中断允许
  44.     //AUXR |= 0x04;                   //定时器2为1T模式
  45.     AUXR &= ~0x04;                  //定时器2为12T模式

  46.         IE2 |= 0x04;                    //开定时器2中断
  47.         //TMOD=0x10;//使用定时器T1的模式1

  48.         T2H=(65536-500)/256;//定时器T1的高8位重新赋初值
  49.         T2L=(65536-500)%256;//定时器T1的低8位重新赋初值
  50.         AUXR |= 0x10;                   //定时器2开始计时
  51.         P1=0xff;//先关所有LED灯

  52.         while(1)
  53.         {
  54.                 key =1;
  55.                 led =1;
  56.                 if(key==0)
  57.                 {
  58.                         z=tab[0]; //控制音节
  59.                         led=0;
  60.                 }
  61.                
  62.                 zdkg();
  63.                
  64.         }

  65. }

  66. void Time2(void) interrupt 12 using 1//
  67. {
  68.         fmq=~fmq; //每进入一次中断就取反一次,快速的进入退出中断,就会听到蜂鸣器发出的音调
  69.         T2H=z/256;//定时器T2的高8位重新赋初值
  70.         T2L=z%256;//定时器T2的低8位重新赋初值
  71. }

复制代码
回复

使用道具 举报

ID:399179 发表于 2021-10-6 09:14 来自手机 | 显示全部楼层
angmall 发表于 2021-5-15 22:05
改成这样

万分感谢!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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