光电计数器源程序

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include //单片机头文件

#include//访问绝对地址

#include

#include//输入输出流

#define COM8279 XBYTE[0X5FFF] //8279控制命令地址

#define DATA8279 XBYTE[0X5EFF] //8279数据地址

#define uint unsigned int

#define uchar unsigned char //定义无字符变量

uint x;//高位计数值

uint y;//定时中断重复值

uint keyboard;//键值

uint i;

uint now;

uint z;

uchar code table[]={ 0x0C0,0x0F9,0x0A4,0x0B0,

0x99, 0x92, 0x82, 0x0F8,

0x80, 0x90, 0x88, 0x83,

0x0C6,0x0A1,0x86, 0x8E};//共阳极LED段码表,0x表示十六进制,表示0~9,a~f

uint LED[]={0,0,0,0,0,0};//六个数码管的初值

void show1(void);//数码管显示程序

void show2(void);

void main(void)

{

COM8279=0xDC;//清除显示RAM和FIFO命令字

COM8279=0x34;//程序时钟编程命令 (11000)24分频

COM8279=0x00;//键盘方式设置(8*8字符显示左边输入,编码方式扫描键盘,双键互锁)

COM8279=0x92;//设置写显示命令(AI=1每次写入后地址自动加1;显示

RAM一个单元地址0010)

for(i=0;i<6;i++)

{

DATA8279=table[LED[i]];//数据地址,数码管置零

}

x=0;

TMOD=0x16; //T1定时50ms,方式1;T0计数,方式2 TH0=0x00;

TL0=0x00; //计数赋初值,计数值为256

TH1=0x3C;

TL1=0x0B0; //50ms定时器赋初值(65536-50ms/1us=15536=0x3CB0) ET0=1;//开中断,计数器,P3.4(光电门)

ET1=1;//开中断,定时器

TR0=1;

TR1=1;

IT0=0;//外部中断0选用电平触发方式,低电平触发中断

EX1=1; //开外部中断

EA=1;//打开总中断

while(1);//等待中断

}

void inter0(void) interrupt 1//外部中断程序

{

COM8279=0x40;//读键盘命令(AI=0仅读一个单元)

keyboard=DATA8279;

/*扫描键盘输入值*/

if(keyboard==0)//清零重新计数

{

TL0=0;

x=0;

}

else if (keyboard==1)//暂停计数 {

TR0=0;

TR1=0;

now=TL0;//存储当前计数值

}

else if (keyboard==2)//开始计数 {

TR0=1;

TR1=1;

TL0=now;//将原计数值赋给计数器

}

else if (keyboard==3)//计数加1 {

TL0++;

}

else if (keyboard==4)//计数总值 {

TR1=0;

z=256*x+TL0;

show2();

}

else if (keyboard==5)//重新显示计数值

{

TR1=1;

TL0=z%256;

}

else

{

TR0=1;

TR1=1;

} //继续计数

}

void timer0(void) interrupt 2//计数器中断程序

{

x++;//高位计数

}

void timer1(void) interrupt 3//50ms定时器中断程序

{

while(y<10)

{

TH1=0x3C; //50ms

TL1=0x0B0;

y++;

}

y=0;

show1();

} //目的是每0.5s扫描一次数值,使计数值一直显示在数码管上

/*显示函数*/

void show1(void)

{

COM8279=0x92;//设置写显示命令,8279命令字

LED[0]=TL0%10;//显示低位计数0-255

LED[1]=TL0%100/10;

LED[2]=TL0%1000/100;

LED[3]=x%10;//显示高位计数

LED[4]=x%100/10;

LED[5]=x%1000/100;

for(i=0;i<6;i++)

{

DATA8279=table[LED[i]];//显示display数组 }

}

void show2(void)//显示计数总值

{

COM8279=0x92;//设置写显示命令,8279命令字

LED[0]=z%10;

LED[1]=z%100/10;

LED[2]=z%1000/100;

LED[3]=z%10000/1000;

LED[4]=z%100000/10000;

LED[5]=z%1000000/100000;

for(i=0;i<6;i++)

{

相关文档
最新文档