找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3051|回复: 1
收起左侧

单片机数控电源设计,含源代码,原理图

[复制链接]
ID:890721 发表于 2021-3-11 13:19 | 显示全部楼层 |阅读模式
大学时期做的一个基于单片机的数控电源,实现利用显示屏显示电压电流,并通过按键控制其大小。
附件里有源代码,ad原理图
G786UU1_O`UZAO0Y1$C7])N.png

单片机源程序如下:
  1. #include <reg51.h>
  2. #define SC P0
  3. void delay_ms(int n);
  4. void AN();
  5. void XSJ(unsigned char SJ);//写数据
  6. void XZL(unsigned char ZL);//写指令
  7. void CSH();//初始化
  8. void SZZH();//转换
  9. void TLC_5651(int buf);
  10. unsigned int A_D();

  11. sbit key1 = P2^3; //左1
  12. sbit key2 = P2^4;
  13. sbit key3 = P2^5;
  14. sbit key4 = P2^6;

  15. sbit RS = P2^0; //数据h/命令L
  16. sbit RW = P2^1; //读H/写L
  17. sbit E = P2^2; //使能

  18. sbit CS_5615=P1^5; //定义片选信号IO口
  19. sbit CLK_5615=P1^6; //定义时钟信号IO口
  20. sbit DAT_5615=P1^7; //定义数据输入IO口

  21. sbit CS=P1^4; //定义片选信号IO口
  22. sbit CLK=P1^5; //定义时钟信号IO口
  23. sbit DIO=P1^6; //定义数据输入IO口

  24. unsigned int U = 0;//电压
  25. unsigned int I = 0;//电流

  26. char uu[3];
  27. char ii[3];
  28. int main()
  29. {
  30. CSH();
  31. while(1)
  32. {
  33. AN();
  34. SZZH();
  35. XZL(0x82);
  36. XSJ(uu[0]);
  37. XZL(0x83);
  38. XSJ(uu[1]);
  39. XZL(0x84);
  40. XSJ('.');
  41. XZL(0x85);
  42. XSJ(uu[2]);
  43. XZL(0xc2);
  44. XSJ(ii[0]);
  45. XZL(0xc3);
  46. XSJ(ii[1]);
  47. XZL(0xc4);
  48. XSJ('.');
  49. XZL(0xc5);
  50. XSJ(ii[2]);
  51. TLC_5651(U);
  52. if(U>999)
  53. U=0;
  54. I=A_D();
  55. }
  56. }
  57. void CSH()//初始化
  58. {
  59. int wz =0x82,i;
  60. XZL(0X38);
  61. XZL(0X0F);
  62. //XZL(0X06);
  63. //XZL(0X80);
  64. XZL(0x80);
  65. XSJ('V');
  66. XZL(0x81);
  67. XSJ('=');
  68. XZL(0x8f);
  69. XSJ('V');
  70. XZL(0xc0);
  71. XSJ('I');
  72. XZL(0xc1);
  73. XSJ('=');
  74. XZL(0xCf);
  75. XSJ('A');
  76. for(i=0;i<13;i++)
  77. {
  78. XZL(wz++);
  79. XSJ(' ');
  80. }
  81. wz = 0xc2;
  82. for(i=0;i<13;i++)
  83. {

  84. delay_ms(5);
  85. XZL(wz++);
  86. XSJ(' ');
  87. }
  88. }
  89. void XZL(unsigned char ZL)//写指令
  90. {
  91. E=0;
  92. RS=0;
  93. RW=0;
  94. SC = ZL;
  95. E=1;
  96. delay_ms(5);
  97. E=0;
  98. }
  99. void XSJ(unsigned char SJ)//写数据
  100. {
  101. E=0;
  102. RS=1;
  103. RW=0;
  104. SC = SJ;
  105. E=1;
  106. delay_ms(5);
  107. E=0;
  108. }
  109. void AN() //按钮控制电压数
  110. {
  111. if(key1 == 0)
  112. {
  113. delay_ms(20);
  114. if(key1 == 0)
  115. U+=2;
  116. }
  117. if(key2 == 0)
  118. {
  119. delay_ms(20);
  120. if(key2 == 0)
  121. U-=2;
  122. }
  123. if(key3 == 0)
  124. {
  125. delay_ms(20);
  126. if(key3 == 0)
  127. U = 50;
  128. }
  129. if(key4 == 0)
  130. {
  131. delay_ms(20);
  132. if(key4 == 0)
  133. U = 0;
  134. }
  135. }
  136. void delay_ms(int n) //阻塞延时
  137. {
  138. int i = 0,j = 0;
  139. for(i = 0;i<n;i++)
  140. for(j = 0;j<123;j++);
  141. }
  142. void SZZH()//转换
  143. {
  144. uu[0] = 0x30+U/100;
  145. uu[1] = 0x30+(U/10)%10;
  146. uu[2] = 0x30+U%10;
  147. ii[0] = 0x30+I/100;
  148. ii[1] = 0x30+(I/10)%10;
  149. ii[2] = 0x30+I%10;
  150. }
  151. void TLC_5651(int buf) //电压
  152. {
  153. int a,c; //定义变量
  154. c=buf*2; //要输出的数据赋值
  155. CS_5615=0; //引脚拉低
  156. for(a=16;a>0;a--) //循环16次
  157. {
  158. DAT_5615=c>>15; //把数据串行输入进da芯片(把数据右移15位得到最高位数据,赋值给数据脚)
  159. c=c<<1; //将数据左移一位,下次循环时就是传输第二位数据了
  160. CLK_5615=1; //拉高
  161. CLK_5615=0; //拉低
  162. }
  163. CLK_5615=1;
  164. CLK_5615=0;
  165. CLK_5615=1;
  166. CLK_5615=0;
  167. CS_5615=1;
  168. }
  169. unsigned int A_D()
  170. {
  171. unsigned char i,dat;
  172. CS=1; //一个转换周期开始
  173. CLK=0; //为第一个脉冲作准备
  174. CS=0; //CS置0,片选有效

  175. DIO=1; //DIO置1,规定的起始信号
  176. CLK=1; //第一个脉冲
  177. CLK=0; //第一个脉冲的下降沿,此前DIO必须是高电平
  178. DIO=1; //DIO置1, 通道选择信号
  179. CLK=1; //第二个脉冲,第2、3个脉冲下沉之前,DI必须跟别输入两位数据用于选择通道,这里选通道CH0
  180. CLK=0; //第二个脉冲下降沿
  181. DIO=0; //DI置0,选择通道0
  182. CLK=1; //第三个脉冲
  183. CLK=0; //第三个脉冲下降沿
  184. DIO=1; //第三个脉冲下沉之后,输入端DIO失去作用,应置1
  185. CLK=1; //第四个脉冲
  186. for(i=0;i<8;i++) //高位在前
  187. {
  188. CLK=1; //第四个脉冲
  189. CLK=0;
  190. dat<<=1; //将下面储存的低位数据向右移
  191. dat|=(unsigned char)DIO; //将输出数据DIO通过或运算储存在dat最低位
  192. }
  193. CS=1; //片选无效
  194. return dat-25; //将读出的数据返回
  195. }
复制代码

新建文件夹 (2).zip

74.92 KB, 下载次数: 101, 下载积分: 黑币 -5

回复

使用道具 举报

ID:914746 发表于 2021-6-7 10:19 来自手机 | 显示全部楼层
楼主,请问有仿真图吗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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