昨天用的共陰數碼管,普通IO口,亮度一般,今天重新焊了個,順手拿了個共陽數碼管,昨天的程序已經不能正常工作了,O1的順序要調反,另外,位選的IO口要設置成推挽方式,學習了。
P?M0=0;P?M1=0X3C; 我用的2345 IO口,00111100換算成16進制就是3C了。在這之前花了2個小時,調段選的推挽,浪費了2個小時。
第二次用少引腳 的單片機,之前用過STC12C5608,是買的流水燈散件,被控件少這種芯片非常舒服。
制作出來的實物圖如下:
51hei圖片_20220107191340.jpg (241.64 KB, 下載次數: 82)
下載附件
2022-1-7 19:13 上傳
51hei圖片_20220107191333.jpg (100.78 KB, 下載次數: 72)
下載附件
2022-1-7 19:13 上傳
單片機源程序如下:
***********************************************************/
#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++;//秒加一
}
}
|