希望可以帮到你
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include "stm32f10x.h"
- #include "Delay.h"
- #include "smg.h"
- #include "sys.h"
- #include "timer.h"
- #include "led.h"
- #include "fmq.h"
- #include "key.h"
- #include "stm32f10x_tim.h"
- //定义0~9十个数字的字型码表
- uint16_t table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x80};//段码
- //显示0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -, .
- uint16_t wei[]={0x0fe,0x0fd,0x0fb,0x0f7,0x0ef,0x0df,0x0bf,0x07f}; //位码;
- uint8_t num[8];
- uint16_t t,i,k; //
- uint16_t L1=LED1OFF;//F1=FMQ1OFF;//不能放在一行定义
- uint16_t F1=FMQ1OFF;
- uint16_t hour,minute,secend; //原有定义时间
- uint16_t hour1,minute1,secend1; //保护修改闹铃当前时间,恢复用
- uint16_t hour2,minute2,secend2; //设闹铃
- int main(void)
- {
- hour=23,minute=59,secend=50;
- NVIC_Configuration(); //设置中断分组2:2位抢占优先级,2位响应优先级
- SMG_Init();
- TIM3_Init(100,7199); //10Khz的计数频率,计数到5000为500ms(仿真1000,实际10000)
- LED_Init(); //7200-1=7199 72M=7200 0000
- FMQ_Init();
- KEY_Init(); //<<左移 &与字节 字 &&位与逻辑里小括号 |字节或字 ||位或逻辑 !=不等于 !逻辑取反
-
- while(1)
- {
- t=KEY_Scan(); //得到键值
- if(t) //if(条件)t!=0真
- {
- switch(t)
- {
- case 1:
- hour++;
- break;
- case 2:
- minute++;
- break;
- case 3:
- secend++;
- break;
- case 4:
- TIM_ITConfig(TIM3,TIM_IT_Update,DISABLE); //禁止TIM3中断
- TIM_Cmd(TIM3,DISABLE); //TIM3停止
- hour1=hour,minute1=minute1,secend1=secend; //把原有时间放在当前时间里
- break;
- case 5:
- if(TIM_GetITStatus(TIM3,TIM_IT_Update)==RESET) //获取TIM3的更新状标志位条件成立
- {
- hour2=hour,minute2=minute,secend2=secend; //闹铃设定时间放在当前时间里
- hour=hour1,minute=minute1,secend=secend1; //还原当前时间
- TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
- TIM_Cmd(TIM3,ENABLE);
- }
- break;
- }
- }
-
- num[7]=secend%10; // 51%10 51/10 取余1 %取余数 /取整数
- num[6]=secend/10;//秒 /整除(商)
- num[5]=10;
- num[4]=minute%10;
- num[3]=(minute%100)/10;
- num[2]=11;
- num[1]=hour%10;
- num[0]=(hour%100)/10;
- for(i=0;i<8;i++)
- {
- GPIO_Write(GPIOB,wei[i]|(L1&F1));//送段送位短延时
- GPIO_Write(GPIOC,table[num[i]]);
- Delay(23);
-
- GPIO_Write(GPIOB,0x0ff|(L1&F1));//复位延时要适当
- Delay(23); //仿真时可以省略,实际根据需要来确定
- }
- if(secend==60){secend=0;minute++;}
- if(minute==60){minute=0;hour++;}
- if(hour==24){hour =0;}
- if(minute==0)
- {
- if(secend%2==1){LED1=0;L1=LED1ON;}
- else{LED1=1;L1=LED1OFF;}
- FMQ1=0;F1=FMQ1ON;
- }
- else
- { LED1=1;L1=LED1OFF;FMQ1=1;F1=FMQ1OFF;}
- if(minute==minute2&&hour==hour2&&secend<=20) //&& 与
- {
- if(secend%2==1){LED1=0;L1=LED1ON;}
- else{LED1=1;L1=LED1OFF;}
- FMQ1=0;F1=FMQ1ON;
- }
- else
- { LED1=1;L1=LED1OFF;FMQ1=1;F1=FMQ1OFF;}
- }
- }
复制代码
本人初学,仅供参考,如有错误,请大家回帖多多指教,仿真代码下载:
定时器+8位数码管数字钟整点PB口闪烁报警按键(查询扫描).7z
(253.75 KB, 下载次数: 394)
|