在12号到14号期间,由于私事略多,对单片机的学习较少。这期间,我学习并编写了秒表程序但亮度较低,改了好久也不见成效,但还好经大佬指点把它完善了。再者,我买了一套寻光萤火虫的元件进行焊接,当然也有根据商家给的原理图在学习它的原理。后面这几天我打算把后面几个实例学完,然后去学习串口通信,关于步进电机,要等到买的stc89c52到了之后再继续进行学习。
秒表程序
#include<reg52.h>
sbit KOUT4 = P2^7;
sbit KOUT3 = P2^6;
sbit KOUT2 = P2^5;
sbit KOUT1 = P2^4;
sbit ADDR0 = P2^0;
sbit ADDR1 = P2^1;
sbit ADDR2 = P2^2;
sbit ADDR3 = P2^3;
sbit ENLED = P1^1;
unsigned char code LedChar[] = {
0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
};
unsigned char LedBuff[6] = {
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF
};
unsigned char KeySta[4] = {
1,1,1,1
};
bit StopwatchRunning = 0;
bit StopwatchRefresh = 1;
unsigned char DecimalPart = 0;
unsigned int IntegerPart = 0;
unsigned char T0RH = 0;
unsigned char T0RL = 0;
void ConfigTimer0(unsigned int ms);
void StopwatchDisplay();
void KeyDriver();
void main()
{
EA = 1;
ENLED = 0;
KOUT1 = 0;
KOUT2 = 1;
KOUT3 = 1;
KOUT4 = 1;
ConfigTimer0(2);
ET0 = 1;
TR0 = 1;
while(1)
{
if(StopwatchRefresh)
{
StopwatchRefresh = 0;
StopwatchDisplay();
}
KeyDriver();
}
}
void ConfigTimer0(unsigned int ms)
{
unsigned long tmp;
tmp = 32768000/12;
tmp = tmp*ms/1000;
tmp = 65536-tmp;
tmp = tmp+18;
T0RH = (unsigned char)(tmp>>8);
T0RL = (unsigned char)tmp;
TMOD&=0xF0;
TMOD|=0x01;
TH0 = T0RH;
TL0 = T0RL;
}
void StopwatchDisplay()
{
signed char i = 0;
unsigned char buf[4];
LedBuff[0] = LedChar[DecimalPart%10];
LedBuff[1] = LedChar[DecimalPart/10];
buf[0] = IntegerPart%10;
buf[1] = (IntegerPart/10)%10;
buf[2] = (IntegerPart/100)%10;
buf[3] = (IntegerPart/1000)%10;
for(i=3;i>=1;i--)
{
if(buf==0)
LedBuff[i+2]=0xFF;
else
break;
}
for(;i>=0;i--)
{
LedBuff[i+2] = LedChar[buf];
}
LedBuff[2]&=0x7F;
}
void StopwatchAction()
{
if(StopwatchRunning)
StopwatchRunning = 0;
else
StopwatchRunning = 1;
}
void StopwatchReset()
{
StopwatchRunning = 0;
DecimalPart = 0;
IntegerPart = 0;
StopwatchRefresh = 1;
}
void KeyDriver()
{
unsigned char i;
static unsigned char backup[4] = {1,1,1,1};
for(i=0;i<4;i++)
{
if (backup!=KeySta)
{
if (backup!=0)
{
if(i==1)
StopwatchReset();
else if(i==2)
StopwatchAction();
}
backup = KeySta;
}
}
}
void KeyScan()
{
static unsigned int a = 0;
unsigned char i;
static unsigned char keybuf[4] = {
0xFF, 0xFF, 0xFF, 0xFF
};
ADDR0 = 1;
ADDR1 = 1;
ADDR2 = 1;
ADDR3 = 1;
keybuf[0] = (keybuf[0]<<1) | ADDR0;
keybuf[1] = (keybuf[1]<<1) | ADDR1;
keybuf[2] = (keybuf[2]<<1) | ADDR2;
keybuf[3] = (keybuf[3]<<1) | ADDR3;
for(i=0; i<4; i++)
{
if(keybuf==0x00)
{
KeySta = 0;
}
else if(keybuf==0xFF)
{
KeySta = 1;
}
}
P0 = 0xFF;
switch(a)
{
case 0:ADDR2 = 0;ADDR1 = 0;ADDR0 = 0;a++0 = LedBuff[5];break;
case 1:ADDR2 = 0;ADDR1 = 0;ADDR0 = 1;a++0 = LedBuff[4];break;
case 2:ADDR2 = 0;ADDR1 = 1;ADDR0 = 0;a++0 = LedBuff[3];break;
case 3:ADDR2 = 0;ADDR1 = 1;ADDR0 = 1;a++0 = LedBuff[2];break;
case 4:ADDR2 = 1;ADDR1 = 0;ADDR0 = 0;a++0 = LedBuff[1];break;
case 5:ADDR2 = 1;ADDR1 = 0;ADDR0 = 1;a = 00 = LedBuff[0];break;
default: break;
}
}
void LedScan()
{
static unsigned int i = 0;
P0 = 0xFF;
switch(i)
{
case 0:ADDR2 = 0;ADDR1 = 0;ADDR0 = 0;i++0 = LedBuff[5];break;
case 1:ADDR2 = 0;ADDR1 = 0;ADDR0 = 1;i++0 = LedBuff[4];break;
case 2:ADDR2 = 0;ADDR1 = 1;ADDR0 = 0;i++0 = LedBuff[3];break;
case 3:ADDR2 = 0;ADDR1 = 1;ADDR0 = 1;i++0 = LedBuff[2];break;
case 4:ADDR2 = 1;ADDR1 = 0;ADDR0 = 0;i++;P0 = LedBuff[1];break;
case 5:ADDR2 = 1;ADDR1 = 0;ADDR0 = 1;i = 0;P0 = LedBuff[0];break;
default: break;
}
}
void StopwatchCount()
{
if(StopwatchRunning)
{
DecimalPart++;
if(DecimalPart>=100)
{
DecimalPart = 0;
IntegerPart++;
if(IntegerPart>=10000)
{
IntegerPart = 0;
}
}
StopwatchRefresh = 1;
}
}
void InterruptTimer0() interrupt 1
{
static unsigned char tmr10ms = 0;
TH0 = T0RH;
TL0 = T0RL;
LedScan();
KeyScan();
tmr10ms++;
if(tmr10ms>=5)
{
tmr10ms = 0;
StopwatchCount();
}
}
寻光萤火虫实图
动起来傻傻的,哈哈
|