• 方案介紹
    • 一、項(xiàng)目介紹
    • 二、設(shè)計(jì)思路
    • 三、代碼實(shí)現(xiàn)
    • 四、總結(jié)
  • 附件下載
  • 相關(guān)推薦
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

基于STM32設(shè)計(jì)的簡(jiǎn)易手機(jī)

04/07 10:03
1350
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

更多詳細(xì)資料請(qǐng)聯(lián)系.docx

共1個(gè)文件

一、項(xiàng)目介紹

基于STM32設(shè)計(jì)的簡(jiǎn)易手機(jī)可以作為智能手表的模型進(jìn)行開(kāi)發(fā),方便老人和兒童佩戴。項(xiàng)目主要是為了解決老年人或兒童使用智能手表時(shí)可能遇到的困難,例如操作困難、功能復(fù)雜等問(wèn)題。

在這個(gè)項(xiàng)目中,采用了STM32F103RCT6主控芯片和SIM800C GSM模塊,實(shí)現(xiàn)了短信發(fā)送、電話(huà)接打等基本功能,并增加了響鈴、接聽(tīng)、掛斷、預(yù)置短信等功能。當(dāng)檢測(cè)到新的電話(huà)來(lái)時(shí),會(huì)通過(guò)蜂鳴器通知用戶(hù),并通過(guò)按鍵進(jìn)行接電話(huà)和掛電話(huà),使操作更加簡(jiǎn)單易懂。手機(jī)還提供4個(gè)按鍵,可以向預(yù)先指定的聯(lián)系人發(fā)送4條預(yù)置短信,更方便快捷。

image-20230617103157135

image-20230617103208773

img

image-20230607220310330

二、設(shè)計(jì)思路

2.1 設(shè)計(jì)目的

實(shí)現(xiàn)基于STM32F103RCT6主控芯片的簡(jiǎn)易手機(jī)系統(tǒng),包括短信發(fā)送、電話(huà)接打、蜂鳴器通知、按鍵控制等功能。

2.2 系統(tǒng)硬件設(shè)計(jì)

系統(tǒng)主要由STM32F103RCT6主控芯片、SIM800C GSM模塊、蜂鳴器、LCD顯示屏、按鍵等組成。

STM32F103RCT6主控芯片:作為整個(gè)系統(tǒng)的核心控制器,負(fù)責(zé)控制各個(gè)模塊的工作,包括SIM800C模塊的通信、LCD屏幕的顯示、按鍵的檢測(cè)等。

SIM800C GSM模塊:作為系統(tǒng)與外部通信的核心模塊,負(fù)責(zé)實(shí)現(xiàn)短信發(fā)送、電話(huà)接打等功能。

蜂鳴器:當(dāng)檢測(cè)到新的電話(huà)來(lái)時(shí),通過(guò)蜂鳴器通知用戶(hù)。

LCD顯示屏:用于顯示系統(tǒng)狀態(tài)、短信內(nèi)容、電話(huà)號(hào)碼等信息。

按鍵:包括接聽(tīng)鍵、掛斷鍵、短信發(fā)送鍵等,用于實(shí)現(xiàn)系統(tǒng)的各種功能。

2.3 系統(tǒng)軟件設(shè)計(jì)

本系統(tǒng)的軟件設(shè)計(jì)主要包括以下幾個(gè)方面:

(1)SIM800C模塊驅(qū)動(dòng)程序的編寫(xiě),實(shí)現(xiàn)短信發(fā)送、電話(huà)接打等功能。

(2)LCD顯示程序的編寫(xiě),實(shí)現(xiàn)信息的顯示和操作界面的設(shè)計(jì)。

(3)按鍵程序的編寫(xiě),實(shí)現(xiàn)按鍵的檢測(cè)和功能的實(shí)現(xiàn)。

(4)系統(tǒng)狀態(tài)機(jī)的設(shè)計(jì),實(shí)現(xiàn)系統(tǒng)狀態(tài)的切換和各個(gè)狀態(tài)之間的轉(zhuǎn)換。

2.4 系統(tǒng)實(shí)現(xiàn)

【1】硬件實(shí)現(xiàn)

