|
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统 驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe |
大侠帮我看看我的程序哪错了啊? |
作者:发霉的味道 栏目:单片机 |
#include "IO.H" /* #define WRITE 0xA0 ; */ /* #define READ 0xA1 ; */ /* **************************/ void delay ( unsigned int timeM ) { unsigned int con1; TH0 = 0x06 ; TL0 = 0x06 ; TMOD = 0x02 ; TF0 = 0 ; TR0 = 1 ; for ( ; timeM > 0 ; timeM-- ) { for ( con1=4 ; con1>0 ; ) if ( TF0 ) { con1-- ; TF0 = 0; } } } /* I2C Start */ void startI2C ( void ) { SDAT = 1 ,SCLK = 1 ; someNOP() ; SDAT = 0 ; someNOP() ; SCLK = 0 ; return ; } /* stop */ void stopI2C ( void ) { SDAT = 0 ,SCLK = 1 ; someNOP() ; SDAT = 1 ; someNOP() ; return ; } /* answer */ void ackI2C ( bit answer) { if ( answer == 0 ) SDAT = 0 ; else SDAT = 1 ; SCLK = 1 ; someNOP() ; SCLK = 0 ; return ; } /* TEST ack */ bit TESTack ( void ) { bit ack ; SDAT = 1 ; SCLK = 1 ; _nop_() ; _nop_() ; if ( SDAT == 1 ) ack = 0 ; else ack = 1 ; SCLK = 0 ; _nop_() ; _nop_() ; return ( ack ) ; } /* send byte */ void senddata ( unsigned CHAR sdata ) { unsigned CHAR bitcount ; for ( bitcount = 0 ; bitcount < 8 ; bitcount ++ ) { if ( sdata << bitcount & 0x80 ) SDAT = 1 ; else SDAT = 0 ; SCLK = 1 ; someNOP() ; SCLK = 0 ; } return ; } /* receive byte */ unsigned CHAR receivedata () { unsigned CHAR bitcount , rdata = 0 ; for ( bitcount = 0 ; bitcount < 8 ; bitcount ++ ) { SCLK = 0 ; someNOP() ; SCLK = 1 ; _nop_() ; _nop_() ; if ( SDAT == 1 ) rdata = ( rdata << 1 ) + 1 ; else rdata <<= 1 ; _nop_() ; _nop_() ; SCLK = 0 ; } return ( ( unsigned CHAR ) rdata ) ; } /* read data */ void Rreceivedata ( unsigned CHAR headadd , unsigned CHAR N , unsigned CHAR *buf ) { startI2C () ; senddata ( 0xa0 ) ; TESTack () ; senddata ( headadd ) ; TESTack () ; startI2C () ; senddata ( 0xa1 ) ; TESTack () ; for ( ; N != 0 ; N -- ) { *buf = receivedata () ; buf ++ ; ackI2C ( 0 ) ; } ackI2C ( 1 ) ; stopI2C () ; return ; } /* write data */ void Wsenddata ( unsigned CHAR headadd , unsigned CHAR N , unsigned CHAR *buf ) { startI2C () ; senddata ( 0xa0 ) ; TESTack () ; senddata ( headadd ) ; TESTack () ; for ( ; N != 0 ; N ++ ) { senddata ( *buf ) ; |
2楼: | >>参与讨论 |
作者: 发霉的味道 于 2007/3/20 16:45:00 发布:
!!! void Wsenddata ( unsigned CHAR headadd , unsigned CHAR N , unsigned CHAR *buf ) { startI2C () ; senddata ( 0xa0 ) ; void Rreceivedata ( unsigned CHAR headadd , unsigned CHAR N , unsigned CHAR *buf ) { startI2C () ; senddata ( 0xa0 ) ; 这几句不知道为什么总是无法编译,其它语句却可以正常编译.真急死我了. |
3楼: | >>参与讨论 |
作者: taoest 于 2007/3/21 0:02:00 发布:
出错信息呢? 出错信息呢? |
4楼: | >>参与讨论 |
作者: turmary 于 2007/3/21 5:09:00 发布:
试试这个 #include "ATMEL\AT89X52.H" #include "INTRINS.H" #define someNOP() _nop_(); \ _nop_() #define SDAT P2_0 #define SCLK P2_1 /* #define WRITE 0xA0 ; */ /* #define READ 0xA1 ; */ /* **************************/ void delay(unsigned int timeM) { unsigned int con1; TH0 = 0x06; TL0 = 0x06; TMOD = 0x02; TF0 = 0; TR0 = 1; for (; timeM > 0; timeM--) { for (con1 = 4; con1 > 0;) if (TF0) { con1--; TF0 = 0; } } } /* I2C Start */ void startI2C(void) { SDAT = 1, SCLK = 1; someNOP(); SDAT = 0; someNOP(); SCLK = 0; return; } /* stop */ void stopI2C(void) { SDAT = 0, SCLK = 1; someNOP(); SDAT = 1; someNOP(); return; } /* answer */ void ackI2C(bit answer) { if (answer == 0) SDAT = 0; else SDAT = 1; SCLK = 1; someNOP(); SCLK = 0; return; } /* TEST ack */ bit TESTack(void) { bit ack; SDAT = 1; SCLK = 1; _nop_(); _nop_(); if (SDAT == 1) ack = 0; else ack = 1; SCLK = 0; _nop_(); _nop_(); return (ack); } /* send byte */ void senddata(unsigned CHAR sdata) { unsigned CHAR bitcount; for (bitcount = 0; bitcount < 8; bitcount++) { if (sdata << bitcount & 0x80) SDAT = 1; else SDAT = 0; SCLK = 1; someNOP(); SCLK = 0; } return; } /* receive byte */ unsigned CHAR receivedata() { unsigned CHAR bitcount, rdata = 0; for (bitcount = 0; bitcount < 8; bitcount++) { SCLK = 0; someNOP(); SCLK = 1; _nop_(); _nop_(); if (SDAT == 1) rdata = (rdata << 1) + 1; else rdata <<= 1; _nop_(); _nop_(); SCLK = 0; } return ((unsigned CHAR) rdata); } /* read data */ void Rreceivedata(unsigned CHAR headadd, unsigned CHAR N, unsigned CHAR *buf) { startI2C(); senddata(0xa0); TESTack(); senddata(headadd); TESTack(); startI2C(); senddata(0xa1); TESTack(); for (; N != 0; N--) { *buf = receivedata(); buf++; ackI2C(0); } ackI2C(1); stopI2C(); return; } /* write data */ void Wsenddata(unsigned CHAR headadd, unsigned CHAR N, unsigned CHAR *buf) { startI2C(); senddata(0xa0); TESTack(); senddata(headadd); TESTack(); for (; N != 0; N++) { senddata(*buf); while (TESTack() == 0) {; } buf++; } stopI2C(); delay(10); return; } |
5楼: | >>参与讨论 |
作者: 发霉的味道 于 2007/3/21 8:53:00 发布:
不是啊 我的这些IO口已经定义了,在IO.H中,我一直想不明白编译不出错,但是跟踪时,总是不能跟到 void Wsenddata ( unsigned CHAR headadd , unsigned CHAR N , unsigned CHAR *buf ) { startI2C () ; 无法设断点 senddata ( 0xa0 ) ; 无法设断点 void Rreceivedata ( unsigned CHAR headadd , unsigned CHAR N , unsigned CHAR *buf ) { startI2C () ; 无法设断点 senddata ( 0xa0 ) ; 无法设断点 这两个函数是进行8个字节连续操作的,其他语句可以正常断点,就是这开头两行,跟不了,试了重写了函数单字节操作没有问题,为什么连续操作就不行呢? |
6楼: | >>参与讨论 |
作者: 发霉的味道 于 2007/3/21 12:33:00 发布:
!! 我自己顶高点!! |
7楼: | >>参与讨论 |
作者: rainbowwrh 于 2007/3/21 12:43:00 发布:
无法设断点?? 无法设断点??? 可能这两句不是有效的语句, 所以编译器不允许在无效的语句(如注释, 空白的地方)设断点的. 仔细看看是不是其他地方出错了. |
8楼: | >>参与讨论 |
作者: nust1996 于 2007/3/21 14:17:00 发布:
无法设断点?? 无法设断点?? 是因为被优化了,如果程序有错,你就把错误信息发出来啊 |
9楼: | >>参与讨论 |
作者: 发霉的味道 于 2007/3/21 14:36:00 发布:
!!! 没有出错信息啊,也没有提示出错. |
|
|
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入 |
Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号 |