標(biāo)題:
求助,兩個(gè)單片機(jī)定時(shí)器之間的沖突問(wèn)題
[打印本頁(yè)]
作者:
zha
時(shí)間:
2017-5-2 20:56
標(biāo)題:
求助,兩個(gè)單片機(jī)定時(shí)器之間的沖突問(wèn)題
用一個(gè)光電傳感器計(jì)數(shù),還有藍(lán)牙控制RGB燈的顏色,兩個(gè)代碼合在一起,
分開(kāi)代碼都能用,合起來(lái)之后發(fā)現(xiàn)藍(lán)牙這部分呢收不到數(shù)據(jù),自己覺(jué)得是兩個(gè)定時(shí)器之間存在沖突,
求教哪里出了問(wèn)題。。。
代碼如下 大神幫指點(diǎn)下
[code]
作者:
zha
時(shí)間:
2017-5-2 21:05
#include <reg52.h>
#include <string.h>
#include <intrins.h>
#define LCD1602_DB P0
unsigned char tmp;
unsigned int c=0;
unsigned char flag1s = 0;
unsigned char flag2s = 0;
unsigned char counter = 0;//jishu
unsigned char str[] = "COUNT: ";
sbit LCD1602_RS = P1^0;
sbit LCD1602_RW = P1^1;
sbit LCD1602_E = P1^5;
sbit red = P2^0;
sbit LED = P2^2;
sbit red1 = P2^1;
sbit RR = P3^5;
sbit GG = P3^6;
sbit BB = P3^7;
int PWM_0 = 0;
int PWM_1 = 0;
int PWM_2 = 0;
void InitLcd1602();
void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str);
void itoa (unsigned int n,unsigned char s[5]);
void keepred();
void init(); //串口初始化
void send(unsigned char a); //單字節(jié)發(fā)送函數(shù)
void ctrl(); //接收處理函數(shù)
void color();
void keepPWM();
void delay (unsigned char t) //延時(shí)
{
unsigned char i;
while(t--)
{
for(i=0; i<114; i++);
}
}
void main()
{
unsigned int sec = 0, i=0, j = 0;
unsigned char s[5] ;
unsigned char x[6] = "none";
init();
red = 1;
red1 = 1;
TMOD = 0x01;
TL0 = 0xC9; //設(shè)置定時(shí)初值
TH0 = 0xFF;
TR0 = 1;
TR1 = 1;
EA = 1;
ET0 = 1;
InitLcd1602();
sec = 0;
itoa(sec, s);
LcdShowStr(8, 0, x);
while(1)
{
if(RI==1) // 是否有數(shù)據(jù)到來(lái)
{
LED = 0;
RI = 0;
tmp = SBUF;
ctrl();
delay(5); // 暫存接收到的數(shù)據(jù)
}
else
LED = 1;
keepPWM();
if(flag1s == 1 )
{
flag1s = 0;
sec++;
}
if(flag2s == 1 )
{
flag2s = 0;
if(sec > 0)
sec--;
}
if(sec<=0)
{
sec = 0;
//LED = 0;
LcdShowStr(8, 0, x);
}
else
{
itoa(sec, s);
memset(s, '\0', 5);
delay(50);
}
if(RI == 0)
{
//LED = 1;
PWM_0 = PWM_0;
PWM_1 = PWM_1;
PWM_2 = PWM_2;
delay(5);
}
}
}
void keepred()
{
}
void LcdWaitReady()
{
unsigned char sta;
LCD1602_DB = 0xFF;
LCD1602_RS = 0;
LCD1602_RW = 1;
do {
LCD1602_E = 1;
sta = LCD1602_DB;
LCD1602_E = 0;
}while(sta & 0x80);
}
void LcdWriteCmd(unsigned char cmd)
{
LcdWaitReady();
LCD1602_RS = 0;
LCD1602_RW = 0;
LCD1602_DB = cmd;
LCD1602_E = 1;
LCD1602_E = 0;
}
void LcdWriteDat(unsigned char dat)
{
LcdWaitReady();
LCD1602_RS = 1;
LCD1602_RW = 0;
LCD1602_DB = dat;
LCD1602_E = 1;
LCD1602_E = 0;
}
void LcdSetCursor(unsigned char x, unsigned char y)
{
unsigned char addr;
if(y == 0)
addr = 0x00 + x;
else
addr = 0x40 + x;
LcdWriteCmd(addr | 0x80);
}
void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str)
{
LcdSetCursor(x, y);
while(*str != '\0')
{
LcdWriteDat(*str++);
}
}
void InitLcd1602()
{
LcdWriteCmd(0x38);
LcdWriteCmd(0x0C);
LcdWriteCmd(0x06);
LcdWriteCmd(0x01);
}
void itoa (unsigned int n,unsigned char s[])
{
unsigned char temp;
unsigned int i = 0;
unsigned int len = 0;
while(n != 0)
{
s[i] = (n % 10) + '0' ;//算出字符
n = n / 10;
i++;
}
s[i] = '\0';
len = strlen(s);
for(i = 0; i < len / 2; i++) //前后換順序
{
temp = s[i];
s[i] = s[len - 1 - i];
s[len - 1 - i] = temp;
}
LcdShowStr(1, 0, str);
LcdWriteCmd(0x01);
LcdShowStr(1, 0, str);
LcdShowStr(8, 0, s);
s[0] = '\0';
}
void keepPWM()//保持輸出
{
if(PWM_0 <=0)
PWM_0 =0;
if(PWM_1 <=0)
PWM_1 =0;
if(PWM_2 <=0)
PWM_2 =0;
if(PWM_0 >=255)
PWM_0 =255;
if(PWM_1 >=255)
PWM_1 =255;
if(PWM_2 >=255)
PWM_2 =255;
}
void init() //串口初始化
{
ES=0; //關(guān)中斷
SCON = 0x50; // REN=1允許串行接受狀態(tài),串口工作模式1,
//10位UART(1位起始位,8位數(shù)據(jù)位,1位停止位,無(wú)奇偶校驗(yàn)),波特率可變
TMOD = 0x20; // 定時(shí)器1工作于方式2,8位自動(dòng)重載模式, 用于產(chǎn)生波特率
TH1=TL1=0xFD; // 波特率9600 (本次測(cè)試采用晶振為11.0592)
PCON &= 0x7f; // 波特率不倍增
TR1 = 1; //定時(shí)器1開(kāi)始工作,產(chǎn)生波特率
//發(fā)送標(biāo)志位置0
TI=0; //接收標(biāo)志位置0
RI=0;
//EA=0;
ES=1;
}
/*void send(unsigned char a) //單字節(jié)數(shù)據(jù)發(fā)送
{
//注意:若單片機(jī)TXD(P3.1)無(wú)上拉能力,必須在P3.1端接上拉電阻。本次測(cè)試需要接上拉電阻
TI=0;
SBUF=a;
while(TI==0);
TI=0;
if(c%2) //發(fā)送指示燈標(biāo)志,每接收一次,此燈亮滅交替
led=1;
else
led=0;
c++;
}*/
void ctrl() //接收處理函數(shù)
{
switch(tmp)
{
case '1': //白
PWM_0 = 0;
PWM_1 = 0;
PWM_2 = 0;
//delay(3000);
//send(tmp);
break;
case '2':
PWM_0 = 255-128; //紫
PWM_1 = 255;
PWM_2 = 255-128;
//delay(3000);
// send(tmp);
break;
case '3':
PWM_0 = 255; //藍(lán)色
PWM_1 = 255;
PWM_2 = 0;
//delay(3000);
// send(tmp);
break;
case '4':
PWM_0 = 30; // 淺藍(lán)
PWM_1 = 100;
PWM_2 = 255;
//delay(3000);
// send(tmp);
break;
case '5':
PWM_0 = 255-33; // 灰
PWM_1 = 255-33;
PWM_2 = 255-33;
//delay(3000);
// send(tmp);
break;
case '6':
PWM_0 = 254; // 白
PWM_1 = 254;
PWM_2 = 254;
//delay(3000);
// send(tmp);
break;
case 'a':
PWM_0=PWM_0+5; // jiaqiang
PWM_1=PWM_1+5;
PWM_2=PWM_2+5;
break;
case 'b':
PWM_0=PWM_0-5; // jianruo
PWM_1=PWM_1-5;
PWM_2=PWM_2-5;
keepPWM();
break;
case 'c': //shanshuo
color();
break;
default: //其他,燈全滅
PWM_0 = 0; //hei
PWM_1 = 0;
PWM_2 = 0;
// send(tmp);
break;
}delay(5);
}
void color()
{
while(RI==0)
{
PWM_0 = rand()%255;
delay(2);
PWM_1 = rand()%255;
delay(2);
PWM_2 = rand()%255;
delay(2);
}
}
void InterruptTimer0() interrupt 1
{
TH0 = 0xFC; //重新加載初值
TL0 = 0x67;
if (red == 0&&red1==1)
{
delay(99);
if(red1==0)
flag1s = 1;
}
if (red1 == 0&&red == 1)
{
delay(99);
if(red == 0)
flag2s = 1;
}
counter++;
if(counter >= 255) counter = 0;
if(counter >= PWM_0) RR = 0; else RR = 1;
if(counter >= PWM_1) GG = 0; else GG = 1;
if(counter >= PWM_2) BB = 0; else BB = 1;
}
復(fù)制代碼
作者:
zha
時(shí)間:
2017-5-2 21:06
問(wèn)題就在藍(lán)牙發(fā)送的數(shù)據(jù)接收不到
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1