串行口自發自收實驗 實驗內容: 根據電路如圖1所示編寫程序。實現當鍵1按下,單片機串行口應用方式1連續向外發送“0、1、2、3”四字節數據,通過串行口單片機自發自收改信號,將接受的數據顯示出來;當鍵2按下,單片機串行口應用方式1連續向外發送“4、5、6、7”四字節數據,通過串行口單片機自發自收改信號,將接受的數據顯示出來;當鍵3按下單片機串行口應用方式1連續向外發送“8、9、a、b”四字節數據,通過串行口單片機自發自收改信號,將接受的數據顯示出來;當鍵4按下,單片機串行口應用方式1連續向外發送“c、d、e、f”四字節數據,通過串行口單片機自發自收改信號,將接受的數據顯示出來。
圖2 靜態顯示電路圖
圖3 波形脈沖寬度測試原理
評分表 序號 | | | | | | | |
| | | | |
| 1、電路圖的理解 2、顯示的準確性 3、顯示數據的處理 | | | |
| 1、串行口的設置 2、串行口的發送 3、串行口的接收 |
- #include<reg51.h>
- unsigned char code led_code[]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09,
- 0x11,0xc1,0x63,0x85,0x61,0x71,0xff};
- unsigned char dis_buf[4];
- sbit led_clk= P1^6 ;
- sbit led_data = P1^7 ;
- sbit key1=P2^0;
- sbit key2=P2^1;
- sbit key3=P2^2;
- sbit key4=P2^3;
- unsigned char read_flag ;
- unsigned char flag=0;
- unsigned char TT[4],num;
- unsigned char i,j;
- void led_display ( )
- {
- unsignedchar t,i;
- unsignedchar input_code;
- for(i=0;i<4;i++)
- {
- input_code=dis_buf[ i];
- for(t=0;t<8;t++)
- {
- if(input_code & 0x01 )
- {
- led_data=1;
- }
- else
- {
- led_data=0;
- }
- led_clk=0;
- input_code>>=1;
- led_clk=1;
- }
- }
- }
- void Send(unsigned char dat)
- {
- SBUF=dat;
- while(TI==0);
- TI=0;
- }
- void recive(void) interrupt 4
- {
- if(RI)
- {
- RI=0;
- TT[num]=SBUF;
- num++;
- if(num>=4)
- {
- num=0;
- read_flag=1;
- }
- }
- }
- void delay_ms(unsigned int x)
- {
- unsigned int i;
- unsigned char j;
- for(i=x;i>0; i--)
- for(j=110;j>0;j--);
- }
- void main(void)
- {
- TMOD=0x20;
- SCON=0x50;
- PCON=0x00;
- TH1=0xfd;
- TL1=0xfd;
- EA=1;
- ES=1;
- TR1=1;
- dis_buf[0]=led_code[16];
- dis_buf[1]=led_code[16];
- dis_buf[2]=led_code[16];
- dis_buf[3]=led_code[16];
- led_display();
- while(1)
- {
- if(key1==0)
- {
- delay_ms(10);
- if(key1==0)
- {
- i=0;flag=1;
- }
- }
- else if(key2==0)
- {
- delay_ms(10);
- if(key2==0)
- {
- i=4;flag=1;
- }
- }
- else if(key3==0)
- {
- delay_ms(10);
- if(key3==0)
- {
- i=8;flag=1;
- }
- }
- else if(key4==0)
- {
- delay_ms(10);
- if(key4==0)
- {
- i=12;flag=1;
- }
- }
- if(flag)
- {
- for(j=i;i<j+4;i++)
- {
- Send(led_code);
- }
- flag=0;
- }
- if(read_flag==1)
- {
- read_flag=0;
- dis_buf[0]=TT[3];
- dis_buf[1]=TT[2];
- dis_buf[2]=TT[1];
- dis_buf[3]=TT[0];
- led_display();
- }
- }
- }
復制代碼
|