嵌入式作业06

1、利用SysTick定时器编写倒计时程序,如初始设置为2分30秒,每秒在屏幕上输出一次时间,倒计时为0后,红灯亮,停止屏幕输出,并关闭SysTick定时器的中断。

main.c:

#define GLOBLE_VAR
#include "includes.h"      //包含总头文件
void systick_disable(void)
{
    // 禁止SysTick中断和停止SysTick计时器
    SysTick->CTRL &= ~(SysTick_CTRL_ENABLE_Msk | SysTick_CTRL_TICKINT_Msk);
}

int main(void)
{
    //(1.1)声明main函数使用的局部变量
    uint8_t  mSec;	       //记当前秒的值
    //(1.2)【不变】关总中断
    DISABLE_INTERRUPTS;
    wdog_stop();
    
    //(1.3)给主函数使用的局部变量赋初值
    
    //(1.4)给全局变量赋初值
   	//"时分秒"缓存初始化(00:00:00)
   	gTime[0] = 0;       //时
   	gTime[1] = 2;		//分
   	gTime[2] = 30;		//秒
   	mSec = 0;	//记住当前秒的值
    //(1.5)用户外设模块初始化
    gpio_init(LIGHT_RED,GPIO_OUTPUT,LIGHT_OFF);    //初始化红灯
    systick_init(10);      //设置systick为10ms中断
    //(1.6)使能模块中断
    //(1.7)【不变】开总中断
    ENABLE_INTERRUPTS;
    printf("CA的嵌入式作业,倒计时2分30秒\n");
    for(;;)     //for(;;)(开头)
    {
   		if (gTime[2] == mSec) continue;
   		mSec=gTime[2];
   		if(gTime[0]==0&&gTime[1]==0&&gTime[2]==0)	//倒计时结束
   		{
   			gpio_set(LIGHT_RED,LIGHT_ON);   //设置灯“亮”
   			printf("%d:%d:%d\n",gTime[0],gTime[1],gTime[2]);
   			systick_disable();
   		}
   		else
   		{
   			printf("%d:%d:%d\n",gTime[0],gTime[1],gTime[2]);
   		}
    }     //for(;;)结尾
}

isr.c:

#include "includes.h"
//isr.c使用的内部函数声明处
void SecAdd1(uint8_t *p);
void SecSub1(uint8_t *p);
void SysTick_Handler()
{
	//printf("***\n");
	static uint8_t SysTickCount = 0;
	SysTickCount++;    //Tick单元+1
	wdog_feed();      //看门狗“喂狗”
	if (SysTickCount >= 100)
	{
		SysTickCount = 0;
		//SecAdd1(gTime);
		SecSub1(gTime);
	}
}

void SecAdd1(uint8_t *p)
{
	*(p+2)+=1;         //秒+1
	if(*(p+2)>=60)     //秒溢出
	{
		*(p+2)=0;       //清秒
		*(p+1)+=1;      //分+1
		if(*(p+1)>=60)  //分溢出
		{
			*(p+1)=0;    //清分
			*p+=1;       //时+1
			if(*p>=24)   //时溢出
			{
				*p=0;      //清时
			}
		}
	}
}

void SecSub1(uint8_t *p)
{
    if (*(p+2) == 0)  // 如果秒为0
    {
        *(p+2) = 59;  // 设置秒为59
        if (*(p+1) == 0)  // 如果分为0
        {
            *(p+1) = 59;  // 设置分为59
            if (*p == 0)  // 如果时为0
            {
                *p = 23;  // 设置时为23
            }
            else
            {
                *p -= 1;  // 时减1
            }
        }
        else
        {
            *(p+1) -= 1;  // 分减1
        }
    }
    else
    {
        *(p+2) -= 1;  // 秒减1
    }
}

2、利用RTC显示日期(年月日、时分秒),每秒更新。并设置某个时间的闹钟。闹钟时间到时,屏幕上显示有你的姓名的文字,并点亮绿灯。

main.c:

#define GLOBLE_VAR
#include "includes.h"      //包含总头文件

int main(void)
{
//(1.1)声明main函数使用的局部变量
	uint32_t mMainLoopCount;  //主循环次数变量
	
  //(1.2)【不变】关总中断
	DISABLE_INTERRUPTS;

//(1.3)给主函数使用的局部变量赋初值
    mMainLoopCount=0;    //主循环次数变量
	
  //(1.4)给全局变量赋初值
    g_RTC_Flag=0;
//(1.5)用户外设模块初始化
    uart_init(UART_User,115200);
    RTC_Init();         //RTC初始化
	RTC_Set_Time(12,0,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值