昨天用的共阴数码管,普通IO口,亮度一般,今天重新焊了个,顺手拿了个共阳数码管,昨天的程序已经不能正常工作了,O1的顺序要调反,另外,位选的IO口要设置成推挽方式,学习了。
P?M0=0;P?M1=0X3C; 我用的2345 IO口,00111100换算成16进制就是3C了。在这之前花了2个小时,调段选的推挽,浪费了2个小时。
第二次用少引脚 的单片机,之前用过STC12C5608,是买的流水灯散件,被控件少这种芯片非常舒服。
制作出来的实物图如下:
单片机源程序如下:
***********************************************************/
#include<STC12C2052.H>
#define uchar unsigned char
#define uint unsigned int
//以下定义是用于EEPROM
#include<intrins.h>
#define nop _nop_()
//以上定义是用于EEPROM
sbit K1=P3^0; //清翔板的S4
//sbit K2=P3^3; //清翔板的S3
//sbit K1=P3^5; //清翔板的S1
//sbit BEEP = P3^6 ; //蜂鸣器
sbit SMG0=P3^2;
sbit SMG1=P3^5;
sbit SMG2=P3^4;
sbit SMG3=P3^3;
uint fmqz; //用于蜂鸣器延时
uchar a1,a2,a3,a4;
uint ys;
uint t0z,t0z1;
uint eepromz ;
uchar code table[]={0x28,0xEE,0x32,0xa2,0xE4,0xA1,0x21,0xEA,0x20,0xA0};// 定义段码
void delay(uint n)//延时
{
uint x;
while(n--)
{
x=50;
while(x--);
}
}
void disp(uchar n3,n2,n1,n0)//显示子程序
{
P1=table[n3];//开段选
SMG3=1; //开位选
delay(5); //延时
SMG3=0;
P1=table[n2];//开段选
SMG2=1; //开位选
delay(5); //延时
SMG2=0; //开位选
P1=table[n1];
SMG1=1; //开位选
delay(5);
SMG1=0; //开位选
P1=table[n0];
SMG0=1; //开位选
delay(5);
SMG0=0; //开位选
}
void main()
{
P3M0=0; P3M1=0X3C; //p1口强推挽
TMOD=0x01;//定时器工作方式1
TH0=0x3C;//定时器初始产生50ms时基信号
TL0=0xB0;//定时器初始产生50ms时基信号
ET0=1;//开定时器中断
EA=1;//开总中断
TR0=1;//启动定时器
while(1)
{
// a1=eepromz/1000; //分离出a的千位
// a2=eepromz%1000/100; //分离出a的百位
// a3=eepromz%100/10; //分离出a的十位
// a4=eepromz%10; //分离出a的个位
a1=t0z1/1000; //分离出a的千位
a2=t0z1%1000/100; //分离出a的百位
a3=t0z1%100/10; //分离出a的十位
a4=t0z1%10; //分离出a的个位
disp(a1,a2,a3,a4);//显示数字
if(K1==0){ delay(5);if(K1==0){ delay(5);eepromz++;}}
}
}
void Timer0_Routine(void) interrupt 1
{
unsigned char a;
TH0=0x3C;//定时器初始产生50ms时基信号
TL0=0xB0;//定时器初始产生50ms时基信号
a++;//定时器循环计数20次为一秒
if(a>=2){//定时器循环计数20次为一秒
a=0;//次数清零,从新循环计数
t0z1++;//秒加一
}
}
|