main.c 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. #include "reg52.h"
  2. #include "string.h"
  3. #include "stdio.h"
  4. #define uint unsigned int
  5. #define uchar unsigned char
  6. /*
  7. 通过hc-sr501人体感应正确感应人体。
  8. (2)实现指定语音播放功能。
  9. (3)通过电机实现正反转来实现迎宾机器人。
  10. 研究方法、步骤及措施:
  11. */
  12. /*
  13. ? 采用5V USB电路供电
  14. ? 可以实现语音停止和开启风扇
  15. ? 实现语音调速风扇
  16. ? 调速等级高低各3级
  17. */
  18. sbit SW1=P2^0;
  19. sbit SW2=P2^1;
  20. sbit YINPIN1=P2^2;
  21. sbit YINPIN2=P2^3;
  22. sbit buzz=P3^3;
  23. void delay_xms(int xms)
  24. {
  25. char ix=0;
  26. for(;xms>0;xms--)
  27. for(ix=110;ix>0;ix--);
  28. }
  29. uchar SET=0;
  30. void Timer0Init(void) //10毫秒@11.0592MHz
  31. {
  32. TMOD &= 0xF0; //设置定时器模式
  33. TMOD |= 0x01; //设置定时器模式
  34. TL0 = 0x00; //设置定时初值
  35. TH0 = 0xDC; //设置定时初值
  36. TF0 = 0; //清除TF0标志
  37. ET0=1;
  38. TR0 = 1; //定时器0开始计时
  39. EA=1;
  40. }
  41. void TimeISR()interrupt 1
  42. {
  43. TL0 = 0x00; //设置定时初值
  44. TH0 = 0xDC; //设置定时初值
  45. }
  46. void UartInit(void) //9600bps@11.0592MHz
  47. {
  48. PCON &= 0x7F; //波特率不倍速
  49. SCON = 0x50; //8位数据,可变波特率
  50. TMOD &= 0x0F; //清除定时器1模式位
  51. TMOD |= 0x20; //设定定时器1为8位自动重装方式
  52. TL1 = 0xFD; //设定定时初值
  53. TH1 = 0xFD; //设定定时器重装值
  54. ET1 = 0; //禁止定时器1中断
  55. TR1 = 1; //启动定时器1
  56. EA=1;
  57. ES=0;
  58. }
  59. void sendData(char *p,unsigned char n)
  60. {
  61. if( p == 0) return ;
  62. ES = 0;
  63. if(n > 0)
  64. {
  65. while(n --)
  66. {
  67. SBUF = *p++ ;
  68. while(!TI) ;
  69. TI = 0 ;
  70. }
  71. }
  72. // ES = 1;
  73. }
  74. // 往串口发送字符串
  75. void sendString(char *p)
  76. {
  77. if(p == 0) return ;
  78. sendData(p,strlen(p));
  79. }
  80. // 接收中断函数
  81. void usart() interrupt 4
  82. {
  83. if(RI == 1)
  84. {
  85. // setUsartRxData(SBUF);
  86. }
  87. RI = 0;
  88. TI = 0;
  89. }
  90. //char xdata showbuff[16]={0};
  91. char data send_buff[17]={0};
  92. uchar fz[8]={0xfe,0xfc,0xfd,0xf9,0xfb,0xf3,0xf7,0xf6};//正转编码
  93. uchar zz[8]={0xf6,0xf7,0xf3,0xfb,0xf9,0xfd,0xfc,0xfe};//反转编码
  94. void zhengzhuan(void)//电机正转
  95. {
  96. char i;
  97. int j;
  98. for(j=8*64;j>0;j--)
  99. {
  100. for(i=0;i<8;i++)
  101. {
  102. P1=zz[i];
  103. delay_xms(5);
  104. }
  105. }
  106. P1=0x00;
  107. }
  108. void fanzhuan(void)//电机反转函数
  109. {
  110. int b;char a;
  111. for(b=8*64;b>0;b--)
  112. {
  113. for(a=0;a<8;a++)
  114. {
  115. P1=fz[a];
  116. delay_xms(5);
  117. }
  118. }
  119. P1=0x00;
  120. }
  121. bit input_flag=0;
  122. bit output_flag=0;
  123. bit lock_flag=0;
  124. void main()
  125. {
  126. UartInit();
  127. Timer0Init();
  128. while(1)
  129. {
  130. if(SW1==0||SW2==0)
  131. {
  132. delay_xms(5);
  133. if(lock_flag==0)
  134. {
  135. if(SW1==0)
  136. {
  137. input_flag=1;
  138. lock_flag=1;
  139. }else if(SW2==0)
  140. {
  141. lock_flag=1;
  142. output_flag=0;
  143. }
  144. }
  145. }else
  146. {
  147. lock_flag=0;
  148. }
  149. if(input_flag)
  150. {
  151. input_flag=0;
  152. YINPIN1=0;
  153. YINPIN2=1; //播放欢迎光临
  154. zhengzhuan();
  155. }
  156. else if(output_flag)
  157. {
  158. output_flag=0;
  159. YINPIN1=1;
  160. YINPIN2=0; //播放欢迎再次光临
  161. fanzhuan();
  162. }
  163. }
  164. }