标题:
自制的的灯网络系统单片机程序
[打印本页]
作者:
123wer烦
时间:
2019-5-23 16:16
标题:
自制的的灯网络系统单片机程序
这是自己初步做的一个灯网络系统
具体内容在附件中
希望可以为广大好友提供参考。
单片机源程序如下:
/*******************************************************************************
* 实验名 : 万年历实验
* 使用的IO :
* 实验效果 :1602显示时钟,按K3进入时钟设置,按K1选择设置的时分秒日月,按K2选择
*选择设置加1。
* 注意
按下s5按键进入操作模式
s3按下为选择改变数值
s2按下加数值 :
*******************************************************************************/
#include<reg51.h>
#include"lcd.h"
#include"ds1302.h"
sbit K1=P3^1;
sbit K2=P3^0;
sbit K3=P3^2;
sbit K4=P3^3;
sbit led8=P1^7;
sbit led2=P1^1;
sbit sda=P2^0;
sbit scl=P2^1;
sbit beep=P2^3;
uchar led_num=100; //用来判断亮度
uchar out_light;
uchar IRtime; //储存检测红外高低电平持续时间
uchar IRcord[4]; //储存解码后的4个字节数据
uchar IRdata[33]; //包含起始码在内的33位数据
bit IRpro_ok; //解码后4个字节数据接收完成标志位
bit IRok; //33位数据接收完成标志
void Int1Configuration();
void delay();
void Display_led();
void delay1(uint i);
void LcdDisplay();
unsigned char SetState,SetPlace;
void Delay10ms(void); //误差 0us
void display_led();
/*********************************DA AD部分***********************************/
void start()
{
scl=1;
_nop_();
sda=1;
delay();
sda=0;
delay();
scl=0;
_nop_();
}
void stop()
{
scl=1;
_nop_();
sda=0;
delay();
sda=1;
delay();
}
void respons()
{
scl=1;
_nop_();
sda=0;
delay();
scl=0;
_nop_();
}
void norespons()
{
scl=1;
_nop_();
sda=1;
delay();
}
void init()
{
scl=1;
_nop_();
sda=1;
_nop_();
}
void write_byte(uchar dat)
{
uchar i,temp;
temp=dat;
for(i=0;i<8;i++)
{
scl=0;
_nop_();
if((temp&0x80)==0x80)
sda=1; //写1
else
sda=0; //写0
scl=1;
_nop_();
temp<<=1;
}
scl=0;
_nop_();
}
uchar read_byte()
{
uchar dat,i;
sda=1;
_nop_();
scl=0;
_nop_();
for(i=0;i<8;i++)
{
scl=1;
_nop_();
if(sda)
dat|=0x01;
if(i<7)
dat<<=1;
scl=0;
_nop_();
}
return dat;
}
void DAC_write(uchar dat)
{
start();
write_byte(0x90);
respons();
write_byte(0x40);
respons();
write_byte(dat);
respons();
stop();
}
uchar ADC_read(uchar com)
{
uchar dat;
dat=com;
start();
write_byte(0x90);
respons();
write_byte(com);
respons();
start();
write_byte(0x91);
respons();
dat=read_byte();
norespons(); //100
stop();
return dat;
}
void CHG_light_out()
{
init();
out_light=ADC_read(0x42);
if(out_light>=0&&out_light<=50)//强光亮
{
led_num=100;
}
if(out_light>50&&out_light<=100)//强平常光亮
{
led_num=120;
}
if(out_light>100&&out_light<=200)//平常光亮
{
led_num=130;
}
if(out_light>200) //弱平常光亮
{
led_num=150;
}
}
void beep_play()
{
beep=0;
delay1(50);
beep=1;
}
void Display_led()
{
uchar i;
init();
if(TIME[2]==0x12)
{
DAC_write(led_num);
if(IRcord[2]==0x0c)
{
led_num=led_num+10;
beep_play();
if(led_num==160)
{
led_num==100;
}
IRcord[2]=0;
}
}
else
{
DAC_write(0);
}
}
/************************************红外通讯部分*******************************/
void init_IR()
{
TMOD=0x02; //定时器0工作模式二,8位自动重装
TL0=TH0=0; //定时器0溢出一次时间为256个机器周期
EA=1; //开启总中断
ET0=1; //开启定时器0中断
TR0=1; //启动定时器0
IT0=1; //外部中断1跳边沿触发
EX0=1; //开启外部中断1
}
//把提取的33次脉宽进行解码 NEC协议
void IRcordpro()
{
uchar i;//i是用于计数处理4个字节
uchar j;//j用于计数处理1个字节的8位数据
uchar k;//k用于计数处理33次脉宽
k = 1;//从第一位脉宽开始处理,丢掉起始码
for(i = 0; i < 4; i++)
{
for(j = 0; j < 8; j++)
{
//如果脉宽大于数据0标准的1125us那么就判定为数据1
if(IRdata[k] > 5) IRcord[i] |= 0x80;//写1
//只能右移7次,如果右移8次则会把第一位数据移出去
if(j < 7) IRcord[i] >>= 1;
k++; //处理下一次脉宽
}
}
IRpro_ok = 1;//解码完成
}
void menu()
{
if(IRcord[2]==0x47)
{
IRcord[2]=0;
beep_play();
SetState=~SetState;
SetPlace=0;
Ds1302Init();
}
}
/*******************************************************************************/
/*******************************************************************************
* 函数名 : main
* 函数功能 : 主函数
* 输入 : 无
* 输出 : 无
*******************************************************************************/
void main()
{
unsigned char i;
Int1Configuration();
LcdInit();
init_IR();
Ds1302Init();
CHG_light_out();
while(1)
{
LcdWriteCom(0x80);
LcdWriteCom(0x0f);
if(IRok)//判断33次脉宽是否提取完成
{
IRcordpro();//根据脉宽解码出4个字节的数据
IRok = 0;//清零脉宽检查完成标志位等待下一次脉宽检查
if(IRpro_ok)//判断解码是否完成
{
if(IRcord[2]==0x40)
{
//led8=0;
}
}
}
Display_led();
menu();
if(SetState==0)
{
Ds1302ReadTime();
}
else
{
if(IRcord[2]==0x44)
{
SetPlace++;
beep_play();
if(SetPlace>=7)
SetPlace=0;
IRcord[2]=0;
}
if(IRcord[2]==0x40)
{
TIME[SetPlace]++;
if((TIME[SetPlace]&0x0f)>9) //换成BCD码。
{
TIME[SetPlace]=TIME[SetPlace]+6;
}
if((TIME[SetPlace]>=0x60)&&(SetPlace<2)) //分秒只能到59
{
TIME[SetPlace]=0;
}
if((TIME[SetPlace]>=0x24)&&(SetPlace==2)) //小时只能到23
{
TIME[SetPlace]=0;
}
if((TIME[SetPlace]>=0x32)&&(SetPlace==3)) //日只能到31
{
TIME[SetPlace]=0;
}
if((TIME[SetPlace]>=0x13)&&(SetPlace==4)) //月只能到12
{
TIME[SetPlace]=0;
}
if((TIME[SetPlace]>=0x8)&&(SetPlace==5)) //周只能到7
{
TIME[SetPlace]=1;
}
// if(SetPlace==5) //月只能到12
// {
// TIME[SetPlace]=;
// }
beep_play();
IRcord[2]=0;
}
}
LcdDisplay();
}
}
/*******************************************************************************
* 函数名 : LcdDisplay()
* 函数功能 : 显示函数
* 输入 : 无
* 输出 : 无
*******************************************************************************/
void LcdDisplay()
{
LcdWriteCom(0x80+0X40);
LcdWriteData('0'+TIME[2]/16); //时
LcdWriteData('0'+(TIME[2]&0x0f));
LcdWriteData('-');
LcdWriteData('0'+TIME[1]/16); //分
LcdWriteData('0'+(TIME[1]&0x0f));
LcdWriteData('-');
LcdWriteData('0'+TIME[0]/16); //秒
LcdWriteData('0'+(TIME[0]&0x0f));
LcdWriteCom(0x80);
LcdWriteData('2');
LcdWriteData('0');
LcdWriteData('0'+TIME[6]/16); //年
LcdWriteData('0'+(TIME[6]&0x0f));
LcdWriteData('-');
LcdWriteData('0'+TIME[4]/16); //月
LcdWriteData('0'+(TIME[4]&0x0f));
LcdWriteData('-');
LcdWriteData('0'+TIME[3]/16); //日
LcdWriteData('0'+(TIME[3]&0x0f));
LcdWriteCom(0x8D);
LcdWriteData('0'+(TIME[5]&0x07)); //星期
}
/*******************************************************************************
* 函数名 : Int0Configuration()
* 函数功能 : 配置外部中断0
* 输入 : 无
* 输出 : 无
*******************************************************************************/
void Int1Configuration()
{
//设置INT1
IT1=1;//跳变沿出发方式(下降沿)
EX1=1;//打开INT1的中断允许。
EA=1;//打开总中断
}
/*******************************************************************************
* 函数名 : Int0()
* 函数功能 : 外部中断0 中断函数
* 输入 : 无
* 输出 : 无
*******************************************************************************/
void Int1() interrupt 2
{
// Delay10ms();
//if(K3==0)
beep_play();
SetState=~SetState;
SetPlace=0;
Ds1302Init();
}
//定时器0中断,每中断一次需要256*1.085us = 277.76us
void time0() interrupt 1
{
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
灯网络系统.zip
(54.55 KB, 下载次数: 5)
2019-5-23 16:14 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
admin
时间:
2019-5-24 05:46
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1