CC2530————T1定时器正计数/倒计数模式采用中断方式控制LED灯

CC2530————T1定时器正计数/倒计数模式采用中断方式控制LED灯

宏定义

# 主函数
/**************************************/
/*         CC2530例程             */
/*例程名称:定时器(中断方式)        */
/*描述:通过定时器T1中断方式控制LED1周期性闪烁
**************************************/
#include <ioCC2530.h>
#define uint unsigned int
#define uchar unsigned char
#define LED1 P1_0	   //定义LED1为P1_0口控制

uchar count=0;

//函数声明
void InitLed(void);		//初始化P1口
void InitT1();                  //初始化定时器T1
//初始化程序
/*****************************/

初始化

void InitLed(void)
{
    P1DIR |= 0x01;    //P1_0定义为输出
    LED1 = 0;       //LED1灯初始化熄灭
}
//定时器初始化
void InitT1() //系统不配置工作时钟时默认使用内部RC振荡,即16MHz
{
  T1CTL = 0x0F;  //128分频,正计数/倒计数模式,计数值由T1CC0L和T1CC0H确定
  T1CC0L=0x12;
  T1CC0H=0x7A;
  //T1OVFIM=1;
  T1IE=1;
  EA=1;
  //T1STAT= 0x21;          //通道0, 中断有效   
}

中断

/***************************
* 函数名称:T1_INT
 * 功    能:定时器1中断处理函数
 * 入口参数:无
 * 出口参数:无
 * 返 回 值:无
***************************/
#pragma vector=T1_VECTOR
__interrupt void T1_INT(void)
{
   T1STAT&=~0x21;
   ++count;
   if(count == 3)   //如果溢出次数到达3说明经过了1.5秒
   {
      LED1 = 1;        //点亮LED1
   }
   if(count == 4)   //如果溢出次数到达4说明经过了2秒
   {
      LED1 = 0;        //熄灭LED1
      count=0;
   }
}

主函数

