设计要求是:生产线计数器,光电计数,过一次光电计数器,记一个数,用数码管显示,当计数到10时,LED灯闪烁2秒。(仿真时,计数器用按键模拟)
下面是单片机程序,定时器不能实现所需要求。
#include<AT89x51.H>
#define uchar unsigned char
#define uint unsigned int
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
uchar duan[10]={0xc0,0Xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //所需的段的位码
uchar wei[2]={0XBf,0X7f}; //位的控制端
uint c,v,date; //定义数据类型
uint dispcount=0;
sbit led=P1^4; //定义P1.4口是led
/*****延时函数*****/
void delay(uchar t)
{
uchar i,j;
for(i=0;i<t;i++)
{
for(j=13;j>0;j--);
{;
}
}
}
/*****数码管动态扫描*****/
void xianshi()
{
/***数据转换***/
c=date%100/10; //求十位
v=date%10; //求个位
P2=wei[0];
P0=duan[c];
delay(50);
P2=wei[1];
P0=duan[v];
delay(50);
}
/*****中断函数*****/
void ExtInt0() interrupt 0 //中断服务程序
{
dispcount++; //外部中断一次,计数加一
if(dispcount==51) //计数范围0~50
{dispcount=0;}
}
/*******************************************************************************
* 函 数 名 : Timer0Init
* 函数功能 : 定时器0初始化
*******************************************************************************/
void Timer0Init()
{
TMOD|=0X01; //选择为定时器0模式,工作方式1,仅用TR0打开启动。
TH0=0XFC; //给定时器高八位赋初值,定时1ms
TL0=0X18;
ET0=1; //打开定时器0中断允许
EA=1; //打开中断总开关
TR0=1; //打开定时器0
}
/*****主函数*****/
void main()
{
static u16 i;
TCON=0x01; //中断设置 TCON寄存器 (外部中断触发方式设)
IE=0x81; //IE外部中断0请求标志位 (总中断开关)
Timer0Init(); //定时器0初始化
while(1)
{
date=dispcount;
xianshi(); //调用数码管显示
if(dispcount%2==0&&dispcount!=0) //1s时
{
led=0; //打开LED
i++;
if(i>1000) //时间大于1s
{
led=1; //关闭LED
i=0; //清零
}
}
else {led=1;}
}
}
/*******************************************************************************
* 函 数 名 : void Timer0() interrupt 1
* 函数功能 : 定时器1中断函数
*******************************************************************************/
void Timer0() interrupt 1
{
static u16 i;
TH0=0XFC; //给定时器赋初值,定时1ms
TL0=0X18;
i++;
}
|