标题:
红外遥控单片机时钟带倒计时
[打印本页]
作者:
jacky118zhang
时间:
2018-8-21 08:35
标题:
红外遥控单片机时钟带倒计时
红外遥控单片机时钟带倒计时,功能强大,可以参考。
单片机源程序如下:
//****************************************************************//
//MCU :STC11F60XE
//去中间值6M 内部晶振5.5-6.8M
//****************************************************************//
#include<STC11F60XE.H>
#include<intrins.h>
#include<math.h>
#include<DS1302.h>
//#include<RS485.h>
//#include<eepram_operate.h>
#define uchar unsigned char
#define uint unsigned int
//#define Segtime 1 //定义读传感器时间间隔 单位为秒
/*********************************/
sbit hwx=P3^2; //红外接收数据引脚
sbit led1=P1^4;
sbit led2=P1^0;
sbit SD=P1^5;
sbit CK=P1^6;
sbit SK=P1^7;
bit time_flag,ly_flag,meter_flag,flash_flag;
uchar count;
uchar last_sec;
int second;
uchar ly_lhj[4]; //保存NEC的四个字节数据
uchar dis_data[4];
uchar data disp_code[12]={0xc0,0xfa,0xa4,0xb0,0x9a,0x91,0x81,0xf8,0x80,0x90,0xff,0xbf}; //0,1,2,3,4,5,6,7,8,9,OFF,负号
/*********************************************/
void delay_1ms(uint ms)
{
uchar i;
while(ms--)
for(i=0;i<20;i++);
}
/*********************************************/
void delay(void)
{
uchar i=10;
while(i--);
}
/***************************************************************************/
void WR_595(uchar num1) ////试用于TPIC6B595N直接拉数码管
{
uchar date;
uchar b;
date=num1;
for(b=0;b<=7;b++)
{
if((date&0x80)==0x80) //最高位为1,则向sdata_595发送1
SD=0; //发出数据的最高位
else
SD=1;
date<<=1; //左移位
SK=0;
_nop_();
_nop_();
SK=1; //产生上升沿
}
}
/***************************************************************************/
void display(void)
{
CK=0;
WR_595(disp_code[dis_data[3]]);
WR_595(disp_code[dis_data[2]]);
WR_595(disp_code[dis_data[1]]);
WR_595(disp_code[dis_data[0]]);
/*
WR_595(disp_code[3]);
WR_595(disp_code[2]);
WR_595(disp_code[1]);
WR_595(disp_code[0]);
*/
CK=1;
}
//--------------------------------------------------------------------------------------------------
// 函数名称: 校验时间函数
// 函数功能:
//--------------------------------------------------------------------------------------------------
void adjust_time(void)
{
uchar ex,wei=3;
led1=0;
led2=0;
////////////////////////////////////
while(time_flag==1)
{
///////////////////////////
ex=dis_data[wei]; //设定位闪烁显示
dis_data[wei]=10;
display();
delay_1ms(1500);
dis_data[wei]=ex;
display();
delay_1ms(2200);
///////////////////////////
if(ly_flag)
{
ly_flag=0; //清空标志
///////////左移键////////////
if(ly_lhj[2]==0x08 && ly_lhj[3]==0xf7)
{ if(wei>0)
wei--;
else
wei=3;
}
///////////右移键////////////
if(ly_lhj[2]==0x0a && ly_lhj[3]==0xf5)
{ if(wei<3)
wei++;
else
wei=0;
}
///////////0键////////////
if(ly_lhj[2]==0x0e && ly_lhj[3]==0xf1)
dis_data[wei]=0;
///////////1键////////////
if(ly_lhj[2]==0x10 && ly_lhj[3]==0xef)
dis_data[wei]=1;
///////////2键////////////
if(ly_lhj[2]==0x11 && ly_lhj[3]==0xee)
dis_data[wei]=2;
///////////3键////////////
if(ly_lhj[2]==0x12 && ly_lhj[3]==0xed)
dis_data[wei]=3;
///////////4键////////////
if(ly_lhj[2]==0x14 && ly_lhj[3]==0xeb)
dis_data[wei]=4;
///////////5键////////////
if(ly_lhj[2]==0x15 && ly_lhj[3]==0xea)
dis_data[wei]=5;
///////////6键////////////
if(ly_lhj[2]==0x16 && ly_lhj[3]==0xe9)
dis_data[wei]=6;
///////////7键////////////
if(ly_lhj[2]==0x18 && ly_lhj[3]==0xe7)
dis_data[wei]=7;
///////////8键////////////
if(ly_lhj[2]==0x19 && ly_lhj[3]==0xe6)
dis_data[wei]=8;
///////////9键////////////
if(ly_lhj[2]==0x1a && ly_lhj[3]==0xe5)
dis_data[wei]=9;
///////////时间设置返回 menu键////////////
if(ly_lhj[2]==0x02 && ly_lhj[3]==0xfd)
{
hour=dis_data[0]*16 + dis_data[1];
min=dis_data[2]*16 + dis_data[3];
ds1302_initial();
time_flag=0;
//while(1); //基准时间设定后需要重新上电
}
}
}
}
//--------------------------------------------------------------------------------------------------
// 函数名称: 校验时间函数
// 函数功能:
//--------------------------------------------------------------------------------------------------
void meter_Init(void)
{
//////////定时器部分///////
TR0=0; //disable timer0
TH0=0x3c;
TL0=0xb0; //reload timer0
count=0;
////////显示部分/////////
led1=0; led2=0; //点亮led
second=0;
dis_data[0]=0;
dis_data[1]=0;
dis_data[2]=0;
dis_data[3]=0;
}
//--------------------------------------------------------------------------------------------------
// 函数名称: 校验时间函数
// 函数功能: 10倒计时到0 开始计时
//--------------------------------------------------------------------------------------------------
void time_meter(void)
{
meter_Init();
while(meter_flag==1)
{
if(count==5 || count==10 || count==15 || count==19 ) //没200ms
{ DIS_change();
if(last_sec!=read_sec)
{
last_sec=read_sec;
if(second==5999)
second=second;
else
second++;
dis_data[0]=second/60/10;
dis_data[1]=second/60%10;
dis_data[2]=second%60/10;
dis_data[3]=second%60%10;
}
}
delay_1ms(20);
display();
/**************遥控器操作不封*****************/
if(ly_flag)
{
ly_flag=0; //清空标志
///////////暂停开始 暂停键////////////
if(ly_lhj[2]==0x00 && ly_lhj[3]==0xff)
{TR0=~TR0;
if(TR0==1)
{DIS_change();last_sec=read_sec;}
}
///////////重新开始 ok键////////////
if(ly_lhj[2]==0x09 && ly_lhj[3]==0xf6)
{ meter_Init();}
///////////返回时钟模式 返回键////////////
if(ly_lhj[2]==0x06 && ly_lhj[3]==0xf9)
{ meter_flag=0;TR0=1;}
}
/****************************************/
}
}
//--------------------------------------------------------------------------------------------------
// 函数名称: setup(void)
// 函数功能: 设置
//--------------------------------------------------------------------------------------------------
void setup(void)
{
if(ly_flag)
{ ly_flag=0; //清R空标志
///////////时间设置进入 menu键////////////
if(ly_lhj[2]==0x02 && ly_lhj[3]==0xfd)
{ time_flag=1; TR0=0;ly_flag=0; adjust_time();TR0=1;}
///////////目标清零 +////////////
//if(ly_lhj[2]==0x04 && ly_lhj[3]==0xfb)
//{target=0; data_transfer();eeprom();}
///////////实际清零 _////////////
//if(ly_lhj[2]==0x0c && ly_lhj[3]==0xf3)
//{real=0; data_transfer();eeprom();}
///////////segtime设置 ok键////////////
if(ly_lhj[2]==0x09 && ly_lhj[3]==0xf6)
{ meter_flag=1;ly_flag=0; time_meter();}
///////////选择segtime////////////
//if(ly_lhj[2]==0x00 && ly_lhj[3]==0xff);
}
}
//--------------------------------------------------------------------------------------------------
// 函数名称:初始化函数
// 函数功能:设定定时器工作方式,设定波特率
//--------------------------------------------------------------------------------------------------
/********************************/
void Init(void)
{
TMOD = 0x11; //set timer0 & timer1 as mode 1 (16-bit)
ET0 = 1; //enable timer0 interrupt
TH0=0x3c;
TL0=0xb0;
TR0=1;
//设置成下降沿触发方式
EX0=1; //开启外部中断0, 红外接收头
IT0=1; //设置成下降沿触发方式
EA = 1;
}
/********************************/
//--------------------------------------------------------------------------------------------------
// 函数名称:主函数
// 函数功能:
//--------------------------------------------------------------------------------------------------
void main()
{
delay_1ms(1000);
//display(); //先点亮数码管
Init();
led1=0;
led2=0;
while(1)
{
delay_1ms(200);
if(flash_flag==1) {led1=~led1;led2=~led2;flash_flag=0;}
if((count%5)==0)
{ DIS_change();
dis_data[0]=read_hour/16;
dis_data[1]=read_hour%16;
dis_data[2]=read_min/16;
dis_data[3]=read_min%16;
}
display();
setup();
}
}
//--------------------------------------------------------------------------------------------------
// 函数名称: 外中断0入口函数,P32引脚,红外线接收IC数据脚 使用timer1 计时
// 函数功能:
//--------------------------------------------------------------------------------------------------
void hongwai(void) interrupt 0
{
unsigned char i,ia;
/**************开始判断是否为NEC波形引导码的前9MS和后4.5MS******************************/
TL1=0;
TH1=0; //定时/计数器1初始值
TR1=1; //定时器以12M晶振12分频计数,(12M 1us)
while(!hwx);
TR1=0; //信号翻转停止计数
if(TH1<30||TH1>40) //NEC引导码前9MS,计数约9000,TH1约等于35,给个误差值,用30-40之
return;
TH1=0; //定时/计数器1初始值
TR1=1;
while(hwx){
delay();
if(TH1>22) //NEC引导码引导码的后4。5MS,计数约4500,TH1约等于17
return;
}
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
FW 时钟单面.rar
(58.35 KB, 下载次数: 7)
2018-8-21 08:35 上传
点击文件名下载附件
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1