51单片机低电平复位电路测量低电平时间,数码管上只会显示45116,想不出哪里有问题,诚心求教

06-3006-3006-3006-3006-3006-30
也许你感兴趣在51单片机中1位位数码管显示的编程怎么写啊,_百度知道
在51单片机中1位位数码管显示的编程怎么写啊,
我有更好的答案
下面这个程序是4x4距阵键盘,LED数码管显示,一共可以到0-F显示,你可以稍微改一下就可以实现你的功能了,如还有问题请发信息,希望能帮上你!#include&at89x52.h&unsigned char code Dig[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
//数码管 0-F 代码
//设置全局变量k 为键盘的键值/************************************键盘延时函数****************************/void key_delay(void)
//延时函数{ for(t=0;t&500;t++);}/************************************键盘扫描函数******************************/void keyscan(void)
//键盘扫描函数{
P2 = 0xf0;
//键盘初始化 if(P2!=0xf0)
//有键按下? {
key_delay();
if(P2!=0xf0)
//确认真的有键按下?
//使行线P2.4为低电平,其余行为高电平
key_delay();
//a作为缓存
switch (a)
//开始执行行列扫描
case 0xee:k=15;
case 0xde:k=11;
case 0xbe:k=7;
case 0x7e:k=3;
default:P2 = 0
//使行线P2.5为低电平,其余行为高电平
switch (a)
case 0xed:k=14;
case 0xdd:k=10;
case 0xbd:k=6;
case 0x7d:k=2;
default:P2 = 0
//使行线P2.6为低电平,其余行为高电平
switch (a)
case 0xeb:k=13;
case 0xdb:k=9;
case 0xbb:k=5;
case 0x7b:k=1;
default:P2 = 0xf7;
//使行线P2.7为低电平,其余行为高电平
switch (a)
case 0xe7:k=12;
case 0xd7:k=8;
case 0xb7:k=4;
case 0x77:k=0;
} }}/****************************** ***主函数*************************************/void main(void){
while(1) {
keyscan();
//调用键盘扫描函数
//查找按键对应的数码管显示代码
case 0:P0=Dig[0];
case 1:P0=Dig[1];
case 2:P0=Dig[2];
case 3:P0=Dig[3];
case 4:P0=Dig[4];
case 5:P0=Dig[5];
case 6:P0=Dig[6];
case 7:P0=Dig[7];
case 8:P0=Dig[8];
case 9:P0=Dig[9];
case 10:P0=Dig[10];
case 11:P0=Dig[11];
case 12:P0=Dig[12];
case 13:P0=Dig[13];
case 14:P0=Dig[14];
case 15:P0=Dig[15];
} } }/**********************************end***************************************/
采纳率:94%
来自团队:
为您推荐:
其他类似问题
51单片机的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。后使用快捷导航没有帐号?
请完成以下验证码
查看: 4924|回复: 3
刚学51单片机,在做用定时器中断控制数码管显示时不知程序问题出在哪,请教大家
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
#include&reg52.h&
#define uchar unsigned char
#define uint unsigned int
uchar table1[]={0xbf,0x86,0x5b,0xcf,0xe6,0xed,0xfd,0x07,0xff,0xef};& & & & //0-9
void&&dis(void)& && & //中断开关函数
EA=1;& && && &&&//开总中断开关
ET0=1;& && && & //开定时器中断0
TMOD=0x01;& && && && && &//定时器0工作方式1
TH0=()/256;& & //设初始值& & 50ms
TL0=()%256;
TR0=1;& && && &
EX0=1;& && &//开外部中断0
ET0=0;& && &//低电平有效
void&&main()
P2=0x00;& && && & //选择第一位数码管
& & & & {&&if(t==20)
& & & && & { t=0;
& & & && && &P0=table1[num];& & //P0控制数码管显示数字0-9
& & & && && &num++;
& & & & & & & &&&if(num=10)
& & & & & & & &&&num=0;
& & & && &&&}& & & &&&
void&&time0()&&interrupt& & 1
TH0=()/256;
TL0=()%256;
void&&int0() interrupt& & 0
P0=table1[0];& && && &外部中断0对数码管清零
程序编译通过,但是下到单片机里运行时数码管只显示8,按p32时显示0,松开还是显示0.不知道问题出在哪,请各位帮帮分析一下
在线时间7 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
if(num=10)改为& &&&if(num==10)
num 和t初始化的时候赋值
迈向工程师
在线时间7 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
外部中断处理程序加入清中断标志
迈向工程师
在线时间25 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
ET0=1;//低电平有效***IT0吧
EEWORLD 官方微信
Powered by51单片机学习之4-数码管
单片机&嵌入式
单片机应用
嵌入式操作系统
学习工具&教程
学习和开发单片机的必备工具
(有问必答)
(带你轻松入门)
电子元件&电路模块
当前位置: >>
>> 浏览文章
51单片机学习之4-数码管
一、数码管工作原理
数码管显示亮度高,响应速度快,可以在一些比较差的环境中使用。有1位、2位、4位、8位连体等。。。也有专用于显示时间的数码管。
如图,一位数码管由8个二极管构成,7个构成&日&字型,1个是小圆点。分共阴和共阳。&共阴:所有二极管的负极连接在一起,接到电源负极。共阳:所有二极管的正极连接在一起,接到电源正极。(图(a)引脚画错了。)
驱动的原理都很简单,如共阳型数码管的驱动。图(b)右边的电路图可以看出,所有的二极管正极都接在电源正极,a、b、c、d、e、f、g、dp都接在单片机的IO口上,在《51单片机复习笔记1》:&中介绍过驱动二极管的原理,所以这里只需要在相应的二极管负极给低电平即可让相应的二极管发光。
这里补充一下,为什么给高电平二极管就不亮,给低电平就亮呢。因为单片机是TTL电平,也就是说高电平即输出5V,低电平就不输出电压0V,二极管的正极接在电源的正极那就是5V,那么二极管的负极如果也给高电平的话,那么就相当于在二极管的负极也接到了5V,二极管两端都是5V&没有电势差,就相当于没有通电一样,自然不会发光。给低电平即0V,那么二极管就有一个5V的电势差且是正向偏置,二极管自然就发光了,共阴型恰好相反。
&&&看下图(设共阳型),假如我们要让数码管显示&1&,那么只需要给b、c段的二极管低电平,其他为高电平即可让数码管显示&1&。假如我们要让数码管显示&2&,那么只给a、b、g、e、d低电平即可让数码管显示&2&。要显示什么,只给相应的发光二极管低电平即可。
&&那么在实际编程中应该怎么写程序呢。
我们将a、b、c、d、e、f、g、dp八个引脚接到单片机的P1口,P1^0&a、P1^1&b.....P1^7&dp。画红框的是低四位。那么如果要显示2。
P1^0&=&a&=0、P1^1&=&b&=&0、P1^6&=&g&=&0、P1^4&=&e&=&0、P1^3&=&d&=&0&&
剩余的为1那么就是:&=&0xA4&
程序代码中将0xA4赋值给P1即可,如&P1&=&0xA4;&&看图。
& 由于数码管需要占用单片机的IO口很多,所以一般会搭配芯片来扩展IO口。《51单片机复习笔记1》有介绍该芯片的使用方法。驱动原理一样。
数码管显示方式有两种:
静态显示:其实和上面一样,如P1=0xA4;&那么P1一直维持0xA4那么数码管的每一段二极管的状态都会保持字形不变。变动P1的电平状态才会改变新字形。优点是占用CPU时间少。缺点是占用IO口多硬件设计复杂,特别是控制多位数码管时尤为占用IO口,成本较高。
动态显示:动态其实就是利用发光二极管的余晖和人眼视觉暂留作用。控制多位数码管时,将所有数码管的段选并联在一起,由位选线控制是哪位数码管接受段选编码。如下图一样。
P0组是并联所有数码管的段选。P2^6、P2^7选择哪位数码管。我要显示520,那么&&&&&首先选中第一位数码管,然后送数字5的段编码控制段选的P0口。
然后再选中第二位数码管,再送数字2的段选编码给P0,这时候第一位数码管虽然断电,但是二极管并没有瞬间熄灭,所以还有余晖保持字形。
继续再选中第三位数码管送数字的段选编码给,这时候第一、第二位数码管虽然都断电,但由于切换速度太快,余晖仍没有完全熄灭就造成三位数码管同时显示不同的数字字型的假象。
上图是六位共阴型数码管搭配两片74HC573芯片的电路图。L2是控制数码管的a、b、c、d、e、f、g、dp,L3是选择要显示的数码管。
下图是74HC573芯片接在单片机上的10个IO口。(完美诠释74HC573的实用性,哈哈~)
下图是编码列表
利用数码管显示秒表程序源码:
/*****************************************
*&说明:动态显示方式控制数码管。秒表源码
*&设计者:L、QQ:
*&开发板:DB-51&Ver2.1
*&数码管:六位共阴型
******************************************/
#include&reg52.h&
#include&intrins.h&
#define&uint&unsigned&int
#define&uchar&unsigned&char
sbit&dual&=&P2^6;//&控制&L2的74HC573芯片是否锁存
sbit&weal&=&P2^7;//&控制&L3的74HC573芯片是否锁存
//&数码管显示数字的编码&table[0]&就是显示&0
uchar&code&table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
//&要显示指定数字的数码管
uchar&code&tablewe[]={
0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
#define&Time&50000
#define&YsTime&1
void&ShowTime(uchar&bai,&uchar&shi,&uchar&ge);
void&delay(uint&z);
/********&主函数&********/
void&main()
uchar&b,&s,&g;
TMOD&=&0x01;//&选择定时器工作方式&1
TH0=(65536-Time)/256;//&(65536&-&(5/12))))/256&;
TL0=(65536-Time)%256;//&(65536&-&(5/12))))%256&;
EA=1;&&//&开启总中断
ET0=1;//&开启定时器&0&中断
TR0=1;//&启动定时器&0
&&&if(aa&==&20)//&50ms*20&=&1000ms&=&1s
&&&aa&=&0;
g&++;&//&个位自增
if(g&==&10)
s++;&&&//&十位自增
if(s&==&10)
{//&百位自增
s&=&g&=&0;
if(b&==&10)
b&=&s&=&g&=&0;
&&&ShowTime(table[b],&table[s],&table[g]);
/********&数码管显示函数&********/
void&ShowTime(uchar&bai,&uchar&shi,&uchar&ge)
//&显示百位
delay(YsTime);
&&&//&显示十位
delay(YsTime);&&
&&//&显示个位
delay(YsTime);
/********&延时函数&********/
void&delay(uint&z)
for(x=z;x&0;x--)
for(y=110;y&0;y--);
/********&中断函数&每50ms触发一次&********/
void&timer0()&interrupt&1&
TH0=(65536-Time)/256;
TL0=(65536-Time)%256;
也有采用BCD-7段译码芯片:共阳型的74LS48、74LS49、CD4511。共阴的74LS46、74LS47、CD4513。
霖锋教程中的是两个四位一体共阴型数码管,通过一片74HC573芯片控制两个四位数码管的段选,通过一片74HC138芯片选择位数码管(即位选)。
74HC138的引脚说明:
先把一些简单的引脚说一下:
GND接地、VCC接电源正极。
E1、E2:低电平有效,如果其中一个为高电平则无法操控芯,Y0&&&Y7&输出全高电平。
E3:高电平有效,如果为低电平则无法操控芯片,Y0&&&Y7&输出全高电平。
如果要控制芯片首先是&VCC和GND接电源,E1、E2低电平或接低,E3高电平。
下面这三个引脚是比较重要的:
A组IO口是输入,Y组端口是输出。
A0、A1、A2是用来控制Y0&&&Y7&输出电平状态,往里面输入八进制数即可指定Y0&&&Y7中其中一个为低电平。例如想要&Y5&为低电平,那么5的八进制为101,只需要给&A2&=&1、A1=0、A0=1,即可让Y5为低电平。想要Y3为低电平,那么3的八进制为011,只需要给A2&=&0、A1&=&1、A0&=&0&即可。
记住,A组IO只是控制Y组的某一IO输出低电平而已,其余都为高电平。
教程中有八位数码管,所有刚好Y组全部都用上。
【】【】【】【】
上一篇:下一篇:
CopyRight @
单片机教程网 51hei.com , All Rights Reserved急!!!求单只数码管循环显示0~9的代码解释,数码管是共阳极的。万分感谢!!!_百度知道
急!!!求单只数码管循环显示0~9的代码解释,数码管是共阳极的。万分感谢!!!
代码如下:
#include&reg51.h&
#include&intrins.h&
#define uchar unsigned char
#define uint unsigned int
uchar code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
void DelayMS(uint x)
我有更好的答案
#include&reg51.h&//单片机寄存器相关的文件#include&intrins.h&//具有空指令的文件#define uchar unsigned char//宏定义 以后用uchar替代unsigned char#define uint unsigned int
//宏定义作用同上uchar code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};//数码管0-9的段码值//延时void DelayMS(uint x)//延时函数{//定义变量数值范围0-255while(x--) for(t=0;t&120;t++);}//主程序void main() //主函数{uchar i=0; //定义变量i 并且i=0P0=0x00; //P0口=0x00 P0口全部为低电平while(1)
//主循环{P0=~DSY_CODE[i];//P0=取反的数码管段码值i=(i+1)%10;
//i =i自加1 个位的数DelayMS(300);
采纳率:28%
1条折叠回答
为您推荐:
其他类似问题
阳极的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。

我要回帖

更多关于 单片机低电平复位电路 的文章

 

随机推荐