51单片机与蓝牙串口通信程序
基于51单片机蓝牙模块传输数据毕业设计作品
基于51单片机蓝牙模块传输数据毕业设计作品在本论文中,我们基于51单片机和蓝牙模块设计了一个数据传输的毕业设计作品。
蓝牙是一种无线通信技术,广泛应用于各种设备之间的数据传输。
本设计作品旨在通过蓝牙模块实现51单片机与其他设备之间的数据交互和传输。
首先,我们介绍了设计的背景和意义。
随着科技的不断进步和物联网的兴起,各种设备之间的互联互通已成为一种趋势,这对数据传输的可靠性和灵活性提出了更高的要求。
因此,设计一个基于51单片机和蓝牙模块的数据传输系统,以提高数据传输的效率和便利性,具有重要意义。
接下来,我们详细介绍了设计方案和实现方法。
首先,我们选择了51单片机作为硬件平台,因为它具有广泛的应用基础和丰富的资源。
然后,我们选择了蓝牙模块作为无线通信模块,因为它能够提供稳定可靠的数据传输通道。
蓝牙模块与51单片机通过串口进行连接,通过串口通信实现数据的发送和接收。
在软件设计方面,我们采用了嵌入式C语言编程。
首先,我们通过51单片机的GPIO口和中断机制实现了对蓝牙模块的控制和数据传输。
然后,我们设计了相应的数据传输协议,以实现数据的可靠传输和解析。
最后,我们开发了用户界面,使用户能够方便地操作和管理数据传输。
在实验和测试中,我们对设计的功能和性能进行了验证。
首先,我们测试了数据传输的可靠性和稳定性,并通过数据验证和传输速度测试得到了令人满意的结果。
然后,我们对系统的功耗和实时性进行了测试,并对数据的完整性和安全性进行了评估。
最后,我们与其他类似的作品进行了比较,证明了该设计在功能和性能上的优势。
在论文的最后部分,我们总结了论文的主要内容和贡献,并对未来的研究方向进行了展望。
总体而言,本设计作品基于51单片机和蓝牙模块实现了数据传输的毕业设计,具有一定的理论和实践意义。
通过该设计,我们能够实现设备之间的数据交互和传输,提高数据传输的效率和便利性,为相关领域的研究和应用提供有益的参考。
51单片机的串口通信程序(C语言)
51单片机的串口通信程序(C语言) 51单片机的串口通信程序(C语言)在嵌入式系统中,串口通信是一种常见的数据传输方式,也是单片机与外部设备进行通信的重要手段之一。
本文将介绍使用C语言编写51单片机的串口通信程序。
1. 硬件准备在开始编写串口通信程序之前,需要准备好相应的硬件设备。
首先,我们需要一块51单片机开发板,内置了串口通信功能。
另外,我们还需要连接一个与单片机通信的外部设备,例如计算机或其他单片机。
2. 引入头文件在C语言中,我们需要引入相应的头文件来使用串口通信相关的函数。
在51单片机中,我们需要引入reg51.h头文件,以便使用单片机的寄存器操作相关函数。
同时,我们还需要引入头文件来定义串口通信的相关寄存器。
3. 配置串口参数在使用串口通信之前,我们需要配置串口的参数,例如波特率、数据位、停止位等。
这些参数的配置需要根据实际需要进行调整。
在51单片机中,我们可以通过写入相应的寄存器来配置串口参数。
4. 初始化串口在配置完串口参数之后,我们需要初始化串口,以便开始进行数据的发送和接收。
初始化串口的过程包括打开串口、设置中断等。
5. 数据发送在串口通信中,数据的发送通常分为两种方式:阻塞发送和非阻塞发送。
阻塞发送是指程序在发送完数据之后才会继续执行下面的代码,而非阻塞发送是指程序在发送数据的同时可以继续执行其他代码。
6. 数据接收数据的接收与数据的发送类似,同样有阻塞接收和非阻塞接收两种方式。
在接收数据时,需要不断地检测是否有数据到达,并及时进行处理。
7. 中断处理在串口通信中,中断是一种常见的处理方式。
通过使用中断,可以及时地响应串口数据的到达或者发送完成等事件,提高程序的处理效率。
8. 串口通信实例下面是一个简单的串口通信实例,用于在51单片机与计算机之间进行数据的传输。
```c#include <reg51.h>#include <stdio.h>#define BAUDRATE 9600#define FOSC 11059200void UART_init(){TMOD = 0x20; // 设置定时器1为模式2SCON = 0x50; // 设置串口为模式1,允许接收TH1 = 256 - FOSC / 12 / 32 / BAUDRATE; // 计算波特率定时器重载值TR1 = 1; // 启动定时器1EA = 1; // 允许中断ES = 1; // 允许串口中断}void UART_send_byte(unsigned char byte){SBUF = byte;while (!TI); // 等待发送完成TI = 0; // 清除发送完成标志位}unsigned char UART_receive_byte(){while (!RI); // 等待接收完成RI = 0; // 清除接收完成标志位return SBUF;}void UART_send_string(char *s){while (*s){UART_send_byte(*s);s++;}}void main(){UART_init();UART_send_string("Hello, World!"); while (1){unsigned char data = UART_receive_byte();// 对接收到的数据进行处理}}```总结:通过以上步骤,我们可以编写出简单的51单片机串口通信程序。
基于51单片机的蓝牙传输
简易无线数据收发设计赛项报告小组成员:指导老师:日期:二〇一五年五月三十一日3系统软件设计 (11)3-1源程序 (11)4系统性能分析 (16)4-1优缺点 (16)4-2改进方向 (16)1方案设定1-1电路设计框图图HC-050~9)22-1主控制模块图6-1STC89C52资料:STC89C52是STC公司生产的一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash 存储器。
STC89C52使用经典的MCS-51内核,但做了很多的改进使得芯片具有传统51单片机不具备的功能。
在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
具有以下标准功能:8k字节Flash,512字节RAM,32位I/O口线,看门狗定时器,内置4KBEEPROM,MAX810复位电路,3个16位定时器/计数器,4个外部中断,一个7向量4级中断结构(兼容传统51的5向量2级中断结构),全双工串行口。
另外STC89C52可降至0Hz静态逻辑操作,支持2种软件可选择节电模式。
空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。
掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。
最高运作频率35MHz,6T/12T可选。
参数:1.增强型8051单片机,6时钟/机器周期和12时钟/机器周期可以任意选择,指令代码完全兼容传统8051.[2]2.工作电压:5.5V~3.3V(5V单片机)/3.8V~2.0V(3V单片机)3.工作频率范围:0~40MHz,相当于普通8051的0~80MHz,实际工作频率可达48MHz4.5.6.通用7.ISP(8.具有9.共310.11.12.13.PDIP2-2ATHC-05)当的动态转换。
串口模块用到的引脚定义:1、PIO8连接LED,指示模块工作状态,模块上电后闪烁,不同的状态闪烁间隔不同。
51单片机与蓝牙模块的串口通信
#include <>#include <>#include<>#include ""#include ""#define uint unsigned int#define uchar unsigned char#define Nop() _nop_()sbit P10 = P1^0; /*定义独立对地按键端口*/sbit P11 = P1^1; /*定义独立对地按键端口*/sbit P12 = P1^2; /*定义独立对地按键端口*/sbit P13 = P1^3; /*定义独立对地按键端口*/ 592MHz TL1=0XFD ;TH0=0;TL0=0;TR1 = 1; // timer 1 runSCON = 0x50; //UART为模式1,8位数据,允许接收 PCON |= 0x80 ; //SMOD=1; Baud加倍IE |= 0x90 ; //Enable Serial InterruptTR1 = 1 ; // timer 1 runEA=1;ET0=1;}void send(uchar cc){SBUF=cc;while(TI==0);TI=0;}void send_f(uchar ccc){send(' ');send('<');send('F');send(ccc);send('>');}void call_out(){uchar i;send('(');for(i=0;i<m;i++){send(CallOut_Num[i]);}send(')');m=0;}void interrupt_pro(){string_write(0,1,reci_buff);lcd_char_write(14,1,mun_to_char[temp/10]); //for testlcd_char_write(15,1,mun_to_char[temp%10]); //for testif(temp==')') CallIn_flag=1;//|temp=='$' |temp=='%'else if(temp=='$'){ lcd_delay(5);//if(temp=='$')string_write(0,0,clr);string_write(0,0,reci_buff);}else switch(temp){case'X':string_write(0,0,clr);string_write(0,0,"Disconnet");break;case 'P':string_write(0,0,clr);string_write(0,0,"Pairing"); break;case 'S':string_write(0,0,clr);string_write(0,0,"Linking"); break;case 'O':string_write(0,0,clr);string_write(0,0,"Connect"); break;case 'R':string_write(0,0,clr);string_write(0,0,"Ring");//string_write(5,0,CallIn_Num);break;case 'D':string_write(0,0,clr);string_write(0,0,"Ding");// string_write(5,0,CallIn_Num);break;case 'I':string_write(0,0,clr);string_write(0,0,"Talking"); break;case 'L':string_write(0,0,clr);string_write(0,0,"Call failed"); break;case 'A':string_write(0,0,clr);string_write(0,0,"MP3 playing"); break;case 'E':string_write(0,0,clr);string_write(0,0,"Call release "); break;case 'H':string_write(0,0,clr);string_write(0,0,"A2DP connected ");break;case 'V':string_write(0,0,clr);string_write(0,0,"A2DP disconnected");break;// case ')':x=0; break; //for(i=0;i<16;i++)lcd_char_write(i,1,lcd_table[i]); /*显示标题*/default:break;}//temp=''; //for test}void key_pro(){uchar i,key_value_buff;key_value_buff = key_scan();if(key_value_buff != 0) //有按键动作{switch(key_value_buff) /*显示按键*/{case 0x18: //0if(call_flag){CallOut_Num[m]='0';lcd_char_write(m+2,0,'0');m++;}else if(!shift_flag){ send(' ');send('A'); //Answerlcd_char_write(3,1,'0'); //可以不显示出来lcd_char_write(8,1,'A');lcd_char_write(9,1,' ');}else{ send_f('P');lcd_char_write(3,1,'0');lcd_char_write(8,1,'F');lcd_char_write(9,1,'P');}break;case 0x28://1if(call_flag){CallOut_Num[m]='1';lcd_char_write(m+2,0,'1');m++;}else if(!shift_flag){ send(' ');send('H'); //Hang uplcd_char_write(3,1,'1');lcd_char_write(8,1,'H');lcd_char_write(9,1,' ');}else{ send_f('L');lcd_char_write(3,1,'1');lcd_char_write(8,1,'F');lcd_char_write(9,1,'L');}break;case 0x48://2if(call_flag){CallOut_Num[m]='2';lcd_char_write(m+2,0,'2');m++;}else if(!shift_flag){ send(' ');send('R'); //Rejectlcd_char_write(3,1,'2');lcd_char_write(8,1,'R');lcd_char_write(9,1,' ');}else{ send_f('U');lcd_char_write(3,1,'2');lcd_char_write(8,1,'F');lcd_char_write(9,1,'U');}break;case 0x88://3if(call_flag){CallOut_Num[m]='3';lcd_char_write(m+2,0,'3');m++;}else if(!shift_flag){ send(' ');send('L'); //Rediallcd_char_write(3,1,'3');lcd_char_write(8,1,'L');lcd_char_write(9,1,' ');}else{ send_f('F');lcd_char_write(3,1,'3');lcd_char_write(8,1,'F');lcd_char_write(9,1,'F');}break;case 0x14://4if(call_flag){CallOut_Num[m]='4';lcd_char_write(m+2,0,'4');m++;}else if(!shift_flag){ send(' ');send('U'); //Vol uplcd_char_write(3,1,'4');lcd_char_write(8,1,'U');lcd_char_write(9,1,' ');}else{ send_f('B');lcd_char_write(3,1,'4');lcd_char_write(8,1,'F');lcd_char_write(9,1,'B');}break;case 0x24://5if(call_flag){CallOut_Num[m]='5';lcd_char_write(m+2,0,'5');m++;} else if(!shift_flag){ send(' ');send('D');//Vol downlcd_char_write(3,1,'5');lcd_char_write(8,1,'D');lcd_char_write(9,1,' ');}else{ send_f('S');lcd_char_write(3,1,'5');lcd_char_write(8,1,'F');lcd_char_write(9,1,'S');}break;case 0x44://6if(call_flag){CallOut_Num[m]='6';lcd_char_write(m+2,0,'6');m++;}else if(!shift_flag){ send(' ');send('0'); //lcd_char_write(3,1,'6');lcd_char_write(8,1,'0');lcd_char_write(9,1,' ');}else{ send(' ');send('G');send('x');lcd_char_write(3,1,'6');lcd_char_write(8,1,'G');lcd_char_write(9,1,'x');}break;case 0x84://7if(call_flag){CallOut_Num[m]='7';lcd_char_write(m+2,0,'7');m++;}else if(!shift_flag){ send(' ');send('V'); //Voice diallcd_char_write(3,1,'7');lcd_char_write(8,1,'V');lcd_char_write(9,1,' ');}else{ send(' ');send('n');lcd_char_write(3,1,'7');lcd_char_write(8,1,'n');lcd_char_write(9,1,' ');}break;case 0x12://8if(call_flag){CallOut_Num[m]='8';lcd_char_write(m+2,0,'8');m++;}else if(!shift_flag){ send(' ');send('Z');//Call transferlcd_char_write(3,1,'8');lcd_char_write(8,1,'Z');lcd_char_write(9,1,' ');}else{ send(' ');send('p');lcd_char_write(3,1,'8');lcd_char_write(8,1,'p');lcd_char_write(9,1,' ');}break;case 0x22://9if(call_flag){CallOut_Num[m]='9';lcd_char_write(m+2,0,'9');m++;}else if(!shift_flag){ send(' ');send('Q'); //Disconnectlcd_char_write(3,1,'9');lcd_char_write(8,1,'Q');lcd_char_write(9,1,' ');}else{ send(' ');send('z'); //Call transferlcd_char_write(3,1,'9');lcd_char_write(8,1,'z');lcd_char_write(9,1,' ');}break;case 0x42://A *if(call_flag){CallOut_Num[m]='*';lcd_char_write(m+2,0,'*');m++;}else{ send(' ');send('Y');//Versionlcd_char_write(3,1,'A');lcd_char_write(8,1,'Y');lcd_char_write(9,1,' ');}break;case 0x82://B #if(call_flag){CallOut_Num[m]='#';lcd_char_write(m+2,0,'#');m++;}else{ send(' ');send('T'); //Set auto answerlcd_char_write(3,1,'B');lcd_char_write(8,1,'T');lcd_char_write(9,1,' ');}break;case 0x11: if(!call_flag){send(' ');send('t'); //Clr auto answerlcd_char_write(3,1,'C');lcd_char_write(8,1,'t');lcd_char_write(9,1,' ');}break;case 0x21: if(!call_flag){send(' ');send('M');//Set volume setlcd_char_write(3,1,'D');lcd_char_write(8,1,'M');lcd_char_write(9,1,' ');}break;case 0x41:if(!call_flag){send(' ');send('m'); //Clr volume setlcd_char_write(3,1,'E');lcd_char_write(8,1,'m');lcd_char_write(9,1,' ');}break;case 0x81:if(!call_flag){send(' ');send('N'); //Set auto linklcd_char_write(3,1,'F');lcd_char_write(8,1,'N');lcd_char_write(9,1,' ');}break;default:break;}while(key_scan()!=0);/*等待按键放开*/}scan_key_port = 0xff; /*释放矩阵按键端口*/delay_1ms(5);if((P10==0)||(P11==0)||(P12==0)||(P13==0)){delay_1ms(10); /*延时去抖动*/if((P10==0)||(P11==0)||(P12==0)||(P13==0)){if(P10==0) {lcd_char_write(3,1,'a'); send(' ');send('S');lcd_char_write(8,1,'S');} //Linkelse if(P11==0){call_flag=~call_flag;if(call_flag){string_write(0,0,clr);lcd_char_write(0,0,0);} //显示拨号状态符号else { for(i=0;i<16;i++) CallOut_Num[i]=' ';string_write(0,0,clr);string_write(3,0,"Welcome!");}}else if(P12==0) {lcd_char_write(3,1,'c'); send(' ');send('P');lcd_char_write(8,1,'P');} //Pairelse if(P13==0){shift_flag=~shift_flag;if(shift_flag) lcd_char_write(15,0,'s');else lcd_char_write(15,0,' ');}while((P10==0)||(P11==0)||(P12==0)||(P13==0));/*等待按键放开*/}}delay_1ms(5);}void Timer0Interrupt() interrupt 1 //定时器0中断服务函数{TH0 =0;TL0 =0;TR0=0; if(reci_flag1==1) reci_flag=1;z=0;if(call_flag==1) time++;}//串口接收中断函数void serial () interrupt 4 using 3{if (RI){RI = 0 ;temp=SBUF; // if(temp!=10)reci_buff[z]=temp;z++; if(z>15) z=0;TR0=1;reci_flag1=1;}}/*void serial () interrupt 4 using 3 //串口接收字符串{if (RI){RI = 0 ;temp=SBUF;if(temp=='R'){CallIn_flag=1;}reci_flag=1;}}bool RIwait(uint i){ //等待时间到,返回1while(i--){if(RI) return 0;}; //等待时间内 RI = 1 ,返回0 return 1; //串行接收停止位的中间时,RI 置1}uchar ReadSbuf(void){//从SBUF 读数据,可得到接收的数据uchar TmpSbuf;TmpSbuf=SBUF;SCON=0x50;return TmpSbuf;}void ComService(void) interrupt 4{uchar TmpSBUF,i=0;EA=0;ES=0;if(RIwait(RiWaitTimer)) goto ExitCom;switch(ReadSbuf()){case 'R'://current callfor(i=0;i<20;i++){if(RIwait(RLongiWaitTimer)) break;//goto ExitCom;[i]=ReadSbuf();TelTmpNum[i]=[i]; // new add if[i]=='\r')break;}[i]='\n';TelTmpNum[i]='\n'; // new add if(StandbyStatus==IsStandby){=IR_BLUETOOTHPOWERON;}else{if==BlueToothWorkInCalling)=IR_BLUETOOTHINTEL;else// =IR_BLUETOOTHIN;_bIRKey= IR_BTPHONECAllIN;// =IR_BTPHONECAllIN;}break;}ExitCom:SCON = 0x50; //模式1 ,REN = 1 ,允许接收数据ES=1;EA=1; //Enable UART}*//* if(call_flag==1&&key_value_buff==0)//拨号状态{n++;if(n>555){for(time=18;call_flag==1&&time>0&&CallOut_Num[0]>='#';time--){if(P11!=0){delay_1ms(222);delay_1ms(222);string_write(2,0,CallOut_Num);delay_1ms(222);delay_1ms(222);delay_1ms(222);delay_1ms(222);string_write(2,0," ");delay_1ms(222);delay_1ms(222);}else {call_flag=0;string_write(0,0,clr);string_write(3,0,"Welcome!");}}call_flag=0;n=0;string_write(0,0,clr); // goto start string_write(3,0,"Welcome!");}}*/。
一文教你用51单片机做蓝牙开关
一文教你用51单片机做蓝牙开关
1.首先是蓝牙APP,易安卓编写的,说编写其实我只是修改了其中的一些内容,两张界面和代码截图,非常简单,功能也很简单,程序前后修改了两次主要地方,主要原因是测试的时候发现第一种程序会出现错误,在单片机哪里会仔细说明!操作界面,很简单,打开之后打开蓝牙,然后点击搜索设备,找到你的模块名字,点击之后就可以连接了,连接之后下面会显示蓝牙的名称和地址信息
2.单片机程序,这个程序也很简单,只要学过一些单片机程序的人应该都知道吧,串口通信,设置好通信的波特率,初始化工作做好,然后在串口中断程序里写上你要做的事情就可以了,这里虽然说11.0592的晶振定时器初值为fd,但是如果用12m的晶振也是可以的,差距不多,没有问题。
(说的不怎幺专业,我也不是很专业的人,所以请大神误喷,见笑了!)这里是修改前后的程序不一样的地方,前面的程序是单片机没接收到数据之后读取前一次的IO状态,然后改变其状态,但是测试的时候发现读取状态有错误,估计是我的电路有问题,第一个继电器可以正常工作,第二个和第三个都有问题,当第一个关闭的时候可以打开,但是当打开的了却不能关闭,只能用关闭所有的命令来关闭,(找了一下午也没发现问题,元件换了几个都没找到,后来放弃了),后来就换了后面程序,直接发送状态命令,不用判断当前的状态了,我觉得后面这种可能更好!而且实际测试的时候也可以,没有问题。
(补充一下,我发现12M的晶振不能用11.0592M的数据,原因是定时器计数产生的波特率与9600差距有点大,误差到达了8.5%左右,理论上误。
蓝牙模块与51单片机串口通信
蓝牙模块与51单片机串口通信引言本文档旨在介绍如何使用蓝牙模块与51单片机进行串口通信。
蓝牙模块是一种常用的无线通信设备,可以用于传输数据和与其他蓝牙设备进行交互。
本文将提供基本的步骤和示例代码,以帮助读者了解蓝牙模块与51单片机之间的串口通信原理和方法。
硬件准备在开始蓝牙模块与51单片机串口通信之前,您需要准备以下硬件设备:- 51单片机开发板- 蓝牙模块软件准备为了实现蓝牙模块与51单片机之间的串口通信,您需要进行以下软件准备工作:1. 安装串口通信库:根据您使用的51单片机型号,选择合适的串口通信库并将其安装到开发环境中。
2. 研究串口通信命令:了解51单片机的串口通信命令集,包括发送数据、接收数据和设置串口参数等命令。
串口通信步骤下面是使用蓝牙模块与51单片机进行串口通信的基本步骤:1. 连接蓝牙模块:将蓝牙模块与51单片机连接,确保电源和引脚连接正确。
2. 开启串口通信:启动51单片机上的串口通信功能。
3. 设置串口参数:根据蓝牙模块和通信需求,设置合适的串口参数,如波特率、数据位、停止位和校验位等。
4. 发送数据:使用串口通信命令将需要传输的数据发送至蓝牙模块。
5. 接收数据:通过串口通信命令接收来自蓝牙模块的数据。
6. 处理数据:对接收到的数据进行处理,根据需求作出相应的响应。
示例代码以下是使用C语言编写的示例代码,演示了蓝牙模块与51单片机进行串口通信的基本操作:include <reg51.h>void main(){// 初始化串口参数// 配置波特率、数据位、停止位和校验位等// 进行串口通信while(1){// 发送数据至蓝牙模块// 接收来自蓝牙模块的数据// 处理接收到的数据}}结论通过本文档,您已经了解了蓝牙模块与51单片机串口通信的基本原理和方法。
根据您的具体需求,您可以根据本文提供的步骤和示例代码,自行实现蓝牙模块与51单片机之间的串口通信功能。
希望本文对您有所帮助!。
51单片机的串口通信程序
单片机串口通信程序#include <reg52.h>#include<intrins.h>#include <stdio.h>#include <math.h>#define uchar unsigned char#define uint unsigned intsbit Key1 = P2^3;sbit Key2 = P2^2;sbit Key3 = P2^1;sbit Key4 = P2^0;sbit BELL = P3^6;sbit CONNECT = P3^7;unsigned int Key1_flag = 0;unsigned int Key2_flag = 0;unsigned int Key3_flag = 0;unsigned int Key4_flag = 0;unsigned char b;unsigned char code Num[21]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x40,0x79,0x24,0x30,0x19,0x12,0x 02,0x78,0x00,0x10,0x89};unsigned char code Disdigit[4] = {0x7F,0xBF,0xDF,0xEF};unsigned char Disbuf[4];void delayms(uint t){uint i;while(t--){/* 对于11.0592M时钟,约延时1ms */for (i=0;i<125;i++){}}}//-----------------------------------------------------void SendData(uchar Dat){uchar i=0;SBUF = Dat;while (1){if(TI){TI=0;break;}}}void ScanKey(){if(Key1 == 0){delayms(100);if(Key1 == 0){Key1_flag = 1;Key2_flag = 0;Key3_flag = 0;Key4_flag = 0;Key1 = 1;}else;}if(Key2 == 0){delayms(100);if(Key2 == 0){Key2_flag = 1;Key1_flag = 0;Key3_flag = 0;Key4_flag = 0;Key2 = 1;}else;}if(Key3 == 0){delayms(50);if(Key3 == 0){Key3_flag = 1;Key1_flag = 0;Key2_flag = 0;Key4_flag = 0;Key3 = 1;}else;}if(Key4 == 0){delayms(50);if(Key4 == 0){Key4_flag = 1;Key1_flag = 0;Key2_flag = 0;Key3_flag = 0;Key4 = 1;}else;}else;}void KeyProc(){if(Key1_flag){TR1 = 1;SendData(0x55);Key1_flag = 0;}else if(Key2_flag){TR1 = 1;SendData(0x11);Key2_flag = 0;}else if(Key3_flag){P1=0xff;BELL = 0; CONNECT = 1;Key3_flag = 0;}else if(Key4_flag){CONNECT = 0;BELL = 1;Key4_flag = 0;}else;}void Initdisplay(void){Disbuf[0] = 1;Disbuf[1] = 2;Disbuf[2] = 3;Disbuf[3] = 4;}void Display() //显示{unsigned int i = 0;unsigned int temp,count;temp = Disdigit[count];P2 =temp;temp = Disbuf[count];temp = Num[temp];P0 =temp;count++;if (count==4)count=0;}void time0() interrupt 1 using 2 {Display();TH0 = (65535 - 2000)/256;TL0 = (65535 - 2000)%256;}void main(){Initdisplay();TMOD = 0x21;TH0 = (65535 - 2000)/256;TL0 = (65535 - 2000)%256;TR0 = 1;ET0 = 1;TH1 = 0xFD; //11.0592MTL1 = 0xFD;PCON&=0x80;TR1 = 1;ET1 = 1;SCON = 0x40; //串口方式REN = 1;PT1 = 0;PT0 = 1;EA = 1;while(1){ScanKey();KeyProc();if(RI){Disbuf[0] = 0;Disbuf[1] = 20;Disbuf[2] = SBUF>>4;Disbuf[3] = SBUF&0x0f;RI = 0;}else;}}。
51单片机串口通信(相关例程)
51单片机串口通信(相关例程) 51单片机串口通信(相关例程)一、简介51单片机是一种常用的微控制器,它具有体积小、功耗低、易于编程等特点,被广泛应用于各种电子设备和嵌入式系统中。
串口通信是51单片机的常见应用之一,通过串口通信,可以使单片机与其他外部设备进行数据交互和通信。
本文将介绍51单片机串口通信的相关例程,并提供一些实用的编程代码。
二、串口通信基础知识1. 串口通信原理串口通信是通过串行数据传输的方式,在数据传输过程中,将信息分为一个个字节进行传输。
在51单片机中,常用的串口通信标准包括RS232、RS485等。
其中,RS232是一种常用的串口标准,具有常见的DB-9或DB-25连接器。
2. 串口通信参数在进行串口通信时,需要设置一些参数,如波特率、数据位、停止位和校验位等。
波特率表示在单位时间内传输的比特数,常见的波特率有9600、115200等。
数据位表示每个数据字节中的位数,一般为8位。
停止位表示停止数据传输的时间,常用的停止位有1位和2位。
校验位用于数据传输的错误检测和纠正。
三、串口通信例程介绍下面是几个常见的51单片机串口通信的例程,提供给读者参考和学习:1. 串口发送数据```C#include <reg51.h>void UART_Init(){TMOD = 0x20; // 设置计数器1为工作方式2(8位自动重装) TH1 = 0xFD; // 设置波特率为9600SCON = 0x50; // 设置串口工作方式1,允许串行接收TR1 = 1; // 启动计数器1}void UART_SendChar(unsigned char dat){SBUF = dat; // 发送数据while (!TI); // 等待发送完成TI = 0; // 清除发送完成标志}void main(){UART_Init(); // 初始化串口while (1){UART_SendChar('A'); // 发送字母A}}```2. 串口接收数据```C#include <reg51.h>void UART_Init(){TMOD = 0x20; // 设置计数器1为工作方式2(8位自动重装) TH1 = 0xFD; // 设置波特率为9600SCON = 0x50; // 设置串口工作方式1,允许串行接收TR1 = 1; // 启动计数器1}void UART_Recv(){unsigned char dat;if (RI) // 检测是否接收到数据{dat = SBUF; // 读取接收到的数据 RI = 0; // 清除接收中断标志// 处理接收到的数据}}void main(){UART_Init(); // 初始化串口EA = 1; // 允许中断ES = 1; // 允许串口中断while (1)// 主循环处理其他任务}}```3. 串口发送字符串```C#include <reg51.h>void UART_Init(){TMOD = 0x20; // 设置计数器1为工作方式2(8位自动重装) TH1 = 0xFD; // 设置波特率为9600SCON = 0x50; // 设置串口工作方式1,允许串行接收TR1 = 1; // 启动计数器1}void UART_SendString(unsigned char *str){while (*str != '\0')SBUF = *str; // 逐个发送字符while (!TI); // 等待发送完成TI = 0; // 清除发送完成标志str++; // 指针指向下一个字符}}void main(){UART_Init(); // 初始化串口while (1){UART_SendString("Hello, World!"); // 发送字符串}}```四、总结本文介绍了51单片机串口通信的基础知识和相关编程例程,包括串口发送数据、串口接收数据和串口发送字符串。
基于51单片机蓝牙控制
基于51单片机蓝牙控制引言蓝牙技术在现代电子设备中得到广泛应用。
它提供了一个简单且低成本的无线通信解决方案,使得设备之间可以方便地进行数据传输和控制。
在嵌入式系统中,使用蓝牙技术可以实现对设备的远程控制,为用户带来更方便的体验。
本文将介绍基于51单片机的蓝牙控制方法及其实现。
一、51单片机简介51单片机是一种常见的基于Intel 8051架构的单片机。
它具有低功耗、高性能和可靠性等特点,广泛应用于各种嵌入式系统中。
51单片机具有丰富的外设接口和强大的计算能力,非常适合用于蓝牙控制的应用。
二、蓝牙技术概述蓝牙技术是一种短距离无线通信技术,采用2.4GHz频段进行通信。
它支持点对点和广播通信方式,并可以同时与多个设备建立连接。
蓝牙技术具有低功耗、简单连接和高速传输等优点,非常适合用于智能家居、智能穿戴设备等应用场景。
三、蓝牙模块选择选择合适的蓝牙模块对于基于51单片机的蓝牙控制至关重要。
目前市面上有很多种蓝牙模块可供选择,如HC-05、HC-06等。
在选择蓝牙模块时,需要考虑功耗、通信距离、接口类型等因素,并结合实际应用需求进行选择。
四、系统设计本系统设计基于51单片机和HC-05蓝牙模块实现蓝牙控制。
系统的主要硬件组成包括:51单片机、HC-05蓝牙模块、LED灯等。
软件方面,需要进行蓝牙通信协议的设计和单片机程序的编写。
4.1 硬件设计首先,将HC-05蓝牙模块与51单片机进行连接。
一般情况下,HC-05模块的VCC接口连接到单片机的正电源,GND接口连接到单片机的地线,TXD接口连接到单片机的RXD口,而RXD接口连接到单片机的TXD口。
接下来,将LED灯与单片机进行连接。
将LED的正极连接到单片机的I/O口,将LED的负极连接到地线。
这样,单片机控制LED的亮灭就可以通过改变相应的I/O口电平实现。
4.2 软件设计首先,在51单片机上编写蓝牙通信协议的实现代码。
蓝牙通信协议一般包括建立连接、数据传输和断开连接三个过程。
51单片机串口通信程序。。含详细例子
{ P3_4=0; P3_3=1;
} void RstPro()//编程器复位 {
pw.fpProOver();//直接编程结束 SendData();//通知上位机,表示编程器就绪,可以直接用此函数因为协议号(ComBuf[0])还没被修改,下同 }
void ReadSign()//读特征字 {
} void serial () interrupt 4 using 3 //串口接收中断函数 {
if (RI) { RI = 0 ; ch=SBUF; read_flag= 1 ; //就置位取数标志 }
} main()
{ init_serialcom(); //初始化串口 while ( 1 ) { if (read_flag) //如果取数标志已置位,就将读到的数从串口发出 { read_flag= 0 ; //取数标志清 0 send_char_com(ch); } }
while(RI == 0); RI = 0; c = SBUF; // 从缓冲区中把接收的字符放入 c 中 SBUF = c; // 要发送的字符放入缓冲区 while(TI == 0); TI = 0; } }
4.//////////////// /////////////////////////////////////////////////////////
SendData(); } else break;//等待回应失败 } pw.fpProOver();//操作结束设置为运行状态 ComBuf[0]=0;//通知上位机编程器进入就绪状态 SendData(); }
void Lock()//写锁定位
{
pw.fpLock();
SendData();
51串口接收蓝牙数据C程序
p,j_]|
电子园51单片机学习网_h_p3L8j_^7KS b)e_U
电子园51单片机学习网!u_l1{_V9g
Y
SM2=0; //no more
_O_N_D_m0{88579/*TH0=31; TL0=0;
_rx_C6N_u-W_W88579TR0=1; //X 32 =1S */电子园51单片机学习网^_Z c+vc
RI=0; TI=0;
,R_w_S9\ `9Q_^_M88579while(1); //ET0=1;
&E5\_^a_n_F88579TMOD = 0x21; /* timer 1 mode 2: 8-Bit reload */
_H_Z_Y9y t%A1I N88579PCON = 0x80;电子园51单片机学习网G2t E2h_O
TH1 = 0xf0; TL1 = 0xf0; /* reload value 19200 baud */电子园51单片机学习网:C$B:@)X)\6R
unsigned char a,b;电子园51单片机学习网9? k_X_v [ Z X_O_L
for(a=0;a电子园51单片机学习网"w4qT`2]
b=c_s[a];
*p_H'q j,~!D88579P1=f_s[b];电子园51单片机学习网6W_L_G7k0Z$e
delay(10000); //大概延时
c_s[i]=SBUF;
_u_v9M#v_S/k_\!a88579while(!RI);
ቤተ መጻሕፍቲ ባይዱ*G(T'o_[
@2|_z2b88579RI=0;电子园51单片机学习网0w2K_g+} G }
51单片机与手机蓝牙通讯1602液晶显示
程序内容
void init() { en=0; rs=0; rw=0; write_com(0x38); write_com(0x0c); write_com(0x06); write_com(0x01); TMOD=0X20; TH1=0XFD; TL1=0XFD; TR1=1; SCON=0X50; } //初始化函数
@WPS官容
void delay(uchar z) //延时函数 { uchar x; while(z--) { for(x=110;x>0;x--); } } //*************************************************************************** void write_com(uchar com) //写指令函数 { rs=0; rw=0; P2=com; delay(5); en=1; delay(5); en=0; }
程序设计
void main() { init(); while(1) { } } //--主函数!
while(RI==0); a=SBUF; write_data(a); RI=0;
谢谢观赏
WPS Office
Make Presentation much more fun
单片机与手机蓝牙通讯
袁亮
1602液晶显示蓝发送的字符
一:设计要求
二:元件选取
三:了解元件信息 四: 系统框图
五:程序内容
设计要求
利用STC89C52R单片机和1602液晶显示蓝牙模块 接收到的字符
元件选取
51单片机的2个串口分别通信的方法
51单片机的2个串口资源分别通信的方法当使用51单片机的2个串口资源进行通信时,比如用一个串口与PLC的串口使用RS485协议通信,一个串口通过蓝牙模块和另一个单片机无线通信时,该如何处理呢?传统的51单片机只有1个串口资源,只能采用分时复用的方法。
STC的15系列增强版51单片机具有多个串口资源,本文将描述如何使用IAP15W4K58S单片机用一个串口资源与PLC的RS485有线通信,另一个串口资源与Arduino单片机通过蓝牙模块无线通信,该通讯连接过程中PLC作为主机,IAP15W4K58S作为中间机,Arduino单片机作为最低层级。
工作过程是按下启动按键,PLC发信息给IAP15W4K58S单片机发高速脉冲控制步进电机驱动的机械臂运动取走货物,当货物取走后,IAP15W4K58S单片机通过蓝牙模块通知Arduino单片机控制的小车将新货物运送过来。
连接结构示意图如下图所示。
本例程使用的单片机型号为:IAP15W4K58S,该单片机有4个采用UART 工作方式的全双工异步串行通信接口(分别为串口1、串口2、串口3和串口4),每个串行口由2个数据缓冲器、1个移位寄存器、1个串行控制寄存器和1个波特率发生器等组成。
本项目使用串行口1和串行口2。
串行口1的两个缓冲器共用寄存器SBUF (99H),串行口2的两个缓冲器共用寄存器S2BUF(9BH)。
10位(1起始位,8位数据位,1停止位)可变波特率(9600)。
串口1对应的硬件部分是TxD和RxD,串行口2对应硬件部分是TxD2和RxD2。
串口1选择引脚P3.0(RxD)和P3.1(TxD),串口2选择引脚P1.0(RxD)和P1.1(TxD)。
串口1既可以选择T1作为波特率发生器,也可以选择T2作为波特率发生器。
本文串口1提供2个选择(T1和T2),串口2只能选择T2作波特率发生器。
但是当串口1和串口2的波特率相同时,可以共用T2作为波特率发器,当T2工作在1T模式时,串行口1的波特率=SYSclk/(65536-[RL_TH2,RL_TL2])/4,SYSclk表示系统时钟频率,[RL_TH2,RL_TL2]表示T2H,T2L的定时初值设置值。
51单片机的串口通信分析
51单片机的串口通信分析1. 简介串口通信是51单片机中常用的通信方式之一,它能够实现通过串行端口将数据传输到其他设备或与其他设备进行通信。
本文将对51单片机的串口通信进行分析与讨论。
2. 串口通信原理串口通信主要包括数据传输、数据格式和通信协议三个方面。
在51单片机中,串口通信使用了UART(通用异步收发传输)协议。
UART协议通过选择适当的波特率、数据位、校验位和停止位等参数,实现串口数据的稳定传输。
3. 串口通信硬件连接在51单片机中,串口通信需要将单片机的串行端口与外部设备连接起来。
一般情况下,串口通信需要使用串口线连接单片机的TXD引脚和RXD引脚与外部设备的对应引脚。
4. 串口通信程序设计51单片机的串口通信程序设计主要包括串口初始化和数据发送与接收两个步骤。
在程序设计中,需要设置适当的波特率、数据位、校验位和停止位等参数,并编写相应的发送和接收函数来实现数据的发送和接收功能。
5. 串口通信应用实例串口通信在51单片机的应用非常广泛,可以用于与PC机的通信、与传感器的通信、与其他单片机的通信等等。
在实际应用中,可以通过串口通信实现数据的传输、控制信号的发送与接收等功能。
6. 总结51单片机的串口通信是一种常用且有效的通信方式,通过合理设置通信参数和编写相应的程序,可以实现稳定的数据传输和通信功能。
在应用中,可以根据具体需求选择适当的串口方式和协议来实现串口通信功能。
以上为本文对51单片机的串口通信进行的简要分析与讨论,希望对读者有所帮助。
参考文献:1. 参考书籍12. 参考书籍2。
[C语言]51单片机蓝牙通信收发字符串完整源码
[C语⾔]51单⽚机蓝⽛通信收发字符串完整源码2019-12-28 11:27:55 我的第⼆篇博客,其实我是⼀个纯物理专业的本科⽣,学习的是物理主流的⼒热电光原,阴差阳错的玩起了电⼦和编程(当然,也是兴趣所驱),考虑过转专业,但是迫于学校各种各样的因素,还是免了吧,就这样写写属于⾃⼰的博客,觉得挺好的。
⼀开始做蓝⽛通信是在上⼀学期(⼤⼀下学期),那时对电⼦特别感兴趣,刚上⼿了51单⽚机,想玩点⾼级点的,想到了蓝⽛和语⾳,然后去问电信专业的⼀个学长(现在是我的好哥们啦),貌似电信专业的都没玩过这个,很惊讶,那就只能⾃⼰玩啦,问了⼀个挺⽜的⼤三学姐,她也没做过,然后给我讲了⼀些特别复杂懵逼的原理,不过给了我⼏篇博客,那我就带着这⼏篇博客⾃主搞啦,那时学姐那刚好有⼀块HC-06模块,说是捡的,还不知道能不能⽤,那就随便玩玩啦。
嘻嘻!!!还是能玩的,虽然出了各种各样的状况,不过还是基本实现了蓝⽛通信啦,那是还只能单字符(其实那时也⽤不到字符串),后来就⾃⼰买模块玩,HC-08、HC-12、LD3320语⾳模块。
都上⼿成功啦。
不过后来由于焊⼯不太好,烧了⼀块语⾳芯⽚(好⼏⼗块,⼼疼),加上玩电⼦实战要焊板⼦,⼀来⼆去不如编程来得⽅便,就改⼿编程了。
⼀台笔记本电脑即可,⽆任何成本,实战快,不过电脑是初中买的Lenovo G40-70m(2900块),⾃⼰加了块内存条和固态,嘻嘻!!!就喜欢搞这些。
由于⾃⼰对电脑⽐较熟悉,感觉⾃⼰电脑⽐同学花好⼏千新买的⾼配置电脑还好⽤。
⾃豪!!! 好啦,下⾯开始分享啦!!! 先上完整代码:12/*-----------------------------------------------------------------------------3* 实验名 : WideMouth 51单⽚机字符串收发4* 实验说明 : 单⽚机串⼝收发数据控制灯亮灭5* 实验模块 : STC89C52RC单⽚机最⼩系统、HC-06蓝⽛模块6* 连接⽅式:蓝⽛模块RXD、TXD端分别连接单⽚机TXD、RXD端,蓝⽛正负极连接单⽚机正负极7* 注意 : 单⽚机晶振使⽤的是11.05928*******************************************************************************/910 #include<reg52.h>11 #include<string.h> //字符串处理函数包12 #include<intrins.h>1314#define uchar unsigned char // 宏定义 51单⽚机内存资源有限15#define uint unsigned int //需考虑内存资源问题,故使⽤⽆符号类型1617 18 uchar receive_data[8];19uint bytes=0;20uint bytes_old;2122//--定义使⽤的IO--//2324 sbit Led301=P2^0;25 sbit Led302=P2^3;2627//--声明全局函数--//28void uart_init();29void Delay_1ms(uint i);30void SendChar(uchar character);31void SendString(uchar *p);3233/********************************************************************34* 名称 : Com_Int()35* 功能 : 串⼝中断函数(接受和发送数据时都会调回此函数)36***********************************************************************/37void Com_Int(void) interrupt 438 {39 EA = 0;40if(RI==1) //此句判断不能省略,否则发送数据时也会执⾏此语句,造成字符串错误!!!(RI为接收数据标志,当接收到数据⾃动置为1)41 {42 RI=0;43 receive_data[bytes] = SBUF;//接收到的数据44 bytes++;45 }46 EA = 1;47 }4849/*******************************************************************************50* 函数名 : main51* 函数功能 : 主函数(程序⼊⼝)52*******************************************************************************/5354void main()55 {56 bytes_old=0;57 uart_init();//初始化串⼝58while(1)59 {60while(1)61 {62 bytes_old=bytes;6364 Delay_1ms(30); //如果单⽚机接收来⾃蓝⽛模块不少于1字节的串⼝数据,⼀定要加延时后再判断是否,延时时间⾃⼰可按情况⽽定65//接收数据中断⼀定发⽣在这30ms内66if(bytes_old==bytes) //如果在这30ms内⽆数据接收,说明字符串已接收完毕,这样才能完整的接收⼀帧串⼝数据67 {68 receive_data[bytes]=0; //字符串末尾加结尾标志0(对应/0)69if(bytes) break; //跳出循环,执⾏相应逻辑操作70 }71 }7273 SendString(receive_data); //将接收到的完整数据返回给发送端7475//想⼲啥⼲啥吧76if(strcmp(receive_data,"3011")==0) //strcmp(str1,str2)字符串⽐较函数. 参数 str1 和 str2 是参与⽐较的两个字符串。
51单片机蓝牙串口从机与手机蓝牙主机及手机蓝牙软件配合使用的说明
手机蓝牙遥控信号发送给蓝牙模块,蓝牙模块通过P3.0 P3.1把数据给单片机,单片机解析蓝牙指令后发出IO口 控制信号给电机驱动,电机驱动输出给带有电机的小车,
从而实现前进后退左右转弯的效果。指示灯效果
本效果用电机驱 动上自带的正反 转指示灯模拟实 验,最终和实际 接上小车电机的 运行结果完全一
致。
首先要将51蓝牙控制小车的程序所产生的
"串口.hex"烧写到单片机学习板的
STC89C52RC单片机上
蓝牙小模块与单片机连接
51单片机晶振 务必 为11.0592保证通 信波特率准确
P3.1 P3.0
P3.1
P3.0 拔去短路
帽,查到
靠近单片
机那一侧 的排针。
+5V GND
蓝牙手机端软件的使用
• 下面用电机驱动前进、后退、左转、 右转指示灯来模拟手机蓝牙遥控的效 果。
用直流电源的效果图
手机触发上下,电机正反转指示灯发生了变化
小车左转指示灯
右转指示灯
安装蓝牙控制软件
在手机找到软件所 在位置,并打开它。
2、连接成功显示
1、手指去点击“HC-06”字的位置, 进行蓝牙设备连接
3、选择菜单键
4、选择”指令设置 “
指令设置 a,b,c,d,e
提供的51蓝牙控制小车单片 机通信C程序
手机指令设置和51单片机 程序是对应的。这样单片 机就能收到正确的指令了。
电机驱动与金属电机的小车接法 直流电机 DC MOTO
接直流电机A connect DC moto A
直流电机 DC MOTO
直流电机 DC MOTO
接直流电机B connect DC moto B
51蓝牙串口通信给亲参考
51蓝牙串口通信给亲参考第一篇:51蓝牙串口通信给亲参考/**********51蓝牙串口调试程序**************///串口接收的数据送至P1口,可接几个led试一下#includevoid main(void){TMOD=0x20;//T0方式2,作为波特率发生器TH1=0xfd;//9600波特率TL1=0xfd;SM0=0;//串口方式1SM1=1;REN=1;EA=1;ES=1;PCON=0x80;TR1=1;while(1);//wait here}//******************串口中断*******************void isr()interrupt 4{ES=0;if(RI==1){P1=SBUF;//P1口作为驱动口,根据需要结合自己发送的指令自己调整哦}ES=1;}第二篇:串口通信实验报告范文华南农业大学实验报告----------目录----------1、实验任务和目的..............................................................................................................2、实验准备..........................................................................................................................3、实验步骤........................................................................................................................... .....4、实验分析与总结....................................................................................................................(1)、分析........................................................................................................................... ..(2)、总结........................................................................................................................... ..1、实验任务和目的了解串行通信的背景知识后,通过三线制制作一条串口通信线(PC-PC),并编程实现两台PC间通过RS-232C通信。
基于51单片机的蓝牙控制
基于51单片机的蓝牙控制摘要随着科技的进步与现代产业的飞速发展,对控制系统的发展也提出了越来越高的要求,非接触控制、中远程通信正在扮演这越来越重要的角色,所以单片机的中远程通信的意义也愈发重要。
作为一名工科生,加强对这方面的学习是很有必要的。
基于AT89C51单片机与HC-08蓝牙模块通信的基础,我们设计了能够实现在手机模拟串口APP的客户端上进行温度监视与控制的系统。
该系统主要由蓝牙通信模块,灯光模拟加热电路,单片机控制电路,基于DS18B20的温度监视电路等部分组成。
画出了系统电路原理图,进行了软件设计,给出了系统流程图,并编写了系统程序。
最后在进行系统仿真的基础上进行了实物制作,实物调试结果表明,所设计的系统能够满足要求。
本系统具有成本低,安全实用,80米左右通信等特点。
关键词:AT89C51;HC-08蓝牙;DS18B20;LCD显示屏;一、概述 (3)1.1 课程考核目的 (3)1.2 设计任务及要求 (3)1.3设计需要的相关知识 (3)二、总体设计方案与说明 (4)2.1系统总体设计方案 (4)2.2系统的技术指标 (4)2.3 AT89C51单片机的串口 (4)2.3.1 概念 (4)2.3.2 串行口结构 (5)2.3.3 特殊功能寄存器PCON (6)2.3.4串行口的4种工作方式 (7)三、系统硬件部分设计 (9)3.1 Protel DXP电路原理图 (9)3.2 LCD显示电路 (10)3.2.1 LCD 1602引脚 (10)3.2.2.LCD1602字符的显示及命令 (10)3.3 HC-08蓝牙模块电路 (11)3.3.1 模块简介 (12)3.3.2 HC-08蓝牙引脚定义 (12)3.4 温度检测电路 (13)3.4.1 DS18B20模块简介 (13)3.4.2 引脚功能 (13)3.4.3 编程方式 (13)3.5 模拟加热电路(本设计中以LED灯和继电器模拟加热电路)(14)四、系统软件部分设计 (15)4.1系统软件流程图 (15)4.2 程序清单 (16)五、系统仿真及实物制作 (16)5.1仿真软件........................................................................................... 错误!未定义书签。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include <reg51.h>#include <intrins.h>#include<stdio.h>#include "LCD1602.h"#include "matrix_key.h"#define uint unsigned int#define uchar unsigned char#define Nop() _nop_()sbit P10 = P1^0; /*定义独立对地按键端口*/sbit P11 = P1^1; /*定义独立对地按键端口*/sbit P12 = P1^2; /*定义独立对地按键端口*/sbit P13 = P1^3; /*定义独立对地按键端口*/ //shift键bit shift_flag;bit call_flag ;bit CallIn_flag=0;bit reci_flag;bit reci_flag1;sbit sled_en_port = P3^6; /*定义数码管数据锁存器控制端口*/ sbit led_en_port = P2^5; /*定义发光二极管数据锁存器控制端口*/ sbit ds1302_en_port = P2^2; /*定义时钟的选片脚*/uchar CallIn_Num[15];//={"00000000000"};uchar CallOut_Num[15]={" "};uchar m=0; //拨号指针uchar temp='?';uchar code clr[16]={" "};uchar code lcd_table[16] = {"Ky: Cm: Re: "};//uchar send_buff[15];uchar reci_buff[15]={" "};uchar z; //接收缓冲区指针uchar time;//定时器中断次数uchar code mun_to_char[]={"0123456789ABCDEF"};/*1MS为单位的延时程序*/void init();void send(uchar cc);void send_f(uchar ccc);void interrupt_pro();void key_pro();void call_out();void main(){uchar i,j;delay_1ms(5);init(); //定时器初始化lcd_system_reset(); /*LCD1602 初始化*/for(i=0;i<16;i++)lcd_char_write(i,1,lcd_table[i]); /*显示标题*/string_write(0,0,clr);string_write(0,0," Welcome! ");sled_en_port = 0; /*关闭数码管显示*/led_en_port = 0; /*关闭发光二极管显示*/ds1302_en_port = 0;/*关闭时钟通讯*/while(1){key_pro(); //扫描键盘,按键盘处理if(reci_flag) //串口有数据过来{interrupt_pro();//分析处理reci_flag=0;reci_flag1=1;}if(CallIn_flag==1) //有电话打进来。
{ CallIn_flag=0;for(i=0,j=0;i<15;i++) //&&reci_buff[i]>=0x30 &&reci_buff[i]<=0x39 { if(reci_buff[i]>='0'&&reci_buff[i]<='9'||reci_buff[i]==' '){CallIn_Num[j]=reci_buff[i];j++;} reci_buff[i]=' ';}string_write(0,1,clr);string_write(0,1,CallIn_Num);}if(call_flag==1)//拨号状态{TR0=1;if(time>100&&CallOut_Num[0]>='0'){ call_out();for(i=16;i>1;i--) {string_write(2,0,CallOut_Num);delay_1ms(222);delay_1ms(222);string_write(2,0," ");delay_1ms(222);delay_1ms(222); }for(i=0;i<15;i++) CallOut_Num[i]=' '; //清空time=0;TR0=0;call_flag=0;string_write(0,0,clr);string_write(3,0,"Welcome!");}// else if(time>222){time=0;goto start;}//else m=0;}}}void init() /* 串口定时器外部中断初始化*/{TMOD =0X21;//|= 0x20; //定时器1为模式2,8位自动重装TH1 = 0xfd; //Baud:19200 fosc="11".0592MHzTL1=0XFD ;TH0=0;TL0=0;TR1 = 1; // timer 1 runSCON = 0x50; //UART为模式1,8位数据,允许接收PCON |= 0x80 ; //SMOD=1; Baud加倍IE |= 0x90 ; //Enable Serial InterruptTR1 = 1 ; // timer 1 runEA=1;ET0=1;}void send(uchar cc){SBUF=cc;while(TI==0);TI=0;}void send_f(uchar ccc){send(' ');send('<');send('F');send(ccc);send('>');}void call_out(){uchar i;send('(');for(i=0;i<m;i++){send(CallOut_Num[i]);}send(')');m=0;}void interrupt_pro(){string_write(0,1,reci_buff);lcd_char_write(14,1,mun_to_char[temp/10]); //for testlcd_char_write(15,1,mun_to_char[temp%10]); //for testif(temp==')') CallIn_flag=1;//|temp=='$' |temp=='%'else if(temp=='$'){ lcd_delay(5);//if(temp=='$')string_write(0,0,clr);string_write(0,0,reci_buff);}else switch(temp){case 'X':string_write(0,0,clr);string_write(0,0,"Disconnet");break;case 'P':string_write(0,0,clr);string_write(0,0,"Pairing"); break;case 'S':string_write(0,0,clr);string_write(0,0,"Linking"); break;case 'O':string_write(0,0,clr);string_write(0,0,"Connect"); break;case 'R':string_write(0,0,clr);string_write(0,0,"Ring");//string_write(5,0,CallIn_Num);break;case 'D':string_write(0,0,clr);string_write(0,0,"Ding");// string_write(5,0,CallIn_Num);break;case 'I':string_write(0,0,clr);string_write(0,0,"Talking"); break;case 'L':string_write(0,0,clr);string_write(0,0,"Call failed"); break;case 'A':string_write(0,0,clr);string_write(0,0,"MP3 playing"); break;case 'E':string_write(0,0,clr);string_write(0,0,"Call release "); break;case 'H':string_write(0,0,clr);string_write(0,0,"A2DP connected ");break;case 'V':string_write(0,0,clr);string_write(0,0,"A2DP disconnected");break;// case ')':x=0; break; //for(i=0;i<16;i++) lcd_char_write(i,1,lcd_table[i]); /*显示标题*/default:break;}//temp='?'; //for test}void key_pro(){uchar i,key_value_buff;key_value_buff = key_scan();if(key_value_buff != 0) //有按键动作{switch(key_value_buff) /*显示按键*/{case 0x18: //0if(call_flag) {CallOut_Num[m]='0';lcd_char_write(m+2,0,'0');m++;}else if(!shift_flag){ send(' ');send('A'); //Answerlcd_char_write(3,1,'0'); //可以不显示出来lcd_char_write(8,1,'A');lcd_char_write(9,1,' ');}else{ send_f('P');lcd_char_write(3,1,'0');lcd_char_write(8,1,'F');lcd_char_write(9,1,'P');}break;case 0x28://1if(call_flag) {CallOut_Num[m]='1';lcd_char_write(m+2,0,'1');m++;}else if(!shift_flag){ send(' ');send('H'); //Hang uplcd_char_write(3,1,'1');lcd_char_write(8,1,'H');lcd_char_write(9,1,' ');}else{ send_f('L');lcd_char_write(3,1,'1');lcd_char_write(8,1,'F');lcd_char_write(9,1,'L');}break;case 0x48://2if(call_flag) {CallOut_Num[m]='2';lcd_char_write(m+2,0,'2');m++;} else if(!shift_flag){ send(' ');send('R'); //Rejectlcd_char_write(3,1,'2');lcd_char_write(8,1,'R');lcd_char_write(9,1,' ');}else{ send_f('U');lcd_char_write(3,1,'2');lcd_char_write(8,1,'F');lcd_char_write(9,1,'U');}break;case 0x88://3if(call_flag) {CallOut_Num[m]='3';lcd_char_write(m+2,0,'3');m++;} else if(!shift_flag){ send(' ');send('L'); //Rediallcd_char_write(3,1,'3');lcd_char_write(8,1,'L');lcd_char_write(9,1,' ');}else{ send_f('F');lcd_char_write(3,1,'3');lcd_char_write(8,1,'F');lcd_char_write(9,1,'F');}break;case 0x14://4if(call_flag) {CallOut_Num[m]='4';lcd_char_write(m+2,0,'4');m++;} else if(!shift_flag){ send(' ');send('U'); //V ol uplcd_char_write(3,1,'4');lcd_char_write(8,1,'U');lcd_char_write(9,1,' ');}else{ send_f('B');lcd_char_write(3,1,'4');lcd_char_write(8,1,'F');lcd_char_write(9,1,'B');}break;case 0x24://5if(call_flag) {CallOut_Num[m]='5';lcd_char_write(m+2,0,'5');m++;} else if(!shift_flag){ send(' ');send('D');//V ol downlcd_char_write(3,1,'5');lcd_char_write(8,1,'D');lcd_char_write(9,1,' ');}else{ send_f('S');lcd_char_write(3,1,'5');lcd_char_write(8,1,'F');lcd_char_write(9,1,'S');}break;case 0x44://6if(call_flag) {CallOut_Num[m]='6';lcd_char_write(m+2,0,'6');m++;} else if(!shift_flag){ send(' ');send('0'); //lcd_char_write(3,1,'6');lcd_char_write(8,1,'0');lcd_char_write(9,1,' ');}else{ send(' ');send('G');send('x');lcd_char_write(3,1,'6');lcd_char_write(8,1,'G');lcd_char_write(9,1,'x');}break;case 0x84://7if(call_flag) {CallOut_Num[m]='7';lcd_char_write(m+2,0,'7');m++;} else if(!shift_flag){ send(' ');send('V'); //V oice diallcd_char_write(3,1,'7');lcd_char_write(8,1,'V');lcd_char_write(9,1,' ');}else{ send(' ');send('n');lcd_char_write(3,1,'7');lcd_char_write(8,1,'n');lcd_char_write(9,1,' ');}break;case 0x12://8if(call_flag) {CallOut_Num[m]='8';lcd_char_write(m+2,0,'8');m++;} else if(!shift_flag){ send(' ');send('Z');//Call transferlcd_char_write(3,1,'8');lcd_char_write(8,1,'Z');lcd_char_write(9,1,' ');}else{ send(' ');send('p');lcd_char_write(3,1,'8');lcd_char_write(8,1,'p');lcd_char_write(9,1,' ');}break;case 0x22://9if(call_flag) {CallOut_Num[m]='9';lcd_char_write(m+2,0,'9');m++;} else if(!shift_flag){ send(' ');send('Q'); //Disconnectlcd_char_write(3,1,'9');lcd_char_write(8,1,'Q');lcd_char_write(9,1,' ');}else{ send(' ');send('z'); //Call transferlcd_char_write(3,1,'9');lcd_char_write(8,1,'z');lcd_char_write(9,1,' ');}break;case 0x42://A *if(call_flag) {CallOut_Num[m]='*';lcd_char_write(m+2,0,'*');m++;} else{ send(' ');send('Y');//Versionlcd_char_write(3,1,'A');lcd_char_write(8,1,'Y');lcd_char_write(9,1,' ');}break;case 0x82://B #if(call_flag) {CallOut_Num[m]='#';lcd_char_write(m+2,0,'#');m++;}else{ send(' ');send('T'); //Set auto answerlcd_char_write(3,1,'B');lcd_char_write(8,1,'T');lcd_char_write(9,1,' ');}break;case 0x11: if(!call_flag){send(' ');send('t'); //Clr auto answerlcd_char_write(3,1,'C');lcd_char_write(8,1,'t');lcd_char_write(9,1,' ');}break;case 0x21: if(!call_flag){send(' ');send('M');//Set volume setlcd_char_write(3,1,'D');lcd_char_write(8,1,'M');lcd_char_write(9,1,' ');}break;case 0x41:if(!call_flag){send(' ');send('m'); //Clr volume setlcd_char_write(3,1,'E');lcd_char_write(8,1,'m');lcd_char_write(9,1,' ');}break;case 0x81:if(!call_flag){send(' ');send('N'); //Set auto linklcd_char_write(3,1,'F');lcd_char_write(8,1,'N');lcd_char_write(9,1,' ');}break;default:break;}while(key_scan()!=0);/*等待按键放开*/}scan_key_port = 0xff; /*释放矩阵按键端口*/delay_1ms(5);if((P10==0)||(P11==0)||(P12==0)||(P13==0)){delay_1ms(10); /*延时去抖动*/if((P10==0)||(P11==0)||(P12==0)||(P13==0)){if(P10==0) {lcd_char_write(3,1,'a'); send(' ');send('S');lcd_char_write(8,1,'S');} //Linkelse if(P11==0){call_flag=~call_flag;if(call_flag) {string_write(0,0,clr);lcd_char_write(0,0,0);} //显示拨号状态符号else { for(i=0;i<16;i++) CallOut_Num[i]=' ';string_write(0,0,clr);string_write(3,0,"Welcome!");}}else if(P12==0) {lcd_char_write(3,1,'c'); send(' ');send('P');lcd_char_write(8,1,'P');} //Pairelse if(P13==0){shift_flag=~shift_flag;if(shift_flag) lcd_char_write(15,0,'s');else lcd_char_write(15,0,' ');}while((P10==0)||(P11==0)||(P12==0)||(P13==0));/*等待按键放开*/}}delay_1ms(5);}void Timer0Interrupt() interrupt 1 //定时器0中断服务函数{TH0 =0;TL0 =0;TR0=0; if(reci_flag1==1) reci_flag=1;z=0;if(call_flag==1) time++;}//串口接收中断函数void serial () interrupt 4 using 3{if (RI){RI = 0 ;temp=SBUF; // if(temp!=10)reci_buff[z]=temp;z++; if(z>15) z=0;TR0=1;reci_flag1=1;}}/*void serial () interrupt 4 using 3 //串口接收字符串{if (RI){RI = 0 ;temp=SBUF;if(temp=='R'){CallIn_flag=1;}reci_flag=1;}}bool RIwait(uint i){ //等待时间到,返回1while(i--){if(RI) return 0;}; //等待时间内RI = 1 ,返回0 return 1; //串行接收停止位的中间时,RI 置1}uchar ReadSbuf(void){//从SBUF 读数据,可得到接收的数据uchar TmpSbuf;TmpSbuf=SBUF;SCON=0x50;return TmpSbuf;}void ComService(void) interrupt 4{uchar TmpSBUF,i=0;EA=0;ES=0;if(RIwait(RiWaitTimer)) goto ExitCom;switch(ReadSbuf()){case 'R'://current callfor(i=0;i<20;i++){if(RIwait(RLongiWaitTimer)) break;//goto ExitCom;BlueTooth.TelNum[i]=ReadSbuf();TelTmpNum[i]=BlueTooth.TelNum[i]; // new add 09.4.08if(BlueTooth.TelNum[i]=='\r')break;}BlueTooth.TelNum[i]='\n';TelTmpNum[i]='\n'; // new add 09.4.08if(StandbyStatus==IsStandby){BlueTooth._bIRKey=IR_BLUETOOTHPOWERON;}else{if(BlueTooth.WorkMode==BlueToothWorkInCalling)BlueTooth._bIRKey=IR_BLUETOOTHINTEL;else// BlueTooth._bIRKey=IR_BLUETOOTHIN;_bIRKey= IR_BTPHONECAllIN;// BlueTooth._bIRKey=IR_BTPHONECAllIN;}break;}ExitCom:SCON = 0x50; //模式1 ,REN = 1 ,允许接收数据ES=1;EA=1; //Enable UART}*//* if(call_flag==1&&key_value_buff==0)//拨号状态{n++;if(n>555){for(time=18;call_flag==1&&time>0&&CallOut_Num[0]>='#';time--){if(P11!=0){delay_1ms(222);delay_1ms(222);string_write(2,0,CallOut_Num);delay_1ms(222);delay_1ms(222);delay_1ms(222);delay_1ms(222);string_write(2,0," ");delay_1ms(222);delay_1ms(222);}else {call_flag=0;string_write(0,0,clr);string_write(3,0,"Welcome!");}}call_flag=0;n=0;string_write(0,0,clr); // goto startstring_write(3,0,"Welcome!");}}*/。