51单片机与Dino928单机通讯实验_第1页
51单片机与Dino928单机通讯实验_第2页
51单片机与Dino928单机通讯实验_第3页
51单片机与Dino928单机通讯实验_第4页
51单片机与Dino928单机通讯实验_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

期末專題報告書單片機与Dino928的单机通讯实验班別:资讯工程丙班組別:15組員一:曹睿龙(i10402091)組員二:谢晓喆(i10402109)

目錄一、 動機 3二、 構想 3三、 專題特色 4四、 製作專題所遇到之困難以及解決方法 4五、 結果呈現 5六、 程式碼 7七、 心得 15

動機制作的初期,发现蓝牙是一个可能很普遍存在于大众的模组,出于推陈出新这样的想法,我们决定不再致力于书本上已有的实验,而是努力向外延伸,寻找更多有新意的提案所谓无通讯,无物联。IOT应该是物物相连的网际网路,如果一个物体装上感测器和制动元件就可以叫智能设备的话,恐怕与真正的物联网还有一定的距离。所以本组所致力的是物联设备与其他处理设备的通讯过程,实现对原有Arduino装置的扩充。構想实验1:本组果断放弃了蓝牙,转而决定用红外线机制,传输一个键码值给MCU,再让MCU控制不同位于Arduino的PIN口进行后续判断实验2:使用串口通讯,将MCU受到的PC端串口信息处理并转发给Arduino,并严格规定时间控制其走停。專題特色此次实验重点在于通讯交互过程在技术实施方面,我们所采用信号发起方式是由单片机接收不同的讯号,包括红外和PC端UART两种。传输上使用简单的数字信号判断和串口单机通讯两种通讯模式,分别由实验1和实验2完成。在外观形态方面,本组仿照单机游戏“Minecraft”中“爬行者”角色的外形,制作Dino928的外壳。外壳体由轻质纸塑壳拼接而成。下底经过打磨,使其摩擦力减小以便于移动製作專題所遇到之困難以及解決方法困難一:由於ardiuno與80C51單片機的收發波特率不一樣,80C51單片機需要自定義,ardiuno默認為19200,當初沒有考慮到波特率的問題導致收發頻率不一,ardiuno無法正常接收來自80C51單片機的串口訊號。解決:查詢資料發現80C51有專門控制發送頻率的代碼,將兩者波特率調製9600,雙方就能實現正常收發數據。困難二:鍵碼讀取的中斷與LED動態顯示的中斷衝突,導致數碼管不規律閃爍。解決:不斷分析中斷源,最終找到合適的流程設計,編寫出合適代碼解決LED燈閃爍問題。困難三:SBUF配置不正確,80C51單片機控制發送語句沒寫循環,由於發送指令一次只能發送一位,如果不循環則ardiuno緩衝池只能收到一位,而ardiuno只能接受數字信號,對單個位沒有處理功能,則緩沖池不接受這樣的單個位,導致收不到信號。解決:在80C51串口發送數據編程中加入循環語句,使發送的數字信號能夠完整發送。結果呈現实验一:实验二:外形:程式碼实验一:51单片机部分:#include<reg52.h>sbitADDR3=P1^3;sbitENLED=P1^4;sbitgo=P2^1;sbitstop=P2^2;sbitback=P2^3;unsignedcharcodeLedChar[]={//数码管显示字符转换表0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};unsignedcharLedBuff[6]={//数码管显示缓冲区0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};unsignedcharT0RH=0;//T0重载值的高字节unsignedcharT0RL=0;//T0重载值的低字节externbitirflag;externunsignedcharircode[4];externvoidInitInfrared(void);voidConfigTimer0(unsignedintms);voidmain(){EA=1;//开总中断ENLED=0;//使能选择数码管ADDR3=1;InitInfrared();//初始化红外功能ConfigTimer0(1);//配置T0定时1msPT0=1;//配置T0中断为高优先级,启用本行可消除接收时的闪烁while(1){if(irflag)//接收到红外数据时刷新显示{irflag=0; switch(ircode[2]){case0X0C:LedBuff[0]=LedChar[1];break;case0X18:{LedBuff[0]=LedChar[2];go=0;back=1;stop=1;}break;case0X5E:LedBuff[0]=LedChar[3];break; case0X08:LedBuff[0]=LedChar[4];break;case0X1C:{LedBuff[0]=LedChar[5];go=1;back=1;stop=0;}break;case0X5A:LedBuff[0]=LedChar[6];break;case0X42:LedBuff[0]=LedChar[7];break;case0X52:{LedBuff[0]=LedChar[8];go=1;back=0;stop=1;}break;case0X4A:LedBuff[0]=LedChar[9];break;}}}}/*配置并启动T0,ms-T0定时时间*/voidConfigTimer0(unsignedintms){unsignedlongtmp;//临时变量tmp=11059200/12;//定时器计数频率tmp=(tmp*ms)/1000;//计算所需的计数值tmp=65536-tmp;//计算定时器重载值tmp=tmp+18;//补偿中断响应延时造成的误差T0RH=(unsignedchar)(tmp>>8);//定时器重载值拆分为高低字节T0RL=(unsignedchar)tmp;TMOD&=0xF0;//清零T0的控制位TMOD|=0x01;//配置T0为模式1TH0=T0RH;//加载T0重载值TL0=T0RL;ET0=1;//使能T0中断TR0=1;//启动T0}/*数码管动态扫描刷新函数,需在定时中断中调用*/voidLedScan(){staticunsignedchari=0;//动态扫描索引P0=0xFF;//关闭所有段选位,显示消隐P1=(P1&0xF8)|i;//位选索引值赋值到P1口低3位P0=LedBuff[i];//缓冲区中索引位置的数据送到P0口if(i<sizeof(LedBuff)-1)//索引递增循环,遍历整个缓冲区i++;elsei=0;}/*T0中断服务函数,执行数码管扫描显示*/voidInterruptTimer0()interrupt1{TH0=T0RH;//重新加载重载值TL0=T0RL;LedScan();//数码管扫描显示}Arduino部分:constintM1_in1=12;constintM1_in2=11;constintM2_in3=10;constintM2_in4=9;voidsetup(){Serial.begin(9600);pinMode(M1_in1,OUTPUT);pinMode(M1_in2,OUTPUT);pinMode(M2_in3,OUTPUT);pinMode(M2_in4,OUTPUT);pinMode(2,INPUT);pinMode(3,INPUT);pinMode(4,INPUT);Serial.println("輸入字元'+'代表前進,字元'-'代表後退,任意鍵代表停車");}voidloop(){intgo=digitalRead(2);//取得A2的模拟信号值。intstop1=digitalRead(3);//取得A3的模拟信号值。intback=digitalRead(4);if(go==1){//前進Serial.println("前進");digitalWrite(M1_in1,HIGH);//右輪前進digitalWrite(M1_in2,LOW);digitalWrite(M2_in3,HIGH);//左輪前進digitalWrite(M2_in4,LOW);}elseif(back==1){//倒車Serial.println("倒車");digitalWrite(M1_in1,LOW);//右輪倒轉digitalWrite(M1_in2,HIGH);digitalWrite(M2_in3,LOW);//左輪倒轉digitalWrite(M2_in4,HIGH);}elseif(stop1==1){//stopSerial.println("stop");digitalWrite(M1_in1,LOW);//右輪倒轉digitalWrite(M1_in2,LOW);digitalWrite(M2_in3,LOW);//左輪倒轉digitalWrite(M2_in4,LOW);}}实验二:51单片机程式码:#include<reg52.H>sbittx=P3^0;#defineXTAL11059200//CUP晶振频率#definebaudrate9600//通信波特率unsignedcharc;voidmain(void){unsignedcharc;TMOD=0x20;//定时器1工作于8位自动重载模式,用于产生波特率TH1=(unsignedchar)(256-(XTAL/(32L*12L*baudrate)));TL1=(unsignedchar)(256-(XTAL/(32L*12L*baudrate)));//定时器0赋初值SCON=0x50;PCON=0x00;TR1=1;IE=0x00;//禁止任何中断while(1){while(RI==0);RI=0;c=SBUF;//从缓冲区中把接收的字符放入c中SBUF=c;//要发送的字符放入缓冲区while(TI==0);TI=0;}}心得本次實作結合本學期所學的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论