数码之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 952|回复: 8

[C51] 小白学51单片机,定时器点灯

[复制链接]
发表于 2024-2-27 11:39:47 | 显示全部楼层 |阅读模式
先来简单的,
STC89C52  2个定时器,不同时间,使LED灯生产一闪一闪效果


代码如下








本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x
 楼主| 发表于 2024-2-27 11:41:02 | 显示全部楼层
这个是STC8H8K64U的 用了5个定时器,产生不同的时间,点亮5个LED灯

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-2-27 11:42:24 | 显示全部楼层
本帖最后由 hellozwt 于 2024-2-27 13:55 编辑

代码如下
  1. //STC8H8K64U
  2. //5个定时器产生不同频率中断点亮 共5个灯
  3. #include <STC8h.h>
  4. #include "time_init.h"

  5. void main ()
  6. {
  7.         P_SW2 |= 0x80;        //扩展寄存器XFR访问使能        1000 0000或等于 B7要为1

  8.         P1M1=0x00; P1M0=0x00;        //P1口设置为准双向口

  9.         EA=1;        //开总中断  

  10.         time0_init();        //定时器0初始化
  11.         time1_init();
  12.         time2_init();
  13.         time3_init();
  14.         time4_init();
  15.          while(1)
  16.         {
  17.         }
  18. }



  19. #include <STC8h.h>
  20. #define main_fosc 24000000UL  //定义主时钟 UL无符号长整形
  21. typedef unsigned char u8;        //类型定义,相当于用u8代替unsigned char
  22. //typedef unsigned int u16;        //
  23. //typedef unsigned long u32;        //
  24. #define time0_reload (main_fosc / 1000)        //time0中断频率 1000次/秒
  25. #define time1_reload (main_fosc / 2000)        //time1中断频率 2000次/秒
  26. #define time2_reload (main_fosc / 3000)        //time2中断频率 3000次/秒
  27. #define time3_reload (main_fosc / 4000)        //time3中断频率 4000次/秒
  28. #define time4_reload (main_fosc / 5000)        //time4中断频率 5000次/秒

  29. void time0_init()         //定时器0初始化
  30. {
  31.         TR0=0;        //定时器0停止
  32.         ET0=1;        //允许定时器0中断
  33.         TMOD &=~0x03;        //与等于2个1得1 ~按位取反后B0B1为00 模式0
  34.         TMOD |=0; //或等于,有1得1
  35.         TMOD &= ~0x04;        //与等于2个1得1 ~按位取反后为011 B2为0 定时器
  36.         INTCLKO &= ~0x01;        //不输出时钟 B0为0
  37.         #if(time0_reload < 65536UL)
  38.         AUXR |= 0x80;  //1000 0000 t0x12 为 1 1T mode
  39.         TH0=(u8)((65536UL-time0_reload)/256);        //
  40.         TL0=(u8)((65536UL-time0_reload)%256);         //
  41.         #else
  42.         AUXR &= ~0x80;  //t0x12 为 0 12T mode
  43.         TH0=(u8)((65536UL-time0_reload/12)/256);        //
  44.         TL0=(u8)((65536UL-time0_reload/12)%256);         //  
  45.         #endif
  46.         TR0=1;        //定时器0开始
  47. }

  48. void time1_init()         //定时器1初始化
  49. {
  50.     TR1=0;        //定时器1停止
  51.         ET1=1;        //允许定时器1中断
  52.         TMOD &=~0x30;        //与等于2个1得1 ~按位取反后B4B5为00 模式0
  53.         TMOD |=(0<<4); //或等于,有1得1 左移4位
  54.         TMOD &= ~0x40;        //与等于2个1得1 ~按位取反后为0111111 B6为0 定时器
  55.         INTCLKO &= ~0x02;        //不输出时钟 B0为0
  56.         #if(time1_reload < 65536UL)
  57.         AUXR |= 0x40;  //1T mode
  58.         TH1=(u8)((65536UL-time1_reload)/256);        //
  59.         TL1=(u8)((65536UL-time1_reload)%256);         //
  60.         #else
  61.         AUXR &= ~0x40;  //12T mode
  62.         TH1=(u8)((65536UL-time1_reload/12)/256);        //
  63.         TL1=(u8)((65536UL-time1_reload/12)%256);         //  
  64.         #endif
  65.         TR1=1;        //定时器0开始
  66. }

  67. void time2_init()         //定时器2初始化
  68. {
  69.     AUXR &= ~0x1c ;        //11100 取反00011 停止记数 定时模式 12T模式
  70.         IE2 |= 0x04;        //100 ET2=1 允许定时器2中断
  71.         INTCLKO &= ~0x04;        //011 不输出时钟 B2为0
  72.         #if(time2_reload < 65536UL)
  73.         AUXR |= (1<<2);  //1T mode
  74.         T2H=(u8)((65536UL-time2_reload)/256);        //
  75.         T2L=(u8)((65536UL-time2_reload)%256);         //
  76.         #else
  77.         T2H=(u8)((65536UL-time2_reload/12)/256);        //
  78.         T2L=(u8)((65536UL-time2_reload/12)%256);         //  
  79.         #endif
  80.         AUXR |=(1<<4);        //定时器2开始
  81. }

  82. void time3_init()         //定时器3初始化
  83. {
  84.     T4T3M &= ~0x0f ;        //0000 T3R停止记数 T3ct定时模式 12T模式        不输出时钟
  85.         IE2 |= 0x20;        //10 0000 ET3=1 允许定时器3中断
  86.         #if(time3_reload < 65536UL)
  87.         T4T3M |= (1<<1);  //1左移1位就是10 T3X12为1 1T mode
  88.         T3H=(u8)((65536UL-time3_reload)/256);        //
  89.         T3L=(u8)((65536UL-time3_reload)%256);         //
  90.         #else
  91.         T3H=(u8)((65536UL-time3_reload/12)/256);        //
  92.         T3L=(u8)((65536UL-time3_reload/12)%256);         //  
  93.         #endif
  94.         T4T3M |=(1<<3);        //1左移3位就是1000 T3R=1 定时器3开始
  95. }

  96. void time4_init()         //定时器4初始化
  97. {
  98.     T4T3M &= ~0xf0 ;        //停止记数 定时模式 12T模式        不输出时钟
  99.         IE2 |= 0x40;        //100 0000 ET4=1 允许定时器4中断
  100.         #if(time4_reload < 65536UL)
  101.         T4T3M |= (1<<5);  //1左移5位就是100000 T4X12为1 1T mode1T mode
  102.         T4H=(u8)((65536UL-time4_reload)/256);        //
  103.         T4L=(u8)((65536UL-time4_reload)%256);         //
  104.         #else
  105.         T4H=(u8)((65536UL-time4_reload/12)/256);        //
  106.         T4L=(u8)((65536UL-time4_reload/12)%256);         //  
  107.         #endif
  108.         T4T3M |=(1<<7);        //1左移7位就是1000 0000 T4R=1 定时器4开始
  109. }
  110.                                                                                                 

  111. //0 16位自重装
  112. //1 16位定时、计数
  113. //2 8位自重装
  114. //3 16位自重装不可屏蔽中断


  115. #include <STC8h.h>
  116. sbit led0=P1^3;
  117. sbit led1=P1^4;
  118. sbit led2=P1^5;
  119. sbit led3=P1^6;
  120. sbit led4=P1^7;
  121. unsigned int time0count=0;        //
  122. unsigned int time1count=0;        //
  123. unsigned int time2count=0;        //
  124. unsigned int time3count=0;        //
  125. unsigned int time4count=0;        //

  126. void time0()interrupt 1
  127. {
  128.         time0count++;        //
  129.         if(time0count==100)                //
  130.         {
  131.                  time0count=0;        //
  132.                 led0=~led0;
  133.         }                                 
  134. }

  135. void time1()interrupt 3
  136. {
  137.         time1count++;        //
  138.         if(time1count==200)                //
  139.         {
  140.                  time1count=0;        //
  141.                 led1=~led1;
  142.         }                                 
  143. }

  144. void time2()interrupt 12
  145. {
  146.         time2count++;        //
  147.         if(time2count==300)                //
  148.         {
  149.                  time2count=0;        //
  150.                 led2=~led2;
  151.         }                                 
  152. }

  153. void time3()interrupt 19
  154. {
  155.         time3count++;        //
  156.         if(time3count==400)                //
  157.         {
  158.                  time3count=0;        //
  159.                 led3=~led3;
  160.         }                                 
  161. }

  162. void time4()interrupt 20
  163. {
  164.         time4count++;        //
  165.         if(time4count==500)                //
  166.         {
  167.                  time4count=0;        //
  168.                 led4=~led4;
  169.         }                                 
  170. }

