找回密码
 立即注册

QQ登录

只需一步,快速开始

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

STC15单片机+MCP4017+Proteus仿真代码

[复制链接]
跳转到指定楼层
楼主
MCP4017的仿真。


单片机源程序如下:
  1. #include <STC15Fxxxx.h>
  2. #include <intrins.h>

  3. #define uint unsigned int
  4. #define uchar unsigned char

  5. //#define FOSC 24000000L


  6. #define IIC_SDA_H P32=1 //BIT2 P3.2为SDA输出高电平

  7. #define IIC_SDA_L P32=0 //BIT2 P3.2为SDA输出低电平

  8. #define IIC_SDA P32

  9. #define IIC_SCL_H P31=1 //BIT1 P3.1为SCL输出高电平

  10. #define IIC_SCL_L P31=0 //BIT1 P3.1为SCL输出低电平


  11. void delay_5us(unsigned int bus) // 2US
  12. {
  13.         unsigned int a;
  14.         while (bus)
  15.         {
  16.                 a = 1;
  17.                 while (a--)
  18.                         ;
  19.                 bus--;
  20.         }
  21.         return;
  22. }


  23. /********IIC初始化************/

  24. void IIC_Init(void)

  25. {

  26. IIC_SDA_H; //SDA拉高

  27. IIC_SCL_H; //SCL拉高

  28. }

  29. /********IIC通讯开始************/

  30. void IIC_Start(void)

  31. {



  32. IIC_SCL_H;

  33. delay_5us(20);

  34. IIC_SDA_H;

  35. delay_5us(20);

  36. IIC_SDA_L;

  37. delay_5us(20);

  38. IIC_SCL_L;

  39. delay_5us(20);

  40. }



  41. /********IIC通讯结束************/

  42. void IIC_Stop(void)

  43. {



  44. IIC_SCL_L;

  45. delay_5us(1);

  46. IIC_SDA_L;

  47. delay_5us(2);

  48. IIC_SCL_H;

  49. delay_5us(10);

  50. IIC_SDA_H;

  51. delay_5us(10);

  52. }


  53. /********IIC从设备应答************/

  54. void IIC_Wait_ACK(void)

  55. {

  56. uchar i = 0;



  57. IIC_SCL_H;

  58. delay_5us(1);

  59. while ((IIC_SDA) && i < 240)

  60. i++;

  61. IIC_SCL_L;



  62. delay_5us(2);

  63. }

  64. /********主设备非应答************/

  65. void IIC_NACK(void)

  66. {

  67. IIC_SCL_H;

  68. delay_5us(1);

  69. IIC_SDA_H;

  70. delay_5us(1);

  71. IIC_SCL_L;

  72. delay_5us(2);

  73. }
  74. /********IIC发送一个字节************/

  75. void IIC_WriteByte(uchar byte)

  76. {

  77. uchar len = 0;

  78. IIC_SCL_L;

  79. delay_5us(10);

  80. for (len = 0; len < 8; len++)

  81. {

  82. if (byte & 0x80)

  83. {

  84. IIC_SDA_H;

  85. }

  86. else

  87. {

  88. IIC_SDA_L;

  89. }

  90. delay_5us(10);

  91. IIC_SCL_H;

  92. byte <<= 1;

  93. delay_5us(10);

  94. IIC_SCL_L;

  95. delay_5us(10);

  96. }

  97. IIC_SDA_H;

  98. delay_5us(1);

  99. IIC_SCL_L;

  100. delay_5us(2);

  101. }

  102. /*********************************************

  103. 功 能:向从设备接收一个字节

  104. 返回值:Byte--读取到的字节

  105. **********************************************/

  106. uchar IIC_ReadByte(void)

  107. {

  108. uchar len = 0, Byte = 0;

  109. IIC_SDA_H;



  110. for (len = 0; len < 8; len++)

  111. {

  112. IIC_SCL_L;

  113. delay_5us(1);

  114. IIC_SCL_H;

  115. delay_5us(1);

  116. Byte <<= 1;

  117. Byte |= (IIC_SDA);

  118. delay_5us(1);

  119. IIC_SCL_L;

  120. delay_5us(1);

  121. }

  122. return Byte;

  123. }

  124. /*********************************************

  125. 函数名:IIC_ReceiveData

  126. 功 能:向从设备接收一个字节,并带应答

  127. **********************************************/

  128. uchar IIC_ReceiveData(uchar Ack)

  129. {

  130. uchar i = 0, ReadValue = 0;



  131. IIC_SDA_H;



  132. IIC_SCL_L;

  133. for (i = 0; i < 8; i++)

  134. {

  135. IIC_SCL_H;

  136. delay_5us(1);

  137. ReadValue <<= 1;

  138. if ((IIC_SDA )!= 0)

  139. {

  140. ReadValue |= 0x01;

  141. }

  142. delay_5us(1);

  143. IIC_SCL_L;

  144. delay_5us(2);

  145. }

  146. if (Ack)

  147. {

  148. IIC_SCL_L;



  149. IIC_SDA_L;

  150. delay_5us(2);

  151. IIC_SCL_H;

  152. delay_5us(1);

  153. IIC_SCL_L;

  154. }

  155. else

  156. {

  157. IIC_SCL_L;



  158. IIC_SDA_H;

  159. delay_5us(2);

  160. IIC_SCL_H;

  161. delay_5us(1);

  162. IIC_SCL_L;

  163. }

  164. return ReadValue;

  165. }



  166. /******************************MCP4017*****************************************/

  167. void MCP4017_Init(void)

  168. {

  169. IIC_Init(); // I2C初始化

  170. }

  171. /*********************************************

  172. 函数名:MCP4017_Write_DATA

  173. 功 能:写 地址 数据

  174. 形 参:addr 地址0x5E dat 数据

  175. **********************************************/

  176. void MCP4017_Write_DATA(const uchar addr, const char DATA)

  177. { IIC_Init();

  178. IIC_Start(); // 启动

  179. IIC_WriteByte(addr); // 设备地址

  180. IIC_Wait_ACK(); // 等待数据响应

  181. // IIC_WriteByte(addr); // 发送寄存器地址

  182. // IIC_Wait_ACK(); // 等待数据响应

  183. IIC_WriteByte(DATA); // 发送数据

  184. IIC_Wait_ACK(); // 等待数据响应

  185. IIC_Stop(); // 停止

  186. }

  187. /*********************************************

  188. 函数名:PAJ7620U2_Read_DATA

  189. 功 能:读地址数据

  190. 形 参:addr--寄存器地址_0x5E

  191. **********************************************/

  192. uchar MCP4017_Read_DATA(const uchar addr)

  193. {

  194. uchar GET_DATA = 0;

  195. // IIC_Start(); // 启动

  196. // IIC_WriteByte(MCP4017.ADDR); // 发送地址

  197. // IIC_Wait_ACK(); // 等待数据响应

  198. // IIC_WriteByte(addr); // 发送地址

  199. // IIC_Wait_ACK(); // 等待数据响应

  200. IIC_Start(); // 启动

  201. IIC_WriteByte(addr | 1); // 发送地址

  202. IIC_Wait_ACK(); // 等待数据响应

  203. GET_DATA = IIC_ReadByte(); // 获取数据

  204. IIC_Wait_ACK(); // 等待数据响应

  205. IIC_Stop(); // 停止

  206. return GET_DATA;

  207. }

  208. /********************************************************
  209. 函数名称:void main()
  210. 函数作用:主函数
  211. 参数说明:
  212. ********************************************************/

  213. /******************** 主函数 **************************/
  214. void main(void)
  215. {
  216.   // unsigned char value = 0x7F; // 设置初始值
  217.          unsigned char value = 0x00; // 设置初始值
  218.         P0M1 = 0;
  219.         P0M0 = 0xff; //设置为准双向口
  220.         P1M1 = 0;
  221.         P1M0 = 0; //设置为准双向口
  222.         P3M1 = 0;
  223.         P3M0 = 0; //设置为准双向口
  224.        
  225.         P00=0;
  226.         while (1)
  227.         {
  228.        


  229.   
  230.        MCP4017_Write_DATA(0x5e,value); // 写入值
  231.         delay_5us(2);
  232.         value++; // 增加值

  233.                 P00=0;
  234. delay_5us(50000);

  235.                 P00=1;
  236. delay_5us(50000);

  237.                 P00=0;
  238. delay_5us(50000);
  239.         }
  240. }

复制代码

仿真程序: MCP4017.7z (278.21 KB, 下载次数: 19)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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