要在51单片机开发板上面实现的效果:
1、数码管固定显示"--8051--"约5s时间。
2、闪烁显示"--8051--"5次。
3、向左移动走字显示"--8051--"3遍。
4、重复执行1~3。
实现代码:(c语言)
#include <REGX51.H> #include <intrins.h> typedef unsigned int uint; typedef unsigned char uchar; uchar count=0; //定时器计数 uint flag=0; //开始为 第一小题 void Timer0Init(){ //50毫秒@12.000MHz TMOD &= 0xF0; //设置定时器模式 TMOD |= 0x01; //设置定时器模式 TL0 = 0x00; //设置定时初值 TH0 = 0x4C; //设置定时初值 TF0 = 0; //清除TF0标志 TR0 = 1; //定时器0开始计时 ET0=1; //打开小开关 EA=1; //打开总开关 } void Delay(unsigned int ms) { /*延时函数 参数:延时的毫秒数*/ while(ms--){ unsigned char i, j; _nop_(); i = 2; j = 199; do{ while (--j); } while (--i); } } void Display(int position,char value){ /*显示模块 参数:字符串*/ switch (position){//位选 case 8:P2_4=0;P2_3=0;P2_2=0;break;//第一位 case 7:P2_4=0;P2_3=0;P2_2=1;break;//第二位 case 6:P2_4=0;P2_3=1;P2_2=0;break;//第三位 case 5:P2_4=0;P2_3=1;P2_2=1;break;//第四位 case 4:P2_4=1;P2_3=0;P2_2=0;break;//第五位 case 3:P2_4=1;P2_3=0;P2_2=1;break;//第六位 case 2:P2_4=1;P2_3=1;P2_2=0;break;//第七位 case 1:P2_4=1;P2_3=1;P2_2=1;break;//第八位 } switch(value){//段选,可以用数组来代替这里的选择 case '0': P0=0x3F; break; //数值0 case '1': P0=0x06; break; //数值1 case '2': P0=0x5B; break; //数值2 case '3': P0=0x4F; break; //数值3 case '4': P0=0x66; break; //数值4 case '5': P0=0x6D; break; //数值5 case '6': P0=0x7D; break; //数值6 case '7': P0=0x07; break; //数值7 case '8': P0=0x7F; break; //数值8 case '9': P0=0x6F; break; //数值9 case'a': case 'A': P0=0x77; break; //数值a 两个case兼容大小写 case'b': case 'B': P0=0x7C; break; //数值b case'c': case 'C': P0=0x39; break; //数值c case'd': case 'D': P0=0x5E; break; //数值d case'e': case 'E': P0=0x79; break; //数值e case'f': case 'F': P0=0x71; break; //数值f case '-': P0=0x40; break; //数值- case '.': P0=0x80; break; //数值. case ' ': P0=0x00; break; //无显示 } Delay(1);P0=0x00;//消影 } void main(){ char display[8]="--8051--"; int i,j=5,k=3,b; int num=3; Timer0Init();//初始化,并开启定时器 for(num=0;num<3;num++){ TR0 = 1;//启动定时器 while(flag<5){//显示5s for(i=1;i<=8;i++){ Display(i,display[i-1]); } } TR0 = 0;//关闭定时器 count=0,flag=0;//清空计数,不影响下次循环的显示时间 for(j=0;j<5;j++){ //闪烁5次 for(b=1;b<50;b++) for(i=1;i<=8;i++) Display(i,display[i-1]); for(b=1;b<50;b++) for(i=1;i<=8;i++) Display(i,' '); } for(k=0;k<3;k++){ //走字显示3遍 for(i=1;i<=8;i++) for(b=1;b<500;b++) Display(i,display[i-1]); } } while(1);//让程序停在这里 } //定时器中断函数 void interrupt_T0()interrupt 1 { TL0 = 0x00; //重新设置定时初值 TH0 = 0x4C; //重新设置定时初值 count++; if(count==20){//1秒时间到了 count=0; flag++; } }
只要修改main函数里面字符串数组内容就能修改数码管显示的东西了
开发板电路图
数码管部分:
138 译码器部分:
效果图:
汇编语言的代码有空会补上~~~~