//晶振频率为6MHz 一个机器周期2us //
//实现按键地址码、指令码的数码管显示//
//2010-06-01 //
//////////////////////////////////////
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6
sbit wela=P2^7
bit overflag,dataover//开始接收数据,数据处理完毕
uchar timedata//定时器0溢出次数
uchar chubus[33]//33Byte数据 timedata组成的数组
uchar jieguos[4]//地址码,地址反码,数据码,数据反码;
void initial()//初始化
{
IT0=1EX0=1//负边沿触发
TMOD=0x01ET0=1TR0=1//模式1,十六位定时器
TH0=0xffTL0=0x06//0.5ms溢出
EA=1//开总中断
}
void time0() interrupt 1//定时器0中断
{TH0=0xffTL0=0x06
timedata++
}
void ex0() interrupt 0//外部中断0,接收数据
{
static bit startflag//开始接收
static uchar i
if(startflag)
{
if(timedata<32&&timedata>=16) i=0
chubus[i]=timedata
timedata=0
i++
if(i==33){overflag=1i=0}
}
else
{
startflag=1
timedata=0
}
}
void chulidata()
{
uchar chubu//初步数据
uchar jieguo//结果数据
uchar x,y,z=1
for(x=0x<4x++)//处理四组数据
{
for(y=1y<=8y++)//处理一组数据8Byte
{
chubu=chubus[z]
jieguo=jieguo>>1
if(chubu>3) jieguo=jieguo|0x80//大于1.5mS为1
z++
}
jieguos[x]=jieguo
jieguo=0
}
dataover=1
}
void delay(uint z)
{
uint x ,y
for(x=zx>0x--)
for(y=110y>0y--)
}
void display()
{
uchar gao,gao1
uchar di,di1
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71}
gao1=table[jieguos[0]/16]
di1=table[jieguos[0]%16]
gao=table[jieguos[2]/16]
di=table[jieguos[2]%16]
dula=1
P0=gao1
dula=0
P0=0xff
wela=1
P0=0x7e
wela=0
delay(2)
dula=1
P0=di1
dula=0
P0=0xff
wela=1
P0=0xfd
wela=0
delay(2)//地址码
dula=1
P0=gao
dula=0
P0=0xff
wela=1
P0=0x77
wela=0
delay(2)
dula=1
P0=di
dula=0
P0=0xff
wela=1
P0=0x6f
wela=0
delay(2)//指令码
}
void main()
{
initial()//初始化
while(1)
{
if(overflag)//数据接收完毕
{
chulidata()//处理数据,完成标志dataover
overflag=0
}
if(dataover)
{
display()//数码管显示
}
}
}
此为 B站up:江科大自动协 课程的12-2程序,学习用
跟着老师敲出来
main.c
Delay.h
Delay.c
Int0.h
Int0.c
LCD1602.h
LCD1602.c
Timer0.h
Timer0.c
IR.h
IR.c
1,首先确定下,你的接收头是不是有问题,有多的换个试试就行。2,你用什么片子,如果够快的话,可以不用中断的,改下程序结构。
3,你自己焊的板子,还是好好检查下,可能有隐蔽错误!
4,软件对这种故障要有保护机制。。。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)