目录
一、设计要求 ------------------------------------- 2 二、 设计结构框图 -------------------------------- 2 三、源程序 --------------------------------------- 2 四、 心得体会 ----------------------------------- 10
1
一、设计要求
1.利用C51的GPIO口模拟SPI总线。
2.在两个C51之间采用gpio模拟的SPI总线进行通信,注意:1个是主机,1个是从机。
3.每隔1分钟(可以缩短),主机就将自己的时间告知从机,从机也将自己的时间告知主机。
4.当主机接到从机的时间后,与自己的时间进行对比,将对比结果通过串口发送到PC上。
二、设计结构框图
三、源程序
主机程序:
#include #define uint unsigned int #define uchar unsigned char sbit sck=P3^4; sbit sdi=P3^5; sbit sdo=P3^6; sbit ss=P3^7; 2 主机 P3^4/SCK P3^6/Sdo P3^5/Sdi P3^7/ SS 从机 SCK/P3^4 Sdi /P3^5 Sdo/P3^6SS /P3^7 PC uint miao,fen,t0,t1,k,p; uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; void Display(); void delayms(uint ms) { uint x,y; for(x=ms;x>0;x--) for(y=110;y>0;y--); } unsigned char spi_rw(uchar byte) { uchar i; ss = 0; sck = 0; for (i=0;i<8;i++) { sdo = (bit)(byte&0x80); byte= byte<<1; delayms(5); sck = 1; byte = byte|(uchar)(sdi); delayms(5); sck = 0; 3 } ss = 1; return(byte); } void main() { SCON = 0x50; TMOD=0x22; TH1 =0xfd; /*串口发送和接收中断*/ TL1 = TH1; TR1 = 1; EA = 1; //允许所有中断 ET0 = 1; //允许T0中断 TMOD =0x01; //T0方式1计时0.05s TH0 = (65536-46080)/256; //定时器T0的高四位 TL0 = (65536-46080)%256; TR0 = 1; while(1) { Display(); if(t1==60) { 4 k=spi_rw((uchar)(fen)); } if(fen>0&&miao==0) { p=spi_rw((uchar)(fen)); } } } void Timer0() interrupt 1 { TH0 = 0xD8; TL0 = 0xF0; t0++; if(t0>=200) { miao++; t1++; t0=0; if(miao>=60) { fen++; miao=0; 5 if(fen>=60) { fen=0; } } } } void Display() { P2=0xff; P2_0=0; P0=table[miao%10]; delayms(5); P2=0xff; P2_1=0; P0=table[miao/10]; delayms(5); P2=0xff; P2_2=0; P0=table[fen%10]; delayms(5); P2=0xff; P2_3=0; P0=table[fen/10]; delayms(5); } 从机程序: #include #define uint unsigned int #define uchar unsigned char sbit sck=P3^4; sbit sdi=P3^5; sbit sdo=P3^6; 6 sbit ss=P3^7; uint miao,fen,t0,t1; Unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; void Display(); void delayms(unsigned int ms) { unsigned int x,y; for(x=ms;x>0;x--) for(y=110;y>0;y--); } unsigned char spis(unsigned char byte) { unsigned char i; if(ss==0) //如果主机选中从机 { for (i=0;i<8;i++) { sdo = (bit)(byte&0x80); //输出 byte=byte<<1; while(!sck); byte = byte|(unsigned char)(sdi); //采样 while(sck); 7 P1=byte; } return(byte); } } void main() { SCON = 0x50; TMOD=0x22; TH1 =0xfd; /*串口发送和接收中断*/ TL1 = TH1; TR1 = 1; EA = 1; //允许所有中断 ET0 = 1; //允许T0中断 TMOD =0x01; //T0方式1计时0.05s TH0 = (65536-46080)/256; //定时器T0的高四位 TL0 = (65536-46080)%256; TR0 = 1; while(1) { if(t1<60) 8 { spis((unsigned char)(t1)); } if(fen>0&&fen<60) { spis((unsigned char)(fen)); } Display(); } } void Timer0() interrupt 1 { TH0 = (65536-46080)/256; //定时器T0的高四位 TL0 = (65536-46080)%256; t0++; if(t0>=200) { miao++; t1++; t0=0; if(miao>=60) { 9 fen++; miao=0; if(fen>=60) { fen=0; } } } } void Display() { P2=0xff; P2_0=0; P0=table[miao%10]; delayms(5); P2=0xff; P2_1=0; P0=table[miao/10]; delayms(5); P2=0xff; P2_2=0; P0=table[fen%10]; delayms(5); P2=0xff; P2_3=0; P0=table[fen/10]; delayms(5); } 四、心得体会 通过这几天的单片机spi总线的开发,我们查阅了大量的资料,使我们的设计有理可依,有据可寻。而且在理论的基础上更深刻的掌握了单片机的深层内容及实际生活中的应用,这次的设计不仅锻炼了我们动手能力和我们思维能力,还有在软件方面的编程能力,使我们受益匪浅,同时也暴露出一些平时学习上的问题,让我们深刻反思。这些问题的发现将为我们以后的学习和工作找明道路,查漏补缺为进一步学习作好准备。 10 因篇幅问题不能全部显示,请点此查看更多更全内容