2020年11月30日21:39:09 实验代码记录
#include <ioCC2530.h>
typedef unsigned char uchar;
typedef unsigned int uint;
#define ulong unsigned long
#define LED1 P1_0 //定义P1.0口为LED1控制端
#define DATA_PIN P0_4 //定义P0.4口为有害气体传感器的输入端
#define buzzer P0_5 //定义P0.5口为蜂鸣器的控制口
#define DATA_RED P0_6 //定义P0.6口为红外的输入端
#define RELAY P0_7 //定义P0.7口为继电器的控制口
void Delay(uint msec) //延时
{
uint i,j;
for(i=0;i<msec;i++)
for(j=0;j<10000;j++){}
}
//LED1设置函数
void Led_Init()
{
P1SEL&=~(1<<0);
P1DIR|=(1<<0);
}
//有害气体传感器设定函数
void InitGpio(void)
{
P0SEL &= ~(1<<6); //P0.6定义为数字io
P0DIR &= ~(1<<6); //P0.6定义为输入口
}
void Relay()
{
P0SEL &= ~(1<<7); //P0.7数字io
P0DIR |= (1<<7); //P0.7定义为输出口
}
void IO_Init(void)
{
P0SEL &= ~(1<<5);
P0DIR |= (1<<5);
buzzer = 0;
}
void Red()
{
P0DIR &= ~(1<<6); //P0.6定义为输入口
}
//继电器的控制函数 1开0灭
void relay(int x)
{
RELAY = x;
}
//&***************************************
uchar time, count,t3count;//用于定时器计数
//--------------------------------------
//单片机晶振采用32MHz Tcy = 256 * (1/16000000)=16us;
// 频率周期数据表
__code const uchar FREQL[] = {1, //0的时候没有音符
239, 213, 189, 179, 159, 142, 127, //低音1234567 3.817ms 3.401ms 3.030ms 2.858ms 2.552ms 2.273ms 2.024ms
119, 106, 95, 90, 80, 71, 63, 60,//1,2,3,4,5,6,7,i 1.908ms 1.700ms 1.514ms 1.432ms 1.276ms 1.136ms 1.012ms 0.955ms
53, 48, 45, 40, 36, 32, //高音 234567 0.852ms 0.759ms 0.717ms 0.638ms 0.568ms 0.506ms
30, 27, 24, 22, 20, 18, 16}; //超高音 1234567 0.478ms 0.426ms 0.379ms 0.358ms 0.319ms 0.284ms 0.253ms
//一个音符有三个数字。前为第几个音、中为第几个八度、后为时长(以1/4拍为单位)。
//6, 2, 6 分别代表:6, 中音, 6个1/4拍;
//5, 2, 2 分别代表:5, 中音, 2个1/4拍;
//3, 2, 4 分别代表:3, 中音, 4个1/4拍;
//5, 2, 4 分别代表:5, 中音, 4个1/4拍;
//1, 3, 4 分别代表:1, 高音, 4个1/4拍;
//低音为1,中音为2,高音为3,超高音为4;
//
/********************世上只有妈妈好*********************/
__code const uchar sszymmh[] = {
6,2,6, 5,2,2, 3,2,4, 5,2,4,
1,3,4, 6,2,2, 5,2,2, 6,2,8,
3,2,4, 5,2,2, 6,2,2, 5,2,4,
3,2,4, 1,2,2, 6,1,2, 5,2,2,
3,2,2, 2,2,8, 2,2,6, 3,2,2,
5,2,4, 5,2,2, 6,2,2, 3,2,4,
2,2,4, 1,2,8, 5,2,6, 3,2,2,
2,2,2, 1,2,2, 6,1,2, 1,2,2,
5,1,16, 0,0,0};
/**********************两只耗子**********************/
__code const uchar TwoMouse[]={
3,2,2, 6,2,2, 7,2,2, 5,2,2,
3,2,2, 6,2,2, 7,2,2, 5,2,2,
7,2,2, 1,3,2, 2,3,4,
7,2,2, 1,3,2, 2,3,4,
2,3,1, 3,3,1, 2,3,1, 1,3,1, 7,2,2, 5,2,2,
2,3,1, 3,3,1, 2,3,1, 1,3,1, 7,2,2, 5,2,2,
6,2,2, 2,2,2, 5,2,4, 6,2,2, 2,2,2, 5,2,4,
0,0,0};
/***********************两只蝴蝶**********************/
__code const uchar TwoButterfly[]={
3,2,2, 2,2,2, 3,2,6, 3,2,2, 3,2,2, 2,2,2,
1,2,6, 6,1,2, 1,2,2, 2,2,4, 2,2,2, 3,2,2,
2,2,2, 1,2,2, 6,1,2, 1,2,2, 5,1,12,3,2,2,
2,2,2, 3,2,8, 3,2,2, 2,2,2, 3,2,2, 3,2,2,
1,2,12,6,1,2, 1,2,2, 2,2,4, 2,2,2, 3,2,2,
2,2,2, 1,2,2, 6,1,2, 1,2,2, 2,2,12,3,2,2,
2,2,2, 3,2,8, 3,2,2, 2,2,2, 3,2,2, 2,2,2,
1,2,12,6,1,2, 1,2,2, 2,2,4, 2,2,2, 3,2,2,
2,2,2, 1,2,2, 6,1,2, 1,2,2, 5,2,12,3,2,2,
5,2,2, 5,2,8, 5,2,2, 5,2,2, 6,2,2, 5,2,2,
3,2,12,2,2,2, 3,2,2, 2,2,4, 2,2,2, 3,2,2,
2,2,2, 1,2,2, 6,1,2, 6,1,1, 1,2,1, 1,2,1,
1,2,1, 1,2,12,0,0,4, 5,2,2, 5,2,2, 6,2,2,
1,3,2, 7,2,2, 7,2,2, 6,2,2, 3,2,2, 2,2,2,
2,2,2, 3,2,2, 3,2,8, 3,2,2, 3,2,2,
5,2,2, 6,2,4, 6,2,6, 6,1,2, 3,2,2, 2,2,2,
2,2,12,3,2,2, 5,2,2, 5,2,2, 3,2,2, 5,2,4,
1,3,4, 7,2,2, 6,2,2, 7,2,2, 3,2,4,
6,2,2, 6,2,2, 7,2,2, 6,2,2, 5,2,2,
3,2,2, 2,2,4, 3,2,2, 2,2,2, 3,2,2, 5,2,6,
5,2,2, 5,2,2, 6,2,2, 6,2,2, 5,2,2,
3,2,2, 2,2,4, 5,1,2, 5,1,2, 6,1,2, 1,2,12,
0,0,0};
/*****************happy birthday***********************/
__code const uchar Birthday[]={
5,1,2, 5,1,2, 6,1,4, 5,1,4, 1,2,4, 7,1,8,
5,1,2, 5,1,2, 6,1,4, 5,1,4, 2,2,4, 1,2,8,
5,1,2, 5,1,2, 5,2,4, 3,2,4, 1,2,4, 7,1,4,
6,1,4, 4,2,2, 4,2,2, 3,2,4, 1,2,4, 2,2,4,
1,2,4, 0,0,0};
//-----------------------------------------------------
void InitT3()
{
T3CTL |= 0x08 ; //开溢出中断
T3IE = 1; //开总中断和T3中断
T3CTL&=~0xE0; //1分频,Tcy = 256 * (1/16000000)=16us; 其中256是timer3 装满一次是256步
T3CTL &= ~0X03; //自动重装 00->0xff
EA = 1;
}
//--------------------------------------
void delay(uchar t) //延时程序,控制发音的时间长度(1/4拍)
{
uchar t1;
ulong t2;
for(t1 = 0; t1 < t; t1++) //双重循环, 共延时t个半拍
for(t2 = 0; t2 < 8000; t2++); //延时期间
T3CTL &=~0x10; //关闭timer3, 停止发音
}
//--------------------------------------
void singachar() //演奏一个音符
{
T3CTL &=~0x10; //关闭timer3
count = t3count; //控制音调
T3CTL |=0X10; //启动, 由timer3输出方波去发音
delay(time); //控制时间长度即 节拍
}
//--------------------------------------
/**************演奏一首歌***********************************/
void song(uchar const __code *str)
{
uchar k,i;
i = 0;
time = 1;
while(time)
{
k = str[i] + 7 * (str[i + 1]);//第i个是音符, 第i+1个是第几个八度
//从数据表中读出频率数值
t3count = FREQL[k]; //实际上, 是定时的时间长度
time = str[i + 2]; //读出时间长度数值 节拍时间
i += 3;
singachar();
}
}
/****************************************************************************
* 名 称: InitUart()
* 功 能: 串口初始化函数
* 入口参数: 无
* 出口参数: 无
****************************************************************************/
void InitUart(void)
{
PERCFG = 0x00; //外设控制寄存器 USART 0的IO位置:0为P0口位置1
P0SEL |= 0x0c; //P0_2,P0_3用作串口(外设功能)
P2DIR &= ~0XC0; //P0优先作为UART0
U0CSR |= 0x80; //设置为UART方式
U0GCR |= 11;
U0BAUD |= 216; //波特率设为115200
UTX0IF = 0; //UART0 TX中断标志初始置位0
}
//****************************************
/****************************************************************************
* 名 称: UartSendString()
* 功 能: 串口发送函数
* 入口参数: Data:发送缓冲区 len:发送长度
* 出口参数: 无
****************************************************************************/
void UartSendString(char *Data, int len)
{
uint i;
for(i=0; i<len; i++)
{
U0DBUF = *Data++;
while(UTX0IF == 0);
UTX0IF = 0;
}
}
//*******************************************************
void main()
{
uint l0=./lp.= jikm0-,jikm,0i9,i9,-ki9s,i9ol-0i=0;
IO_Init(); //初始化IO
InitT3();
Led_Init(); //初始化LED1
InitGpio(); //初始化MQ2相应的IO口
Relay();//初始化继电器
Red();//初始化红外传感器
relay(0);
LED1 = 0;
CLKCONCMD &= ~0x40; //设置系统时钟源为32MHZ晶振
while(CLKCONSTA & 0x40); //等待晶振稳定为32M
CLKCONCMD &= ~0x47; //设置系统主时钟频率为32MHZ
while(1)
{
//以下代码须删除
//检测有害气体
if(DATA_PIN == 0) //当浓度高于设定值时 ,执行条件函数
{
Delay(10); //延时抗干扰
if(DATA_PIN == 0) //确定 浓度高于设定值时 ,执行条件函数
{
for (i=0; i<10; i++)
{
//LED1 = ~LED1; //闪烁LED1,提示用户
relay(1);
Delay(100);
}
}
}else{
relay(0);
}
//检测红外
if(DATA_RED == 1)
{
Delay(10); //延时抗干扰
if(DATA_RED == 1){
LED1 = 0; //有人时LED1亮
//relay(1);
song(sszymmh);
delay(20);
UartSendString("ON ", 3); //串口发送数据,提示用户
}
}
else if(DATA_RED == 0)
{
LED1 = 1; //无人时LED1熄灭
//relay(0);
UartSendString("OFF ", 4); //串口发送数据,提示用户
}
Delay(100);
}
}
#pragma vector = T3_VECTOR
__interrupt void T3_ISR(void) //timer3中断处理
{
IRCON = 0x00; //清中断标志, 也可由硬件自动完成
if(--count == 0)
{
T3CTL &=~0X10; //关闭timer3
buzzer = ~buzzer; //输出方波, 发音
T3CTL |=0X10; //启动
count = t3count; //下次的中断时间, 这个时间, 控制音调高低
}
}