C51单片机Day03-数码管静态显示

    科技2025-08-18  21

    C51单片机Day03

    89c51引脚介绍(见课件)

    数码管显示的原理(位选和段选)

    街上的大屏幕就是由发光二极管紧凑拼接组合在一起的TX实验板用共阴LED显示器,根据16进制显示数字显示方法:静态显示方法、动态显示方法 一行复制的方法:第一步:一行代码写完之后(注意光标在这一行的最后)shify+home(shift一直不要松手)、第二步:delete、第三步:点击insert、回车后再点insert,复制完成。点亮第一个数码管并显示“1” #include<reg52.h> sbit dula=P2^6; sbit wela=P2^7; void main() { wela=1;//送位选 P0=0xfe; wela=0; dula=1;//送段选 P0=0x06; dula=0; while(1); }

    编码表code

    -随机存储器中每定义一个变量都会占用一个字节如uchar,而int占两个字节,而随机存储器共128字节,故要合理使用; code是存储在程序存储器中; 若只是写unchar table[]={},则table中的每一个数据都会在随机存储器中占一个字节,故放入在code中

    uchar code table[]={};//数组定义成编码的格式

    六个数码管一起从000000到ffffff显示(静态显示)

    #include<reg52.h> #define uint unsigned int #define uchar unsigned char sbit dula=P2^6; sbit wela=P2^7; uchar num; uchar code table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71};//数组定义成编码的格式 void delay(uint z); void main() { wela=1;//让位选先都打开 P0=0xc0; wela=0; while(1) { for(num=0;num<16;num++) { dula=1; P0=table[num]; dula=0; delay(1000); } } } void delay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); }

    中断

    见可见

    电脑当中的中断设备如图所示: 外部中断,电平触发方式如下:(以数码管和发光二极管为例)

    #include<reg52.h> #define uint unsigned int #define uchar unsigned char sbit dula=P2^6; sbit wela=P2^7; sbit d1=P1^0; uchar num; uchar code table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71};//数组定义成编码的格式 void delay(uint z); void main() { EA=1;//打开总中断 EX0=1;//开外部中断0 wela=1;//让位选先都打开11101010 P0=0xea; wela=0; while(1) { for(num=0;num<16;num++) { d1=1;//熄灭第一个二极管 dula=1; P0=table[num]; dula=0; delay(1000); } } } void delay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } //中断服务程序没有返回值 //中断函数不需要声明 void exter0() interrupt 0//中断服务子程序 { d1=0;//第一个发光二极管亮 }

    外部中断:跳变沿触发方式如下:

    #include<reg52.h> #define uint unsigned int #define uchar unsigned char sbit dula=P2^6; sbit wela=P2^7; sbit d1=P1^0; uchar num; uchar code table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71};//数组定义成编码的格式 void delay(uint z); void main() { EA=1;//打开总中断 EX0=1;//开外部中断0 IT0=1;//或者TCON=0x01;//跳变沿触发方式 wela=1;//让位选先都打开11101010 P0=0xea; wela=0; while(1) { for(num=0;num<16;num++) { d1=1;//熄灭第一个二极管 dula=1; P0=table[num]; dula=0; delay(1000); } } } void delay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } //中断服务程序没有返回值 //中断函数不需要声明 void exter0() interrupt 0//中断服务子程序 { d1=0;//第一个发光二极管亮 }

    定时器

    定时器是和中断连在一起的,定时器内部是由两个八位的寄存器构成的,刚开始装入一些数,之后启动定时器。每来一个机器周期,这个数自动加1,一直到加满为止,两个字节加满之后,它会出发一次中断。即也会进入到中断函数。
    定时器应用举例(依旧以数码管为例)
    两个16位定时器最大只能定时65ms(65535us),如果要定时1s,可采办法:让定时器进入20次中断,并且每次中断进入的时间是50ms,那么20次刚好就是1秒钟。在中断中对一个变量加1(自加1),一直加到20(每进一次中断加1、每进一次中断加1),加1之后我们不做处理,只是在子程序中判断该变量何时加到20,每加到一次20我们就让数码管变换一次。 定时器初始化程序应完成如下工作: 1.对TMOD赋值,以确定T0和T1的工作方式 2.计算初值,并将其写入TH0、TL0或TH1、TL1 3.中断方式时,则对IE赋值,开放中断 4.使TR0或TR1置位,启动定时器定时 #include<reg52.h> #define uint unsigned int #define uchar unsigned char sbit dula=P2^6; sbit wela=P2^7; sbit d1=P1^0; uchar num; uchar tt; uchar code table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71};//数组定义成编码的格式 void delay(uint z); void main() { num=0; tt=0; TMOD=0x01;//T0定时器,设置定时器0为工作方式1 TH0=(65536-50000)/256;//计时器T0的高八位 TL0=(65536-50000)%256;//计时器T0的低八位 EA=1;//打开总中断 ET0=1;//开定时器0中断 TR0=1;//启动定时器0 wela=1;//让位选先都打开11101010 P0=0xea; wela=0; dula=1; P0=0x3f; dula=0; while(1) { if(tt==20) { tt=0; num++; if(num==16) num=0; dula=1; P0=table[num]; dula=0; // delay(1000); } } } /*void delay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); }*/ //中断服务程序没有返回值 //中断函数不需要声明 void exter0() interrupt 1//定时器0的中断服务程序 { TH0=(65536-50000)/256;//装初值 TL0=(65536-50000)%256; tt++; }
    Processed: 0.019, SQL: 8