求:用单片机C语言编一位数码管的数字显示 要求可以从0变化到9
//8字段定义
//先进行宏定义,然后进行查表,输出就OK了
unsigned int i ;
#defineSEGA0x04
#defineSEGB0x08
#defineSEGC0x10
#defineSEGD0x80
#defineSEGE0x20
#defineSEGF0x02
#defineSEGG0x01//
#defineSEGDP0x40//
#defineNSEGG0x7f//无解
#defineNUM_0SEGA + SEGB + SEGC + SEGD + SEGE + SEGF
#defineNUM_1SEGB + SEGC
#defineNUM_2SEGA + SEGB + SEGG + SEGE + SEGD
#defineNUM_3SEGA + SEGB + SEGC + SEGD + SEGG
#defineNUM_4SEGF + SEGG + SEGB + SEGC
#defineNUM_5SEGF + SEGG + SEGC + SEGD + SEGA
#defineNUM_6SEGA + SEGF + SEGE + SEGD + SEGC + SEGG
#defineNUM_7SEGA + SEGB + SEGC
#defineNUM_8SEGA + SEGB + SEGC + SEGD + SEGE + SEGF + SEGG
#defineNUM_9SEGA + SEGB + SEGC + SEGD + SEGF + SEGG
const unsigned char tNUMBER[] = {NUM_0,NUM_1,NUM_2,NUM_3,NUM_4,NUM_5,NUM_6,NUM_7,NUM_8,NUM_9};
if(i==9)
{P2 = tNUMBER[9];}
else
{P2 = 0x00;}
具体问题你也描述的不详细,所以只能写到这个地方了。
程序清单如下:
#include // 51单片机头文件
#define uchar unsigned char// 宏定义,用uchar替代无符号字符型
#define uint unsigned int// 宏定义,用uint 替代无符号整数型
sbit Key = P2 ^ 7;
uchar Count = 0;
uchar code DataChar[10] = // 定义数码管的段码 '0'~'9'、'-'、' ' 'P'
{
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
};//延时N毫秒
void DelayNms( uint N )// 利用x、y作简单的自减运算,消耗单片机指令周期,达到延时的目的
{
uint x,y;
for( x=N; x>0; x-- )
for( y=110; y>0; y-- );
}
//数码管显示 // 显示方式为动态扫描,视觉暂留原理
void Display( uchar Num )// *p指向Main函数中的数组ShowNum的首地址
{
P0 = DataChar[ Num ];// 向P0赋段码值
DelayNms(2);// 短暂的延时
P0 = 0x00;// 让数码管熄灭,否则会造成数字重叠
}
void main( void )
{
while(1)
{
if( Key == 0 )
{
DelayNms(30);
if( Key == 0 )
{
Count += 1;
Count = (Count>9)? 0 : Count;
}
while( !Key );
}
Display( Count );
}
}
扩展资料
8051单片机具有如下功能:
8位CPU·4kbytes程序存储器(ROM) (52为8K)
128bytes的数据存储器(RAM) (52有256bytes的RAM)
32条I/O口线·111条指令,大部分为单字节指令
21个专用寄存器
2个可编程定时/计数器·5个中断源,2个优先级(52有6个)
一个全双工串行通信口
外部数据存储器寻址空间为64kB
外部程序存储器寻址空间为64kB
逻辑操作位寻址功能·双列直插40PinDIP封装
单一+5V电源供电
CPU:由运算和控制逻辑组成,同时还包括中断系统和部分外部特殊功能寄存器;
RAM:用以存放可以读写的数据,如运算的中间结果、最终结果以及欲显示的数据;
ROM:用以存放程序、一些原始数据和表格;
I/O口:四个8位并行I/O口,既可用作输入,也可用作输出
T/C:两个定时/记数器,既可以工作在定时模式,也可以工作在记数模式;
五个中断源的中断控制系统;
一个全双工UART(通用异步接收发送器)的串行I/O口,用于实现单片机之间或单片机与微机之间的串行通信;
片内振荡器和时钟产生电路,石英晶体和微调电容需要外接。最佳振荡频率为6M—12M。
参考资料来源:百度百科-51单片机
#include<reg52.h>
#include<intrins.h>
//p0接数码管的A~H;
uchar led[]={0xA0,0xBD,0x64,0x2C,0x39, 0x2A, 0x22,0xBC,0x20,0x28};//0-9数字摸。
unsigned int dat;
main()
{while()
{
P0=led(dat);//显示dat变量,这里只能显示数字0~9;
}
}
//程序功能:000-999显示
//2012-
//作者:李超峰
//版本:VER:1.0
//=============================
#include <reg51.h>
sbit SEG=P1^5;
unsigned char SEGTAB[10]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f};
////////延时子函数////////////////////
void delay(int x)
{
int i,j;
for(i=0;i<x;i++)
for(j=0;j<120;j++);
}
///////////主函数部分///////////////////
main(void)
{
while(1)
{
int i;
for(i=0;i<9;i++)
{
SEG=0;
P0=SEGTAB[i];
delay(1000);
}
}
}
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit wei=P1^0;
sbit duan=P1^1;
uchar num;
void delay(uint z);
char code table[]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f};
void main()
{
wei=1;
P3=0xfe;
while(1)
{
for (num=0;num<10;num++)
{ duan=1;
P2=table[num];
duan=0;
delay(500);
duan=1;
P2=table[num];
duan=0;
}
}
}
void delay(uint z)
{
uint x,y;
for(x=110;x>0;x--)
for(y=z;y>0;y--);
}
我感觉这个程序适合初学者简单易懂
要有延时子函数,一楼的缺少延时子函数
0-9数字摸,这个跟数码管是共阴、共阳有关。
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit sm1= P3^7;
unsigned char table1[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90 };
void delay_50ms(uint t)
{
uint k;
for(;t>0;t--)
for(k=0;k<6245;k++) ;
}
void main()
{
uchar i;
while(1)
{
for(i=0;i<10;i++)
{
P0=table1[i];
sm1=0;
delay_50ms(30);
}
}
}
单片机C语言如何编写?
1、首先在电脑桌面中,双击“Keil4”图标打开软件。2、点击上部菜单栏中的“工程”,在下拉菜单中选择“新建工程文件”。3、把工程文件保存到目标文件夹里去,工程文件命名可以随意写入一些数字。4、选择单片机类型,根据实际情况进行选择,例如“Atmel”中的“89C52”。5、点击“文件”,在“文件”的下拉...
C语言怎么写进单片机?
1、把C语言编译为编程器支持的语言格式,比如常用的bin,或hex等格式。\\x0d\\x0a2、如果是可在线编程的,可以用ISP直接进行烧录。\\x0d\\x0a3、如果不是可在线编程的,将单片机芯片,放入编程器,然后烧录。\\x0d\\x0a注意:编译和烧录时,都要选择和单片机芯片一致的型号,否则会出错。\\x0d\\x0a如果找不到对应的...
单片机怎么用c语言设置I\/O口输入或输出
P1M0=0;P1M1=255; \/\/all 推挽输出 而51单片机的所有IO引脚,在启动后默认都是1。因此,如之前没有对此引脚进行过置0操作的话,可以直接读该引脚。但为了保险起见,也为了使程序通用、可移植,最好在读取之前对此引脚置1。
请问单片机的C语言怎么编写啊?
单片机C语言编译错误:requires ANSI-style prototype,是编译过程错误造成的,解决方法如下:1、编程前保存文件,单击文件菜单,下拉菜单中选择保存按钮。2、输入文件名,文件类型选择为.c类型。3、然后开编辑,首先,定义头文件,头文件一般为stdio.h。4、接着,定义主函数,主函数名为main。5、然后,...
求 单片机简单的C语言程序例子(越多越好)
6. 汇编源程序ORG 0START: CLR P1.0LCALL DELAYSETB P1.0LCALL DELAYLJMP STARTDELAY: MOV R5,#20 ;延时子程序,延时0.2秒D1: MOV R6,#20D2: MOV R7,#248DJNZ R7,$DJNZ R6,D2DJNZ R5,D1RETEND7. C语言源程序#include <AT89X51.H>sbit L1=P1^0;void delay02s(void) \/\/延时0...
单片机编程用汇编好还是C语言好?
单片机编程,C语言编程但很好。大致分成三类:机器语言、汇编语言、高级语言。机器语言由于繁琐容易出错,大部分用户已经不再便用。1.单片机汇编语言 汇编语言是一种符号语言,它使用文字助记符来表示机器指令。它是最接近机器代码的语言。它的主要优点是占用资源少,程序执行效率高。由于每条指令对应于一个...
如何写出高效的单片机C语言程序代码
说明:位操作只需一个指令周期即可完成,而大部分的C 编译器的“%”运算均是调用子程序来 完成,代码长、执行速度慢。通常,只要求是求2n 方的余数,均可使用位操作的方法来代替。(2) 平方运算 N=Pow(3,2) 可以改为N=3*3 说明:在有内置硬件乘法器的单片机中(如51 系列),乘法运算比求...
单片机c语言编程100个实例
一个中断控制器;(IE,IP) 针对AT89C52单片机,头文件AT89x52.h给出了SFR特殊功能寄存器所有端口的定义。 C语言编程基础: 1. 十六进制表示字节0x5a:二进制为01011010B;0x6E为01101110。 2. 如果将一个16位二进数赋给一个8位的字节变量,则自动截断为低8位,而丢掉高8位。 3. ++var表示对变量var先增一;var...
单片机编程可以用c语言吗
c语言也可以,在以前汇编很流行的,但是人们发现汇编代码量太大,小程序就没什么,到了大的程序其大量的代码,让程序员调试都很头疼的,随后就发展了基于汇编的高级语言--c,而且想对于汇编,c的优势非常明显,可移植性好,直观,代码模块化,调试方便,接近人类语言等等的优点,当然也有缺点啊,最突出...
c语言与单片机c语言的区别急求
单片机C语言编程通常需要更直接地与硬件交互,编写与硬件相关的代码,如控制GPIO端口、处理中断、进行低功耗设计等。这使得单片机C语言编程在某些情况下比通用C语言更复杂。然而,由于其专用性和针对性,开发者可以更高效地利用单片机的资源,实现特定的功能。总的来说,C语言和单片机C语言在通用性与专用性...
斐盼曲安: /*******************************************************************************************************//*******************************************************************************************************/#include //通用89C52头文件 sbit AA=P3^4;//数码管显示用IO端...
红桥区18058333240: 单片机c语言,设计一个计数器,中断一次,数码管数字从0起加1, 4位的数码管 - ?
斐盼曲安: 我直接拿一个现成的例子吧.这个是用定时器中断的,你可以改成外部中断.这是8位的数码管,对4位稍加修改就行了.#include <reg52.h> //包括一个52标准内核的头文件#include<intrins.h> /****************************声明函数********************...
红桥区18058333240: 单片机AT89C51用C语言编,两个按钮分别控制一个数码管加减数,最好用中 - ?
斐盼曲安: #include<reg51.h>#define uchar unsigned char uchar distab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00}; //0到f uchar dat; void ext0() interrupt 0 { dat++; dat%=10; P1=distab[dat]; } ext1() interrupt 2 ...
红桥区18058333240: 单片机动态数码显示0 - 99,没有锁存器,怎么用c语言写,求指点. - ?
斐盼曲安: 应该是这样的 你先打开段选 然后输入你要显示的数字,关闭段选 打开位选 选择用哪一个数码管来显示 然后关闭位选 这个程序应该是这样的吧 dula=1; p0=table[a]; dula=0; wela=1; p0=0xfe; wela=0; delay(5) ; 这之后再选择别的数码管点亮 这样就达到动态显示的效果了 前面说错了 有锁存器的话是可以用同一个io口就能达到动态显示的目的了
红桥区18058333240: 如何用C语言实现数码管显示数字12345和HELLO - ?
斐盼曲安: 看一下我编的123456 的显示,是共阴极数码管接P1口 ,用了两个74HC573锁存器段选位选,HELLO的编码表 你自己编一下,然后定义一个数组就可以了.我也刚学 ,加油! #include<reg52.h> #define uint unsigned int #define uchar unsigned...
红桥区18058333240: 用c语言编写一个计数器(单片机为51型,数码管为共阴)要求有三个按键分别控制停止、加、减 - ?
斐盼曲安: 一看到你说是计数器,又看到你要求有停止功能,意思是把Timer改为计数器,然后可以通过一个键停止计数对吧?如果这样的话挺简单的,51单片机的计数器io口记得好像是P3^0和P3^1,但不管怎么,首先设置TMOD,将C/T位置1,这就改为计数器了,然后可以编写函数来对一个变量进行加减;同样利用51单片机的外部中断也可以实现计数功能,打开外部中断开关,在外部中断服务函数对计数变量进行加减;最简单的,直接利用io口高低电平变化来进行计数,编写if函数,只要某个io口电平变化了,就对计数变量进行加减.如果你对这个有点陌生,那么回复我一起讨论或者我可以帮你写程序.希望我的回答能帮助到你.
红桥区18058333240: C语言单片机代码 数码管动态显示 - ?
斐盼曲安: 这里的16个元素代表的是从十六进制数0~9、A、B、C、D、E、F的段码,根据什么来填这些数组元素?那就要看你设计程序时定义数组的作用才能确定.table[1]对应的元素为0x06,是十六进制数,转换成二进制数是00000110B,分别对应于数码管的Dp、g、f、e、d、c、b、a 脚,所以在共阴数码管上点亮b、c两段,显示的是数字1,其它同理.
红桥区18058333240: 怎么用单片计C语言编出两个按键控制一位数码管,一个按健控制0至9就是按一下加1.另一个按键控制归零,... - ?
斐盼曲安: 很简单啊.按键中断控制标志位加一或清零就行了.
红桥区18058333240: 用单片机控制单个数码管,如何控制?写出关键的c代码 - ?
斐盼曲安: unsigned char code SMGTAB[]={0X5F, //0 数码管译码表 0X0C, //1 0X6B, //2 0X2F, //3 0X3C, //4 0X37, //5 0X77, //6 0X0D, //7 0X7F, //8 0X3F}; //9 unsigned char smg;//显示缓冲器 …… P1.2=1;消隐 P0=SMGTAB[smg];//译码 P1.2=0;显示 ……
红桥区18058333240: 单片机驱动数码管C程序 - ?
斐盼曲安: 额...这个问题...首先要我们要分析一下74LS164的工作方式,是有一出一,还是有1出0..还是全一出1.了解了工作方式后 我们先要将单片机与之相连的管脚进行初始化.全设成输出.然后在程序里进行置位是置1还是置0.在点数码管的时候要看清楚你...