找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3630|回复: 0
打印 上一主题 下一主题
收起左侧

基于AVR的SCCB读写程序

[复制链接]
跳转到指定楼层
楼主
ID:26188 发表于 2015-6-23 14:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式


  1. #include<iom16v.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. #define set_bit(a,b)  a|=(1<<b)
  5. #define clr_bit(a,b)  a&=(1<<b)
  6. #define get_bit(a,b)  a&(1<<b)
  7. #pragma interrupt_handler TX_end:14
  8. uchar TXEND;
  9. void TX_end()
  10. {

  11. TXEND=0;//发送完毕标志

  12. }
  13. void USART_INT()//初始化串口
  14. {

  15. //UCSRA默认
  16. UCSRB=0x48;//使能发送完毕中断,禁能数据寄存器空中断,使能发送模式,关闭接收,关闭接收中断
  17. UCSRC=0x86;//禁止奇偶效验,数据位8,停止位1,工作在异步模式
  18. UBRRH=0x00;//
  19. UBRRL=51;//波特率9600,8MHZ,

  20. SREG=0x80;//开启全局中断

  21. }



  22. void send_byte(uchar buffer)//向PC发送数据
  23. {
  24.    while(0==get_bit(UCSRA,5));//数据寄存器里的数据是不是为空如果是就写数据

  25.     UDR=buffer;


  26. while(TXEND);//是否发送完毕?
  27. TXEND=1;//上一帧已经发送准备下一帧的发送

  28. }

  29. /*void ov7670_int()//7670初始化函数
  30. {



  31. }*/





  32. ////***********SCCB-----OX7670************************//////////
  33. void delay1ms(uint z)
  34. {
  35. uint j,k;
  36.     for(k=z;k;k--)
  37.                        {                          
  38.                       for(j=2666;j;j--) ;  //此处j不得小于27否则读不出数据
  39.         }
  40.                

  41. }



  42. void int_twi_sccb()
  43. {
  44. TWBR=50;/*设置SCL的时钟频率在19。230根据公式SCL FREQUENCY=CPU Clock frequency/16+2(TWBR)*4的TWPS次方
  45. */


  46. }
  47. /**************************************************/
  48. //本函数为设置7670寄存器的最底层操作函数,
  49. //无返回值
  50. //ADD是要写的寄存器地址,DATE是向里面写入的数据
  51. //
  52. /*************************************************/

  53. void write_ov7670_sccb_twi(uchar add,uchar date)//向add指定的地址内写入指定的数据
  54. {

  55.     //主发送模式程序/////////////////////////
  56.     TWCR=0xa4;//插入开始新号使能总线,使能START
  57.   delay1ms(1);
  58. while(0==get_bit(TWCR,7));//检测起始信号是否发送?
  59. while((TWSR&0xf8)!=0x08)
  60. {
  61.   send_byte(0xf4);
  62.      send_byte(0x21);
  63.      send_byte(0xf4);//出错

  64. }

  65. send_byte(0xf4);
  66. send_byte(0x11);
  67. send_byte(0xf4);//START信号的正确响应码





  68. TWDR=0x42;//写操作SCCB的器件地址0X42
  69. TWCR=0x84;//重启启动数据的发送
  70. delay1ms(1);
  71. while(0==get_bit(TWCR,7));//检测数据信号是否发送?
  72. while((TWSR&0XF8)!=0x18)
  73. {

  74. send_byte(0xf4);
  75. send_byte(0x22);
  76. send_byte(0xf4);

  77.      }

  78. send_byte(0xf4);
  79. send_byte(0x12);
  80. send_byte(0xf4);//发送完毕有ACK应答响应码





  81. TWDR=add;//写操作SCCB的寄存器子地址
  82. TWCR=0x84;//重启启动数据的发送
  83. delay1ms(1);
  84. while(0==get_bit(TWCR,7));//检测数据信号是否发送?
  85. while((TWSR&0XF8)!=0x28)
  86. {
  87. send_byte(0xf4);
  88. send_byte(0x23);//出错
  89. send_byte(0xf4);
  90.      }

  91. send_byte(0xf4);
  92. send_byte(0x13);
  93. send_byte(0xf4);//发送完毕有ACK应答响应码



  94. TWDR=date;//写操作SCCB的寄存器数据
  95. TWCR=0x84;//重启启动数据的发送
  96. delay1ms(1);
  97. while(0==get_bit(TWCR,7));//检测数据信号是否发送?
  98. while((TWSR&0XF8)!=0x28)
  99. {
  100. send_byte(0xf4);
  101. send_byte(0x24);//出错
  102. send_byte(0xf4);
  103.      }

  104. send_byte(0xf4);
  105. send_byte(0x14);
  106. send_byte(0xf4);//发送完毕有ACK应答响应码


  107. TWCR=0x94;//STOP信号




  108. }
  109. /**************************************************/
  110. //本函数为设置7670寄存器的最底层操作函数,
  111. //返回值为8位的数据
  112. //ADD是要读的寄存器地址,
  113. //
  114. /*************************************************/
  115. uchar read_ov7670_sccb_twi(uchar add)//读取一个add中的一个字节个数据
  116. {   
  117.          uchar date;
  118. //主发送模式程序/////////////////////////
  119.       
  120.    
  121.      TWCR=0xa4;//插入开始新号使能总线,使能START
  122.   delay1ms(1);
  123. while(0==get_bit(TWCR,7));//检测起始信号是否发送?
  124. while((TWSR&0xf8)!=0x08)
  125. {
  126. send_byte(0xf4);
  127.      send_byte(0x01);
  128.      send_byte(0xf4);//出错

  129. }

  130. send_byte(0xf4);
  131. send_byte(0x10);
  132. send_byte(0xf4);//START信号的正确响应码





  133. TWDR=0x42;//写操作SCCB的器件写地址0X42
  134. TWCR=0x84;//重启启动数据的发送
  135. delay1ms(1);
  136. while(0==get_bit(TWCR,7));//检测数据信号是否发送?
  137. while((TWSR&0XF8)!=0x18)
  138. {

  139. send_byte(0xf4);
  140. send_byte(0x02);
  141. send_byte(0xf4);

  142.      }

  143. send_byte(0xf4);
  144. send_byte(0x20);
  145. send_byte(0xf4);//发送完毕有ACK应答响应码





  146. TWDR=add;//写操作SCCB的寄存器子地址
  147. TWCR=0x84;//重启启动数据的发送
  148. delay1ms(1);
  149. while(0==get_bit(TWCR,7));//检测数据信号是否发送?
  150. while((TWSR&0XF8)!=0x28)
  151. {
  152. send_byte(0xf4);
  153. send_byte(0x03);//出错
  154. send_byte(0xf4);
  155.      }

  156. send_byte(0xf4);
  157. send_byte(0x30);
  158. send_byte(0xf4);//发送完毕有ACK应答响应码


  159. TWCR=0x94;//STOP信号

  160. delay1ms(10);////无论读完还是模式转换后都要等待

  161. //主接收模式程序///////////////////////////////////////////
  162. TWCR=0xa4;//插入开始新号使能总线,使能START
  163.    delay1ms(1);
  164. while(0==get_bit(TWCR,7));//检测起始信号是否发送?
  165. while((TWSR&0XF8)!=0x08)
  166. {send_byte(0xf4);
  167. send_byte(0x04);//出错
  168. send_byte(0xf4);
  169.      }

  170. send_byte(0xf4);
  171. send_byte(0x40);
  172. send_byte(0xf4);//START信号的正确响应码


  173. TWDR=0x43;//写操作SCCB的器件读地址0X43
  174. TWCR=0x84;//重启启动数据的发送
  175. delay1ms(1);
  176. while(0==get_bit(TWCR,7));//检测数据信号是否发送?
  177. while((TWSR&0XF8)!=0x40)
  178. {send_byte(0xf4);
  179. send_byte(0x05);//出错
  180. send_byte(0xf4);
  181.      }

  182. send_byte(0xf4);
  183. send_byte(0x50);
  184. send_byte(0xf4);//发送完毕有ACK应答响应码


  185. TWCR=0x84;//启动数据的接收
  186. delay1ms(1);
  187. while(0==get_bit(TWCR,7));//检测数据信号是否发送?
  188. date=TWDR;
  189. while((TWSR&0XF8)!=0x58)
  190. {send_byte(0xf4);
  191. send_byte(0x06);
  192. send_byte(0xf4);}//出错

  193. send_byte(0xf4);
  194. send_byte(0x60);
  195. send_byte(0xf4);//发送完毕有NACK应答响应码


  196. TWCR=0x94;//STOP信号


  197. return(date);



  198. }
  199. void main()
  200. {

  201. uchar inceptdate;//读出的寄存器数据
  202. DDRC=0xff;
  203. PORTC=0xff;
  204. USART_INT();
  205. int_twi_sccb();

  206. inceptdate=read_ov7670_sccb_twi(0x15);//读寄存器地址为15的数据

  207. send_byte(0xf4);
  208. send_byte(inceptdate);//数据显示
  209. send_byte(0xf4);

  210. delay1ms(10);//无论读完还是写完都要等等

  211. write_ov7670_sccb_twi(0x15,0x20);//写寄存器15的数据位20
  212. delay1ms(10);

  213. inceptdate=read_ov7670_sccb_twi(0x15);//再次读15的数据

  214. send_byte(0xf4);
  215. send_byte(inceptdate);//送显示,已是校验写入钱与写入后的对比
  216. send_byte(0xf4);
  217. while(1);


  218. }
复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表