123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189 |
- #include "reg52.h"
- #include "string.h"
- #include "stdio.h"
- #define uint unsigned int
- #define uchar unsigned char
- /*
- 通过hc-sr501人体感应正确感应人体。
- (2)实现指定语音播放功能。
- (3)通过电机实现正反转来实现迎宾机器人。
- 研究方法、步骤及措施:
- */
- /*
- ? 采用5V USB电路供电
- ? 可以实现语音停止和开启风扇
- ? 实现语音调速风扇
- ? 调速等级高低各3级
- */
- sbit SW1=P2^0;
- sbit SW2=P2^1;
- sbit YINPIN1=P2^2;
- sbit YINPIN2=P2^3;
- sbit buzz=P3^3;
- void delay_xms(int xms)
- {
- char ix=0;
- for(;xms>0;xms--)
- for(ix=110;ix>0;ix--);
- }
- uchar SET=0;
- void Timer0Init(void) //10毫秒@11.0592MHz
- {
-
- TMOD &= 0xF0; //设置定时器模式
- TMOD |= 0x01; //设置定时器模式
- TL0 = 0x00; //设置定时初值
- TH0 = 0xDC; //设置定时初值
- TF0 = 0; //清除TF0标志
- ET0=1;
- TR0 = 1; //定时器0开始计时
- EA=1;
-
- }
- void TimeISR()interrupt 1
- {
- TL0 = 0x00; //设置定时初值
- TH0 = 0xDC; //设置定时初值
- }
- void UartInit(void) //9600bps@11.0592MHz
- {
- PCON &= 0x7F; //波特率不倍速
- SCON = 0x50; //8位数据,可变波特率
- TMOD &= 0x0F; //清除定时器1模式位
- TMOD |= 0x20; //设定定时器1为8位自动重装方式
- TL1 = 0xFD; //设定定时初值
- TH1 = 0xFD; //设定定时器重装值
- ET1 = 0; //禁止定时器1中断
- TR1 = 1; //启动定时器1
- EA=1;
- ES=0;
- }
- void sendData(char *p,unsigned char n)
- {
- if( p == 0) return ;
- ES = 0;
- if(n > 0)
- {
- while(n --)
- {
- SBUF = *p++ ;
- while(!TI) ;
- TI = 0 ;
- }
- }
- // ES = 1;
- }
- // 往串口发送字符串
- void sendString(char *p)
- {
- if(p == 0) return ;
- sendData(p,strlen(p));
- }
- // 接收中断函数
- void usart() interrupt 4
- {
- if(RI == 1)
- {
- // setUsartRxData(SBUF);
- }
- RI = 0;
- TI = 0;
- }
- //char xdata showbuff[16]={0};
- char data send_buff[17]={0};
- uchar fz[8]={0xfe,0xfc,0xfd,0xf9,0xfb,0xf3,0xf7,0xf6};//正转编码
- uchar zz[8]={0xf6,0xf7,0xf3,0xfb,0xf9,0xfd,0xfc,0xfe};//反转编码
- void zhengzhuan(void)//电机正转
- {
- char i;
- int j;
- for(j=8*64;j>0;j--)
- {
- for(i=0;i<8;i++)
- {
- P1=zz[i];
- delay_xms(5);
- }
- }
- P1=0x00;
- }
- void fanzhuan(void)//电机反转函数
- {
- int b;char a;
- for(b=8*64;b>0;b--)
- {
- for(a=0;a<8;a++)
- {
- P1=fz[a];
- delay_xms(5);
- }
- }
- P1=0x00;
- }
- bit input_flag=0;
- bit output_flag=0;
- bit lock_flag=0;
- void main()
- {
- UartInit();
- Timer0Init();
- while(1)
- {
- if(SW1==0||SW2==0)
- {
- delay_xms(5);
- if(lock_flag==0)
- {
- if(SW1==0)
- {
- input_flag=1;
- lock_flag=1;
- }else if(SW2==0)
- {
- lock_flag=1;
- output_flag=0;
- }
- }
- }else
- {
- lock_flag=0;
- }
-
- if(input_flag)
- {
- input_flag=0;
- YINPIN1=0;
- YINPIN2=1; //播放欢迎光临
- zhengzhuan();
- }
- else if(output_flag)
- {
- output_flag=0;
- YINPIN1=1;
- YINPIN2=0; //播放欢迎再次光临
- fanzhuan();
- }
- }
- }
|