实验4(串行通行实验报告) 联系客服

发布时间 : 星期三 文章实验4(串行通行实验报告)更新完毕开始阅读4a42091ba8114431b90dd855

开始初始化SPSTAT,SPCTL循环查询标志位SPIFN一次温度数据是否已经接受完?Y从SPDAT中读取数据接着进行下一次数据的接受

程序首先初始化特殊寄存器SPSTAT=0xc0,SPCTL=0xc7。这样就工作在 从机模式下,SPI传输速度是晶振的128分频,传输时先高位传送。接着程序循 环查询标志位SPIF,当SPIF==1时说明程序已经接受到完整的一个字节数据。 可以从数据寄存器中读取接受到的数据,接着进行下一个字节数据的接受。

5. 从机通过UART与PC机相连,将数据显示到串口调试助手上

51单片机有一个全双工的串行通讯口,所以单片机和电脑之间可以方便地 进行串口通讯。但是需要经过MAX232电平转换,PC机和MAX232接口的连接非常简单,在一般的应用中,只需有三条线即可完成通信,分别是串口接头DB9的第2脚RXD与MAX232的输出相连,第3脚TXD与MAX232的输入相连,然后再共地,最后,通过串口线连接到电脑的串口上就可以实现单片机与PC机的串行通信了,不过在通信的过程中一定要特别注意双方的波特率一定要相同,否则,通信是不可能成功的 具体的电路如图所示。 软件实现

开始串口初始化发送判断信号发送温度数据N一次温度数据是否发送完毕?Y发送下一组数据

程序首先初始化一些特殊寄存器,将TMOD设为0x20,将PCON设为0X00 (波特率不增),将TH1和TL1设为0Xfd,这样波特率就设成为9600bps。将SCON设为0X50,使得串口工作在工作方式一下。然后程序向SBUF写入温度数据循环等待标志位TI为1,这样串口就发送了一个字节的数据,如此循环,直到送完所有数据为止。

四.测试

DS18B20测得一个温度(如23.3392^C),在主机和从机的1602上显示该温度值,通过串口线在计算机串口调试助手显示同样的数值,说明在温度的误差范围内,实验大致正确。

五. 总结

总结:通过本次实验,我们了解了I2C器件24C04和OneWire器件DS18b20的基

本性能以及对他们的操作,学会了双机SPI通信,通过MCU的UART与PC通信,了解了串行通信的原理,本次实验中有一点需要注意,在进行双机通信的时候,两块实验板必须共地。

参考文献:

[1]《单片机基础》 李广弟 北京航空航天大学出版社 [2] 24c04中文官方资料手册 [3]DS18B20资料手册

实验程序:

主机

#include \

#include \ #define uchar unsigned char #define uint unsigned int

#define OP_WRITE 0xa0 // address & write #define OP_READ 0xa1 // address & read #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();}; sbit SDA=P3^7; //set data io for 24c04 sbit SCL=P3^6; //set clock io for 24c04 sbit DQ=P1^7; //entrance for 18b20 sbit DS1=P1^5; //Serial datain 1 sbit ST1=P1^4; //Output flip-latch impulse 1 sbit SH1=P1^3; //Shift clock impulse 1 sbit DS2=P1^2; //Serial datain 2 sbit ST2=P1^1; //Output flip-latch impulse 2 sbit SH2=P1^0; //Shift clock impulse 2 sbit SCK=P2^0; // P2.0 simulate clock out sbit MOSI=P2^1; // P2.1 simulate master out sbit MISO=P2^2; // P2.2 simulate master in sbit SS1=P2^3; // P2.3 simulate choice uint h,temp; uchar Disdata,discan; uchar code ditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04, 0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09}; //look decimal part from table

uchar code dis_7[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf}; uchar code scan_con[4]={0x07,0x0b,0x0d,0x0e}; //nixietube choose uchar data temp_data[2]={0x00,0x00}; //buffer for temperature uchar data display[5]={0x00,0x00,0x00,0x00,0x00}; //buffer for display uchar data pcplay[10]={'0','1','2','3','4','5','6','7','8','9'}; //used in UART /******Declaration for the following functions********/ void delay(uint t);

void delayms(uint ms); void start(); void stop();

void f595(uchar cod1);

void s595(uchar cod2);

void SPISendByte(unsigned char ch);

void write_cyte(uchar addr, uchar write_data); void write_byte(uchar val); uchar shin();

uchar read_byte(void); uchar read_current();

uchar read_random(uchar random_addr); bit shout(uchar write_data); scan();

ow_reset(void); read_temp();

work_temp(uint tem);

main() {

unsigned char i=5; f595(0xff); s595(0xff);

for(h=0;h<4;h++) {display[h]=0;} i=read_random(8) ; ++i; i%=10;

write_cyte(8,i); display[3]=read_random(8);

ow_reset(); write_byte(0xcc); write_byte(0x44); for(h=0;h<100;h++) {scan();}

while(1) { SCON= 0x40; PCON=0; REN=1; TMOD= 0x20; TH1= 0xe6; TL1= 0xe6; TR1= 1; //innit io //display \ //converse when power on //Skip ROM

//send converse command //display \ //mode 1 //SMOD=0 //allow receive //timer 1 mode 2 //12MHz 1200 baud rate //set timer