找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5418|回复: 4
收起左侧

51单片机的声光控照明系统Proteus仿真+程序

[复制链接]
ID:511728 发表于 2019-4-14 11:22 | 显示全部楼层 |阅读模式
这是一些和声光控照明有关的资料

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0.png 0.png

单片机源程序如下:
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #define uint unsigned int
  4. #define uchar unsigned char
  5. #define delay4us() {_nop_();_nop_();_nop_();_nop_();}   //??4us

  6. unsigned char dat = 0x00;
  7. unsigned char count = 0x00;
  8. unsigned char CH;
  9. unsigned char dis[] = {0x00, 0x00, 0x00};
  10. unsigned int displaynum;
  11. sbit RS = P2^0;
  12. sbit RW = P2^1;
  13. sbit E= P2^2;
  14. sbit buzzer= P2^4;
  15. sbit led= P2^3;

  16. sbit CS = P3^5;
  17. sbit Clk = P3^4;
  18. sbit DATI = P3^3;
  19. sbit DATO = P3^3;


  20. void Disp_temper_range(uchar add,uint T);
  21. void Display();

  22. uchar code table1[]="GZ:";
  23. uchar code table2[]="SY:";
  24. uchar code table5[]="SPEED:";
  25. uchar code table3[]={0x07,0x05,0x07,0x00,0x00,0x00,0x00,0x00,
  26. 0x00,0x00,0x00,0x06,0x09,0x10,0x00,0x00,
  27. 0x00,0x00,0x00,0x00,0x01,0x12,0x0C,0x00,};
  28. uchar code table4[]={14,12,7,5,0};
  29. uchar code table6[]="1";
  30. uchar code table7[]="2";
  31. uchar code table8[]="3";
  32. uchar code table9[]="0";
  33. uchar d,a,temp,*p,aa,s,m,i=0;
  34. unsigned int num=0;
  35. unsigned char gz;
  36. unsigned char sy;
  37. unsigned char openflag=0;

  38. void delay(uint z)
  39. {
  40. uint i,j;
  41. for(i=z;i>0;i--)
  42. for(j=110;j>0;j--);
  43. }
  44. void delay_(uint i)
  45. {
  46. while(i--);
  47. }
  48. void DelayMS(uint ms)
  49. {
  50. uchar i;
  51. while(ms--)
  52. {
  53. for(i=0;i<120;i++);
  54. }
  55. }
  56. bit LCD_Busy_Check()   //LCD判忙
  57. {
  58. bit result;
  59. RS = 0;
  60. RW = 1;

  61. E= 1;
  62. delay4us();
  63. result = (bit)(P0&0x80);
  64. E= 0;
  65. return result;
  66. }
  67. void LCD_Write_Command(uchar cmd)   //LCD写命令
  68. {
  69. while(LCD_Busy_Check());
  70. RS = 0;
  71. RW = 0;
  72. E = 0;
  73. _nop_();
  74. _nop_();
  75. P0 = cmd;
  76. delay4us();
  77. E = 1;
  78. delay4us();
  79. E = 0;
  80. }
  81. /*
  82. void Set_Disp_Pos(uchar pos)
  83. {
  84. LCD_Write_Command(pos | 0x80);   //???
  85. }
  86. */
  87. void LCD_Write_Data(uchar dat)
  88. {
  89. while(LCD_Busy_Check());
  90. RS = 1;
  91. RW = 0;
  92. E = 0;
  93. P0 = dat;
  94. delay4us();

  95. E = 1;
  96. delay4us();
  97. E = 0;
  98. }

  99. void set_XY(uchar X,uchar Y)   //????????
  100. {
  101. if(Y==0)
  102. X+=0x80;
  103. else
  104. X|=0xC0;
  105. LCD_Write_Command(X);
  106. }


  107. void DispOneChar(uchar X,uchar Y,uchar Data)         //??????
  108. {
  109. set_XY(X,Y);
  110. LCD_Write_Data(Data);
  111. }

  112. void LCD_Initialise()             //LCD初始化
  113. {
  114. LCD_Write_Command(0x38); DelayMS(1);
  115. LCD_Write_Command(0x38); DelayMS(1);
  116. LCD_Write_Command(0x38); DelayMS(1);
  117. LCD_Write_Command(0x38); DelayMS(1);
  118. LCD_Write_Command(0x0c); DelayMS(1);
  119. LCD_Write_Command(0x06);
  120. LCD_Write_Command(0x01);
  121. delay4us();
  122. delay4us();delay4us();delay4us();
  123. }

  124. void Display_fre(uchar f)           //       
  125. {
  126. uchar a1,a2,a3;
  127. a1=f/100;
  128. a2=f/10%10;
  129. a3=f%10;
  130. DispOneChar(4,0,0x30+a1);
  131. DispOneChar(5,0,0x30+a2);
  132. DispOneChar(6,0,0x30+a3);
  133. }

  134. void Display_fre1(uchar s)       
  135. {
  136. uchar b1,b2,b3;
  137. b1=s/100;
  138. b2=s/10%10;
  139. b3=s%10;

  140. DispOneChar(13,0,0x30+b1);
  141. DispOneChar(14,0,0x30+b2);
  142. DispOneChar(15,0,0x30+b3);
  143. }

  144. void Display_fre2(uint ss)       
  145. {
  146. uint c1,c2,c3,c4;
  147. c1=ss/1000;
  148. c2=ss/100%10;
  149. c3=ss/10%10;
  150. c4=ss%10;

  151. DispOneChar(7,1,0x30+c1);
  152. DispOneChar(8,1,0x30+c2);
  153. DispOneChar(9,1,0x30+c3);
  154. DispOneChar(10,1,0x30+c4);
  155. }


  156. void DispChars(uchar X,uchar Y,uchar *p,uchar count) //?????
  157. {
  158. uchar i;
  159. for(i=0;i<count;i++)
  160. {
  161. set_XY(X,Y);
  162. LCD_Write_Data(*p);
  163. X++;
  164. p++;
  165. }
  166. }

  167. /*****CH=0X00,对CH1进行转换,TGS260******/
  168. unsigned char adc0832(unsigned char CH) //模数转化
  169. {
  170. unsigned char i,test,adval;
  171. adval = 0x00;
  172. test = 0x00;
  173. Clk = 0;
  174. DATI = 1;
  175. _nop_();
  176. CS = 0;

  177. _nop_();
  178. Clk = 1;
  179. _nop_();

  180. if ( CH == 0x00 )           //CH=0X00,对CH1进行转换,TGS260
  181. {
  182. Clk = 0;
  183. DATI = 1; //
  184. _nop_();
  185. Clk = 1;
  186. _nop_();
  187. Clk = 0;
  188. DATI = 1;
  189. _nop_();
  190. Clk = 1;
  191. _nop_();
  192. }
  193. else
  194. {
  195. Clk = 0;
  196. DATI = 1;
  197. _nop_();
  198. Clk = 1;
  199. _nop_();
  200. Clk = 0;
  201. DATI = 0;
  202. _nop_();
  203. Clk = 1;
  204. _nop_();
  205. }

  206. Clk = 0;
  207. DATI = 1;

  208. for( i = 0;i < 8;i++ ) //
  209. {
  210. _nop_();
  211. adval <<= 1;
  212. Clk = 1;
  213. _nop_();
  214. Clk = 0;
  215. if (DATO)
  216. adval |= 0x01;
  217. else
  218. adval |= 0x00;
  219. }


  220. for (i = 0; i < 8; i++)
  221. {
  222. test >>= 1;
  223. if (DATO)
  224. test |= 0x80;
  225. else
  226. test |= 0x00;
  227. _nop_();
  228. Clk = 1;
  229. _nop_();
  230. Clk = 0;
  231. }

  232. if (adval == test)
  233. dat = test;
  234. _nop_();
  235. CS = 1;//ADC0832
  236. DATO = 1;
  237. Clk = 1;


  238. return dat;

  239. }




  240. void main(){
  241.         led = 1;
  242.         LCD_Initialise();   //LED初始化
  243. //        DelayMS(5);
  244.           DispChars(0,0,p=table1,4);        //??“tgs”
  245. //          DelayMS(5);
  246.           DispChars(8,0,p=table2,4);        //??“mq2”
  247.         while (1){
  248.        
  249.                 gz=100-100*adc0832(0x00)/255;
  250.                         Display_fre(gz);
  251.                 sy=        100*adc0832(0x11)/255;
  252.                 Display_fre1(sy);
  253.                 if (gz<50){
  254.                         openflag = 0;
  255.                 }
  256.                 if ((50<=gz)&&(sy>40)){
  257.                         openflag = 1;
  258.                 }
  259.                 else {
  260.                         openflag = 0;
  261.                 }
  262.                 if (openflag==1){
  263.                         led = 0;
  264.                         num++;
  265.                         delay(200);
  266.                         if (num>180){
  267.                                 num=0;
  268.                                 led=1;
  269.                                 openflag = 0;
  270.                         }
  271.                 }
  272.                 else{
  273.                          if (num!=0){
  274.                                 num++;
  275.                                 delay(200);
  276.                         if (num>180){
  277.                                 num=0;
  278.                                 led=1;
  279.                                 openflag = 0;
  280.                         }
  281.                 }
  282.                                                
  283.         }
  284. }
  285. }
复制代码

所有资料51hei提供下载:
声控灯.rar (81.57 KB, 下载次数: 158)
回复

使用道具 举报

ID:456462 发表于 2019-12-7 13:48 | 显示全部楼层
我照着图片接了实物,可是LCD不亮怎么办呢
回复

使用道具 举报

ID:591866 发表于 2020-1-5 10:53 | 显示全部楼层
没有仿真图啊,打不开
回复

使用道具 举报

ID:744791 发表于 2020-5-26 22:24 | 显示全部楼层
这个红色LED灯要在什么情况下亮啊?
回复

使用道具 举报

ID:701047 发表于 2020-6-24 21:34 | 显示全部楼层
有人仿真成功了吗,求助
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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