#include <reg52.h> //包含头文件
#include <intrins.h>
#define uchar unsigned char // 以后unsigned char就可以用uchar代替
#define uint unsigned int // 以后unsigned int 就可以用uint 代替
sbit LED1 = P1^0; // 模式指示灯,绿灯亮是自动模
sbit LED2 = P1^1; // 模式指示灯,蓝灯亮是手动模式
sbit Key1 = P3^2; // 按键1,模式切换按键
sbit Key2 = P3^3; // 按键2,亮度减少按键
sbit Key3 = P3^4; // 按键3,亮度增加按键
sbit Lamp = P2^7; // 台灯控制引脚
sbit Ganying = P2^6; // 红外感应引脚
sbit ADC_CLK = P2^1; // ADC0832的CLK引脚
sbit ADC_DAT = P2^2; // ADC0832的DI/DO引脚
sbit ADC_CS = P2^3; // ADC0832的CS引脚
uchar gCount = 0; // 全局计数变量
uchar gIndex = 0; // 亮度变量,0是最暗,9是最亮
uchar rxshu,ch;
bit rxright1=0,rxright=0,rxflag=0,recive_flag=0;
uchar rxbuff[8];
bit light_flag;
bit ganying_flag;
uchar temp1;
uchar seek_val;
bit seek_flag;
bit day_flag;
uchar ret,temp;
/*******************************************************************
请提前计算一下所选晶振能达到的最高速度,波特率不能超过最高速度
(1) 波特率加倍(SMOD=1): Max_Baud = FOSC/12/16
(2) 波特率不加倍(SMOD=0):Max_Baud = FOSC/12/32
例如:22.1184MHz晶振,波特率加倍时,最大波特率=22118400/12/16=115200
*******************************************************************/
#define FOSC 11059200L //振荡频率
#define BAUD 9600 //波特率
#define SMOD 0 //是否波特率加倍
#if SMOD
#define TC_VAL (256-FOSC/16/12/BAUD)
#else
#define TC_VAL (256-FOSC/32/12/BAUD)
#endif
/*********************************************************/
// 毫秒级的延时函数,time是要延时的毫秒数
/*********************************************************/
void DelayMs(uint time)
{
uint i,j;
for(i=0; i<time; i++)
for(j=0; j<112; j++);
}
/*********************************************************/
// 串口初始化函数,波特率为9600
/*********************************************************/
void init_serialcom( void )
{
TMOD=0x22;
SCON=0x50;
TH1 = TL1 = (256-FOSC/32/12/BAUD);
TH0 =252;
TL0 =24;
ES=1;
ET0=1;
TR0=1;
TR1=1;
EA=1;
}
/*********************************************************/
// ADC0832的时钟脉冲
/*********************************************************/
void WavePlus()
{
_nop_(); //延时1us
ADC_CLK = 1; //时钟引脚拉为高电平
_nop_(); //延时1us
ADC_CLK = 0; //时钟引脚拉为低电平
}
/*********************************************************/
// 获取指定通道的A/D转换结果
/*********************************************************/
unsigned char Get_ADC0832()
{
unsigned char i; //定义变量i,for循环用
unsigned char value1, value2; //定义两个变量用于保存读取的结果
ADC_CLK = 0; //电平初始化,拉低时钟引脚
ADC_DAT = 1; //数据引脚输出高电平,输入第一个数据
_nop_(); //延时大约1us
ADC_CS = 0; //片选拉低,使能
WavePlus(); //产生一个脉冲,第一个数据写入
ADC_DAT = 1; //通道选择的第一位
WavePlus(); //产生一个脉冲,通道选择的第一位被写入
ADC_DAT = 0; //通道选择的第二位
WavePlus(); //产生一个脉冲,通道选择的第二位被写入
ADC_DAT = 1; //拉高数据引脚,为下面的读数据做准备
for(i=0; i<8; i++) //for循环,依次读取八次数据
{
value1 <<= 1; //value1左移一位,最低位变为0;依次循环从高位到低位读出ADC0832转换的8位数字数据。
WavePlus(); //产生一个脉冲,开始读取一位数据
if(ADC_DAT == 0) //判断如果为0
value1 &= ~0x01; //value1按位与上0xfe(~0x01),1按位与上任何数还是原数本身,0与上任何数等于0,所以按位与后的结果是其他位数值不变,最低位变为0
else //判断如果为1
value1 |= 0x01; //value1按位或上0x01,0按位或上任何数还是原数本身,1或上任何数都等于1,所以按位或后的结果是其他位数值不变,最低位变为1
}
for(i=0; i<8; i++) //for循环,依次读取八次数据
{
value2 >>= 1; //value2右移一位,最高位为0;依次循环从低位到高位读出ADC0832转换的8位数字数据。
if(ADC_DAT == 0) //判断如果为0
value2 &= ~0x80; //value2按位与上0xef(~0x80),1按位与上任何数还是原数本身,0与上任何数等于0,所以按位与后的结果是其他位数值不变,最高位变为0
else //判断如果为1
value2 |= 0x80; //value2按位或上0x80,0按位或上任何数还是原数本身,1或上任何数都等于1,所以按位或后的结果是其他位数值不变,最高位变为1
WavePlus(); //产生一个脉冲,开始读取下一位数据
}
_nop_(); //延时大约1us
ADC_CS = 1; //片选拉高,不使能
ADC_DAT = 1; //数据引脚拉高
ADC_CLK = 1; //时钟引脚拉高
if(value1 == value2) //判断两次读取数据是否一样
return value1; //一样返回value1;
else
return 0; //不一样返回0
}
/*********************************************************/
// 手动控制
/*********************************************************/
void ManualControl()
{
// 亮度减少
if(Key2==0) // 如果按键2被按下去
{
if(temp1>0) // 只要当前亮度不为最低才能减少亮度
{
temp1--; // 亮度降低一档
DelayMs(200); // 延时0.3秒
}
}
// 亮度增加
if(Key3==0) // 如果按键3被按下去
{
if(temp1<10) // 只要当前亮度不为最高才能增加亮度
{
temp1++; // 亮度增加一档
DelayMs(200); // 延时0.3秒
}
}
}
/*********************************************************/
// 串口接收到的数据处理函数
// 总体逻辑处理函数
/*********************************************************/
void uart_chuli()
{
if(rxflag)
{
LED2=0;
LED1=1;
rxflag=0;
if(rxbuff[0]==0x01)
{
light_flag=1;
seek_flag=0;
ganying_flag=0;
temp1=5;
}
if(rxbuff[0]==0x02)
{
light_flag=0;
seek_flag=0;
ganying_flag=0;
}
if(rxbuff[0]==0x03)
{
seek_val=rxbuff[1];
seek_flag=1;
}
if(rxbuff[0]==0x04)
{
seek_flag=0;
if(rxbuff[1]==0xfc)
{
if(rxbuff[2]==0x01)