嵌入式作业7

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

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

3、利用PWM脉宽调制,交替显示红灯的5个短闪和5个长闪。

4、GEC39定义为输出引脚,GEC10定义为输入引脚,用杜邦线将两个引脚相连,验证捕捉实验程序Incapture-Outcmp-20211110,观察输出的时间间隔。

程序源码

3.1

int main(void)

{

    //(1)======启动部分(开头)==========================================

    //(1.1)声明main函数使用的局部变量

    uint8_t  mFlag;           //主循环使用的临时变量

    uint8_t  mSec;               //记当前秒的值

    //(1.2)【不变】关总中断

    DISABLE_INTERRUPTS;

    wdog_stop();

   

    //(1.3)给主函数使用的局部变量赋初值

    mFlag='A';              //主循环使用的临时变量:红灯状态标志

   

    //(1.4)给全局变量赋初值

     //"时分秒"缓存初始化(00:00:00)

     gTime[0] = 0;       //时

     gTime[1] = 0;        //分

     gTime[2] = 0;        //秒

     mSec = 0;       //记住当前秒的值

    //(1.5)用户外设模块初始化

    gpio_init(LIGHT_RED,GPIO_OUTPUT,LIGHT_OFF);    //初始化红灯

    systick_init(10);      //设置systick为10ms中断

    //(1.6)使能模块中断

    //(1.7)【不变】开总中断

    ENABLE_INTERRUPTS;

   

    for(;;) 

    {

            if (gTime[2] == mSec) continue;

            mSec=gTime[2];

            if(gTime[1]==2 && gTime[2]==30){

                   gpio_set(LIGHT_RED,LIGHT_ON);

                   break;

            }

        int h=gTime[0],m=2-gTime[1],s=30-gTime[2];

        if(s<0){s+=60,m--;}

        printf("%d:%d:%d\n",h,m,s);

    }

for(;;){}

3.2

Main.c

int main(void)

{

uart_init(UART_User,115200);

    RTC_Init();        

       RTC_Set_Time( 22, 41,40 );         //设置时间

    RTC_Set_Date( 24, 6,1 ,6 );               //设置日期

    RTC_PeriodWKUP_Enable_Int();

    uart_enable_re_int(UART_User);

    RTC_Alarm_Enable_Int(0);

       RTC_Set_Alarm(0, 6,22 ,42 ,0 );   //设置闹钟

       RTC_Set_PeriodWakeUp(1);

}   //main函数(结尾)

Isr.c

void RTC_Alarm_IRQHandler(void)

{

       RTC_WKUP_IRQHandler();

       if(RTC_Alarm_Get_Int(A))            //闹钟A的中断标志位

       {

              gpio_init(LIGHT_GREEN,GPIO_OUTPUT,LIGHT_OFF);

              RTC_Alarm_Clear(A);       //清闹钟A的中断标志位

              gpio_set(LIGHT_GREEN,LIGHT_ON);

              printf("zhouhao");                                     //输出名字拼音

       }

       if(RTC_Alarm_Get_Int(B))            //闹钟A的中断标志位

       {

              RTC_Alarm_Clear(B);       //清闹钟A的中断标志位

              printf("This is ALARM_B!!!\n");

       }

}

3.3

int main(void)

{

    //(1)======启动部分(开头)==========================================

    //(1.1)声明main函数使用的局部变量

    uint8_t  mFlag;           //灯的状态标志

    uint8_t Flag;             //希望采集的电平高低标志

    double  m_duty;          //占空比

    uint32_t m_i;           //控制在未知周期内不同占空比的波形只打印有限次

    uint8_t m_K;           //确保每次能正确打印输出PWM波形

   

    //(1.2)【不变】关总中断

    DISABLE_INTERRUPTS;

   

    //(1.3)给主函数使用的局部变量赋初值

    Flag=0;

    mFlag=0;     //灯的状态标志

    //(1.4)给全局变量赋初值

   

    //(1.5)用户外设模块初始化

    gpio_init(LIGHT_RED,GPIO_OUTPUT,LIGHT_OFF);    //初始化蓝灯

    pwm_init(PWM_USER,1500,1000,10.0,PWM_CENTER,PWM_MINUS);   //PWM输出初始化

    ENABLE_INTERRUPTS;

   

   

    m_K=0;

    m_duty=10.0;

    for(;;)     //for(;;)(开头)

    {

        pwm_update(PWM_USER,m_duty);           //调节占空比

        m_duty=m_duty+5.0;                               

        if (m_duty>=80.0) m_duty=10.0;             

        printf("\n");

        for (m_i=1;m_i<11;m_i++)           

        {

            m_K=0;                        //保证每次输出打印完整的PWM波,再进入下一个循环                

            do

            {

                mFlag=gpio_get(PWM_USER);

                if ((mFlag==1)&&(Flag==1))

                {

                    printf("快闪次数:%d\n",(m_i+1)/2);       

                    Flag=0;

                    m_K++;

                    gpio_reverse(LIGHT_RED);

                }

                else if ((mFlag==0)&&(Flag==0))

                {

                    printf("短闪次数:%d\n",(m_i+1)/2);       

                    Flag=1;

                    m_K++;

                    gpio_reverse(LIGHT_RED);

                }

               

            }

            while (m_K<1);

        }

    }  //for(;;)结尾

    //(2)======主循环部分(结尾)========================================

}

运行结果

用适当的文字、截图、图片等描述实验的结果。

 1、

2、

3、

4、

  • 40
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值