源代碼原理圖硬件設(shè)計(jì)等
一、系統(tǒng)主要功能
可以通過LCD的輸出顯示公歷和農(nóng)歷時(shí)間,通過按鍵設(shè)置時(shí)間和鬧鐘;通過蜂鳴器響應(yīng)鬧鐘。 三、電路原理圖、接口、硬件構(gòu)成 1.原理圖 
2.接口 本次實(shí)驗(yàn)使用了串口、定時(shí)器、中斷接口。 3.硬件組成 (1)實(shí)驗(yàn)設(shè)計(jì)程序流程圖如圖左所示,中斷流程圖如圖右所示。
(2)該設(shè)計(jì)分為軟件設(shè)計(jì)和硬件設(shè)計(jì)兩大模塊,硬件電路由 ARM 最小系統(tǒng)電路、時(shí)鐘顯示電路和鬧鐘提醒電路組成,采用stm32f103RCT6芯片,芯片管腳圖示如下。 (3)時(shí)鐘電路 此電路主要是復(fù)位電路和時(shí)鐘電路兩部分,其中復(fù)位電路采用按鍵手動(dòng)復(fù)位和上電自動(dòng)復(fù)位組合,電路如圖所示:晶振采用的是 8MHz 和 32.786KHz , 8MKz 分別接 STM32 的 5 腳和 6 腳, 32.786KHz 分別接 STM32 的 3 腳和 4 腳。 (4)鬧鐘提醒電路 本次實(shí)驗(yàn)設(shè)計(jì)的鬧鐘提醒電路為蜂鳴器電路,接入芯片的PC7引腳,當(dāng)時(shí)間為設(shè)置鬧鐘時(shí)間時(shí),蜂鳴器工作,發(fā)出響聲,提醒電路如圖所示。
四、核心代碼(帶注釋)
- #include "delay.h"
- #include "sys.h"
- #include "lcd.h"
- #include "dht11.h"
- #include "ds1302.h"
- #include "KEY.h"
- #include "beep.h"
- u8 temp;
- u8 humi;
- u8 t=0;
- u8 flag=0,flag1=0,flag2=0,flag3=1;
- u8 a,b,c;
- int min1=10,hour1=10;
- DHT11_Data_TypeDef DHT11_Data;
- void TIM3_Int_Init(u16 arr,u16 psc)
- {
- TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
- NVIC_InitTypeDef NVIC_InitStructure;
-
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //時(shí)鐘使能
-
- //定時(shí)器TIM3初始化
- TIM_TimeBaseStructure.TIM_Period = arr; //設(shè)置在下一個(gè)更新事件裝入活動(dòng)的自動(dòng)重裝載計(jì)時(shí)器的值
- TIM_TimeBaseStructure.TIM_Prescaler =psc; //設(shè)置用來作為TIMx時(shí)鐘頻率除數(shù)的預(yù)分頻值 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //設(shè)置時(shí)鐘分割:TDTS = Tck_tim
- TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上計(jì)數(shù)模式
- TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根據(jù)指定的參數(shù)初始化TIMx的時(shí)間基數(shù)單位
-
- TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中斷,允許更新中斷
- //中斷優(yōu)先級(jí)NVIC設(shè)置
- NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM中斷
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占優(yōu)先級(jí)0級(jí)
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //從優(yōu)先級(jí)3級(jí)
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
- NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器
- TIM_Cmd(TIM3, DISABLE); //使能TIMx
- }
- void gui0(u8 mode)
- {
- LCD_ShowPicture(0,0,480,320);
- if(flag3==1)
- {
- LCD_ShowPicture3(445,0,479,34);
- }
- LCD_ShowChinese(0+40,0,0,BLUE,32,mode);//字
- LCD_ShowChinese(32+40,0,8,BLUE,32,mode);
- LCD_ShowChinese(64+40,0,9,BLUE,32,mode);
- LCD_ShowChinese(96+40,0,10,BLUE,32,mode);
- LCD_ShowNum(52,40,temp,2,BLUE,32,mode);//溫度
- LCD_ShowChinese(132,40,12,BLUE,32,mode);
-
- LCD_ShowChinese(128+80+30,0,0,BLUE,32,mode);
- LCD_ShowChinese(160+80+30,0,8,BLUE,32,mode);
- LCD_ShowChinese(192+80+30,0,11,BLUE,32,mode);
- LCD_ShowChinese(224+80+30,0,10,BLUE,32,mode);
- LCD_ShowNum(248+30,40,humi,2,BLUE,32,mode);
- LCD_ShowChar(280+30,40,'%',BLUE,32,mode);
-
- LCD_ShowNum(20,80,hour/10,1,BLUE,160,mode);//時(shí)間
- LCD_ShowNum(110,80,hour%10,1,BLUE,160,mode);
- LCD_ShowChar(200,65,':',BLUE,160,mode);
- LCD_ShowNum(290,80,min/10,1,BLUE,160,mode);
- LCD_ShowNum(380,80,min%10,1,BLUE,160,mode);
- LCD_ShowNum(0,250,year+2000,4,BLUE,32,mode);
- LCD_ShowChinese(64,250,13,BLUE,32,mode);
- LCD_ShowNum(96,250,month,2,BLUE,32,mode);
- LCD_ShowChinese(128,250,14,BLUE,32,mode);
- LCD_ShowNum(160,250,day,2,BLUE,32,mode);
- LCD_ShowChinese(192,250,15,BLUE,32,mode);
- LCD_ShowChinese(224,250,16,BLUE,32,mode);
- LCD_ShowChinese(256,250,week,BLUE,32,mode);
-
- LCD_ShowNum(0,283,hour1,2,BLUE,32,mode);
- LCD_ShowChar(33,283,':',BLUE,32,mode);
- LCD_ShowNum(50,283,min1,2,BLUE,32,mode);
- }
- void keyscan(u8 mode)
- {
- switch(t)
- {
- case KEY0_PRES:
- if(min1==min&&hour1==hour)
- {
- flag2=1;
- BEEP(OFF);
- }
- switch(flag)
- {
- case 1: hour++; if(hour>23)hour=0;LCD_ShowPicture2(20,80,190,240); LCD_ShowNum(20,80,hour/10,1,BLUE,160,mode);//時(shí)間
- LCD_ShowNum(110,80,hour%10,1,BLUE,160,mode);break;
- case 2: min++; if(min>59) min=0;LCD_ShowPicture2(290,80,460,240);LCD_ShowNum(290,80,min/10,1,BLUE,160,mode);
- LCD_ShowNum(380,80,min%10,1,BLUE,160,mode); break;
- case 3: year++; LCD_ShowPicture2(0,250,64,282); LCD_ShowNum(0,250,year+2000,4,BLUE,32,mode);break;
- case 4: month++; if(month>12) month=1;LCD_ShowPicture2(96,250,128,282); LCD_ShowNum(96,250,month,2,BLUE,32,mode);break;
- case 5: day++; if(day>31) day=1; LCD_ShowPicture2(160,250,192,282);LCD_ShowNum(160,250,day,2,BLUE,32,mode); break;
- case 6: week++; if(week>7) week=1; LCD_ShowPicture2(256,250,288,282);LCD_ShowChinese(256,250,week,BLUE,32,mode);break;
- case 7: hour1++; if(hour1>23)hour1=0;LCD_ShowPicture2(0,283,32,315); LCD_ShowNum(0,283,hour1,2,BLUE,32,mode);break;
- case 8: min1++; if(min1>59)min1=0;LCD_ShowPicture2(50,283,82,315);LCD_ShowNum(50,283,min1,2,BLUE,32,mode);break;
- case 9: flag3=1; LCD_ShowPicture3(445,0,479,34); break;
- default: break;
- }
- break;
- case KEY1_PRES:
- if(min1==min&&hour1==hour)
- {
- flag2=1;
- BEEP( OFF );
- }
- switch(flag)
- {
- case 1: hour--; if(hour<0)hour=23; LCD_ShowPicture2(20,80,190,240);LCD_ShowNum(20,80,hour/10,1,BLUE,160,mode);//時(shí)間
- LCD_ShowNum(110,80,hour%10,1,BLUE,160,mode); break;
- case 2: min--; if(min<0) min=59; LCD_ShowPicture2(290,80,460,240);LCD_ShowNum(290,80,min/10,1,BLUE,160,mode);
- LCD_ShowNum(380,80,min%10,1,BLUE,160,mode); break;
- case 3: year--; LCD_ShowPicture2(0,250,64,282); LCD_ShowNum(0,250,year+2000,4,BLUE,32,mode);break;
- case 4: month--; if(month<1) month=12; LCD_ShowPicture2(96,250,128,282); LCD_ShowNum(96,250,month,2,BLUE,32,mode);break;
- case 5: day--; if(day<1) day=31; LCD_ShowPicture2(160,250,192,282);LCD_ShowNum(160,250,day,2,BLUE,32,mode); break;
- case 6: week--; if(week<1) week=7; LCD_ShowPicture2(256,250,288,282);LCD_ShowChinese(256,250,week,BLUE,32,mode); break;
- case 7: hour1--; if(hour1<0)hour1=23;LCD_ShowPicture2(0,283,32,315); LCD_ShowNum(0,283,hour1,2,BLUE,32,mode);break;
- case 8: min1--; if(min1<0)min1=59;LCD_ShowPicture2(50,283,82,315);LCD_ShowNum(50,283,min1,2,BLUE,32,mode);break;
- case 9: flag3=0; LCD_ShowPicture2(445,0,480,36);break;
- default: break;
- }
- break;
- case WKUP_PRES:
- cc1();flag++;
- switch(flag)
- {
- case 1: TIM_Cmd(TIM3, DISABLE); LCD_DrawLine(20,242,190,243,BLUE);break;
- case 2: LCD_ShowPicture1(242,243);LCD_DrawLine(290,242,460,243,BLUE); break;
- case 3: LCD_ShowPicture1(242,243); LCD_DrawLine(0,287,64,288,BLUE);break;
- case 4: LCD_ShowPicture1(287,288);LCD_DrawLine(96,287,128,288,BLUE);break;
- case 5: LCD_ShowPicture1(287,288); LCD_DrawLine(160,287,192,288,BLUE); break;
- case 6: LCD_ShowPicture1(287,288);LCD_DrawLine(256,287,288,288,BLUE); break;
- case 7: LCD_ShowPicture1(287,288); LCD_DrawLine(0,316,32,317,BLUE);break;
- case 8: LCD_ShowPicture1(316,317); LCD_DrawLine(50,316,82,317,BLUE);break;
- case 9: LCD_ShowPicture1(316,317); LCD_DrawLine(445,37,479,38,BLUE);break;
- case 10: LCD_ShowPicture2(445,37,479,38); ds_wtime();a=sec;b=min;c=hour;TIM_Cmd(TIM3, ENABLE);flag=0;break;
- default: break;
- }
- break;
- default: delay_ms(5); break;
- }
- }
- int main(void)
- {
- delay_init();
- NVIC_Configuration();
- DHT11_Init ();
- KEY_Init();
- BEEP_GPIO_Config();
- BEEP( OFF );
- TIM3_Int_Init(9999,7199);
- ds1302_init();
- ds_read_time();
- cc();
- a=sec;
- b=min;
- c=hour;
- Lcd_Init();
- LCD_Clear(WHITE);
- gui0(1);
- TIM_Cmd(TIM3, ENABLE);
- while(1)
- {
- t=KEY_Scan(0);
- keyscan(1);
- if( DHT11_Read_TempAndHumidity (&DHT11_Data ) == SUCCESS&&flag==0)
- {
- temp=DHT11_Data.temp_int;
- humi=DHT11_Data.humi_int;
- LCD_ShowPicture2(52,40,84,72);
- LCD_ShowPicture2(278,40,310,72);
- LCD_ShowNum(52,40,temp,2,BLUE,32,1);
- LCD_ShowNum(278,40,humi,2,BLUE,32,1);
- }
- if(flag==0&&min1==min&&hour1==hour&&flag2==0&&flag3==1)
- {
- BEEP( ON );
- }
- }
- }
復(fù)制代碼 以上圖文的Word格式文檔下載(內(nèi)容和本網(wǎng)頁上的一模一樣,方便保存):
基于定時(shí)中斷的電子鬧鐘.doc
(2.9 MB, 下載次數(shù): 187)
2020-5-27 17:02 上傳
點(diǎn)擊文件名下載附件
|