复制代码

回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-2-27 11:44:42 | 显示全部楼层
编辑出了点意外,这是3个段程序,怎么连在一起了
回复 支持 反对

使用道具 举报

发表于 2024-2-27 12:57:35 | 显示全部楼层
定时器不要钱啊!直接开4个!
回复 支持 反对

使用道具 举报

发表于 2024-2-27 12:58:05 | 显示全部楼层
只是学习的话,这程序蛮好!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-2-27 14:06:50 | 显示全部楼层
主要参考了厂家给的例程
主要查看了以下资料



















也有一些我不理解的地方,比如定时器0初始化中TMOD的设置,为什么要分三行?

    TMOD &=~0x03;    //与等于2个1得1 ~按位取反后B0B1为00 模式0
    TMOD |=0; //或等于,有1得1
    TMOD &= ~0x04;    //与等于2个1得1 ~按位取反后为011 B2为0 定时器


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x
回复 支持 反对

使用道具 举报

发表于 2024-2-27 15:38:45 | 显示全部楼层
hellozwt 发表于 2024-2-27 14:06
主要参考了厂家给的例程
主要查看了以下资料

TMOD |=0; //这句等于什么都没做,可以删掉也不影响吧?
回复 支持 反对

使用道具 举报

发表于 2024-2-27 15:45:13 | 显示全部楼层
hellozwt 发表于 2024-2-27 14:06
主要参考了厂家给的例程
主要查看了以下资料

看了下,那三句估计是复制别的地方改的,中间那句在别的地方可能是有用的,复制过来用不到但也没删直接改成没作用的:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x
回复 支持 反对

使用道具 举报

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

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-7-20 16:12 , Processed in 0.171600 second(s), 12 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

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