c51单片机驱动三位8段数码管显示0.00-9.99,c语言程序
51单片机数码管0到99循环程序代码
51单片机数码管0到99循环程序代码1. 概述在嵌入式系统的开发中,数码管是一种常见的输出设备,可以用于显示数字、字符等信息。
而51单片机是一种广泛应用的微控制器,其结合了强大的功能和灵活的应用,能够很好地驱动数码管。
本文将介绍如何使用51单片机编写一个循环显示0到99的程序,通过数码管输出这些数字。
2. 电路连接我们需要连接51单片机和数码管。
通常我们使用的是共阴数码管,其连接方式如下:- VCC连接到5V电源- GND连接到GND- DIO(数据输入/输出)连接到51单片机的IO口3. 程序设计下面是一个简单的C语言程序设计,用于控制数码管显示0到99的数字。
```c#include <reg51.h>sbit DIO = P2^0; // 数码管数据输入/输出sbit CL = P2^1; // 数码管片选信号unsigned char code numCode[10] = { 0xc0, // 00xf9, // 10xa4, // 20xb0, // 30x99, // 40x92, // 50x82, // 60xf8, // 70x80, // 80x90 // 9};//延时函数void delay(unsigned int i) {unsigned int j,k;for (j=i;j>0;j--)for(k=110;k>0;k--);}void display(unsigned char num) { CL = 1; //关闭片选DIO = numCode[num / 10]; //十位 delay(2);CL = 0;DIO = 0xff; //消隐delay(2);CL = 1; //关闭片选DIO = numCode[num 10]; //个位 delay(2);CL = 0;DIO = 0xff; //消隐delay(2);}void m本人n() {unsigned char i,j;while(1) {for(i=0;i<10;i++) {for(j=0;j<10;j++) {display(i * 10 + j);}}}}```4. 程序说明- 首先定义了数码管的连接引脚,以及0~9的显示编码。
单片机c语言版数码管动态显示实验报告
数码管动态显示实验一、实验要求1.在Proteus软件中画好51单片机最小核心电路,包括复位电路和晶振电路2.在电路中增加四个7段数码管(共阳/共阴自选),将P1口作数据输出口与7段数码管数据引脚相连,P2.0~P2.3引脚输出选控制信号3.在Keil软件中编写程序,采用动态显示法,实现数码管显示变量unsigned intshow_value的值(show_value的值范围为0000~9999),即把show_value的千百十个位的值用数码管显示出来。
二、实验目的1.巩固Proteus软件和Keil软件的使用方法2.学习端口输入输出的高级应用3.掌握7段数码管的连接方式和动态显示法4.掌握查表程序和延时等子程序的设计三.实验说明(条理清晰,含程序的一些功能分析计算)如下图(五)所示,由P1口将要显示的数字输给七段数码管;再由P2第四位输给数码管的公共端,作为扫描输入信号;用外部中断P3.2和P3.3分别接PB1与PB2,实现数字的增减。
所要实现的功能是,开始运行电路功能图时,四个数码管分别显示0000,按下PB1增1,直到9999回到0000,相反按下PB2减1,直到0000回到9999。
在算相关数据时,由于要显示个十百千的不同数字,要调用disp函数,disp[0]=show/1000; //显示千位的值 disp[1]=show%1000/100; //显示百位的值disp[2]=show%100/10; //显示十位的值 disp[3]=show%10; //显示个位的值本实验需要用到IE寄存器与TCON寄存器。
四、硬件原理图及程序设计(一)硬件原理图设计图(五)开始运行proteus,四个数码管显示0000,按下PB1数码管增1,按下PB2数码管减1。
(二)程序流程图设计三)程序设源代码#include<reg51.h> //定义8051寄存器头文件#define SEG7P P1 // 定义数码管输入信号接P1 #define SCANP P2 //定义数码管扫描信号接P2 char code TAB[10]={0xc0, 0xf9, 0xa4, 0xb0, 0x99, //数字0~4 0x92, 0x83, 0xf8, 0x80, 0x98 };//数字5~~9 char disp[4]={0,0,0,0}; //显示数组void delay_ms(int x); //声明延迟函数char scan[4]={0xfe,0xfd,0xfb,0xf7}; //声明输入扫描信号char i,j; //声明变量void display(); //显示数组diso的内容int show=0000; //定义初始值void get_disp(); //声明返回diap main() //主程序开始{IE=0X85; //开IE寄存器,允许INT0和INT1中断TCON=0X05; //开INT0,INT1while(1) //无穷循环{get_disp();display();}void delay_ms(int x) //声明延迟函数{ int i,j; //定义变量for (i=0;i<x;i++) //开始计数,计数x次for (j=0;j<120;j++); //计数120次,延迟1ms }void display() //声明显示函数{for(i=0;i<4;i++) //开始计数,计数4次{ j=disp[3-i]; //diap的值附到变量j SCANP=scan[i]; //显示扫描信号SEG7P=TAB[j]; //显示数字到数码管delay_ms(4); //延迟4ms}}void INT0_ISR(void) interrupt 0 //INT0中断子程序开始 {if(show<9999) //如果显示数值小于9999show++; //显示数值自增1else show=0; //否则显示数值0}void_INT1_ISR(void) interrupt 2 //INT1中断子程序开始{if(show>0) //如果显示数值大于0show--; //显示数值自减1else show=9999; //否则显示数值9999}void get_disp (){disp[0]=show/1000; //显示千位的值disp[1]=show%1000/100; //显示百位的值disp[2]=show%100/10; //显示十位的disp[3]=show%10; //显示个位的值}五.实验总结实验过程中遇到的问题及解决方法、体会问题1:运行电路原理图时,数码管都不亮。
51单片机控制数码管动态显示C语言源代码
//此表为 LED 的字模, 共阴数码管 0-9 -
unsigned char code Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //段码控制
//此表为8个数码管位选控制, 共阴数码管 1-8个 -
***********************************************************************************
* *
* 2013年8月30日 made by musen *
/**********************************************************************************
* 标题: 试验数码管上显示数字( 单片机直接实现位选 共阴极) *
*
unsigned int LedOut[10]; //变量定义
DelayCNT=0;
while(1)
{
if(++DelayCNT>=20) //控制数字变化速度
{
DelayCNT=0; //20个扫描周期清零一次
++LedNumVal; //每隔20个扫描周期加一次
unsigned char code dispbit[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdF,0xbF,0x7F}; //位选控制 查表的方法控制
/************主函数**********************/
main()
{
unsigned int i,LedNumVal=1 ; //变量定义
51单片机-八段数码管显示
实验一八段数码管显示1、实验目的:(1)了解数码管动态显示的原理。
(2)了解74LS164扩展端口的方法。
2、实验要求:利用实验仪提供的显示电路,动态显示一行数据.3、实验电路图LED1LED2LED3LED4LED5LED64、实验器材:(1)超想-3000TB综合实验仪 1 台(2)超想3000仿真器 1 台(3)计算机 1 台5、实验连线无 6、实验说明:(1)本实验仪提供了8段码LED 显示电路,学生只要按地址输出相应数据,就可以实现对显示器的控制。
显示共有6位,用动态方式显示。
8段数码管是由8155的PB0、PB1经74LS164“串转并”后输出得到。
6位位码由8155的PA0口输出,经Ua2003反向驱动后,选择相应显示位。
74LS164是串行输入并行输出转换电路,串行输入的数据位由8155的PB0控制,时钟位由8155的PB1控制输出。
写程序时,只要向数据位地址输出数据,然后向时钟位地址输出一高一低两个电平就可以将数据位移到74LS164中,并且实现移位。
向显示位选通地址输出高电平就可以点亮相应的显示位。
本实验仪中数据位输出地址为0e102H ,时钟位输出地址为0e102H ,位选通输出地址为 0e101H 。
本实验涉及到了8155 I0/RAM 扩展芯片的工作原理以及74LS164器件的工作原理。
(2)七段数码管的字型代码表显示字形g f e d c b a 段码 0 0 1 1 1 1 1 1 3fh 1 0 0 0 0 1 1 0 06h 2 1 0 1 1 0 1 16bh 3 1 0 0 1 1 1 1 4fh 4 1 1 0 0 1 1 0 66h 5 1 1 0 1 1 0 1 6dh 6 1 1 1 1 1 0 1 7dh 7 0 0 0 0 1 1 1 07h 8 1 1 1 1 1 1 1 7fh 9 1 1 0 1 1 1 1 6fh A 1 1 1 0 1 1 1 77h B 1 1 1 1 1 0 0 7ch C 0 1 1 1 0 0 1 39h D 1 0 1 1 1 1 05ehE 1 1 1 1 0 0 1 79h F1111 71hab c def g dp7、程序框图8、实验步骤1.将KEIL仿真器上40芯排线一端和实验箱上51CPU板上的40芯排针连接起来,将仿真器连接的USB或串口线与PC机对应的USB或串口连接起来,打开实验箱电源。
3位八段码管 驱动电压
3位八段码管驱动电压
在C语言中,可以使用I/O口控制3位八段数码管。
假设数码管的引脚分别为A、G、DP和COM1、COM2、COM3,将A、G连接到微控制器的不同I/O口上,DP连接到某个I/O口作为小数点显示控制,将COM1、COM2、COM3连接到微控制器的不同I/O口上作为选通控制。
在程序中,需要定义和初始化控制数码管的引脚。
然后,根据需要通过将相应的引脚置高或置低来实现数字的显示,例如,要显示数字0,可以将A-G引脚分别置高或置低以满足数码管的显示需求。
为了实现多位数的显示,可以使用定时器中断和多任务编程的方法。
通过定时器中断,可以产生一定频率的中断,然后在中断服务程序中进行位选操作,即依次置高COM1、COM2和COM3引脚。
这样,在每个中断中就能够显示一个数位。
可以通过循环计数器和数组来控制数码管的位选操作,以便在每个中断中循环显示不同的数位。
通过定义和初始化引脚,使用定时器中断和多任务编程的方法,可以在C语言中驱动3位八段数码管,并完成数字显示的功能。
编写程序使实验板上八段数码管循环显示0 到9 字符
编写程序使实验板上八段数码管循环显示0 到9 字符1.八段数码管嵌入式系统中,经常使用八段数码管来显示数字或符号,由于它具有显示清晰、亮度高、使用电压低、寿命长的特点,因此使用非常广泛。
结构八段数码管由八个发光二极管组成,其中七个长条形的发光管排列成“日”字形,右下角一个点形的发光管作为显示小数点用,八段数码管能显示所有数字及部份英文字母。
见图1。
图1 八段数码管的结构类型八段数码管有两种不同的形式:一种是八个发光二极管的阳极都连在一起的,称之为共阳极八段数码管;另一种是八个发光二极管的阴极都连在一起的,称之为共阴极八段数码管。
工作原理以共阳极八段数码管为例,当控制某段发光二极管的信号为低电平时,对应的发光二极管点亮,当需要显示某字符时,就将该字符对应的所有二极管点亮;共阴极二极管则相反,控制信号为高电平时点亮。
电平信号按照dp,g,e…a 的顺序组合形成的数据字称为该字符对应的段码,常用字符的段码表如下:表1 常用字符的段码表显示方式八段数码管的显示方式有两种,分别是静态显示和动态显示。
静态显示是指当八段数码管显示一个字符时,该字符对应段的发光二极管控制信号一直保持有效。
动态显示是指当八段数码管显示一个字符时,该字符对应段的发光二极管是轮流点亮的,即控制信号按一定周期有效,在轮流点亮的过程中,点亮时间是极为短暂的(约1ms),由于人的视觉暂留现象及发光二极管的余辉效应,数码管的显示依然是非常稳定的。
基础知识地址0x10000004为数码管的数据寄存器,控制数码管的段码输出.数码管扫描控制地址为0x10000006,8位访问Bit0 –控制数码管0 –低电平有效Bit1 –控制数码管1 –低电平有效Bit2 –控制数码管2 –低电平有效Bit3 –控制数码管3 –低电平有效Bit4 –控制数码管4 –低电平有效Bit5 –控制数码管5 –低电平有效实验说明1、制作LED字符与码段对应表unsigned char seg7table[16] = {/* 0 1 2 3 4 5 6 7*/0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8,/* 8 9 A B C D E F*/0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e };2、扫描控制*((U8*) 0x02000006) = 0x3E; /* 使能第一个数码管 */段码输出*((U8*) 0x02000004) = seg7table[0]; /* 输出数据 0 */思考:简述LED的显示原理以及LED的显示办法静态显示和动态显示各有什么优缺点设计"HELLO"的码表,编写程序循环显示"HELLO"。
单片机8位数码管动态显示数据
if(8==i) //检测8位扫描完全结束?如扫描完成则从第一个开始再次扫描8位
i=0;
if(j==500) //检测当前数值显示了一小段时间后,需要显示的数值加1,实现数据显示的变化
{
j=0;
num++;
if(num==9)
num=0;
}
}
}
/*------------------------------------------------
}
单片机8位数码管动态显示数据单片机数码管动态显示单片机数码管显示程序单片机数码管显示0到9单片机数码管显示单片机数码管静态显示单片机数码管显示原理单片机数码管显示电路单片机数码管移位显示单片机数码管显示时间
单片机8位数码管动态显示数据
编写:szjcdz
日期:2010.9
内容:8位数码管分别显示不同数字,这种扫描显示方式成为动态扫描,并不停变化赋值
unsigned int j;
while(1)
{
DataPort=WeiMa[i]; //取位码
LATCH2=1; //位锁存
LATCH2=0;
DataPort=DuanMa[num+i]; //取显示数据,段码
LATCH1=1; //段锁存
LATCH1=0;
Delay(200); //扫描间隙延时,时间太长会闪烁,太短会造成重影
延时函数,含有输入参数unsigned int t,无返回值
unsigned int是定义无符号整形变量,其值的范围是
0~65535
------------------------------------------------*/
8位数码管显示电子时钟c51单片机程序之欧阳法创编
8位数码管显示电子时钟c51单片机程序时间:2012-09-10 13:52:26 来源:作者:/*8位数码管显示时间格式 05—50—00 标示05点50分00秒S1 用于小时加1操作S2 用于小时减1操作S3 用于分钟加1操作S4 用于分钟减1操作*/#include<reg52.h>sbit KEY1=P3^0; //定义端口参数sbit KEY2=P3^1;sbit KEY3=P3^2;sbitKEY4=P3^3;sbit LED=P1^2; //定义指示灯参数code unsigned chartab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f }; //共阴极数码管0—9unsigned char StrTab[8];//定义缓冲区unsigned char minute=19,hour=23,second; //定义并初始化为 12:30:00void delay(unsigned int cnt){ while(--cnt);}/******************************************************************//* 显示处理函数*//******************************************************************/void Displaypro(void){StrTab[0]=tab[hour/10]; //显示小时StrTab[1]=tab[hour%10]; StrTab[2]=0x40; //显示"-" StrTab[3]=tab[minute/10]; //显示分钟StrTab[4]=tab[minute%10]; StrTab[5]=0x40;//显示"-" StrTab[6]=tab[second/10]; //显示秒 StrTab[7]=tab[second%10];}main(){ TMOD |=0x01; //定时器0 10msinM crystal 用于计时 TH0=0xd8; //初值TL0=0xf0; ET0=1; TR0=1;TMOD |=0x10; //定时器1用于动态扫描TH1=0xF8; //初值 TL1=0xf0; ET1=1;TR1=1; EA =1; Displaypro(); //调用显示处理函数while(1) { if(!KEY1) //按键1去抖以及动作 { delay(10000); if(!KEY1){ hour++;if(hour==24)hour=0; //正常时间小时加1Displaypro(); } }if(!KEY2) //按键2去抖以及动作{ delay(10000); if(!KEY2) { hour--;if(hour==255)hour=23; //正常时间小时减1Displaypro(); } }if(!KEY3) //按键去抖以及动作{ delay(10000); if(!KEY3) { minute++;if(minute==60)minute=0; //分加1 Displaypro(); } }if(!KEY4) //按键去抖以及动作{ delay(10000); if(!KEY4) { minute--;if(minute==255)minute=59; //分减1Displaypro(); } } }}/******************************************************************//* 定时器1中断*//******************************************************************/void time1_isr(void) interrupt 3 using 0 //定时器1用来动态扫描{ static unsigned char num; TH1=0xF8; //重入初值 TL1=0xf0;switch (num){ case 0:P2=0;P0=StrTab[num];break;//分别调用缓冲区的值进行扫描 case1:P2=1;P0=StrTab[num];break; case2:P2=2;P0=StrTab[num];break; case3:P2=3;P0=StrTab[num];break; case4:P2=4;P0=StrTab[num];break; case5:P2=5;P0=StrTab[num];break; case6:P2=6;P0=StrTab[num];break; case7:P2=7;P0=StrTab[num];break;default:break; } num++; //扫描8次,使用8个数码管 if(num==8) num=0;}/******************************************************************//* 定时器0中断*//******************************************************************/void tim(void) interrupt 1 using1{ static unsigned char count; //定义内部局部变量TH0=0xd8; //重新赋值 TL0=0xf0;count++; switch (count) { case 0:case 20: case 40: case 60: case80:Displaypro();break; //隔一定时间调用显示处理case 50:P1=~P1;break; //半秒 LED 闪烁default:break; }if (count==100) { count=0;second++; //秒加1 if(second==60){ second=0; minute++;//分加1 if(minute==60){ minute=0;hour++; //时加1 if(hour==24) hour=0; } } } }基于单片机的LCD1602控制总线模式时间:2012-09-10 13:50:39 来源:作者:第一行显示"Welcome";第二行显示="Happy day";若要显示其他字符,请直接往数组 LCMLineOne[16]和LCMLineTwo[16]填充相应的代码。
单片机C51程序设计 数码管显示ppt课件
P0 = d);\ LE573 = 0;\ }
中断源的符号、称号及产生的条件
INT0:外部中断0,由P3.2端口线引入,低电平或下跳沿引起。 INT1:外部中断1,由P3.3端口线引入,低电平或下跳沿引起。 T0:定时器/计数器0中断,由T0计满回零引起。 T1:定时器/计数器l中断,由T1计满回零引起。 TI/RI:串行I/O中断,串行端口完成一帧字符发送/接纳后引起。
定时/计数器编程运用
初始化程序应完成如下任务: 1.对TMOD赋值,以确定T0和T1的任务方式。 2.计算初值,并将其写入TH0、TL0或TH1、TL1。 3.中断方式时,那么对IE赋值,开放中断。 4.使TR0或TR1置位,启动定时/计数器定时或计数。
TR1:定时器1控制位,置位时定时器1任务 TR0:定时器0控制位,置位时定时器0任务
定时器初值 计算
设单片机晶振频率为6MHZ,求方式1时的定时器初 值.
定时时间=(2X-初值)×机器周期 X由定时器任务方式决议,分别为13、16、8. 机器周期=12/单片机晶振频率 fosc。 由以上公式可知:定时lms所需的机器周期为2us.个数 为500D,即0lF4H,任务方式为1(16位方式)时定时初 值是01F4H.
动态显示
动态显示的特点是将一切位数码管的段选线 并联在一同,由位选线控制是哪一位数码管有 效。选亮数码管采用动态扫描显示。所谓动态 扫描显示即轮番向各位数码管送出字形码和相 应的位选,利用发光管的余辉和人眼视觉暂留 作用,使人的觉得好似各位数码管同时都在显 示。动态显示的亮度比静态显示要差一些,所 以在选择限流电阻时应略小于静态显示电路中 的。
JBCflag ? C002 DECval C002: RET
单片机作业单只数码管循环显示0~9
单只数码管循环显示0~9学生学号:学生姓名:同组学号:同组姓名:单只数码管循环显示 0~9一、本课题剖析本次课程设计任务为:利用51 单片机、 BCD译码芯片和一位 LED组成一个数码管扫描显示系统,一个数码管同时循环显示0~9。
并依据设计任务的要求编写程序,在 PROTEUS 7.5中绘制电路原理图。
而后在PROTEUS 7.5下进行仿真,实现相应功能。
二、硬件设计原理2.1 Proteus软件介绍Proteus 软件是英国 Labcenter electronics企业第一版的EDA工具软件(该软件中国总代理为广州风标电子技术有限企业)。
它不单拥有其余EDA工具软件的仿真功能,还可以仿真单片机及外头器件。
它是当前最好的仿真单片机及外头器件的工具。
固然当前国内推行刚起步,但已遇到单片机喜好者、从事单片机教课的教师、致力于单片机开发应用的科技工作者的喜爱。
Proteus 是世界上有名的 EDA工具 ( 仿真软件 ) ,从原理图布图、代码调试到单片机与外头电路协同仿真,一键切换到PCB设计,真实实现了从观点到产品的完好设计。
是当前世界上独一将电路仿真软件、PCB设计软件和虚构模型仿真软件三合一的设计平台,其办理器模型支持8051、HC11、PIC10/12/16/18/24/30/DsPIC33、AVR、ARM、 8086 和 MSP430等, 2010 年马上增添 Cortex 和 DSP系列办理器,并连续增添其余系列办理器模型。
在编译方面,它也支持IAR、 Keil 和 MPLAB等多种编译器。
2.2原理图绘制说明本次设计的数码管0~9 循环系统是以 80C51单片机为中心器件,利用Keil进行程序编写,后由单个LED显示数字循环,致使达就任务要求。
电路原理图的设计与绘制是整个电路设计的基础。
电路原理图的设计包含:设置电路图的图纸大小;规划电路图的整体布局;在图纸上搁置元器件,进行布局和布线;依据需要增添说明并进行检查与改正,最后保留。
51单片机键盘数码管显示(带程序)
期中大作业学院:物理与电子信息工程学院课题:【利用8255和51单片机实现数码管显示按键数值的程序】要求:【4*4矩阵键盘,按0到15,数码管上分别显示0~9,A~F】芯片资料:8255:8255是Intel公司生产的可编程并行I/O接口芯片,有3个8位并行I/O口。
具有3个通道3种工作方式的可编程并行接口芯片(40引脚)。
其各口功能可由软件选择,使用灵活,通用性强。
8255可作为单片机与多种外设连接时的中间接口电路。
8255作为主机与外设的连接芯片,必须提供与主机相连的3个总线接口,即数据线、地址线、控制线接口。
同时必须具有与外设连接的接口A、B、C口。
由于8255可编程,所以必须具有逻辑控制部分,因而8255内部结构分为3个部分:与CPU连接部分、与外设连接部分、控制部分。
8255特性:1.一个并行输入/输出的LSI芯片,多功能的I/O器件,可作为CPU总线与外围的接口。
2.具有24个可编程设置的I/O口,即3组8位的I/O口,分别为PA口、PB口和PC 口。
它们又可分为两组12位的I/O口:A组包括A口及C口(高4位,PC4~PC7),B组包括B口及C口(低4位,PC0~PC3)。
A组可设置为基本的I/O口,闪控(STROBE)的I/O闪控式,双向I/O三种模式;B组只能设置为基本I/O或闪控式I/O两种模式,而这些操作模式完全由控制寄存器的控制字决定.引脚说明RESET:复位输入线,当该输入端处于高电平时,所有内部寄存器(包括控制寄存器)均被清除,所有I/O口均被置成输入方式。
CS:芯片选择信号线,当这个输入引脚为低电平时,即CS=0时,表示芯片被选中,允许8255与CPU进行通讯;CS=1时,8255无法与CPU做数据传输。
RD:读信号线,当这个输入引脚为低电平时,即CS=0且RD=0时,允许8255通过数据总线向CPU发送数据或状态信息,即CPU从8255读取信息或数据。
WR:写入信号,当这个输入引脚为低电平时,即CS=0且WR=0时,允许CPU将数据或控制字写入8255。
C51单片机的数码管显示c程序
//熄灭数码管,让其不闪烁
P26=0 ; P0=s[x%100/10];
//求数的十位
delay(1);
P2=0xff;
P25=0;
//P25 接通点亮第六个数码管
P0=s[x/100];
//x/100 取余,得到 x 的最高位
delay(1); P2=0xff;
//延时 1ms,让数码管显示稳定 //关闭 P2 口,熄灭数码管
}
/************************** 函数功能:1ms 延时函数
**************************/ void delay(unsigned char i) { unsigned char j ; while(i--) {for(j=0;j<125;j++) {; } } }
/**********************************/ 函数功能:点亮数码管电路 7678
/*********************************/
void display(unsigned char x)
{ P27=0;
P0=s[x%10];
//求数的个位0); //蜂鸣器发声 while(!P32);//等到按键释放 delay(10); } }}
/********************************** 函数功能:中断 T1 函数,按按键让数码管显示计数
************************************/ void timer() interrupt 1 { if(P33==0)
}
/*************************** 函数功能:主函数
单片机数码管显示0-9
/************************************************************重庆文理学院电子电气工程学院版权信息:main.c 文件名称:Keil4开发环境描述:LED 个P2口控制8 STC89C51单片机,晶振12M,单片机的硬件平台描述:主要功能描述: 实现闪烁灯的功能函数列表其及功能:延时功能1. DelayTime();2.历史修改记录:备注版本作者时间建立工程zhang fei 2014-10-14 1.0***********************************************************/#include <reg51.h>50#define MainDelayTimevoid DelayTime10ms(unsigned int DelayValue);unsigned char segdata[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xa0};//unsigned char one=0,two=0;//sbit seg0_select=P2^0;sbit seg1_select=P2^1;sbit key01=P3^0;/************************************************************main.c函数名称:主函数: 功能描述参数列表:无返还参数:***********************************************************/void main(){ int one;while(1){seg0_select=1; //seg1_select=0; //P0=segdata[two]; //DelayTime10ms(4); //seg0_select=0; //seg1_select=1;P0=segdata[one];DelayTime10ms(10);if(one++==10)//// {one=0;// if(two++==10)// one=two=0;// DelayTime10ms(20);if(key01==0){DelayTime10ms(10);if(key01==0){one++;if(one==9){one=0;// two=0;// two++;// if(two==10)// one=two=0;DelayTime10ms(20);// seg0_select=0;while(key01==0)seg1_select=1;}}}}}/************************************************************函数名称:main.c功能描述: 主函数参数列表:无返还参数:***********************************************************/void DelayTime10ms(unsigned int DelayValue){unsigned int a,b;for(a=0;a<DelayValue;a++)for(b=0;b<1828;b++);}//***********************END****************************************。
用PIC单片机驱动按键控制8个数码管的显示的C程序
用PIC16F877A单片机驱动按键控制8个数码管的显示的C程序经典按键控制数码管C程序#include <htc.h>#define HC595_SER RB7#define HC595_SCK RB6#define HC595_RCK RB5#define key_164_data RB3#define key_164_clk RB2#define key_com1 RB1#define key_com0 RB0#define TURE 1bit key_finish; //定义的位变量,这是PICmate仿真软件环境的特有的地方unsigned int sample_key;unsigned int sample_keyBuf[2];unsigned int key_value;unsigned char key_row_sel;unsigned char key_number;//键号unsigned int T100ms;unsigned char disbuf[8];const unsigned char seven_seg[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5 e,0x79,0x71};//----------------------------------------------void disbuf_update(void){if(key_number>=16){disbuf[0]=0xff;disbuf[1]=0xff;disbuf[2]=0xff;disbuf[3]=0xff;disbuf[4]=0xff;disbuf[5]=0xff;disbuf[6]=0xff;disbuf[7]=0xff;return;}disbuf[0]=seven_seg[key_number];disbuf[1]=seven_seg[key_number];disbuf[2]=seven_seg[key_number];disbuf[3]=seven_seg[key_number];disbuf[4]=seven_seg[key_number];disbuf[5]=seven_seg[key_number];disbuf[6]=seven_seg[key_number];disbuf[7]=seven_seg[key_number];}//----------------------------------------------void inite_time0(void) //对timer0中断进行初始化{PSA=0;T0CS=0;T0IF=0;GIE=1;T0IE=1;TMR0=0xf0;PS0=1;PS1=1;PS2=1;}//----------------------------------------------//发送一个字节void s_pData(unsigned char key) //形参key对应着实参disbuf[i]{unsigned char i;for(i=0;i<8;i++){if(0x80&(key<<i))HC595_SER=1;else HC595_SER=0;HC595_SCK=0;HC595_SCK=1;}}//----------------------------------------------//发送一个字节void Key_s_pData(unsigned char key){unsigned char i;for(i=0;i<8;i++){if(0x80&(key<<i))key_164_data=1;elsekey_164_data=0;key_164_clk=0;key_164_clk=1;}}//---------------------------------------------- void display (void){unsigned char i;for(i=0;i<8;i++)s_pData(disbuf[i]);HC595_RCK=0;HC595_RCK=1;}//---------------------------------------------- void key_process(void){unsigned char i;for(i=0;i<16;i++){if( (key_value&(0x0001<<i)) ){key_number=i;return;}}}//---------------------------------------------- //主程序int main(void){PORTB=0;TRISB=0x03;inite_time0();key_number=0xff;while(1){if(key_finish==TURE){//按键扫描成功key_process();key_finish=0;}if(T100ms<10)continue;T100ms=0;disbuf_update();display();}}//---------------------------------------------- void scan_key(void){sample_key =sample_key<<1;if(key_com1)sample_key |=0x0001;sample_key =sample_key<<1;if(key_com0)sample_key |=0x0001;key_row_sel++;if(key_row_sel<8){Key_s_pData(1<<key_row_sel);return;}key_row_sel=0;Key_s_pData(1<<key_row_sel);sample_keyBuf[0]=sample_key;if(sample_keyBuf[1]!=sample_keyBuf[0]){sample_keyBuf[1]=sample_keyBuf[0];return;}key_value=sample_keyBuf[0];if(key_value!=0)key_finish=TURE;}//-------------------------------------------- //2ms中断interruptvoid time_int(void){if(T0IF==1){T0IF=0;TMR0=0xf0;T100ms++;scan_key();}}它的电路图可以参考用PIC16F877A单片机驱动按键控制8个数码管的显示电路图.。
51单片机数码管循环显示0~9程序说明
数码管循环显示0~9程序说明功能说明:用一位数码管循环显示数字0~9,数字间隔时间为0.2秒。
一、电路图数码管循环显示0~9电路图二、所用电子元器件A T89C51:单片机;7SEG—COM—AN—GRN:带公共端共阳七段绿色数码管;CAP、CAP—ELEC:电容、电解电容;CRYSTAL:晶振。
三、程序汇编语言编写的数码管循环显示0~9源程序代码如下:START:MOV DPTR,#TABLEMOV R0,#00HLOOP: MOV A,R0MOVC A,@A+DPTRMOV P0,AACALL DLY1SINC R0CJNE R0,#10,LOOPJMP STARTDLY1S:MOV R5,#10HD1: MOV R6,#100HD2: MOV R7,#100HDJNZ R7,$DJNZ R6,D2DJNZ R5,D1RETTABLE:DB 0C0H,0F9H,0A4H,0B0HDB 99H, 92H, 82H, 0F8HDB 80H, 90H, 88H, 83HDB 0C6H,0A1H,86H, 8EHENDProtetus 安装说明使用说明1.先安装Setup71.exe,提示选择Setup Type时默认选择即可;若提示No LICENCE 选择安装文件中"crack"-->MAXIM_LICENCE.lxk,打开安装。
2.安装完成后将crack-->文件夹BIN 和文件夹MODELS 下的文件复制到安装目录相应的文件夹内覆盖。
3.安装proteus.7.x-patch,选择patch,提示can not find the file. search the file,选择yes即可;然后选择bin文件中的ares.exe ;在选择models 中的avr.dll安装完毕退出即可。
注:***"Keil驱动"中的程序为Proteus与Keil联调的驱动。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
unsigned char temp[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}
unsigned char table[3];
unsigned iபைடு நூலகம்t num;
void display(unsigned int num)
TH0 = 0xfc;
TL0 = 0x18;
j++;
if(i < 3)
{
P2 = 0xf8;
P1 = 0x00;
P2 = ~(1 << i);
P1 = table1[i];
i++;
}
else
i = 0;
if(j >= 1000)
{
num++;
if(num > 999)
num = 0;
j = 0;
}
用的是共阴极数码管,定时器延时,不会出现数码管抖动现象
定时器自动加,会从0.00-9.99自动显示,9.99以后又清0.00
追问
我是从ADC0908中传出的8位数字量到单片机上,用单片来动态显示到数码管上的,不知道是不是要标定一下?(传感器输出1-5v,量程是0-10米经AD转换后给单片机用数码管显示0-10米,且在1米和8米处要求报警)
是不是该用单片机不断地循环查询?
回答
不知道这个有没的AD转换中断,如果有可以在每次转换成功以后查下,没有的话,估计要不断查询
TL0 = 0x18;
ET0 = 1;
TR0 = 1;
while(1)
{
display(num);
}
}
void timer0() interrupt 1//定时为2ms
{
static unsigned char i = 0;
static unsigned int j = 0;
追问
好像没有,可能要不停查询。
能帮忙编一下单片机怎么读AD转换器输出的吗?AD转换输出的0-5v怎么才能显示0-10米啊,这个量化的过程不会编。很急用的,感激不尽。
回答
不好意思,最近在做PIC,我手头上没现成的,所以没时间去看资料,再写
{
table[0] = temp[num / 100]
table[1] = temp[num / 10 % 10 ] | 0x80;
table[2] = temp[num % 10]
}
void main()
{
EA = 1;
TMOD |= 0x21;
TH0 = 0xfc;