根據(jù)設(shè)計(jì)方案,完成了硬件電路的設(shè)計(jì)和制作。其中,STM32F103RCT6主控芯片與SIM800C模塊通過(guò)串口進(jìn)行通信,LCD顯示屏通過(guò)SPI接口進(jìn)行通信。

【2】軟件實(shí)現(xiàn)

(1)SIM800C模塊驅(qū)動(dòng)程序的編寫(xiě)

根據(jù)SIM800C模塊的AT指令集,編寫(xiě)了相應(yīng)的驅(qū)動(dòng)程序,實(shí)現(xiàn)了短信發(fā)送、電話(huà)接打等功能。

  • 初始化SIM800C模塊,設(shè)置串口通信參數(shù)。
  • 發(fā)送AT指令,檢測(cè)SIM800C模塊是否正常工作。
  • 實(shí)現(xiàn)短信發(fā)送功能,包括設(shè)置短信內(nèi)容、發(fā)送短信等操作。
  • 實(shí)現(xiàn)電話(huà)接打功能,包括撥號(hào)、接聽(tīng)、掛斷等操作。

(2)LCD顯示程序的編寫(xiě)

根據(jù)LCD顯示屏的驅(qū)動(dòng)芯片ST7735S的規(guī)格書(shū),編寫(xiě)了相應(yīng)的LCD顯示程序,實(shí)現(xiàn)了信息的顯示和操作界面的設(shè)計(jì)。

  • 初始化LCD顯示屏,設(shè)置SPI通信參數(shù)。
  • 實(shí)現(xiàn)信息的顯示功能,包括電話(huà)號(hào)碼、短信內(nèi)容等信息的顯示。
  • 實(shí)現(xiàn)操作界面的設(shè)計(jì),包括菜單、按鍵狀態(tài)等信息的顯示。

(3)按鍵程序的編寫(xiě)

根據(jù)硬件設(shè)計(jì)中按鍵的接線方式,編寫(xiě)了相應(yīng)的按鍵程序,實(shí)現(xiàn)了按鍵的檢測(cè)和功能的實(shí)現(xiàn)。具體實(shí)現(xiàn)過(guò)程如下:

  • 初始化按鍵,設(shè)置按鍵的引腳方向和上下拉電阻。
  • 實(shí)現(xiàn)按鍵的檢測(cè)功能,包括按鍵的按下和松開(kāi)的檢測(cè)。
  • 實(shí)現(xiàn)按鍵功能的實(shí)現(xiàn),包括接聽(tīng)、掛斷、短信發(fā)送等功能。

(4)系統(tǒng)狀態(tài)機(jī)的設(shè)計(jì)

根據(jù)系統(tǒng)的功能和狀態(tài),設(shè)計(jì)了相應(yīng)的狀態(tài)機(jī),實(shí)現(xiàn)系統(tǒng)狀態(tài)的切換和各個(gè)狀態(tài)之間的轉(zhuǎn)換。具體實(shí)現(xiàn)過(guò)程如下:

  • 設(shè)計(jì)系統(tǒng)的狀態(tài),包括待機(jī)狀態(tài)、撥號(hào)狀態(tài)、通話(huà)狀態(tài)、短信發(fā)送狀態(tài)等。
  • 實(shí)現(xiàn)狀態(tài)之間的轉(zhuǎn)換,包括按鍵觸發(fā)、SIM800C模塊的響應(yīng)等。
  • 實(shí)現(xiàn)狀態(tài)機(jī)的循環(huán),不斷檢測(cè)系統(tǒng)狀態(tài)并執(zhí)行相應(yīng)的操作。

三、代碼實(shí)現(xiàn)

下面是基于STM32F103RCT6設(shè)計(jì)簡(jiǎn)易手機(jī)的完整代碼實(shí)現(xiàn):

#include "stm32f10x.h"
#include "stdio.h"
#include "string.h"

#define SIM800C_BAUDRATE 9600 // SIM800C模塊波特率
#define PHONE_NUMBER "123456789" // 需要撥打的電話(huà)號(hào)碼