/***************************
* 函数名称:main
 * 功    能:main函数入口
 * 入口参数:无
 * 出口参数:无
 * 返 回 值:无
***************************/
void main(void)
{
    InitLed();		//调用初始化函数
    InitT1();
    while(1)
    {       
      
    }
}
  • 4
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
实验三 定时中断实验 一、实验目的 1. 掌握51单片机外部中断的应用。 2. 掌握中断函数的写法。 3. 掌握定时器的定时方法。 4. 掌握LED数码管的显示。 二、实验内容 1. 用外部中断0测量负跳变信号的累计数,同时在LED数码管上显示出来。 2. 用外部中断改变流水方式。 3. 用定时器T1方式2控制两个LED以不同周期闪烁。 使用定时器T1方式2来控制P0.0、P0.1引脚的两个LED分别以1s和2s的周期闪烁。 三、实验仿真硬件图 在Proteus软件中建立如下图所示仿真模型并保存。 1. 用外部中断0测量负跳变信号的累计数,同时在LED数码管上显示出来(用中断方式计数 器)。 2.用外部中断改变流水方式中断前:开始时,P0.0~P0.7的8个依次点亮。 外部中断0:P0.0~P0.7的左右4个闪烁亮8次 外部中断1: P0.0~P0.7的8个间隔闪烁8次 改变中断优先级和保护现场,观察运行结果 编程提示 外部中断0请求,由P3.2管脚输入,通过IT0位来决定是低电平有效还是下降沿 有效。一旦输入信号有效,即向CPU申请中断,并建立IE0中断标志。 以外部中断0为例,开放中断采用以下语句: EA=1; //开放中断总允许位 EX0=1; //开放外部中断0允许位 IT0=1; //置外部中断为边沿(下边沿)触发方式 中断函数结构如下: void int_0() interrupt 0 // interrupt 0表示该函数为中断类型号0的中断函数 { } 同级自然优先级: 外部中断0 定时器T0中断 外部中断1 定时器T1中断 串行口中断中断优先级别的设定: 实验二要求: 初始状态为P0.0~P0.7的8个LED显示依次循环点亮;外部中断0服务程序为8个LED, 左4个,右4个闪烁8次,外部中断1服务程序8个LED,间隔闪烁8次。 设定外部中断0为高优先级,先执行外部1中断,过程中用外部0中断来将其中断,反之不 行。注意保护现场。 设定外部中断1为高优先级,先执行外部0中断,过程中用外部1中断来将其中断,反之不 行。注意保护现场。 实验三(调试下列程序,在错误行后面注明错误及改方法): #include <reg51.h> #define uchar unsigned char; sbit D0=P1^0; sbit D1=P1^1; uchar a,b; void main() { EA=1; ET1=1; TMOD=0x20; TL1=6; TR0=1; a=0; b=0; while(1) ; } void t1() interrupt 1 { a++; b++; if(a=1000) { D0=~D0 a=0; } if(b=4000) { D1=~D1; b=0; } 写出源程序,并注释 实验报告格式 实验三 定时中断实验 学院: 专业: 年级: 实验时间: 姓名: 学号: 指导教师: 一、实验目的 1. 掌握51单片机外部中断的应用。 2. 掌握中断函数的写法。 3. 掌握中断优先级别的使用。 4. 掌握LED数码管的显示。 二、实验内容 1. 用外部中断0测量负跳变信号的累计数,同时在LED数码管上显示出来。 2. 用外部中断改变流水方式。 三、电路图(贴Protues仿真图) 四、程序与注释 1)程序1 2)程序2 3)程序3 六、简答题 1)电平触发和下降沿触发在程序中如何设置? 2)如何设置INT1为优先级?何谓优先? 3)中断服务函数的interrupt后面的数字表示什么? 七、体会 ----------------------- 实验3-外部中断实验报告全文共4页,当前为第1页。 实验3-外部中断实验报告全文共4页,当前为第2页。 实验3-外部中断实验报告全文共4页,当前为第3页。 实验3-外部中断实验报告全文共4页,当前为第4页。
单片机原理及应用》 课程设计报告 2010 — 2011 学年第 2 学期 题 目: 简易十字路口交通设计 专 业: 通信技术 班 级: 通信1102 学 号: 1007045149 学 号: 6 姓 名: 曾靖凯 指导教师: 卫兵哥 "2012 "年"12 "月"13-17 "日" 简易十字路口交通设计 一、设计目的 1.了解交通管理的基本工作原理 2.掌握80C31工作原理和应用编程 3.掌握80C31计算器/定时器的工作方式和应用编程外部中断方式 4.掌握动态LED显示 二、设计内容 内容:设计一个十字路口交通控制器。初始态东西南北等全灭,程序开始运行先南 北通行30S、东西禁止;然后,南北转黄;接着,东西通行30S,南北禁止;最后,东 西转黄;依次循环。如果有意外发生,产生中断,红全亮,时间10S. 三、总体设计 本设计采以用单片机8051作为控制器,通行时间或等待时间通过数码管以计时方式 显示,同时单片机P1口控制交通(红、黄、绿)的常的替换工作,如果有意 外发生(交通事故)就会产生中断,东西南北红全亮。系统设计框图1如下: 图1 系统框图 四、硬件设计 因才用了PC机和单片机试验箱接口应用平台硬件电路相对简单,利用8031的P1口对 交通控制计数/定时器中断和数码管显示构成的简易交通,实验电路连接如表 1所示。 表1 实验连接图 "连线 "连接孔1 "连接孔2 " "1 "P7 "L7(东西红)" "2 "P6 "L6(东西黄)" " 3 "P5 "L5 (东西绿) " "4 "P4 "L4 (南北红) " "5 "P3 "L3(南北黄)" "6 "P2 "L2(南北绿)" "7 "P3.2 "负脉冲 " "8 "KEY/LED_CS"CS0 " 五、软件设计 1.交通显示时序的理论分析 以下四图所示为红黄绿规则的状态图 图2 状态S1南北通行30S 东西禁止 图3 状态S2南北转黄 图4 状态S3南北禁止 东西通行30S 图5 状态S4东西绿转黄 共四种状态,分别设定为S1、S2、S3、S42,交通以这四种状态为一个周期,循环 执行如图6所示。如果有意外发生,去处理中断,红全亮,时间10S。 图6 交通状态循环 依据上述车辆行驶的状态图,可以列出各个路口的逻辑表如表1所示(其中逻辑值"1" 代表执行通行,逻辑值"0"代表禁止通行,逻辑值"L"代表绿转黄): 表2 状态逻辑表 "S1的状态 "E "S "W "N " "逻辑值 "0 "1 "0 "1 " "显示时间 "30S " "S2的状态 "E "S "W "N " "逻辑值 "0 "L "0 "L " "显示时间 "1S " "S3的状态 "E "S "W "N " "逻辑值 "1 "0 "1 "0 " "显示时间 "30S " "S4的状态 "E "S "W "N " "逻辑值 "L "0 "L "0 " "显示时间 "1S " 程序就是上述四种状态下循环转化的,一个周期四个状态,常情况下共花费63S。 2交通显示的理论分析 2.1 计时显示的理论分析 利用MCS- 51内部的定时器/计数器进行,配合软件延时实现计时。在工作之前必须通过软件设定 它的工作方式,即对寄存器TMOD中每位进行设定,格式如表3所示。 表3 TMOD格式 D7 D6 D5 D4 D3 D2 D1 D0 "CATE"C/T "M1 "M0 "CATE "C/T "M1 "M0 " 其中,低四位用于决定T0的工作方式,高四位用于决定T1的工作方式,M1 和M0 工作方式控制位用以确定 4 种工作方式,如下表4所示: 表4 M1和M0控制4种工作方式 "M1 M0 "工作方式 "说明 " "0 0 "方式0 "13位计数器 " " 0 1 "方式1 "16位计数器 " "1 0 "方式2 "自动装载8位计数器 " "1 1 "方式3 "定时器0:分为两个8位计数器 " " " "定时器1:对外部停止计数 " 采用T0方式1,定时1S,系统时钟为6MHZ,所以时钟周期=(12*1/6)us=2us;采用每隔 100ms中断一次,中断10次为1S,使时间的计数值减1,实现了计时的功能。计算计数 初值X:(216-X)*2us=1s,所以X=15536=3CB0H,因此TH0=3CH,TL0=B0H。 2.2 状态显示的理论分析 南北通行,东西禁止时利用定时器中断计时30S;东西通行,南北禁止时利用定时 器中断计时30S。 2.3 中断理论分析 MCS- 51中断系统有5个中断源,分别是外部中断0、外部中断1、定时器/计数器T0溢出中断定时器/计数T1溢出中断、串行口中断请求。 MCS- 51的
要使用定时器1中断实现LED1呼吸显示,可以按照以下步骤进行: 1. 首先,需要将P1.2口初始化为输出模式,将LED1连接到P1.2口。 2. 然后,需要初始化定时器1,并设置定时器1的模式定时器模式,同时设置定时器计数器初值和重载值。 3. 接着,在定时器1中断服务函数中,需要实现LED1呼吸控制。可以使用PWM技术实现呼吸效果。在每次定时器1中断时,改变占空比,从而改变LED1的亮度。 下面是一份C语言的示例代码,可供参考: ```c #include "reg_cc2530.h" // 定义LED1口 #define LED1 P1_2 // 定义定时器1的初值和重载值 #define T1_INIT_VAL 0xFFFF #define T1_RELOAD_VAL 0xFFFF // 定义PWM的周期和占空比 #define PWM_PERIOD 100 #define PWM_DUTY_CYCLE 50 // 定义占空比的变化步长 #define PWM_STEP 1 // 定义当前占空比和方向 static uint8_t pwm_duty_cycle = 0; static bool pwm_direction = true; // 定义定时器1中断服务函数 #pragma vector=T1_VECTOR __interrupt void t1_isr(void) { // 清除定时器1中断标志 T1IF = 0; // 计算新的占空比 if (pwm_direction) { pwm_duty_cycle += PWM_STEP; if (pwm_duty_cycle >= PWM_DUTY_CYCLE) { pwm_duty_cycle = PWM_DUTY_CYCLE; pwm_direction = false; } } else { pwm_duty_cycle -= PWM_STEP; if (pwm_duty_cycle == 0) { pwm_duty_cycle = 0; pwm_direction = true; } } // 设置LED1的亮度 uint16_t cmp_val = (PWM_PERIOD * pwm_duty_cycle) / 100; T1CC0H = (cmp_val >> 8) & 0xFF; T1CC0L = cmp_val & 0xFF; } // 主函数 int main(void) { // 初始化LED1口为输出 LED1 = 0; P1SEL &= ~0x04; P1DIR |= 0x04; // 初始化定时器1 T1CTL = 0x00; // 关闭定时器1 T1CCTL0 = 0x2C; // 设置定时器1为PWM模式,输出高电平时计数,比较匹配时清零 T1CC0H = 0x00; // 设置比较值高字节 T1CC0L = 0x00; // 设置比较值低字节 T1IE = 1; // 使能定时器1中断 // 设置定时器1的初值和重载值 T1CNTH = T1_INIT_VAL >> 8; T1CNTL = T1_INIT_VAL & 0xFF; T1CC0H = T1_RELOAD_VAL >> 8; T1CC0L = T1_RELOAD_VAL & 0xFF; // 启动定时器1 T1CTL |= 0x0C; // 进入循环 while (1) { // 程序主循环 } return 0; } ``` 在上述代码中,可以通过改变`PWM_PERIOD`和`PWM_DUTY_CYCLE`的值来调整PWM的周期和占空比,从而改变LED1的呼吸效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FranzLiszt1847

嘟嘟嘟嘟嘟

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值