#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar code Table_of_Digits[]=
{
0x00,0x3e,0x41,0x41,0x41,0x3e,0x00,0x00, //0
0x00,0x00,0x00,0x21,0x7f,0x01,0x00,0x00, //1
0x00,0x27,0x45,0x45,0x45,0x39,0x00,0x00, //2
0x00,0x22,0x49,0x49,0x49,0x36,0x00,0x00, //3
0x00,0x0c,0x14,0x24,0x7f,0x04,0x00,0x00, //4
0x00,0x72,0x51,0x51,0x51,0x4e,0x00,0x00, //5
0x00,0x3e,0x49,0x49,0x49,0x26,0x00,0x00, //6
0x00,0x40,0x40,0x40,0x4f,0x70,0x00,0x00, //7
0x00,0x36,0x49,0x49,0x49,0x36,0x00,0x00, //8
0x00,0x32,0x49,0x49,0x49,0x3e,0x00,0x00, //9
0xff,0x81,0x81,0x81,0x81,0x81,0x81,0xff
}
uchar code xdat[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01}
uchar code ydat[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}
uchar i=0,j=0,t=0,Num_Index,key,xi,yi
//主程序
void main()
{
P1=0x80
Num_Index=0//从0 开始显示
TMOD=0x01//T0 方式0
TH0=(65536-2000)/256//2ms 定时
TL0=(65536-2000)%256
IE=0x82
key=0
xi=0
yi=0
EX0=1
IT0=1
TR0=1//启动T0
while(1)
}
//T0 中断函数
void ext_int0() interrupt 0
{
key++
key&=0x03
}
void LED_Screen_Display() interrupt 1
{
TH0=(65536-2000)/256//2ms 定时
TL0=(65536-2000)%256
switch(key)
{
case 0:
P0=0xff//输出位码猜码和段码
P0=~Table_of_Digits[Num_Index*8+i]
P1=_crol_(P1,1)
if(++i==8) i=0//每屏一个数字由8 个字节构成
if(++t==250) //每个数字刷新戚乎显示一段时间
{
t=0
if(++Num_Index==10) Num_Index=0//显示下一个数字
}
break
case 1:
P0=~xdat[xi]
P1=0xff
P1=ydat[yi]
if(++t==250) //每个数字刷新显示高兆悉一段时间
{
t=0
yi++
if(yi>7){yi=0xi++}
if(xi>7)xi=0
}
break
case 2:
P0=0xff//输出位码和段码
P0=~Table_of_Digits[80+j]
if(j==0)P1=0x80
P1=_crol_(P1,1)
if(++j==8) j=0//每屏一个数字由8 个字节构成
break
default:
key=0
i=0
j=0#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar code Table_of_Digits[]=
{
0x00,0x3e,0x41,0x41,0x41,0x3e,0x00,0x00, //0
0x00,0x00,0x00,0x21,0x7f,0x01,0x00,0x00, //1
0x00,0x27,0x45,0x45,0x45,0x39,0x00,0x00, //2
0x00,0x22,0x49,0x49,0x49,0x36,0x00,0x00, //3
0x00,0x0c,0x14,0x24,0x7f,0x04,0x00,0x00, //4
0x00,0x72,0x51,0x51,0x51,0x4e,0x00,0x00, //5
0x00,0x3e,0x49,0x49,0x49,0x26,0x00,0x00, //6
0x00,0x40,0x40,0x40,0x4f,0x70,0x00,0x00, //7
0x00,0x36,0x49,0x49,0x49,0x36,0x00,0x00, //8
0x00,0x32,0x49,0x49,0x49,0x3e,0x00,0x00, //9
0xff,0x81,0x81,0x81,0x81,0x81,0x81,0xff
}
uchar code xdat[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01}
uchar code ydat[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}
uchar i=0,j=0,t=0,Num_Index,key,xi,yi
//主程序
void main()
{
P1=0x80
Num_Index=0//从0 开始显示
TMOD=0x01//T0 方式0
TH0=(65536-2000)/256//2ms 定时
TL0=(65536-2000)%256
IE=0x82
key=0
xi=0
yi=0
EX0=1
IT0=1
TR0=1//启动T0
while(1)
}
//T0 中断函数
void ext_int0() interrupt 0
{
key++
key&=0x03
}
void LED_Screen_Display() interrupt 1
{
TH0=(65536-2000)/256//2ms 定时
TL0=(65536-2000)%256
switch(key)
{
case 0:
P0=0xff//输出位码和段码
P0=~Table_of_Digits[Num_Index*8+i]
P1=_crol_(P1,1)
if(++i==8) i=0//每屏一个数字由8 个字节构成
if(++t==250) //每个数字刷新显示一段时间
{
t=0
if(++Num_Index==10) Num_Index=0//显示下一个数字
}
break
case 1:
P0=~xdat[xi]
P1=0xff
P1=ydat[yi]
if(++t==250) //每个数字刷新显示一段时间
{
t=0
yi++
if(yi>7){yi=0xi++}
if(xi>7)xi=0
}
break
case 2:
P0=0xff//输出位码和段码
P0=~Table_of_Digits[80+j]
if(j==0)P1=0x80
P1=_crol_(P1,1)
if(++j==8) j=0//每屏一个数字由8 个字节构成
break
default:
key=0
i=0
j=0
t=0
xi=0
yi=0
Num_Index=0
P0=0xff
P1=0x80
break
}
}
t=0
xi=0
yi=0
Num_Index=0
P0=0xff
P1=0x80
break
}
}
#include<reg52.h>#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit dq=P3^7 //////18b20
sbit lcden=P2^7//喊枯//lcd
sbit rs=P2^6
sbit wr=P2^5
sbit sck=P3^6 ////1302
sbit sda=P3^4
sbit rst=P3^5
sbit a=P1^0
sbit b=P1^1
sbit c=P1^2
sbit d=P1^3
sbit kj=P1^4
sbit beep=P1^5
uchar ritime
uchar startflag
uchar ridate[33]
uchar bitnum
uchar rireceok
uchar ricode[4]
uchar riprosok
uchar dis[8]
void dis_key(void)
void riwork(void)
void ripros(void)
void keyscan(void)
void bep(void)
void timer0init(void)
void init0init(void)
uchar key0,key1,key2,key0num,passwordok
uchar key,p,m,pnum,sha
uchar password[9]
uchar password1[9]={6,7,4,6,8,8,6,4,6}
void password_scan()
void post_key()
void dj1()
void dj2()
//////////////////////函数声明1302
void wr1302_byte(uchar byte)
void wr1302 (uchar add,uchar dat)
uchar read1302(uchar add)
uchar time_date[7]={10,3,12,8,21,37,20}////年周月日时分秒
uchar time_add[7]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80}////写入地址
uchar read_add[7]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81}////读出地址
uchar disp[13] ////将读出时间装入
void set_rtc()
void read_rtc()
void timepost() ////处理时间为10进制
void display()
void password_display()
void timeplay()
void runnian1()///闰年加
void runnian2() ///闰年减
void keypost() /亏渗衫/按键处理
///////////////////////////// 函数声明 lcd ////////////////////
uchar code lcd_tab[]="0123456789- ():c"
uchar code lcd_tab1[]="Plese Password:"
uchar code table1[]="key=00-00-00-00"
uchar code table[]=" QQ:674688646"
uchar code numtab[]="0123456789ABCDEF"
uchar code numtab1[]=" 1234567890"
void delay(uint z)
void init_lcd()
void write_com(uchar com)
void write_date(uchar x)
///////////////////////////18b20////////////
void init18b20(void)
void wr1820_byte(uchar dat)
uchar read18b20_byte(void)
uchar read1820(void)
void delay1(uint t)
///////////////销腔///////////////////////////
void timer0init(void) //开定时器2
{
TMOD=0X02
TH0=0X00
TL0=0X00
ET0=1
EA=1
TR0=1
}
void init0init(void) //外部中断
{
IT0=1
EX0=1
EA=1
}
void riwork(void)
{
dis[0]=ricode[0]/16
dis[1]=ricode[0]%16
dis[2]=ricode[1]/16
dis[3]=ricode[1]%16
dis[4]=ricode[2]/16
dis[5]=ricode[2]%16
dis[6]=ricode[3]/16
dis[7]=ricode[3]%16
}
void ripros(void)
{ uchar j,k,i,value
k=1
for(j=0j<4j++)
{
for(i=0i<8i++)
{
value=value>>1
if(ridate[k]>6)
{
value=value|0x80
}
k++
}
ricode[j]=value
}
riprosok=1
}
void timer0 () interrupt 1
{
ritime++
}
void int0() interrupt 0
{
if(startflag==1)
{
if(ritime>32)//检测引导码
{
bitnum=0
}
ridate[bitnum]=ritime
ritime=0
bitnum++
if(bitnum==33)
{
bitnum=0
rireceok=1
}
}
else
{
startflag=1
ritime=0
}
}
void keyscan(void)
{ if(rireceok==1)
{bep() //按键发声 但影响蜂鸣器 *** 作
ripros()
rireceok=0
}
if(riprosok==1)
{ riwork()
riprosok=0
switch(ricode[2])
{ case 0x46:p=1pnum++break
case 0x0c:key=1break
case 0x18:key=2break
case 0x5e:key=3break
case 0x08:key=4break
case 0x1c:key=5break
case 0x5a:key=6break
case 0x42:key=7break
case 0x52:key=8break
case 0x4a:key=9break
case 0x16:key=10break
case 0x09:key0=1key0num++break
case 0x15:key1=1break
case 0x07:sha=1key2=1break
if(key0==1){if(key0num==1)read_rtc()}
}
}
////按下设定键后读一次1302保证time_date内数据正常
}
void bep(void)
{
beep=0delay(100)beep=1
}
///////////////////////////////////////////////////////////
void write_com(uchar com) /////写命令
{
rs=0
P0=com
lcden=1
delay(5)
lcden=0
}
void write_date(uchar x)/////写数据
{
rs=1
P0=x
delay(5)
lcden=1
delay(5)
lcden=0
}
void init_lcd()// ///lcd初始化
{
wr=0
lcden=0
write_com(0x38)
write_com(0x0c)
write_com(0x06)
write_com(0x01)
}
void display()
{timepost()
write_com(0x80+2)
write_date(lcd_tab[2])
write_date(lcd_tab[0])
write_date(lcd_tab[disp[0]])
write_date(lcd_tab[disp[1]])
write_date(lcd_tab[10])
write_date(lcd_tab[disp[3]])
write_date(lcd_tab[disp[4]])
write_date(lcd_tab[10])
write_date(lcd_tab[disp[5]])
write_date(lcd_tab[disp[6]])
write_date(lcd_tab[11])
write_date(lcd_tab[12])
write_date(lcd_tab[disp[2]])
write_date(lcd_tab[13])
write_com(0x80+0x40+4)/////////第二行
write_date(lcd_tab[disp[7]])
write_date(lcd_tab[disp[8]])
write_date(lcd_tab[14])
write_date(lcd_tab[disp[9]])
write_date(lcd_tab[disp[10]])
write_date(lcd_tab[14])
write_date(lcd_tab[disp[11]])
write_date(lcd_tab[disp[12]])
write_date(lcd_tab[11])
write_date(lcd_tab[read1820()/10])/////显示温度
write_date(lcd_tab[read1820()%10])
write_date(lcd_tab[15])
}
//////////////// 1302 //////////////////////////////
void wr1302_byte(uchar byte) /////写入一个字节
{ uchar i
for(i=0i<8i++)
{ sck=0
sda=byte&0x01
byte>>=1
sck=1
}
}
void wr1302 (uchar add,uchar dat)/////写进1302 时间和地址
{ rst=0
_nop_()
sck=0
_nop_()
rst=1
_nop_()
wr1302_byte(add)
wr1302_byte(dat)
rst=0
//_nop_()
//sda=1
//sck=1
}
uchar read1302(uchar add)
{ uchar i,temp
rst=0
_nop_()
sck=0
_nop_()
rst=1
_nop_()
wr1302_byte(add)////////////////////写入要读的地址
for(i=0i<8i++)
{
if(sda)temp=temp|0x80
sck=0
temp>>=1
_nop_()
sck=1
}
rst=0 //////// 延时很重要
_nop_()
sck=0
_nop_()
sck=1
_nop_()
sda=0
_nop_()
sda=1
_nop_()
return temp
}
void set_rtc()
{
uchar i,j
for(i=0i<7i++)
{
j=time_date[i]/10 ///////将10进制变成16进制
time_date[i]=time_date[i]%10
time_date[i]=time_date[i]+j*16
}
wr1302(0x8e,0x00)//////去除写保护
for(i=0i<7i++)
{
wr1302(time_add[i],time_date[i])
}
wr1302(0x8e,0x80)//////加写保护
}
void read_rtc()
{uchar i,j
for(i=0i<7i++)
{
time_date[i]=read1302(read_add[i])
////将读到的bcd码转化成10进制码
j=time_date[i]&0x0f
time_date[i]>>=4
time_date[i]&=0x0f
time_date[i]*=10
time_date[i]=time_date[i]+j
}
}
void timepost()
{ disp[0]=time_date[0]/10/////年
disp[1]=time_date[0]%10
disp[2]=time_date[1]%10/////周
disp[3]=time_date[2]/10/////月
disp[4]=time_date[2]%10/////
disp[5]=time_date[3]/10/////日
disp[6]=time_date[3]%10////
disp[7]=time_date[4]/10////时
disp[8]=time_date[4]%10////
disp[9]=time_date[5]/10////分
disp[10]=time_date[5]%10////
disp[11]=time_date[6]/10////秒
disp[12]=time_date[6]%10////
}
void delay(uint z)
{
uint x,y
for(x=0x<20x++)
for(y=zy>0y--)
}
/////////////////////////18b20////////
void delay1(uint t)
{
while (t--)
}
void init18b20(void)
{
uchar n
dq=1
delay1(8)
dq=0
delay1(80)
dq=1
delay1(8)
n=dq
delay1(4)
}
void wr18b20_byte(uchar dat)
{
uchar i
for(i=0i<8i++)
{
dq=0
dq=dat&0x01
delay1(4)
dq=1
dat>>=1
}
delay1(4)
}
uchar read18b20_byte(void)
{
uchar i,value
for(i=0i<8i++)
{ dq=0
value>>=1
dq=1
if(dq)
value|=0x80
delay1(4)
}
return value
}
uchar read1820(void)
{ uchar a,b
init18b20()
wr18b20_byte(0xcc)
wr18b20_byte(0x44)
delay1(50)
init18b20()
wr18b20_byte(0xcc)
wr18b20_byte(0xbe)
a=read18b20_byte()
b=read18b20_byte()
b<<=4
b+=(a&0xf0)>>4
return b
}
///////////////////////////////////////////////////////
void keypost()
{ uchar n
if(key0==1)
{
if(key0num==1)
{write_com(0x80+0x40+10)
write_com(0x0f)delay(1000)
if(key1==1)
{ key1=0n=1
time_date[6]++
if(time_date[6]==60)time_date[6]=0
display()
}
if(key2==1)
{
key2=0n=1
time_date[6]--
if(time_date[6]==-1)time_date[6]=59
display()
}
}
if(key0num==2)
{write_com(0x80+0x40+8)
write_com(0x0f)delay(1000)
if(key1==1)
{ key1=0n=1
time_date[5]++
if(time_date[5]==60)time_date[5]=0
display()
}
if(key2==1)
{
key2=0n=1
time_date[5]--
if(time_date[5]==-1)time_date[5]=59
display()
}
}
if(key0num==3)
{write_com(0x80+0x40+5)
write_com(0x0f)delay(1000)
if(key1==1)
{ key1=0n=1
time_date[4]++
if(time_date[4]==24)time_date[4]=0
display()
}
if(key2==1)
{
key2=0n=1
time_date[4]--
if(time_date[4]==-1)time_date[4]=23
display()
}
}
if(key0num==4)
{write_com(0x80+14)
write_com(0x0f)delay(1000)
if(key1==1)
{ key1=0n=1
time_date[1]++
if(time_date[1]==8)time_date[1]=1
display()
}
if(key2==1)
{
key2=0n=1
time_date[1]--
if(time_date[1]==0)time_date[1]=7
display()
}
}
if(key0num==5)
{write_com(0x80+10)
write_com(0x0f)delay(1000)
if(key1==1)
{ key1=0n=1
time_date[3]++
runnian1()
display()
}
if(key2==1)
{
key2=0n=1
time_date[3]--
if(time_date[3]<1)time_date[3]=31
runnian2()
display()
}
}
if(key0num==6)
{write_com(0x80+7)
write_com(0x0f)delay(1000)
if(key1==1)
{ key1=0n=1
time_date[2]++
if(time_date[2]>12)time_date[2]=1
runnian2()
display()
}
if(key2==1)
{
key2=0n=1
time_date[2]--
if(time_date[2]==0)time_date[2]=12
runnian2()
display()
}
}
if(key0num==7)
{write_com(0x80+4)
write_com(0x0f)delay(1000)
if(key1==1)
{ key1=0n=1
time_date[0]++
if(time_date[0]==100)time_date[0]=0
runnian2()
display()
}
if(key2==1)
{
key2=0n=1
time_date[0]--
if(time_date[0]==-1)time_date[0]=99
runnian2()
display()
}
}
if(key0num==8)
{ key0num=0key0=0
write_com(0x0c)
if(n){n=0set_rtc()}
}
}
else
{
read_rtc()
timepost()
display()
if(time_date[5]==0)///整点报时
{if(time_date[6]==0)beep=0
else beep=1
}
}
}
void runnian1()////闰年加
{
if(time_date[2]==2) /////判断2月
{ if((time_date[0]+4)%4==0)
{ if(time_date[3]>29)time_date[3]=1}//判断闰年
else
{if(time_date[3]>28)time_date[3]=1}
}
else
{ if(time_date[2]<8)///判断月小于8
{
if((time_date[2]+1)%2==0)
{if(time_date[3]>31)time_date[3]=1}
else
{if(time_date[3]>30)time_date[3]=1}
}
if(time_date[2]>7)
{
if((time_date[2])%2==0)
{if(time_date[3]>31)time_date[3]=1}
else
{if(time_date[3]>30)time_date[3]=1}
}
}
}
void runnian2()//闰年减
{
if(time_date[2]==2) /////判断2月
{ if((time_date[0]+4)%4==0)
{ if(time_date[3]>29)time_date[3]=29}//判断闰年
else
{if(time_date[3]>28)time_date[3]=28}
}
else
{
if(time_date[2]<8)///判断月小于8
{
if((time_date[2]+1)%2==0)
{if(time_date[3]>31)time_date[3]=31}
else
{if(time_date[3]>30)time_date[3]=30}
}
if(time_date[2]>7)
{
if((time_date[2])%2==0)
{if(time_date[3]>31)time_date[3]=31}
else
{if(time_date[3]>30)time_date[3]=30}
}
}
}
void password_scan() ////////输入密码界面
{uchar l,i,j
write_com(0x80)
for(l=0l<15l++)
{write_date(lcd_tab1[l])}
write_com(0x80+0x40+4+i)
write_com(0x0f)delay(1000)
if(key!=0)
{
password[i]=key
write_com(0x80+0x40+4+i)
write_date(numtab1[key])
write_com(0x14)
i++key=0
}
if(i>0)
{if(sha==1)
{sha=0i--
write_com(0x80+0x40+4+i)
write_date(numtab1[0])
write_com(0x10)
}
}
if(i==9)
{ i=0
for(j=0j<9j++)
{
if(password1[j]==password[j])m++
else {init_lcd()m=0break}
}
if(m==9)
{
m=0passwordok=1
p=0pnum=0key=0
init_lcd()
for(i=0i<15i++)
{write_date(table[i])}
write_com(0x80+0x40)
for(i=0i<15i++)
{write_date(table1[i])}
}
}
}
void dis_key(void) //显示键值
{
write_com(0x80+0x40+4)
write_date(numtab[dis[0]])
write_date(numtab[dis[1]])
write_com(0x80+0x40+7)
write_date(numtab[dis[2]])
write_date(numtab[dis[3]])
write_com(0x80+0x40+10)
write_date(numtab[dis[4]])
write_date(numtab[dis[5]])
write_com(0x80+0x40+13)
write_date(numtab[dis[6]])
write_date(numtab[dis[7]])
}
void timeplay()
{
if(p==1)
{ uchar vkey0num=0key0=0
if(v==0){v=1init_lcd()key=0}
if(pnum==1)
{
password_scan()
}
if(pnum==2)
{ p=0pnum=0m=0v=0
init_lcd()
}
}
else keypost()
}
//////////////////////////主函数////////////////////////
void main()
{
init_lcd() /////初始化lcd
timer0init()///// 开定时器中断
init0init()///// 开外部器中断
key=0
while(1)
{
keyscan()
if(passwordok)
{ dis_key()
post_key()
if(p==1)
{ if(pnum==1)
{if(ricode[2]!=0x46)pnum=0}
if(pnum==2)
{pnum=0m=0
passwordok=0p=0
break
}
}
}
else timeplay()
}
}
void post_key()
{
if(key==1){key=0kj=0}
if(key==2){key=0kj=1}
if(key==3){key=0dj1()}
if(key==4){key=0dj2()}
}
void dj1()
{
uint i
for(i=0i<512i++)
{if(rireceok==1)break
a=0b=0delay(20)
a=1b=0delay(20)
b=0c=0delay(20)
b=1c=0delay(20)
c=0d=0delay(20)
c=1d=0delay(20)
d=0a=0delay(20)
d=1delay(20)
}
}
void dj2()
{ uint i
for(i=0i<512i++)
{if(rireceok==1)break
d=0a=0delay(20)
a=1d=0delay(20)
c=0d=0delay(20)
c=0d=1delay(20)
b=0c=0delay(20)
c=1b=0delay(20)
a=0b=0delay(20)
a=0b=1delay(20)
}
}
使用方法 本程序用于HC6800 V2.6 实验箱,需要装上1602液晶屏,18b20 温度传感器,红外接收头,和步进电机,同时保证遥控器好用(要用配套的小遥控器并且要按键值和我的一样才能准确的 *** 作本程序)
我的遥控器按键值如下
ch-0x45 ch 0x46 ch+0x47
<<0x44 >>0x40 >= 0x43
- 0x07 + 0x15 EQ 0x09
0 0x16 100+ 0x19200+ 0x0d
1 0x0c 2 0x18 3 0x5e
4 0x08 5 0x1c 6 0x5a
7 0x42 8 0x52 9 0x4a
主要 *** 作键为 ch EQ + - 123456789 等键,
程序下进去后 1602会显示日期 时间 温度
用EQ键可对日期 时间进行设定
用+ - 键对日期时间进行调节
调节日期时会自动识别大小月,及闰年并对日期进行相应调整
按下ch键后 会进入输入密码界面 依次输入674688646 会进入按键读值界面 ,输入错误可用 - 键退回
在按键读值界面 连续按两次ch 键后,程序 会退出到时间显示界面
在按键读值界面 按1 打开继电器 按2 关闭继电器 按3 步进电机正转一周,按 4 步进电机反转一周 ,步进电机转的过程中按其他键,步进电机停止
首先你说的“烧上去”了,是不是已经把编译好的程序烧录进单片机开发板中了,如果是(我猜你是考的别人的程序直接使用的),只需要则升按开发板的说明书进行陆悄连接早盯渣就可以看效果了(注意:要看你该程序涉及哪些硬件,比如只涉及到发光二极管,则将单片机芯片和发光二级管连接按要求连接就行了,如果还涉及到其他硬件,就需要连接其他硬件,这个要看你烧录的程序涉及哪些硬件)欢迎分享,转载请注明来源:内存溢出
评论列表(0条)