找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5707|回复: 3
收起左侧

经典32位单片机流水灯仿真电路+代码

[复制链接]
ID:299757 发表于 2018-11-22 11:33 | 显示全部楼层 |阅读模式
利用函数调用实现流水灯多样控制, 很好的单片机初学实例。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0.png

利用函数实现多种循环控制

利用函数实现多种循环控制


单片机源程序如下:

  1. /***********************************************************************/

  2. #include "reg51.h"
  3.                                                                                                                                                                         
  4. #define uchar unsigned char         //定义unsigned char 为 uchar
  5. #define uint  unsigned int

  6. sbit  F1 = P3^0;
  7. sbit  F2 = P3^1;

  8. uint  time = 40;        //通过改变TIME的参数可以改变流水灯的变换速度                  


  9. /***************一微秒延时子程序******************/
  10. void delayus(uint delay){
  11.         while(delay--);
  12. }

  13. /***************一毫秒延时子程序******************/

  14. void delayms(uint delay){
  15.         while(delay--)
  16.                 delayus(149);
  17. }


  18. /*******************************变换方式一  子函数 ***********************************/

  19. void run_LED_fun1()
  20. {
  21. uchar a,temp,temp1;
  22. temp=0x10;

  23. for(a=9;a>0;a--)   //P1口LED灯依次点亮
  24. {
  25. P1=~temp;

  26. delayms(time);
  27. temp<<=1;

  28. }

  29. temp=0x01;
  30. for(a=9;a>0;a--)   //P3口LED灯依次点亮
  31. {
  32. P3=~temp;

  33. delayms(time);
  34. temp<<=1;

  35. }


  36. temp=0x01;                  //P2口LED灯依次反向点亮

  37. for(a=9;a>0;a--)
  38. {
  39. P2=~temp;
  40. delayms(time);
  41. temp<<=1;

  42. }

  43. temp=0x80;                  //P0口LED灯依次反向点亮

  44. for(a=9;a>0;a--)
  45. {
  46. P0=~temp;
  47. delayms(time);
  48. temp>>=1;

  49. }




  50. temp=0x01;
  51. for(a=9;a>0;a--)   //P0口LED灯依次点亮
  52. {
  53. P0=~temp;

  54. delayms(time);
  55. temp<<=1;

  56. }

  57. temp=0x80;
  58. for(a=9;a>0;a--)   //P2口LED灯依次点亮
  59. {
  60. P2=~temp;

  61. delayms(time);
  62. temp>>=1;

  63. }



  64. temp=0x80;                  //P3口LED灯依次反向点亮

  65. for(a=9;a>0;a--)
  66. {
  67. P3=~temp;
  68. delayms(time);
  69. temp>>=1;

  70. }

  71. temp=0x80;                  //P1口LED灯依次反向点亮

  72. for(a=9;a>0;a--)
  73. {
  74. P1=~temp;
  75. delayms(time);
  76. temp>>=1;

  77. }


  78. temp=0xfe;
  79. for(a=8;a>0;a--)
  80. {
  81. P1=temp;
  82. delayms(time);
  83. temp<<=1;

  84. }


  85. temp=0xfe;
  86. for(a=8;a>0;a--)
  87. {
  88. P3=temp;
  89. delayms(time);
  90. temp<<=1;

  91. }


  92. temp=0xfe;
  93. for(a=8;a>0;a--)
  94. {
  95. P0=temp;
  96. delayms(time);
  97. temp<<=1;

  98. }


  99. temp=0x7f;
  100. for(a=8;a>0;a--)
  101. {
  102. P2=temp;
  103. delayms(time);
  104. temp>>=1;

  105. }


  106. temp=0x01;
  107. for(a=8;a>0;a--)
  108. {
  109. P2=temp;
  110. delayms(time);
  111. temp1=~temp;
  112. temp1<<=1;
  113. temp=~temp1;

  114. }

  115. temp=0x80;
  116. for(a=8;a>0;a--)
  117. {
  118. P0=temp;
  119. delayms(time);
  120. temp1=~temp;
  121. temp1>>=1;
  122. temp=~temp1;

  123. }

  124. temp=0x80;
  125. for(a=8;a>0;a--)
  126. {
  127. P3=temp;
  128. delayms(time);
  129. temp1=~temp;
  130. temp1>>=1;
  131. temp=~temp1;

  132. }
  133. temp=0x80;
  134. for(a=8;a>0;a--)
  135. {
  136. P1=temp;
  137. delayms(time);
  138. temp1=~temp;
  139. temp1>>=1;
  140. temp=~temp1;

  141. }

  142. }


  143. /*******************************变换方式二  子函数 ***********************************/


  144. void run_LED_fun2()
  145. {
  146. uchar a,temp,temp1,temp2;

  147. temp=0x01;
  148. temp1=0x80;
  149. for(a=8;a>0;a--)   //P1口LED灯依次点亮
  150. {
  151. P1=~temp;
  152. P0=~temp;
  153. P3=~temp1;
  154. P2=~temp;
  155. delayms(time);
  156. temp<<=1;
  157. temp1>>=1;

  158. }

  159. temp=0x80;
  160. temp1=0x01;
  161. for(a=8;a>0;a--)   //P1口LED灯依次点亮
  162. {
  163. P1=~temp;
  164. P0=~temp;
  165. P3=~temp1;
  166. P2=~temp;
  167. delayms(time);
  168. temp>>=1;
  169. temp1<<=1;

  170. }

  171. temp=0xfe;
  172. temp1=0x7f;
  173. for(a=8;a>0;a--)
  174. {
  175. P1=temp;
  176. P0=temp;
  177. P3=temp1;
  178. P2=temp;
  179. delayms(time);
  180. temp<<=1;
  181. temp1>>=1;

  182. }

  183. temp=0x7f;
  184. temp1=0xfe;
  185. for(a=8;a>0;a--)
  186. {
  187. P1=~temp;
  188. P0=~temp;
  189. P3=~temp1;
  190. P2=~temp;
  191. delayms(time);

  192. temp2=~temp;
  193. temp>>=1;
  194. temp2=~temp;

  195. temp1<<=1;


  196. }


  197. }


  198. /*******************************变换方式三 子函数 ***********************************/

  199. void run_LED_fun3()
  200. {

  201. P0=0x00;
  202. P1=0xff;
  203. P2=0xff;
  204. P3=0xff;
  205. delayms(5*time);

  206. P0=0xff;
  207. P1=0x00;
  208. P2=0xff;
  209. P3=0xff;
  210. delayms(5*time);

  211. P0=0xff;
  212. P1=0xff;
  213. P2=0xff;
  214. P3=0x00;
  215. delayms(5*time);

  216. P0=0xff;
  217. P1=0xff;
  218. P2=0x00;
  219. P3=0xff;
  220. delayms(5*time);

  221. P0=0xff;
  222. P1=0x00;
  223. P2=0xff;
  224. P3=0x00;
  225. delayms(5*time);

  226. P0=0x00;
  227. P1=0xff;
  228. P2=0x00;
  229. P3=0xff;
  230. delayms(5*time);
  231. P0=0xff;
  232. P1=0xff;
  233. P2=0xff;
  234. P3=0xff;

  235. }


  236. /*******************************变换方式四  子函数 ***********************************/

  237. void run_LED_fun4()
  238. {
  239. uchar a,temp,temp1,temp2;
  240. P0=0xff;
  241. P1=0x00;
  242. P2=0xff;
  243. P3=0xff;
  244. delayms(time);

  245. temp=0xfe;
  246. temp1=0xfe;

  247. for(a=8;a>0;a--)
  248. {
  249. P1=~temp;

  250. P3=temp1;

  251. delayms(time);

  252. temp2=~temp;
  253. temp<<=1;
  254. temp2=~temp;

  255. temp1<<=1;
  256. }

  257. temp=0xfe;
  258. temp1=0x7f;

  259. for(a=8;a>0;a--)
  260. {
  261. P3=~temp;

  262. P2=temp;

  263. delayms(time);

  264. temp2=~temp;
  265. temp<<=1;
  266. temp2=~temp;

  267. temp1>>=1;
  268. }

  269. temp=0xfe;
  270. temp1=0x7f;



  271. for(a=8;a>0;a--)
  272. {
  273. P2=~temp;

  274. P0=temp1;

  275. delayms(time);

  276. //temp2=~temp1;
  277. temp<<=1;
  278. //temp2=~temp;

  279. temp1>>=1;
  280. }


  281. temp=0x7f;
  282. temp1=0xfe;

  283. for(a=8;a>0;a--)
  284. {
  285. P0=~temp;

  286. P1=temp1;

  287. delayms(time);

  288. temp2=~temp;
  289. temp>>=1;
  290. temp2=~temp;

  291. temp1<<=1;
  292. }



  293. }

  294. /*
  295. void  change_speed()
  296. {
  297. if(F1 == 0)
  298. {
  299. delayms(10);
  300. if(F1 == 0)
  301. {
  302. while(!F1);
  303. time = time +20;

  304. }
  305. }


  306. if(F2 == 0)
  307. {
  308. delayms(10);
  309. if(F2 == 0)
  310. {
  311. while(!F2);
  312. time = time -20;

  313. }
  314. }



  315. }


  316. */

  317. /*******************************主函数 ***********************************/

  318. void main()
  319. {
  320. while(1)
  321. {


  322. run_LED_fun1();
  323. run_LED_fun2();
  324. run_LED_fun3();
  325. run_LED_fun4();


  326. }

  327. }
复制代码

所有资料51hei提供下载:
经典流水灯 测试程序及Proteus仿真.zip (61.92 KB, 下载次数: 76)
回复

使用道具 举报

ID:549706 发表于 2019-5-28 21:54 | 显示全部楼层
谢谢大佬
回复

使用道具 举报

ID:61140 发表于 2022-6-17 06:30 | 显示全部楼层
呵呵,32位片机开头写REG51?
回复

使用道具 举报

ID:1042173 发表于 2022-8-18 02:53 来自手机 | 显示全部楼层
乱说32位,,我以为是sTM32的呢,,
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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