基于51单片机的双机通信系统设计protues仿真
生活随笔
收集整理的這篇文章主要介紹了
基于51单片机的双机通信系统设计protues仿真
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
硬件設計
(末尾附文件)
代碼設計
#include"reg51.h" //此文件中定義了單片機的一些特殊功能寄存器 #include"math.h" #define PI 3.14 sbit P36=P3^6; //P36=0是單片機2數據發送完畢的標志 sbit P37=P3^7; //P37=0是單片機1數據發送完畢的標志 sbit RST=P3^2; typedef unsigned int u16; //對數據類型進行聲明定義 typedef unsigned char u8; u8 N=90; //N為多少,即一個周期內采樣多少個點 u16 k; u8 value; u8 x; u8 j=1; u8 KeyValue; //用來存放讀取到矩陣鍵盤的鍵值 u8 count=0; u16 xdata sin_100[90]; //正弦信號數組 u8 dis_buf[4]; u8 code led_data[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, //數碼管段選0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //數碼管段選0-F u8 code led_bit[4]={0xf7,0xfb,0xfd,0xfe}; //數碼管位選void delay(u16 i) // delay延時函數 i=1時,大約延時10us {while(i--); }void KeyDown(void) //該函數用于檢測是否有按鍵按下并讀取鍵值 {char a=0;P0=0x0f; //高四位為0,低四位為1,當按鍵被按下后,會有某個低四位變為0if(P0!=0x0f)//讀取按鍵是否按下{delay(100);//延時10ms進行消抖if(P0!=0x0f)//再次檢測鍵盤是否按下{ //測試列P0=0X0F;switch(P0) //按鍵被按下后,會有某個低四位變為0{case(0X07): KeyValue=0;break; //P0.3=0,即第一列有某個按鍵被按下case(0X0b): KeyValue=1;break; //P0.2=0,即第二列有某個按鍵被按下case(0X0d): KeyValue=2;break; //P0.3=0,即第三列有某個按鍵被按下case(0X0e): KeyValue=3;break; //P0.4=0,即第四列有某個按鍵被按下}//測試行P0=0XF0;switch(P0){case(0X70): KeyValue=KeyValue;break; //P0.7=0,即第一行有某個按鍵被按下case(0Xb0): KeyValue=KeyValue+4;break; //……每行相差4,因此為+4case(0Xd0): KeyValue=KeyValue+8;break;case(0Xe0): KeyValue=KeyValue+12;break;}}} }void sin_initial(void) //正弦信號數組初始化 {for(k=0;k<N;k++) //N為多少,即一個周期內采樣多少個點{sin_100[k]=100+100*sin(2*k*PI/50); } }void serial_initial(void) //串口初始化 //T1作為波特率發生器,使用工作模式1 {TMOD=0x20; //T1工作方式2八位定時器自動重裝TH1=0xf4;TL1=0xf4; // 波特率2400b/sTR1=1; //啟動定時器1SCON=0x40; //設定串口方式1REN=1; }void Timer0Init() //定時器0初始化 {TMOD|=0X01; //選擇為定時器0模式,工作方式1,僅用TR0打開啟動。TH0=0Xff; TL0=0Xff; //給定時器賦初值,定時1msET0=1;//打開定時器0中斷允許EA=1;//打開總中斷TR0=1;//打開定時器 }void send_byte(u8 x) //串口發送一個字節 { SBUF=x; //啟動串口發送while(TI==0);TI=0; //發送完畢,置位TI=0delay(1); }void main() //主函數 { P0=0x0f;while(P0==0x0f);KeyDown();switch(KeyValue){case(0):N=15;break; //按下K0,N為15,即一個正弦信號周期內采樣15個點case(1):N=20;break; //按下K1,N為20,即一個正弦信號周期內采樣20個點case(2):N=25;break; //按下K2,N為25,即一個正弦信號周期內采樣25個點case(3):N=30;break; //按下K3,N為30,即一個正弦信號周期內采樣30個點case(4):N=35;break; //按下K4,N為35,即一個正弦信號周期內采樣35個點case(5):N=40;break; //按下K5,N為40,即一個正弦信號周期內采樣40個點case(6):N=45;break; //按下K6,N為45,即一個正弦信號周期內采樣45個點case(7):N=50;break; //按下K7,N為50,即一個正弦信號周期內采樣50個點case(8):N=55;break; //按下K8,N為55,即一個正弦信號周期內采樣55個點case(9):N=60;break; //按下K9,N為60,即一個正弦信號周期內采樣60個點case(10):N=65;break; //按下K10,N為65,即一個正弦信號周期內采樣65個點case(11):N=70;break; //按下K11,N為70,即一個正弦信號周期內采樣70個點case(12):N=75;break; //按下K12,N為75,即一個正弦信號周期內采樣75個點case(13):N=80;break; //按下K13,N為80,即一個正弦信號周期內采樣80個點case(14):N=85;break; //按下K14,N為85,即一個正弦信號周期內采樣85個點case(15):N=90;break; //按下K15,N為90,即一個正弦信號周期內采樣90個點default:break;}serial_initial(); //串口初始化sin_initial(); //正弦信號數組初始化Timer0Init(); //定時器0初始化while(1){if(j==1&&P36==0) //j==1只執行一次{ //P36=0為單片機2開始發送數據標志delay(100);while(RI==0);RI=0; value=SBUF; //存儲接受單片機2的數據(單片機2所接受的字節數)P36=1;j=0;}//單片機1用三位數碼管顯示字節數dis_buf[0] =value%10; // 數碼管"個位"dis_buf[1] =value%100/10; // 數碼管"十位" dis_buf[2] =value/100; // 數碼管"百位"for(k=0;k<3;k++){ P1=led_bit[k]; //發送數碼管位碼到P1口P2=led_data[dis_buf[k]]; //發送數碼管段碼到P2口 delay(1);P2=0x00;}}; }void Timer0() interrupt 1 { // TH0=0XFF; //給定時器賦初值 // TL0=0XFF;P37=0; //單片機1開始發送數據標志for(k=0;k<N;k++){send_byte(sin_100[k]);} P37=1; //單片機1結束發送數據標志EA=0; //關閉總中斷TF0=0; //關閉溢出中斷TR0=0; //關閉定時器T0 }鏈接:https://pan.baidu.com/s/1qwUpJ8yay8eiYCjmHuftQQ
提取碼:6mfd
總結
以上是生活随笔為你收集整理的基于51单片机的双机通信系统设计protues仿真的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 七牛直播云服务技术揭秘
- 下一篇: 公布生成cscope.out, csco