这次做的是用单片机控制数码管显示学号,比用纯数字电路简单方便了许多。相信会有更多的人能够顺利完成。
其实数码管只是LED的一种有序组合,在忘记引脚排序的情况下可以用万用表的通断档来进行测量,从而区分出哪个引脚对应着数码管的哪段LED,同时也可以知道该数码管是共阳还是共阴的。
数码管分为共阳数码管和共阴数码管,区别仅在于他们的内部电路连接方式不同:
如上图
本次用到的单片机还是上次焊接的最小系统板(也可以使用面包板,这个分分钟就能搭建出一个电路来了),建议大家还是自己多动手实践一下,去吧电路焊接一下,这个也是个基本的技能之一。
下面是一个基本的面包板内部结构图:
本次用到的单片机引脚是P0口,如下绿色方框内的部分,共8个IO口:
硬件部分连线如下(这里的连接方式决定了后面程序编写时的编码部分):
一般能在软件中修改的东西最好别去动硬件,除非硬件有问题。
编码举例(仅供参考):
下面是程序部分:
由于这次的硬件比较简单,我就不搭建了啊,你们还是要去练习练习哈!
有点晚,我也该睡觉了!
修改segment=code7[i];那行
定值输出,当i=0表示输出最低位,当i=5表示输出最高位
如要输出定值325981
修改代码
dislpay()
{
uchar i,t,segment;
uint n=325981//n为要输出的正整数值
for(i=0;i6;++i)
{
segment=code7[n%10];
n/=10;
lchclk=0;
...//原代码不变即可
}
}
当然也可将需要表示的正整数n作为display函数参数来做,更具有通用性
对于共阳极数码管,只要使数码管的a,b,c,d,g段引脚上送入低电平,其他段引脚送入高电平即可显示3,对于a,b,c,d,e,f,g,dp顺序排列的数据线,控制数据为00001101(B)或0x0d(H)。
#includereg51.h
#define uchar unsigned char
uchar code ledtab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};//共阳级数码管码表0-9
uchar time,scanled;
uchar disdat[2];
bit flag=0;
void dischg() //显示码转换
{
disdat[0]=s_dat/10; //秒转换
disdat[1]=s_dat%10;
}
void t0isr() interrupt 1 //秒计时
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
time++;
if(time=20)
{
time=0;
s_dat++;
flag=1;
}
}
void t1isr() interrupt 3 //显示控制
{
TH1=(65536-4000)/256;
TL1=(65536-4000)%256;
duan=1;
P0=0xff; //消隐
duan=0;
wei=1;
P0=1scanled; //位码
wei=0;
duan=1;
P0=disdat[scanled];
duan=0;
scanled++;
scanled%=2; //共8位显示
}
main()
{
TMOD=0x21; //定时器0和1都为模式1
TH0=(65536-50000)/256; //定时器0,50毫秒中断一次
TL0=(65536-50000)%256;
TH1=0xfd;
TL1=0xfd;
SCON=0x40;
TR1=1;
TR0=0;
ET0=1;
EA=1;
scanled=0;
time=0;
dischg();
while(1)
{
if(flag)
{
flag=0;
SBUF=s_dat;
while(TI==0);
TI=0;
}
}
}
楼上已经把两点都指出了:
①头文件中有重复定义。你看看是不是不慎把STC15.h中的内容复制粘贴过,出现了重复内容。
②源程序中有汉字全角符号。例如粗略一眼就能看到第64行的左右小括号不正常、是全角的。你需要自己检查一遍书写…
//实验用程序 测试通过 STC15F2K60S2 @11.0592MHZ
#include "reg51.h"
#include "intrins.h"
typedef unsigned char BYTE;
typedef unsigned int WORD;
sfr ADC_CONTR = 0xBC;
sfr ADC_RES = 0xBD;
sfr ADC_LOW2 = 0xBE;
sfr P1ASF = 0x9D;
BYTE ch = 0; //ADC回路数
/*----------------------------
延时
----------------------------*/
void Delay(WORD n){
WORD x;
while (n--){
x = 5000;
while (x--);
}
}
/*----------------------------
ADC中断
----------------------------*/
void adc_isr() interrupt 5 using 1{
ADC_CONTR = !0x10;
P2=ADC_RES;
ADC_CONTR = 0x80 | 0x00 | 0x08 | ch;
}
/*----------------------------
初始化ADC
----------------------------*/
void InitADC(){
P1ASF = 0xff;
ADC_RES = 0;
ADC_CONTR = 0x80 | 0x00 | 0x08 | ch;;
Delay(2);
}
void main(){
InitADC(); //初始化ADC
IE = 0xa0;
while (1);
}
stc15单片机的数码管实验的介绍就聊到这里吧,感谢您花时间阅读,谢谢。
本文标签:stc15单片机的数码管实验