8个数码管同时显示不同字符的单片机电路设计

单片机应用: 51 单片机应用:8 只数码管同时显示多个不同字符
设计要求
单片机控制 8 只数码管,同时显示 8 个字符。例如,从左至右显示 “12345678” ,接着显示“23456781” ,在接着显示“34567812” ,…… “81234567” “12345678” , ,
分析及方案设计 本题可以采用扩展 I/O 口或直接用单片机自身的 I/O 口的方法实现。 为节 分析及方案设计: 及方案设计 省硬件设施并使电路连线尽量简单,采用直接使用单片机自身 I/O 口的方式,8 个数码管同 时显示数字则需采用动态显示方法,初步设定以 P0 口给出数码管显示字段,P1 口选中某一 时刻动态点亮的数码管。 软件设计可以有以下几种方案: a) 将全部显示状态列出,放在主程序中不断循环 b) 将显示状态放入 8 个数组中,每个状态循环一次后主程序重新开始循环 c) 只设置两个数组,其中一个取值不变,为正序的从 1 到 8 的共阳极数码管段码,另一 个数组中的数值不断被修改,即每次显示状态改变的时候都相应改变一次,如从 12345678 的段码改为 23456781 的段码。 从上述方案可以看出, 若设置太多的数组或列出所有显示状态, 程序虽然清晰易懂但占 用程序存储空间明显较大,且用 delay()函数延时的话会不断占用 CPU;用两个数组和两 个定时器虽然算法略复杂,但程序可以达到最简化。 详细的方案说明: 详细的方案说明: 1) 采用数码管动态显示方法。 2) 8 个数码管由 P3 控制位选,即决定某一时刻哪一个数码管亮,由 P0 发出的总线控制显 示的段码。 3) 定时器 T0 和 T1 同时工作,定时时间均为 0.5 毫秒,采用方式 1 定时,每次溢出后由软 件重装初值。 4) 设置中间变量 temp, 用于不断左移并给 P3 赋值; 数组 display[]为 code 即取之不变的 数组,数组 show[]中的取值变化。 5) 每次 T0 计数溢出时,temp 左移一次,相应的 P3 左移一次,数码管由第 i 个点亮变为 第 i+1 个点亮, 与此同时赋给 P0 口的值由 show[i]变为 show[i+1], 达到动态显示的效 果。 6) 定时器 T1 也是每 0.5 毫秒计数溢出一次,但只有到 1 秒时才执行定时器 1 中断中修改 数组 show[]取值的程序, 用变量 t 记录 T1 溢出的次数, 达到 200 次时数组 show[]中的 内容开始进行修改并且 t 清零。 假设 showp[0]到 show[7]中的取值分别为共阳极数码管 显示 1、2、3、4、5、6、7、8 的段码,修改后分别变为显示 2、3、4、5、6、7、8、1 的段码,这样显示状态自然发生了改变。 7) 修改 show[]中的取值为本程序中细节最多的部分, 设置无符号长整型变量 n (无符号长 整型变量的取值为 0 到 4294967295,按 1 秒增加 1 的速度计算,在实验范围内不会溢

出)为显示状态总共改变的次数,易知 show[0]的值为 display[p],p 为 n 除以 8 的余 数,从此处开始循环给 show[]重新赋值。 硬件电路设计:

程序: #include<reg51.h> #include<intrins.h> int i,t,m,a; unsigned long n; unsigned char code display[]={0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80}; unsigned char show[]={0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80}; //数组 display 的取值不变,数组 show 的取值每次显示状态改变时均改变一次,T0 中断程序只管流水使得 位选从 0 到 7 时依次显示 show[]中从 0 到 7 的取值// unsigned char temp; //定时器 T1 中断程序控制数组 show[]取值的改变, 使得现实状态相应改变// unsigned char middle; //i 用于 T0 的计时循环,取值从 0 到 7,控制 P1 口 位选的流水;t 用于 T1 的循环,控制每个显示状态(12345678 或 23456781 等)的时间,1s 改变一次,即 t 的取值从 0 到 200// //n 记录显示状态改变的次数,每次改变时 m 从 0 到 7 为数组 show 循环赋值,a 为中间变量,保证第 n 次显示状态时 show[]的第 0 个取值恰好 为 n 除以 8 的余数被记录下来// void main() { TMOD=0x11; //设置定时器 T0、T1 均为方式 1 工作 TH0=0xee; //写入定时器 T0 的高 8 位 TL0=0x00; //写入定时器 T0 的低 8 位 TH1=0xee; //写入定时器 T1 的高 8 位 TL1=0x00; //写入定时器 T1 的低 8 位 EA=1; //打开总中断

ET0=1; ET1=1; TR0=1; TR1=1; i=0; temp=0x01; P3=temp; P0=show[i]; while(1) { ; } } void t0int(void) interrupt 1 { TH0=0xee; TL0=0x00; i++; if(i==8) { i=0; } temp=_crol_(temp,1); P3=temp; P0=show[i]; 个数码管显示 show[i] }

//定时器中断允许位置 1 //定时器开始工作

//给变量设定初值 //第一个数码管开始显示数字 1 //空的循环作为主程序,中断返回后回到主程序

//定时器 T0 中断服务程序 //给 T0 重新装入 16 位初值,重新开始计数 //预备动态点亮下一个数码管 //判断 i 的数值,若超过 0 到 7 的范围,清零

//给即将动态点亮的数码管位选加高电平 //位选从 P3 送出,数码管被选中 //P0 发送总线信息为改点亮的数码管的编码,第 i

void t1int(void) interrupt 3 //定时器 T1 的中断服务程序,内容为数组 show[]的 改写,从而改变显示状态 { TH1=0xee; TL1=0x00; //定时器 T1 重新装初值 if(t<200) { //判断 t 的数值,若 t<200,即没到 1 秒钟,显示状 态不改变,t 增一计数;若 t 到 200,开始修改显示状态 t++; } else { t=0; //定时器 T1 计数溢出 200 次,到达时间 1 秒钟,t 清零重新开始 1 秒钟计时 n++; //n 为总的显示状态改变次数,每次改变显示状态,

n加1 a=n%8; //a 为 n 除以 8 的余数,记录不断变化数组 show[] 应取的第一个值在不变的数组 display[]中的位置 for(m=0;m<8;m++) { if(a<8) // 若 a 小 于 8 , display[a] 赋 值 给 show[0],display[a+1]赋值给 show[1]... { middle=display[a];//middle 做中间变量,在数组 display[]和 show[] 之间传递数值 show[m]=middle; //每次赋值之后 a 加 1 a++; } else //a 的值需要不断进行判断, a 到达 8 则将 a 清零, 若 否则数组出错 { a=a-8; middle=display[a]; show[m]=middle; a++; } } } }


相关文档

51单片机应用:8只数码管同时显示多个不同字符
8只数码管动态显示多个不同字符
单片机12-1数码管滚动显示和字符显示(任务8)
单片机C语言程序设计:8 只数码管滚动显示数字、字符
基于单片机的数码管循环显示的电路设计
单片机12-1数码管滚动显示和字符显示(任务8)1
读一篇文章_作一个单片机电路_八_基于AT89C2051串口的LED数码管显示电
基于ATmega48单片机动态扫描多位数码管显示电路设计
单片机课程设计-8位8段LED数码管动态扫描显示
电脑版