找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1099|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

基于串口屏和語音控制的單片機(jī)代碼

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:981666 發(fā)表于 2023-5-7 14:37 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
程序代碼
#include "reg51.h"
#include "intrins.h"
bit busy;
unsigned char uart_buff = 0xff;
unsigned char speak_buff = 0x0f;
unsigned char out_buff = 0xff;
unsigned char temp;
unsigned char counter0 = 0;
bit speak_refresh_flag = 0;
bit hmi_refresh_flag = 0;
void delay_ms(unsigned int ms)//延時(shí)函數(shù)
{
        unsigned char k;
        while(ms--)
        {
        for(k=0;k<123;k++);//晶振頻率12MHz時(shí),1ms實(shí)際延時(shí)1.016ms。      
}
}
void uart_check( )//串口屏點(diǎn)亮函數(shù)
{
switch( SBUF )//循環(huán)接收SBUF當(dāng)中的信息
        {
        case 0x02:
          {
          uart_buff = uart_buff & 0xfe;//接收到02信號后客廳的燈光打開
                break;
                }
        case 0x01:
                {
                uart_buff = uart_buff | 0x01;//接收到01信號后客廳的燈光關(guān)閉
                break;
                }
        case 0x04:
                {
                uart_buff = uart_buff & 0xfd;//接收到04的信號后臥室一的燈光打卡
                break;
                }
        case 0x03:
                {
                uart_buff = uart_buff | 0x02;//接收到03的信號后臥室一的燈光關(guān)閉
                break;
                }
        case 0x06:
                {
                uart_buff = uart_buff & 0xfb;//接收到06的信號后臥室二的燈光打開
                break;
                }
        case 0x05:
                {
                uart_buff = uart_buff | 0x04;//接收到05的信號后臥室二的燈光關(guān)閉
                break;
                }
        case 0x08:
                {
                uart_buff = uart_buff & 0xf7;//接收的08的信號后臥室三的燈光打開
                break;
                }
        case 0x07:
                {
                uart_buff = uart_buff | 0x08;//接收到07的信號后臥室三的燈光關(guān)閉
                break;
                }
        case 0x00:
                {
                uart_buff = uart_buff & 0xf0;//接收到00的信號后全部的房間的燈光打開
                break;
                }
        case 0xff:
                {
                uart_buff = uart_buff | 0x0f;//接收到ff信號后全部房間的燈光都關(guān)閉
                break;
                }
        default: break;
        }
}
void UartIsr() interrupt 4//串口中斷函數(shù)
{
    if (TI)
    {
        TI = 0;//發(fā)送信號后TI置0
        busy = 0;//清空BUSY中的信息
    }
    if (RI)
    {
        RI = 0;//接收信號后RI置0
                          hmi_refresh_flag = 1;
        //uart_buff = SBUF;
                          uart_check();
    }
}
void Timer0Isr() interrupt 1//延時(shí)中斷函數(shù)
{
TH0 = (65536 - 50000) / 256;
TL1 = (65536 - 50000) % 256;
counter0++;
        if(counter0 == 4)
        {
        counter0 = 0;
        temp = ( P0 & 0X0F );
                if(speak_buff != temp)
                {
                        speak_buff = temp;
                        speak_refresh_flag = 1;
                }
        }
}
      