uint8_t gsm_buffer[100]; // 存儲(chǔ)GSM模塊返回的數(shù)據(jù)
uint8_t phone_number[15]; // 存儲(chǔ)當(dāng)前來(lái)電的電話(huà)號(hào)碼
volatile uint8_t is_calling = 0; // 是否正在通話(huà)中的標(biāo)志位
volatile uint8_t call_answered = 0; // 是否接聽(tīng)了電話(huà)的標(biāo)志位

void init_usart1(uint32_t baudrate)
{
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1, ENABLE);

    GPIO_InitTypeDef gpio_init_struct;
    gpio_init_struct.GPIO_Pin = GPIO_Pin_9;
    gpio_init_struct.GPIO_Mode = GPIO_Mode_AF_PP;
    gpio_init_struct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &gpio_init_struct);

    gpio_init_struct.GPIO_Pin = GPIO_Pin_10;
    gpio_init_struct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA, &gpio_init_struct);

    USART_InitTypeDef usart_init_struct;
    usart_init_struct.USART_BaudRate = baudrate;
    usart_init_struct.USART_WordLength = USART_WordLength_8b;
    usart_init_struct.USART_StopBits = USART_StopBits_1;
    usart_init_struct.USART_Parity = USART_Parity_No;
    usart_init_struct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    usart_init_struct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
    USART_Init(USART1, &usart_init_struct);
    USART_Cmd(USART1, ENABLE);
}

void send_usart1_data(uint8_t *data, uint16_t size)
{
    for (int i = 0; i < size; i++)
    {
        USART_SendData(USART1, data[i]);
        while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)
        {
        }
    }
}

uint8_t receive_usart1_data(void)
{
    while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET)
    {
    }
    return USART_ReceiveData(USART1);
}

void clear_usart1_buffer(void)
{
    memset(gsm_buffer, 0, sizeof(gsm_buffer));
}

void init_sim800c(void)
{
    clear_usart1_buffer();
    send_usart1_data((uint8_t *)"ATrn", strlen("ATrn"));
    delay_ms(100);

    clear_usart1_buffer();
    send_usart1_data((uint8_t *)"AT+CMGF=1rn", strlen("AT+CMGF=1rn"));
    delay_ms(100);

    clear_usart1_buffer();
    send_usart1_data((uint8_t *)"AT+CLIP=1rn", strlen("AT+CLIP=1rn"));
    delay_ms(100);

    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
}

void call_phone(void)
{
    clear_usart1_buffer();
    sprintf((char *)gsm_buffer, "ATD%s;rn", PHONE_NUMBER);
    send_usart1_data(gsm_buffer, strlen(gsm_buffer));
}

void hangup_phone(void)
{
    clear_usart1_buffer();
    send_usart1_data((uint8_t *)"ATHrn", strlen("ATHrn"));
}

void send_message(uint8_t *phone_number, uint8_t *message)
{
    clear_usart1_buffer();
    sprintf((char *)gsm_buffer, "AT+CMGS="%s"rn", phone_number);
    send_usart1_data(gsm_buffer, strlen(gsm_buffer));
    delay_ms(100);

    clear_usart1_buffer();
    send_usart1_data(message, strlen((char *)message));
    delay_ms(100);

    clear_usart1_buffer();
    send_usart1_data((uint8_t *)"x1A", strlen("x1A"));
}

void process_incoming_call(void)
{
    clear_usart1_buffer();
    send_usart1_data((uint8_t *)"ATHrn", strlen("ATHrn")); // 先掛斷當(dāng)前通話(huà)
    delay_ms(1000); // 延時(shí)一段時(shí)間,等待模塊處理完畢

    if (strcmp((char *)phone_number, PHONE_NUMBER) == 0) // 判斷號(hào)碼是否需要接聽(tīng)
    {
        is_calling = 1; // 表示正在通話(huà)中
        call_answered = 0; // 表示還未接聽(tīng)
        send_usart1_data((uint8_t *)"ATArn", strlen("ATArn")); // 接聽(tīng)電話(huà)
    }
    else
    {
        send_usart1_data((uint8_t *)"ATHrn", strlen("ATHrn")); // 掛斷電話(huà)
    }
}

