找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 799|回复: 0
打印 上一主题 下一主题
收起左侧

基于串口屏和语音控制的单片机代码

[复制链接]
跳转到指定楼层
楼主
ID:981666 发表于 2023-5-7 14:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
程序代码
#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)//延时函数
{
        unsigned char k;
        while(ms--)
        {
        for(k=0;k<123;k++);//晶振频率12MHz时,1ms实际延时1.016ms。      
}
}
void uart_check( )//串口屏点亮函数
{
switch( SBUF )//循环接收SBUF当中的信息
        {
        case 0x02:
          {
          uart_buff = uart_buff & 0xfe;//接收到02信号后客厅的灯光打开
                break;
                }
        case 0x01:
                {
                uart_buff = uart_buff | 0x01;//接收到01信号后客厅的灯光关闭
                break;
                }
        case 0x04:
                {
                uart_buff = uart_buff & 0xfd;//接收到04的信号后卧室一的灯光打卡
                break;
                }
        case 0x03:
                {
                uart_buff = uart_buff | 0x02;//接收到03的信号后卧室一的灯光关闭
                break;
                }
        case 0x06:
                {
                uart_buff = uart_buff & 0xfb;//接收到06的信号后卧室二的灯光打开
                break;
                }
        case 0x05:
                {
                uart_buff = uart_buff | 0x04;//接收到05的信号后卧室二的灯光关闭
                break;
                }
        case 0x08:
                {
                uart_buff = uart_buff & 0xf7;//接收的08的信号后卧室三的灯光打开
                break;
                }
        case 0x07:
                {
                uart_buff = uart_buff | 0x08;//接收到07的信号后卧室三的灯光关闭
                break;
                }
        case 0x00:
                {
                uart_buff = uart_buff & 0xf0;//接收到00的信号后全部的房间的灯光打开
                break;
                }
        case 0xff:
                {
                uart_buff = uart_buff | 0x0f;//接收到ff信号后全部房间的灯光都关闭
                break;
                }
        default: break;
        }
}
void UartIsr() interrupt 4//串口中断函数
{
    if (TI)
    {
        TI = 0;//发送信号后TI置0
        busy = 0;//清空BUSY中的信息
    }
    if (RI)
    {
        RI = 0;//接收信号后RI置0
                          hmi_refresh_flag = 1;
        //uart_buff = SBUF;
                          uart_check();
    }
}
void Timer0Isr() interrupt 1//延时中断函数
{
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()//内存初始化
{
TMOD = 0x21;
TH0 = (65536 - 50000) / 256;
TL1 = (65536 - 50000) % 256;
TR0 = 1;
}
void UART_Send_Byte(char dat)//字节发送
{
    while (busy);
    busy = 1;
    SBUF = dat;
}
void UART_Send_Str(char *p)//字符串发送
{
    while (*p)
    {
        UART_Send_Byte(*p++);
    }
}
void UART_Send_END(void)   //发送结束符
{
         UART_Send_Byte(0xFF);
         UART_Send_Byte(0xFF);
         UART_Send_Byte(0xFF);
}
void speak_check( )//语音点亮函数
{
switch(speak_buff)//循环语音接收模块内存
{
        case 0x00://接收到02信号后客厅的灯光打开
        {
        UART_Send_Str("bt0.pic=3"); //发送指令控制串口屏控制图标的改变        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();//结束指令发送
        break;
        }
        case 0x01://接受到01信号后客厅的灯光关闭
        {
        UART_Send_Str("bt0.pic=4"); //发送指令控制串口屏控制图标的改变
        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();//结束指令发送
                break;
        }
        case 0x02:/接受到04信号后客厅的灯光打开
        {
        UART_Send_Str("bt0.pic=3"); //发送指令控制串口屏控制图标的改变
        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();//结束指令发送
                break;
        }
        case 0x03://接受到03信号后客厅的灯光关闭
        {
        UART_Send_Str("bt0.pic=4"); //发送指令控制串口屏控制图标的改变
        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();/结束指令发送
                break;
        }
        case 0x04://接受到06信号后客厅的灯光打开
        {
        UART_Send_Str("bt0.pic=3"); //发送指令控制串口屏控制图标的改变
        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();//结束指令发送
                break;
        }
        case 0x05://接受到05信号后客厅的灯光关闭
        {
        UART_Send_Str("bt0.pic=4"); //发送指令控制串口屏控制图标的改变
        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();//结束指令发送
                break;
        }
        case 0x06:/接受到08信号后客厅的灯光打开
        {
        UART_Send_Str("bt0.pic=3");  //发送指令控制串口屏控制图标的改变
        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();/结束指令发送
                break;
        }
        case 0x07://接受到07信号后客厅的灯光关闭
        {
        UART_Send_Str("bt0.pic=4");  //发送指令控制串口屏控制图标的改变
        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();//结束指令发送
                break;
        }
        case 0x08:
        {
        UART_Send_Str("bt0.pic=4");  //发送指令控制串口屏控制图标的改变
        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();/结束指令发送
                break;
        }
        case 0x09:
        {
        UART_Send_Str("bt0.pic=4");  //发送指令控制串口屏控制图标的改变
        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();//结束指令发送
                break;
        }
        case 0x0a:
        {
        UART_Send_Str("bt0.pic=3"); //发送指令控制串口屏控制图标的改变
        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();//结束指令发送
                break;
        }
        case 0x0b:
        {
        UART_Send_Str("bt0.pic=4");  //发送指令控制串口屏控制图标的改变
        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();//结束指令发送
                break;
        }
        case 0x0c:
        {
        UART_Send_Str("bt0.pic=3"); //发送指令控制串口屏控制图标的改变
        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();//结束指令发送
                break;
        }
        case 0x0d:
        {
        UART_Send_Str("bt0.pic=4"); //发送指令控制串口屏控制图标的改变
        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();/结束指令发送
                break;
        }
        case 0x0e:
        {
        UART_Send_Str("bt0.pic=3"); //发送指令控制串口屏控制图标的改变
        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();//结束指令发送
                break;
        }
        case 0x0f:
        {
        UART_Send_Str("bt0.pic=4"); //发送指令控制串口屏控制图标的改变
        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();/结束指令发送
                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))/循环语音恢复标志和屏幕恢复标志都等于零那么所有房间的灯光都关闭。
                        {
                                P1 = out_buff;
                        }
      if((speak_refresh_flag == 1) || (hmi_refresh_flag == 1))//如果语音恢复标志或者是屏幕恢复标志其中一个等于一。                              
                        {
                                if( speak_refresh_flag == 1 )//如果是语音的等于一那么执行语音模块。                                {
                                out_buff = speak_buff;
                                speak_check( );
                                speak_refresh_flag = 0;
                                }
                                else if( hmi_refresh_flag == 1 )//若是屏幕那么就执行屏幕功能。                                {
                                out_buff = uart_buff;
                                hmi_refresh_flag = 0;
                                }
                        }                              
    }
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表