|
我有一個問題:我想讓第一個led燈亮且數碼管動態掃描顯示,可是把這兩個程序結合起來就不對,它們單個運行的時候是正確的,但是當把他們同時運行的時候就出現問題?我不知道是不是我鎖存器那塊操作不正確,請大神幫幫我。
單片機源程序如下:
1.#include "head.h"
void main()
{
init();
model=1;
time=50;
ZKB=20;
//Timer_On();
Select_Show(0);
LED_On(1);
while(1)
{
//LED_On(1);
/*if(time)
{
LED_On(1);
}
else
{
LED_Off();
Timer_Off();
}*/
DIG_Show();
}
}
2.*******************************************
頭文件head.h
***********************************************/
#ifndef HEAD_H
#define HEAD_H
/*******************************/
//包含的頭文件
#include <reg52.h>
#include <intrins.h>
#include "delay.h"
/*******************************/
//宏定義
#define uchar unsigned char
#define uint unsigned int
/*******************************/
//74LS138譯碼器
sbit LSA=P2^5;
sbit LSB=P2^6;
sbit LSC=P2^7;
extern void LS138(uchar i);//選擇譯碼器輸出
/*******************************/
//定時器
extern uint ZKB;//占空比單位:%
extern bit PWM;
extern uchar flag;
extern uint counter0;
extern uint counter1;
extern uchar counter_time;
extern uchar time;
extern void Timer0_init();//定時器0初始化設置
extern void Timer_On();//定時器開啟
extern void Timer_Off();//定時器關閉
/*******************************/
//LED
extern void LED_On(uchar i);//LED亮
extern void LED_Off();//LED滅
/*******************************/
//初始化函數
extern void init();
/*******************************/
//數碼管
extern uchar model;
extern uchar DIG_BUFFER[8];
extern uchar code DIG[16];
extern void DIG_Show();//數碼管顯示
extern void Select_DIG(uchar i);//選擇數碼管
extern void Select_Show(uchar i);//選擇數碼管顯示模式 0倒計時 1溫度
/*******************************/
//鍵盤
extern void KeyScan();//鍵盤掃描函數
#endif
3********************************************
head.c
***********************************************
#include "head.h"
/*******************************/
//74LS138譯碼器
void LS138(uchar i)//選擇譯碼器輸出
{
switch(i)
{
case 0:LSA=0;LSB=0;LSC=0;break;
case 4:LSA=0;LSB=0;LSC=1;break;
case 5:LSA=1;LSB=0;LSC=1;break;
case 6:LSA=0;LSB=1;LSC=1;break;
case 7:LSA=1;LSB=1;LSC=1;break;
}
}
/*******************************/
//定時器
uint ZKB;//占空比單位:%
bit PWM=0;
uchar flag;
uint counter0=0;
uint counter1=0;
uchar counter_time=0;
uchar time=0;
void Timer0_init()//定時器0初始化設置
{
TH0=(65536-1)/256;
TL0=(65536-1)%256;
ET0=1;//開定時器0中斷
}
void Timer0() interrupt 1
{
TH0=(65536-1)/256;
TL0=(65536-1)%256;
counter0++;
counter1++;
if(counter0<(ZKB*10))
{
PWM=1;
}
else if((counter0>=(ZKB*10))&&(counter0<1000))
{
PWM=0;
}
else
{
counter0=0;
}
if(counter1>50000)
{
counter1=0;
time--;
}
}
void Timer_On()//定時器開啟
{
TMOD=0x01;
Timer0_init();
EA=1;
TR0=1;
}
void Timer_Off()//定時器關閉
{
EA=0;
ET0=0;
TR0=0;
counter0=0;
counter1=0;
counter_time=0;
PWM=0;
}
/*******************************/
//LED
void LED_On(uchar i)//LED亮
{
switch(i)
{
case 1:P0=0xfe;break;
case 2:P0=0xfd;break;
case 3:P0=0xfb;break;
}
LS138(4);
LS138(0);
}
void LED_Off()//LED滅
{
LS138(4);
P0=0xff;
LS138(0);
}
/*******************************/
//初始化函數
void init()
{
LS138(4);
P0=0xff;
LS138(0);
//關閉蜂鳴器、繼電器等無關外設
LS138(5);
P0=0x00;
LS138(0);
//數碼管熄滅
/*LS138(6);
DIG_COM(8);
P0=0xff;
LS138(7);
P0=0xff;*/
}
/*******************************/
//數碼管
uchar model;
uchar code DIG[16]={0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8,
0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e};
uchar DIG_BUFFER[8]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};//數碼管緩存
void Select_DIG(uchar i)//選擇數碼管
{
switch(i)
{
case 0:P0=0x01;break;
case 1:P0=0x02;break;
case 2:P0=0x04;break;
case 3:P0=0x08;break;
case 4:P0=0x10;break;
case 5:P0=0x20;break;
case 6:P0=0x40;break;
case 7:P0=0x80;break;
}
LS138(6);
LS138(0);
}
void DIG_Show()//數碼管顯示
{
uchar x;
for(x=0;x<8;x++)
{
Select_DIG(x);
P0=0xff;
P0=DIG_BUFFER[x];
LS138(7);
//while(counter1<1000);
LS138(0);
Delay1ms();
}
}
void Select_Show(uchar i)//選擇數碼管顯示模式 0倒計時 1溫度
{
switch(i)
{
case 0:
DIG_BUFFER[0]=0xbf;
DIG_BUFFER[1]=DIG[model];
DIG_BUFFER[2]=0xbf;
DIG_BUFFER[3]=0xff;
DIG_BUFFER[4]=DIG[time/1000];
DIG_BUFFER[5]=DIG[(time%1000)/100];
DIG_BUFFER[6]=DIG[(time%100)/10];
DIG_BUFFER[7]=DIG[time%10];
break;
}
}
|
|