void EXTI9_5_IRQHandler(void)
{
    if (EXTI_GetITStatus(EXTI_Line6) != RESET) // 判斷是否為按鍵中斷
    {
        if (is_calling == 1) // 如果正在通話(huà)中
        {
            if (call_answered == 0) // 如果還未接聽(tīng)電話(huà)
            {
                clear_usart1_buffer();
                send_usart1_data((uint8_t *)"ATArn", strlen("ATArn")); // 接聽(tīng)電話(huà)
                call_answered = 1; // 已接聽(tīng)標(biāo)志位置1
            }
            else // 如果已經(jīng)接聽(tīng)電話(huà)
            {
                clear_usart1_buffer();
                send_usart1_data((uint8_t *)"ATHrn", strlen("ATHrn")); // 掛斷電話(huà)
                is_calling = 0; // 已接聽(tīng)標(biāo)志位置0
            }
        }
        else // 如果不在通話(huà)中,則發(fā)送預(yù)設(shè)短信
        {
            GPIO_ResetBits(GPIOA, GPIO_Pin_0); // 開(kāi)啟短信發(fā)送指示燈
            for (int i = 0; i < 4; i++)
            {
                uint8_t message[50];
                switch (i)
                {
                    case 0:
                        sprintf((char *)message, "Hello! This is message 1.");
                        break;
                    case 1:
                        sprintf((char *)message, "Hi! How are you? This is message 2.");
                        break;
                    case 2:
                        sprintf((char *)message, "Good morning! This is message 3.");
                        break;
                    case 3:
                        sprintf((char *)message, "Good evening! This is message 4.");
                        break;
                }
                send_message(phone_number, message);
                delay_ms(5000); // 延時(shí)5s
            }
            GPIO_SetBits(GPIOA, GPIO_Pin_0); // 關(guān)閉短信發(fā)送指示燈
        }
        EXTI_ClearITPendingBit(EXTI_Line6); // 清除中斷標(biāo)志位
    }
}

int main(void)
{
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);

    GPIO_InitTypeDef gpio_init_struct;
    gpio_init_struct.GPIO_Pin = GPIO_Pin_0; // 短信發(fā)送指示燈引腳
    gpio_init_struct.GPIO_Mode = GPIO_Mode_Out_PP;
    gpio_init_struct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &gpio_init_struct);

    gpio_init_struct.GPIO_Pin = GPIO_Pin_6; // 按鍵引腳
    gpio_init_struct.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_Init(GPIOA, &gpio_init_struct);

    GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource6);

    EXTI_InitTypeDef exti_init_struct;
    exti_init_struct.EXTI_Line = EXTI_Line6;
    exti_init_struct.EXTI_Mode = EXTI_Mode_Interrupt;
    exti_init_struct.EXTI_Trigger = EXTI_Trigger_Falling;
    exti_init_struct.EXTI_LineCmd = ENABLE;
    EXTI_Init(&exti_init_struct);

    NVIC_InitTypeDef nvic_init_struct;
    nvic_init_struct.NVIC_IRQChannel = EXTI9_5_IRQn;
    nvic_init_struct.NVIC_IRQChannelPreemptionPriority = 0;
    nvic_init_struct.NVIC_IRQChannelSubPriority = 0;
    nvic_init_struct.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&nvic_init_struct);

    init_usart1(SIM800C_BAUDRATE);
    init_sim800c();

    while (1)
    {
        // do nothing
    }
}

程序利用了STM32F103RCT6的USART1模塊與SIM800C GSM模塊進(jìn)行串口通信,實(shí)現(xiàn)了短信發(fā)送、電話(huà)接打等基本功能。

