单片机时钟程序
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
uchar code table2[]="Password error!";
uchar code wish[]="Happy every day!";
uchar code time[]="00:00:00";
uchar code loading[]="Loading...";
/////////////////////////////////////////////////////
sbit en=P3^4;
sbit rs=P3^5;//用于控制1602
sbit rw=P3^6;
sbit dula=P2^6;
sbit wela=P2^7;//用于控制晶体管
sbit IRIN=P3^2;//红外接收器数据线IO口
bit L=1;
uchar t,key=0,hh=0,mm=0,ss=0;
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=112;y>0;y--);//大约是1ms,因为单片机的时钟周期为11.0592mhz。
}
void write_com(uchar com)
{
rs=0;//指令
P0=com;//写指令函数
delay(5);
/////////////////////////////////////////////////
void delay014ms(uchar x) //x*0.14MS STC10F04延时约0.15MS
{Байду номын сангаас
uchar i;
while(x--)
{
for (i = 0; i<15; i++)//13
;
}
//引导码检验结束
while (!IRIN);//等IR变为高电平开始检测
while (IRIN)//计算IR高电平时长
{
delay014ms(1);
N++;
if (N>=30)
{
EX0=1;
return;
}//0.14ms计数过长自动离开?
}//高电平计数完毕
IRCOM[j]=IRCOM[j] >> 1; //数据最高位补"0"
case 0x5e:n=3;write_data(num[3]);break;//3
case 0x08:n=4;write_data(num[4]);break;//4
case 0x1c:n=5;write_data(num[5]);break;//5
case 0x5a:n=6;write_data(num[6]);break;//6
首先要掌握lcd1602编程,红外遥控原理,当然,单片机基本的要懂得
此程序是用stc89c52单片机,所用的IO口程序有说明。
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define tt 46080//设置时间间隔,对应11.0592MHZ的晶振
rw=0;
write_com(0x38);//显示屏模式设置为1602方案
write_com(0x0f);//显示开关/光标设置
write_com(0x06);
write_com(0x01);//清屏
write_com(0x80);//指针置零
}
/////////////////////////////////////////////////
uchar IRCOM[4]=0;
//定义数组IRCOM,分别装解码后得到的数据
//IRCOM[0]低8位地址码
//IRCOM[1]高8位地址码
//IRCOM[2] 8位数据码
//IRCOM[3] 8位数据码的反码
uchar code table[]="Input password";
uchar code table1[]="Welcome to use!";
if(L)
{
switch(IRCOM[2]) //判断第三个数码值
{
case 0x16:n=0;write_data(num[0]);break;//0
case 0x0c:n=1;write_data(num[1]);break;//1
case 0x18:n=2;write_data(num[2]);break;//2
en=1;
delay(5);
en=0;
}
void write_data(uchar dat)
{
rs=1;//数据
P0=dat;//写指令函数
delay(5);
en=1;
delay(5);
en=0;
}
void LCD_init()
{
wela=0;
dula=0;//用于关闭晶体管,因为都是用P0
en=0;//初始时使能为0
}
//////////////初始化////////////
void IR_init(void)
{
EA=1;
EX0=1;//允许总中断中断,使能INT0外部中断
IT0=1;//触发方式为脉冲负边沿触发
IRIN=1;//I/O口初始化
}
////////////解码过程//////////////
void IR_CODE(void) interrupt 0//在外部中断子程序中解码
{
void shuanxin(uchar add,uchar date);
uchar j,k,N=0,h,m,n;
EX0 = 0;//防止干扰
delay014ms(15);//延时2.1ms
if (IRIN==1)//2.1ms能够检测出各种错误信号
{
EX0 =1;
return;
}//确认IR信号出现
while (!IRIN);//等IR变为高电平,跳过9ms的前导低电平信号。
//////高电平后开始检测高电平持续的时间以确定是0还是1/////
for (j=0;j<4;j++)//收集四组数据
{
for (k=0;k<8;k++)//每组数据有8位
{
while (IRIN);//等IR变为低电平,跳过4.5ms的前导高电平信号。
if (N>=8)//6*0.14=0.84ms(6/7均可)
{
IRCOM[j] = IRCOM[j] | 0x80;
}//数据最高位补"1"
N=0;
}
}
if (IRCOM[2]!=~IRCOM[3])//不等的话表示解码失败
{
IRCOM[4]=0;
EX0=1;
return;
}
/////////////////////嵌入加密程序////////////////////
uchar code wish[]="Happy every day!";
uchar code time[]="00:00:00";
uchar code loading[]="Loading...";
/////////////////////////////////////////////////////
sbit en=P3^4;
sbit rs=P3^5;//用于控制1602
sbit rw=P3^6;
sbit dula=P2^6;
sbit wela=P2^7;//用于控制晶体管
sbit IRIN=P3^2;//红外接收器数据线IO口
bit L=1;
uchar t,key=0,hh=0,mm=0,ss=0;
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=112;y>0;y--);//大约是1ms,因为单片机的时钟周期为11.0592mhz。
}
void write_com(uchar com)
{
rs=0;//指令
P0=com;//写指令函数
delay(5);
/////////////////////////////////////////////////
void delay014ms(uchar x) //x*0.14MS STC10F04延时约0.15MS
{Байду номын сангаас
uchar i;
while(x--)
{
for (i = 0; i<15; i++)//13
;
}
//引导码检验结束
while (!IRIN);//等IR变为高电平开始检测
while (IRIN)//计算IR高电平时长
{
delay014ms(1);
N++;
if (N>=30)
{
EX0=1;
return;
}//0.14ms计数过长自动离开?
}//高电平计数完毕
IRCOM[j]=IRCOM[j] >> 1; //数据最高位补"0"
case 0x5e:n=3;write_data(num[3]);break;//3
case 0x08:n=4;write_data(num[4]);break;//4
case 0x1c:n=5;write_data(num[5]);break;//5
case 0x5a:n=6;write_data(num[6]);break;//6
首先要掌握lcd1602编程,红外遥控原理,当然,单片机基本的要懂得
此程序是用stc89c52单片机,所用的IO口程序有说明。
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define tt 46080//设置时间间隔,对应11.0592MHZ的晶振
rw=0;
write_com(0x38);//显示屏模式设置为1602方案
write_com(0x0f);//显示开关/光标设置
write_com(0x06);
write_com(0x01);//清屏
write_com(0x80);//指针置零
}
/////////////////////////////////////////////////
uchar IRCOM[4]=0;
//定义数组IRCOM,分别装解码后得到的数据
//IRCOM[0]低8位地址码
//IRCOM[1]高8位地址码
//IRCOM[2] 8位数据码
//IRCOM[3] 8位数据码的反码
uchar code table[]="Input password";
uchar code table1[]="Welcome to use!";
if(L)
{
switch(IRCOM[2]) //判断第三个数码值
{
case 0x16:n=0;write_data(num[0]);break;//0
case 0x0c:n=1;write_data(num[1]);break;//1
case 0x18:n=2;write_data(num[2]);break;//2
en=1;
delay(5);
en=0;
}
void write_data(uchar dat)
{
rs=1;//数据
P0=dat;//写指令函数
delay(5);
en=1;
delay(5);
en=0;
}
void LCD_init()
{
wela=0;
dula=0;//用于关闭晶体管,因为都是用P0
en=0;//初始时使能为0
}
//////////////初始化////////////
void IR_init(void)
{
EA=1;
EX0=1;//允许总中断中断,使能INT0外部中断
IT0=1;//触发方式为脉冲负边沿触发
IRIN=1;//I/O口初始化
}
////////////解码过程//////////////
void IR_CODE(void) interrupt 0//在外部中断子程序中解码
{
void shuanxin(uchar add,uchar date);
uchar j,k,N=0,h,m,n;
EX0 = 0;//防止干扰
delay014ms(15);//延时2.1ms
if (IRIN==1)//2.1ms能够检测出各种错误信号
{
EX0 =1;
return;
}//确认IR信号出现
while (!IRIN);//等IR变为高电平,跳过9ms的前导低电平信号。
//////高电平后开始检测高电平持续的时间以确定是0还是1/////
for (j=0;j<4;j++)//收集四组数据
{
for (k=0;k<8;k++)//每组数据有8位
{
while (IRIN);//等IR变为低电平,跳过4.5ms的前导高电平信号。
if (N>=8)//6*0.14=0.84ms(6/7均可)
{
IRCOM[j] = IRCOM[j] | 0x80;
}//数据最高位补"1"
N=0;
}
}
if (IRCOM[2]!=~IRCOM[3])//不等的话表示解码失败
{
IRCOM[4]=0;
EX0=1;
return;
}
/////////////////////嵌入加密程序////////////////////