void UartInit( )//功能初始化
{
    SCON = 0x50;
    TMOD = 0x21;
          PCON = PCON | 0X80;
    TL1 = 0XFA;
    TH1 = 0XFA;
    TR1 = 1;
    busy = 0;
}
void Timer0Init()//內(nèi)存初始化
{
TMOD = 0x21;
TH0 = (65536 - 50000) / 256;
TL1 = (65536 - 50000) % 256;
TR0 = 1;
}
void UART_Send_Byte(char dat)//字節(jié)發(fā)送
{
    while (busy);
    busy = 1;
    SBUF = dat;
}
void UART_Send_Str(char *p)//字符串發(fā)送
{
    while (*p)
    {
        UART_Send_Byte(*p++);
    }
}
void UART_Send_END(void)   //發(fā)送結(jié)束符
{
         UART_Send_Byte(0xFF);
         UART_Send_Byte(0xFF);
         UART_Send_Byte(0xFF);
}
void speak_check( )//語音點(diǎn)亮函數(shù)
{
switch(speak_buff)//循環(huán)語音接收模塊內(nèi)存
{
        case 0x00://接收到02信號后客廳的燈光打開
        {
        UART_Send_Str("bt0.pic=3"); //發(fā)送指令控制串口屏控制圖標(biāo)的改變        UART_Send_END();
        UART_Send_Str("bt1.pic=3");  
        UART_Send_END();
        UART_Send_Str("bt2.pic=3");  
        UART_Send_END();
        UART_Send_Str("bt3.pic=3");  
        UART_Send_END();//結(jié)束指令發(fā)送
        break;
        }
        case 0x01://接受到01信號后客廳的燈光關(guān)閉
        {
        UART_Send_Str("bt0.pic=4"); //發(fā)送指令控制串口屏控制圖標(biāo)的改變
        UART_Send_END();
        UART_Send_Str("bt1.pic=3");  
        UART_Send_END();
        UART_Send_Str("bt2.pic=3");  
        UART_Send_END();
        UART_Send_Str("bt3.pic=3");  
        UART_Send_END();//結(jié)束指令發(fā)送
                break;
        }
        case 0x02:/接受到04信號后客廳的燈光打開
        {
        UART_Send_Str("bt0.pic=3"); //發(fā)送指令控制串口屏控制圖標(biāo)的改變
        UART_Send_END();
        UART_Send_Str("bt1.pic=4");  
        UART_Send_END();
        UART_Send_Str("bt2.pic=3");  
        UART_Send_END();
        UART_Send_Str("bt3.pic=3");  
        UART_Send_END();//結(jié)束指令發(fā)送
                break;
        }
        case 0x03://接受到03信號后客廳的燈光關(guān)閉
        {
        UART_Send_Str("bt0.pic=4"); //發(fā)送指令控制串口屏控制圖標(biāo)的改變
        UART_Send_END();
        UART_Send_Str("bt1.pic=4");  
        UART_Send_END();
        UART_Send_Str("bt2.pic=3");  
        UART_Send_END();
        UART_Send_Str("bt3.pic=3");  
        UART_Send_END();/結(jié)束指令發(fā)送
                break;
        }
        case 0x04://接受到06信號后客廳的燈光打開
        {
        UART_Send_Str("bt0.pic=3"); //發(fā)送指令控制串口屏控制圖標(biāo)的改變
        UART_Send_END();
        UART_Send_Str("bt1.pic=3");  
        UART_Send_END();
        UART_Send_Str("bt2.pic=4");  
        UART_Send_END();
        UART_Send_Str("bt3.pic=3");  
        UART_Send_END();//結(jié)束指令發(fā)送
                break;
        }
        case 0x05://接受到05信號后客廳的燈光關(guān)閉
        {
        UART_Send_Str("bt0.pic=4"); //發(fā)送指令控制串口屏控制圖標(biāo)的改變
        UART_Send_END();
        UART_Send_Str("bt1.pic=3");  
        UART_Send_END();
        UART_Send_Str("bt2.pic=4");  
        UART_Send_END();
        UART_Send_Str("bt3.pic=3");  
        UART_Send_END();//結(jié)束指令發(fā)送
                break;
        }
        case 0x06:/接受到08信號后客廳的燈光打開
        {
        UART_Send_Str("bt0.pic=3");  //發(fā)送指令控制串口屏控制圖標(biāo)的改變
        UART_Send_END();
        UART_Send_Str("bt1.pic=4");  
        UART_Send_END();
        UART_Send_Str("bt2.pic=4");  
        UART_Send_END();
        UART_Send_Str("bt3.pic=3");  
        UART_Send_END();/結(jié)束指令發(fā)送
                break;
        }
        case 0x07://接受到07信號后客廳的燈光關(guān)閉
        {
        UART_Send_Str("bt0.pic=4");  //發(fā)送指令控制串口屏控制圖標(biāo)的改變
        UART_Send_END();
        UART_Send_Str("bt1.pic=4");  
        UART_Send_END();
        UART_Send_Str("bt2.pic=4");  
        UART_Send_END();
        UART_Send_Str("bt3.pic=3");  
        UART_Send_END();//結(jié)束指令發(fā)送
                break;
        }
        case 0x08:
        {
        UART_Send_Str("bt0.pic=4");  //發(fā)送指令控制串口屏控制圖標(biāo)的改變
        UART_Send_END();
        UART_Send_Str("bt1.pic=3");  
        UART_Send_END();
        UART_Send_Str("bt2.pic=3");  
        UART_Send_END();
        UART_Send_Str("bt3.pic=3");  
        UART_Send_END();/結(jié)束指令發(fā)送
                break;
        }
        case 0x09:
        {
        UART_Send_Str("bt0.pic=4");  //發(fā)送指令控制串口屏控制圖標(biāo)的改變
        UART_Send_END();
        UART_Send_Str("bt1.pic=3");  
        UART_Send_END();
        UART_Send_Str("bt2.pic=3");  
        UART_Send_END();
        UART_Send_Str("bt3.pic=4");  
        UART_Send_END();//結(jié)束指令發(fā)送
                break;
        }
        case 0x0a:
        {
        UART_Send_Str("bt0.pic=3"); //發(fā)送指令控制串口屏控制圖標(biāo)的改變
        UART_Send_END();
        UART_Send_Str("bt1.pic=4");  
        UART_Send_END();
        UART_Send_Str("bt2.pic=3");  
        UART_Send_END();
        UART_Send_Str("bt3.pic=4");  
        UART_Send_END();//結(jié)束指令發(fā)送
                break;
        }
        case 0x0b:
        {
        UART_Send_Str("bt0.pic=4");  //發(fā)送指令控制串口屏控制圖標(biāo)的改變
        UART_Send_END();
        UART_Send_Str("bt1.pic=4");  
        UART_Send_END();
        UART_Send_Str("bt2.pic=3");  
        UART_Send_END();
        UART_Send_Str("bt3.pic=4");  
        UART_Send_END();//結(jié)束指令發(fā)送
                break;
        }
        case 0x0c:
        {
        UART_Send_Str("bt0.pic=3"); //發(fā)送指令控制串口屏控制圖標(biāo)的改變
        UART_Send_END();
        UART_Send_Str("bt1.pic=3");  
        UART_Send_END();
        UART_Send_Str("bt2.pic=4");  
        UART_Send_END();
        UART_Send_Str("bt3.pic=4");  
        UART_Send_END();//結(jié)束指令發(fā)送
                break;
        }
        case 0x0d:
        {
        UART_Send_Str("bt0.pic=4"); //發(fā)送指令控制串口屏控制圖標(biāo)的改變
        UART_Send_END();
        UART_Send_Str("bt1.pic=3");  
        UART_Send_END();
        UART_Send_Str("bt2.pic=4");  
        UART_Send_END();
        UART_Send_Str("bt3.pic=4");  
        UART_Send_END();/結(jié)束指令發(fā)送
                break;
        }
        case 0x0e:
        {
        UART_Send_Str("bt0.pic=3"); //發(fā)送指令控制串口屏控制圖標(biāo)的改變
        UART_Send_END();
        UART_Send_Str("bt1.pic=4");  
        UART_Send_END();
        UART_Send_Str("bt2.pic=4");  
        UART_Send_END();
        UART_Send_Str("bt3.pic=4");  
        UART_Send_END();//結(jié)束指令發(fā)送
                break;
        }
        case 0x0f:
        {
        UART_Send_Str("bt0.pic=4"); //發(fā)送指令控制串口屏控制圖標(biāo)的改變
        UART_Send_END();
        UART_Send_Str("bt1.pic=4");  
        UART_Send_END();
        UART_Send_Str("bt2.pic=4");  
        UART_Send_END();
        UART_Send_Str("bt3.pic=4");  
        UART_Send_END();/結(jié)束指令發(fā)送
                break;
        }
        default:break;
      
}
}
void main()
{
    P0 = 0XFF;
          UartInit();
          Timer0Init();
    ES = 1;
          ET0 = 1;
    EA = 1;
          delay_ms(1000);
          UART_Send_END();
   
    while (1)
    {
                        while((speak_refresh_flag == 0) && (hmi_refresh_flag == 0))/循環(huán)語音恢復(fù)標(biāo)志和屏幕恢復(fù)標(biāo)志都等于零那么所有房間的燈光都關(guān)閉。
                        {
                                P1 = out_buff;
                        }
      if((speak_refresh_flag == 1) || (hmi_refresh_flag == 1))//如果語音恢復(fù)標(biāo)志或者是屏幕恢復(fù)標(biāo)志其中一個(gè)等于一。                              
                        {
                                if( speak_refresh_flag == 1 )//如果是語音的等于一那么執(zhí)行語音模塊。                                {
                                out_buff = speak_buff;
                                speak_check( );
                                speak_refresh_flag = 0;
                                }
                                else if( hmi_refresh_flag == 1 )//若是屏幕那么就執(zhí)行屏幕功能。                                {
                                out_buff = uart_buff;
                                hmi_refresh_flag = 0;
                                }
                        }                              
    }
}
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表