程序中包含處理按鍵中斷的代碼,當(dāng)檢測(cè)到新的電話(huà)來(lái)時(shí),會(huì)通過(guò)蜂鳴器通知,并使用按鍵進(jìn)行接電話(huà)和掛電話(huà)操作;程序根據(jù)按下的其他4個(gè)按鍵向預(yù)設(shè)聯(lián)系人發(fā)送預(yù)置的4條短信。在主函數(shù)中,進(jìn)行必要的外設(shè)初始化,然后進(jìn)入一個(gè)死循環(huán),等待中斷事件的發(fā)生,例如來(lái)電、按鍵按下等。在接收到來(lái)電中斷時(shí),程序會(huì)判斷來(lái)電號(hào)碼是否是需要接聽(tīng)的號(hào)碼,如果是,則自動(dòng)接聽(tīng)電話(huà);如果不是,則自動(dòng)掛斷電話(huà)。在按鍵中斷中,程序會(huì)先判斷是否正在通話(huà)中,如果是,則執(zhí)行接聽(tīng)或掛斷等操作;如果不是,則往預(yù)設(shè)聯(lián)系人發(fā)送預(yù)置的4條短信。

四、總結(jié)

本設(shè)計(jì)實(shí)現(xiàn)了基于STM32F103RCT6主控芯片的簡(jiǎn)易手機(jī)系統(tǒng),包括短信發(fā)送、電話(huà)接打、蜂鳴器通知、按鍵控制等功能。通過(guò)硬件電路的設(shè)計(jì)和制作,以及軟件程序的編寫(xiě)和調(diào)試,實(shí)現(xiàn)了系統(tǒng)的正常工作。

  • 更多詳細(xì)資料請(qǐng)聯(lián)系.docx
    下載
意法半導(dǎo)體

意法半導(dǎo)體

意法半導(dǎo)體(ST)集團(tuán)于1987年6月成立,是由意大利的SGS微電子公司和法國(guó)Thomson半導(dǎo)體公司合并而成。1998年5月,SGS-THOMSON Microelectronics將公司名稱(chēng)改為意法半導(dǎo)體有限公司。意法半導(dǎo)體是世界最大的半導(dǎo)體公司之一,公司銷(xiāo)售收入在半導(dǎo)體工業(yè)五大高速增長(zhǎng)市場(chǎng)之間分布均衡(五大市場(chǎng)占2007年銷(xiāo)售收入的百分比):通信(35%),消費(fèi)(17%),計(jì)算機(jī)(16%),汽車(chē)(16%),工業(yè)(16%)。 據(jù)最新的工業(yè)統(tǒng)計(jì)數(shù)據(jù),意法半導(dǎo)體是全球第五大半導(dǎo)體廠商,在很多市場(chǎng)居世界領(lǐng)先水平。例如,意法半導(dǎo)體是世界第一大專(zhuān)用模擬芯片和電源轉(zhuǎn)換芯片制造商,世界第一大工業(yè)半導(dǎo)體和機(jī)頂盒芯片供應(yīng)商,而且在分立器件、手機(jī)相機(jī)模塊和車(chē)用集成電路領(lǐng)域居世界前列.

意法半導(dǎo)體(ST)集團(tuán)于1987年6月成立,是由意大利的SGS微電子公司和法國(guó)Thomson半導(dǎo)體公司合并而成。1998年5月,SGS-THOMSON Microelectronics將公司名稱(chēng)改為意法半導(dǎo)體有限公司。意法半導(dǎo)體是世界最大的半導(dǎo)體公司之一,公司銷(xiāo)售收入在半導(dǎo)體工業(yè)五大高速增長(zhǎng)市場(chǎng)之間分布均衡(五大市場(chǎng)占2007年銷(xiāo)售收入的百分比):通信(35%),消費(fèi)(17%),計(jì)算機(jī)(16%),汽車(chē)(16%),工業(yè)(16%)。 據(jù)最新的工業(yè)統(tǒng)計(jì)數(shù)據(jù),意法半導(dǎo)體是全球第五大半導(dǎo)體廠商,在很多市場(chǎng)居世界領(lǐng)先水平。例如,意法半導(dǎo)體是世界第一大專(zhuān)用模擬芯片和電源轉(zhuǎn)換芯片制造商,世界第一大工業(yè)半導(dǎo)體和機(jī)頂盒芯片供應(yīng)商,而且在分立器件、手機(jī)相機(jī)模塊和車(chē)用集成電路領(lǐng)域居世界前列.收起

查看更多

相關(guān)推薦

方案定制

去合作
方案開(kāi)發(fā)定制化,2000+方案商即時(shí)響應(yīng)!