基于F28335芯片,编写一个简易的交通灯程序,使用GPIO0-3四个引脚,利用定时器。初始状态四个灯全亮,GPIO0暗60秒后闪烁5秒后变亮,GPIO1暗45秒后闪烁5秒后变亮,GPIO2暗60秒后闪烁5秒后变亮,GPIO3暗45秒后闪烁5秒后变亮。
时间: 2024-04-24 10:22:11 浏览: 76
用定时器编的交通灯程序.gxw
好的,这是一个基于F28335芯片的简易交通灯程序。程序使用了GPIO0-3四个引脚,定时器和延时函数。
```C
#include "F2837xD_device.h"
#include "F2837xD_pievect.h"
// 定义GPIO引脚
#define GPIO0 0
#define GPIO1 1
#define GPIO2 2
#define GPIO3 3
// 定义定时器
#define CPUTIMER0_PERIOD 2000000L
// 延时函数
void delay(unsigned long count)
{
while(count--)
asm(" NOP");
}
// 初始化GPIO引脚
void initGPIO()
{
// 设置GPIO0-3为输出
GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 0;
GpioCtrlRegs.GPADIR.bit.GPIO0 = 1;
GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 0;
GpioCtrlRegs.GPADIR.bit.GPIO1 = 1;
GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 0;
GpioCtrlRegs.GPADIR.bit.GPIO2 = 1;
GpioCtrlRegs.GPAMUX1.bit.GPIO3 = 0;
GpioCtrlRegs.GPADIR.bit.GPIO3 = 1;
// 初始化GPIO0-3为高电平
GpioDataRegs.GPASET.bit.GPIO0 = 1;
GpioDataRegs.GPASET.bit.GPIO1 = 1;
GpioDataRegs.GPASET.bit.GPIO2 = 1;
GpioDataRegs.GPASET.bit.GPIO3 = 1;
}
// 初始化定时器
void initCpuTimer()
{
// 停止计数器
CpuTimer0Regs.TCR.bit.TSS = 1;
// 清除计数器
CpuTimer0Regs.TCR.bit.TRB = 1;
// 设置定时器周期
CpuTimer0Regs.PRD.all = CPUTIMER0_PERIOD;
// 重载寄存器
CpuTimer0Regs.TCR.bit.TIF = 1;
CpuTimer0Regs.TCR.bit.TIE = 1;
// 启动计数器
CpuTimer0Regs.TCR.bit.TSS = 0;
}
// 定时器中断服务程序
interrupt void cpu_timer0_isr(void)
{
// 中断计数器清零
CpuTimer0Regs.TCR.bit.TIF = 1;
// GPIO0-3闪烁5秒后再变亮
if(CpuTimer0Regs.TIM.all > CPUTIMER0_PERIOD - 5000000L)
{
GpioDataRegs.GPATOGGLE.bit.GPIO0 = 1;
GpioDataRegs.GPATOGGLE.bit.GPIO1 = 1;
GpioDataRegs.GPATOGGLE.bit.GPIO2 = 1;
GpioDataRegs.GPATOGGLE.bit.GPIO3 = 1;
}
// GPIO0暗60秒后闪烁5秒后变亮
if(CpuTimer0Regs.TIM.all > CPUTIMER0_PERIOD - 60000000L)
{
delay(5000000L);
GpioDataRegs.GPACLEAR.bit.GPIO0 = 1;
}
// GPIO1暗45秒后闪烁5秒后变亮
if(CpuTimer0Regs.TIM.all > CPUTIMER0_PERIOD - 45000000L)
{
delay(5000000L);
GpioDataRegs.GPACLEAR.bit.GPIO1 = 1;
}
// GPIO2暗60秒后闪烁5秒后变亮
if(CpuTimer0Regs.TIM.all > CPUTIMER0_PERIOD - 60000000L)
{
delay(5000000L);
GpioDataRegs.GPACLEAR.bit.GPIO2 = 1;
}
// GPIO3暗45秒后闪烁5秒后变亮
if(CpuTimer0Regs.TIM.all > CPUTIMER0_PERIOD - 45000000L)
{
delay(5000000L);
GpioDataRegs.GPACLEAR.bit.GPIO3 = 1;
}
}
// 主函数
void main()
{
// 禁用全局中断
DINT;
// 初始化GPIO引脚
initGPIO();
// 初始化定时器
InitCpuTimers();
initCpuTimer();
// 使能全局中断
EINT;
// 循环等待
while(1);
}
```
这个程序使用了一个定时器和一个延时函数,来控制GPIO引脚的状态。在程序开始时,我们会初始化GPIO引脚为输出,设置GPIO0-3为高电平。然后我们会初始化定时器,设置定时器周期为2秒,并在中断服务程序中控制GPIO0-3的状态。在中断服务程序中,我们会根据时间控制GPIO引脚的状态,首先GPIO0-3会在计时器超过2秒时闪烁5秒,然后GPIO0会在计时器超过60秒时变暗,45秒后再闪烁5秒后变亮。GPIO1会在计时器超过45秒后变暗,45秒后再闪烁5秒后变亮。GPIO2会在计时器超过60秒后变暗,45秒后再闪烁5秒后变亮。GPIO3会在计时器超过45秒后变暗,45秒后再闪烁5秒后变亮。最后,程序会进入一个无限循环,等待中断。
阅读全文