四位数码管动态显示c语言程序
数码管动态显示c语言程序
//这是一个,四位数码管动态显示c语言程序,每隔一秒加一,直至加到9999为止#include <reg52.h>unsigned char code LED[]={0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90}; unsigned char LEDbuff[]={0xff,0xff,0xff,0xff};//定义数码管的位选段sbit SEG_bit_1 = P0^1;sbit SEG_bit_2 = P0^2;sbit SEG_bit_3 = P0^3;sbit SEG_bit_4 = P0^4;unsigned int cnt=0;unsigned int sec =0;unsigned char i=0;void main(){TMOD=0x01; /*设置定时器*/TH0=0xfc;TL0=0x18;TR0=1;EA=1; /*设置中断*/ET0=1;while(1){if(0==TF0){if(cnt>=1000){cnt=0;sec++;LEDbuff[0]=LED[sec%10]; /*设置数码管显示位*/LEDbuff[1]=LED[sec/10%10];LEDbuff[2]=LED[sec/100%10];LEDbuff[3]=LED[sec/1000%10];}}}}void interrupttimer0() interrupt 1 /*设置中断函数*/{TH0=0xfc;TL0=0x18;cnt++;P1=0xff;switch(i){case 0: SEG_bit_1 = 1;SEG_bit_4 = 0;P1=LEDbuff[0];i++;break;case 1: SEG_bit_4 = 1;SEG_bit_3 = 0;P1=LEDbuff[1];i++;break;case 2: SEG_bit_3 = 1;SEG_bit_2 = 0;P1=LEDbuff[2];i++;break;case 3: SEG_bit_2 = 1;SEG_bit_1 = 0;P1=LEDbuff[3];i=0;break;default:break;}}教你如何用WORD文档(2012-06-27 192246)转载▼标签:杂谈1. 问:WORD 里边怎样设置每页不同的页眉?如何使不同的章节显示的页眉不同?答:分节,每节可以设置不同的页眉。
数码管动态显示实验报告
一、实验目的1. 掌握数码管动态扫描显示的原理和编程实现方法;2. 熟悉单片机与数码管之间的接口连接;3. 学会使用定时器中断控制数码管的动态显示;4. 培养动手能力和问题解决能力。
二、实验原理数码管动态显示是通过单片机控制多个数码管同时显示不同的数字或字符,利用人眼的视觉暂留效应,实现快速切换显示内容,从而在有限的引脚数下显示更多的信息。
实验中,我们采用动态扫描的方式,依次点亮数码管,通过定时器中断控制扫描速度。
三、实验器材1. 单片机开发板(如51单片机、AVR单片机等);2. 数码管(共阳/共阴自选);3. 连接线;4. 电阻;5. 实验台;6. 编译器(如Keil、IAR等)。
四、实验步骤1. 设计电路图:根据实验要求,设计单片机与数码管的连接电路图,包括数码管的段码、位选信号、电源等。
2. 编写程序:使用C语言或汇编语言编写程序,实现数码管的动态显示功能。
(1)初始化:设置单片机的工作模式、定时器模式、端口方向等。
(2)显示函数:编写显示函数,实现数码管的点亮和熄灭。
(3)定时器中断服务程序:设置定时器中断,实现数码管的动态扫描。
3. 编译程序:将编写的程序编译成机器码。
4. 烧录程序:将编译后的程序烧录到单片机中。
5. 连接电路:将单片机与数码管连接好,包括数码管的段码、位选信号、电源等。
6. 运行实验:打开电源,观察数码管的显示效果。
五、实验结果与分析1. 实验结果:数码管按照预期实现了动态显示功能,依次点亮每位数码管,并显示出不同的数字或字符。
2. 分析:(1)通过调整定时器中断的周期,可以改变数码管的扫描速度,从而控制显示效果。
(2)在编写显示函数时,要考虑到数码管的共阳/共阴特性,选择合适的点亮和熄灭方式。
(3)在实际应用中,可以根据需要添加其他功能,如显示时间、温度等。
六、实验总结1. 通过本次实验,掌握了数码管动态显示的原理和编程实现方法。
2. 熟悉了单片机与数码管之间的接口连接,提高了动手能力。
数码管动态显示实验报告
数码管动态显示实验报告1.实验目的:本实验旨在通过使用单片机控制数码管的动态显示,了解数码管的原理和使用方法,加深对单片机控制的理解。
2.实验原理:数码管是由许多发光二极管(LED)组成的,每个数码管有7个发光二极管组成7段,再加上一个小数点(或8段数码管),通过控制每个发光二极管的亮灭状态,可以显示出数字、字母等字符。
本实验使用的是共阴极数码管,在通常情况下,数码管引脚为低电平时亮灯,为高电平时灭灯。
3.实验器材:-STC89C52单片机-共阴极数码管-电阻-面包板及连接线-电源4.实验步骤:步骤1:连接电路将数码管的7个引脚分别连接到单片机的7个I/O引脚上,并通过电阻限流。
连接电路后,确认连接无误。
步骤2:编写程序使用C语言编写程序,实现数码管的动态显示。
可以使用延时函数和位操作函数控制数码管的亮灭,通过改变每个数码管引脚的高低电平状态,实现显示不同的数字、字母。
步骤4:实验观察与分析观察数码管的显示效果,通过改变程序中的参数,可以实现不同的显示效果。
5.实验结果与分析:经过实验,我们成功实现了数码管的动态显示。
通过编写程序,我们可以实现数码管显示数字、字母等不同的字符。
调整程序中的参数,可以实现不同的动态显示效果,如流水灯、闪烁等。
数码管的动态显示是通过改变每个数码管引脚的高低电平实现的,通过快速改变引脚电平状态的时间间隔,创建了肉眼无法察觉的视觉效果,从而实现了动态显示。
此外,通过实验我们还了解到了单片机控制数码管的原理和方法,加深了对单片机控制的理解。
6.实验总结:通过本实验,我们了解到了数码管的动态显示原理和方法,并通过编写程序,成功实现了数码管的动态显示。
同时,我们还巩固了单片机控制的知识,提高了自己的动手能力和问题解决能力。
在今后的学习和工作中,我们将进一步掌握数码管的使用方法,并能够将其应用于更加复杂的应用场景中,实现更多有趣的功能。
4位拨动开关控制数码管显示系统设计
4位拨动开关控制数码管显⽰系统设计务书设计题⽬4位拨动开关控制数码管显⽰系统设计学⽣姓名设计要求:1.电源电路具有电源开关及指⽰灯,有复位按键;2.⾼4位开关屏蔽;3.⽤4位拨码开关为输⼊,控制数码管显⽰器的输出;4.实现功能:通电复位后数码管全显即显“8”,数码管对应4位DIP开关的⼆进制输⼊显⽰⼗六进制全部字符即从“0”到“F”。
学⽣应完成的⼯作:1.了解单⽚机系统的设计⽅法,设计步骤;2.查找并收集相关资料书籍;3.完成硬件原理图设计;4.完成软件和流程图的设计;5.对系统进⾏仿真;6.焊接电路板,调试系统;7.认真撰写课程设计报告。
8.孙晓界同学主要负责软件设计参考⽂献阅读:[1] 张毅刚,彭喜元,彭宇. 单⽚机原理及应⽤[M]. 北京:⾼等教育出版社,2009.[2] 杜树春. 单⽚机C语⾔和汇编语⾔混合编程实例详解[M]. 北京:北京航空航天⼤学出版社,2006.[3] 童诗⽩,华成英. 模拟电⼦技术基础(第四版)[M]. 北京:⾼等教育出版社,2006.[4] 林志琦. 基于Proteus的单⽚机可视化软硬件仿真[M]. 北京:北京航空航天⼤学出版社,2006. ⼯作计划:5⽉6⽇:查阅相关资料,拟定⽅案;5⽉7⽇:进⾏⽅案论证,完善设计⽅案;5⽉8⽇:完成硬件设计;5⽉9⽇:设计程序流程图;5⽉10⽇:完成软件设计,并进⾏仿真和调试;5⽉13⽇:进⾏焊接;5⽉14⽇:烧写程序;5⽉15⽇:调试电路;5⽉16⽇:与辅导⽼师交流,写课程设计报告;5⽉17⽇:上交课程设计报告及实物。
任务下达⽇期:2013 年5⽉ 6 ⽇任务完成⽇期:2013 年5⽉17 ⽇指导教师(签名):学⽣(签名):4位拨动开关控制数码管显⽰系统设计摘要:⽤AT89S52单⽚机作为核⼼,利⽤晶振,共阳极数码管,7805,桥堆2w10等器件进⾏设计,由电源电路、复位电路、时钟电路、输⼊输出电路等设计⼀个控制电路。
利⽤汇编编写控制程序,程序使⽤查表法进⾏编写。
四位LED数码管编程
设计要求:一个基于单片机89S51的可编程定时器的程序,定时器由4个8段数码管显示,可以设置分和秒定时。
可以同时对四路控制对象进行定时控制,外部控件可以用于选择控制对象,设置定时,对定时进行暂停,重置等控制。
#include <AT89X52.H>//宏定义#define uchar unsigned char#define uint unsigned int#define ulong unsigned long int/****************************************************************************** TH0和TL0是计数器0的高8位和低8位计数器,计算办法:TL0=(65536-C)%256; ** TH0=(65536-C)/256,其中C为所要计数的次数即多长时间产生一次中断;TMOD是计数器** 工作模式选择,0X01表示选用模式1,它有16位计数器,最大计数脉冲为65536,最长时** 间为1ms*65536=65.536ms*******************************************************************************/#define V_TMOD 0x01 //工作方式1#define V_TH0 0x3C //50ms延时常数C=50000//0XDC#define V_TL0 0xB0 //50ms延时常数C=50000 /0X58 //#define V_TH1 0xFF //5ms延时常数C=5000 //0XDC//#define V_TL1 0xFB //5ms延时常数C=5000 /0X58#define V_TH1 0xDC //1ms延时常数C=1000 //0XDC#define V_TL1 0x58 //1ms延时常数C=1000 /0X58#define MAXFUN 6 //功能切换,表示最多的功能状态,sbit k10=P1^0;//sbit BEEP = P3^7; //蜂鸣器驱动线----------------请修改为sbit BEEP =P0^4;uchar bee; //蜂鸣器01开关uchar key; //键顺序吗uchar fun=10; //功能状态, <= MAXFUNuchar it0=0,it1; //Timer0中断计数uchar text=0; //数字//uchar text_ctrl[4]={0xFE,0xFD,0xFB,0xF7}; //位选通值uchar text_ctrl[4]={0xE,0xD,0xB,0x7};//位选通值, 00001110, 00001101, 00001011, 00000111//uchar text_code[11]={ 0x28, 0x7E, 0xA2, 0x62, 0x74, 0x61, 0x21, 0x7A, 0x20,0x60,0xff};//0,1,2,3,4,5,6,7,8,9,关显示,数码管码表,高电平有效//uchar text_code[17]={0x28,0x7e,0xa2,0x62,0x74,0x61,0x21,0x7a,0x20,0x60,0x30,0x25,0xa9,0x26,0xa1,0xb1};//数码管代码uchar text_code[11]={ 0xFC, 0x60, 0xDA, 0xF2, 0x66, 0xB6, 0xBE, 0xE0,0xFE, 0xF6,0xff};//0,1,2,3,4,5,6,7,8,9,关显示,数码管码表,高电平有效uchar text_index=0; //当前显示第几个uchar dis_buf[4]; //显示缓存uchar refresh=0; //刷新否T1蜂鸣uchar min=0; //minutesuchar sec=0; //sccondsuchar hour=0; //sccondsuchar onsetup=0;uchar keydown0=0,keydown1=0;uchar data PWM=0xFf ;//PWM值增加,则占空比减小,LED 灯渐暗。
四位数码管单独显示
四位数码管单独显示1. 引言数码管是一种常见的数字显示设备,常用于电子时钟、电子测量仪器等场合。
四位数码管单独显示是指将四个数码管分别控制,使其能够独立显示不同的数字。
本文将介绍如何使用Arduino控制四位数码管实现单独显示的功能。
2. 器件准备在开始之前,我们需要准备以下器件: - Arduino主控板 - 四位共阳数码管 - 适配器电源 - 杜邦线若干3. 电路连接将四位数码管接线连接到Arduino主控板上,具体的接线方式如下: - 将数码管的A、B、C、D、E、F、G引脚分别连接到Arduino的引脚2、3、4、5、6、7、8; - 将数码管的COM1、COM2、COM3、COM4引脚分别连接到Arduino的引脚9、10、11、12。
4. 程序编写以下是使用Arduino语言编写的程序,实现四位数码管单独显示的功能:// 四位数码管单独显示// 数码管引脚定义int segPins[] = {2, 3, 4, 5, 6, 7, 8};int comPins[] = {9, 10, 11, 12};void setup() {// 设置数码管引脚为输出模式for (int i = 0; i < 7; i++) {pinMode(segPins[i], OUTPUT);}for (int i = 0; i < 4; i++) {pinMode(comPins[i], OUTPUT);}}void loop() {// 数字0-9的编码,对应数码管的a-g引脚状态int numCode[] = {B1111110, B0110000, B1101101, B1111001, B0110011, B1 011011, B1011111, B1110000, B1111111, B1110011};for (int i = 0; i < 4; i++) {// 在COM1-COM4引脚依次输出低电平,其他引脚输出高电平for (int j = 0; j < 4; j++) {if (j == i) {digitalWrite(comPins[j], LOW);} else {digitalWrite(comPins[j], HIGH);}}// 控制数码管显示对应数字for (int j = 0; j < 7; j++) {digitalWrite(segPins[j], (numCode[i] >> j) & 1);}// 设置显示间隔delay(10);}}5. 程序说明上述程序中,我们首先定义了数码管的引脚,然后在setup()函数中,设置数码管引脚为输出模式。
51单片机(四位数码管的显示)程序
51单片机(四位数码管的显示)程序基于单片机V1或V2实验系统,编写一个程序,实现以下功能:1)首先在数码管上显示“P_ _ _”4个字符;2)等待按键,如按了任何一个键,则将这4个字符清除,改为显示“0000”4个字符(为数字的0)。
最佳答案下面这个程序是4x4距阵键盘,LED数码管显示,一共可以到0-F显示,你可以稍微改一下就可以实现你的功能了,如还有问题请发信息,希望能帮上你!#include<at89x52.h>unsigned char codeDig[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1 ,0x86,0x8e}; //gongyang数码管0-F 代码unsigned char k; //设置全局变量k 为键盘的键值/************************************键盘延时函数****************************/void key_delay(void) //延时函数{int t;for(t=0;t<500;t++);}/************************************键盘扫描函数******************************/void keyscan(void) //键盘扫描函数{unsigned char a;P2 = 0xf0; //键盘初始化if(P2!=0xf0) //有键按下?{key_delay(); //延时if(P2!=0xf0) //确认真的有键按下?{P2 = 0xfe; //使行线P2.4为低电平,其余行为高电平key_delay();a = P2; //a作为缓存switch (a) //开始执行行列扫描{case 0xee:k=15;break;case 0xde:k=11;break;case 0xbe:k=7;break;case 0x7e:k=3;break;default:P2 = 0xfd; //使行线P2.5为低电平,其余行为高电平a = P2;switch (a){case 0xed:k=14;break;case 0xdd:k=10;break;case 0xbd:k=6;break;case 0x7d:k=2;break;default:P2 = 0xfb; //使行线P2.6为低电平,其余行为高电平a = P2;switch (a){case 0xeb:k=13;break;case 0xdb:k=9;break;case 0xbb:k=5;break;case 0x7b:k=1;break;default:P2 = 0xf7; //使行线P2.7为低电平,其余行为高电平a = P2;switch (a){case 0xe7:k=12;break;case 0xd7:k=8;break;case 0xb7:k=4;break;case 0x77:k=0;break;default:break;}}}break;}}}}/****************************** ***主函数*************************************/ void main(void){while(1){keyscan(); //调用键盘扫描函数switch(k) //查找按键对应的数码管显示代码{case 0:P0=Dig[0];break;case 1:P0=Dig[1];break;case 2:P0=Dig[2];break;case 3:P0=Dig[3];break;case 4:P0=Dig[4];break;case 5:P0=Dig[5];break;case 6:P0=Dig[6];break;case 7:P0=Dig[7];break;case 8:P0=Dig[8];break;case 9:P0=Dig[9];break;case 10:P0=Dig[10];break;case 11:P0=Dig[11];break;case 12:P0=Dig[12];break;case 13:P0=Dig[13];break;case 14:P0=Dig[14];break;case 15:P0=Dig[15];break;default:break; //退出}}}/**********************************end***************************************/。
4位数码管计时器程序
/******************************************************************************************* **/#include<STC12C2052AD.H>//STC头文件/******************************************************************************************* ***///“程序开发调试设置项”#define DY_LI 9 //设置LED显示的亮度(值域:~9)#define DY_DELAY 12 //设置每一个点显示的时间长度(~20)/******************************************************************************************* ***/sbit DY_LED1_H1 =P3 ^ 0; //设置LED点阵屏连接的I/O口sbit DY_LED1_H2 =P3 ^ 1; //设置LED点阵屏连接的I/O口sbit DY_LED1_H3 =P3 ^ 2; //设置LED点阵屏连接的I/O口sbit DY_LED1_H4 =P3 ^ 3; //设置LED点阵屏连接的I/O口sbit DY_LED1_L1 =P1 ^ 0; //设置LED点阵屏连接的I/O口sbit DY_LED1_L2 =P1 ^ 1; //设置LED点阵屏连接的I/O口sbit DY_LED1_L3 =P1 ^ 2; //设置LED点阵屏连接的I/O口sbit DY_LED1_L4 =P1 ^ 3; //设置LED点阵屏连接的I/O口sbit DY_LED1_L5 =P1 ^ 4; //设置LED点阵屏连接的I/O口sbit DY_LED1_L6 =P1 ^ 5; //设置LED点阵屏连接的I/O口sbit DY_LED1_L7 =P1 ^ 6; //设置LED点阵屏连接的I/O口sbit DY_LED1_L8 =P1 ^ 7; //设置LED点阵屏连接的I/O口//sbit DY_BEEP =P2 ^ 2; //扬声器//sbit DY_KEY1 =P0 ^ 2; //按键(M键)(连接在P1.3和P0.2,读P0.2为低时表示有按键动作)//sbit DY_KEY2 =P3 ^ 0; //按键(+键)(连接在P4.6和P3.0,读P3.0为低时表示有按键动作)//sbit DY_KEY3 =P3 ^ 6; //按键(-键)(连接在P2.4和P3.6,读P3.6为低时表示有按键动作)#define DY_P1M0SET 0x00 //设置I/O口工作方式//00000000(左到右,高到低位)#define DY_P1M1SET 0x00 //设置I/O口工作方式//00101000#define DY_P3M0SET 0x00 //设置I/O口工作方式//00000000#define DY_P3M1SET 0xff //设置I/O口工作方式//10010100data unsigned char TIME_DD,TIME_MO,TIME_YY,TIME_WW,TIME_HH,TIME_MM,TIME_SS,ty;//设置日、月、年、周、时、分、秒和温度存放区data unsigned char cou = 0; // 软计数器,对ms时基信号累加到sdata unsigned char bn;//扫描映射全局变量data unsigned char KEY_BIT = 0;//按键值data unsigned char DY_PWM;//显示亮度data unsigned char DY_PWM2;//显示暂存unsigned char code disdata[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f //无小数点数码管段码表(0~9)};/******************************************************************************************* **/void delay (unsigned int a){ // 用于点扫描的延时unsigned int i;while( --a != 0){for(i = 0; i < DY_DELAY; i++);}}/******************************************************************************************* **/void delay1ms (unsigned int a){ // 1ms延时程序(MHz 10倍于单片机速度时)unsigned int i;while( --a != 0){for(i = 0; i < 600; i++);}}/******************************************************************************************* **/void dis_off (void){P1 = ~DY_P1M1SET; //关所有显示P3 = ~DY_P3M1SET;delay(10-DY_PWM);}/******************************************************************************************* **/void displayHH1 (unsigned char d){ //第列横向显示程序unsigned char i;i = d & 0x01;if(i == 0x01){DY_LED1_H1 = 1;DY_LED1_L1 = 0;}delay(DY_PWM);dis_off();i = d & 0x02;if(i == 0x02){DY_LED1_H1 = 1;DY_LED1_L2 = 0;}delay(DY_PWM);dis_off();i = d & 0x04;if(i == 0x04){DY_LED1_H1 = 1;DY_LED1_L3 = 0;}delay(DY_PWM);dis_off();i = d & 0x08;if(i == 0x08){DY_LED1_H1 = 1;DY_LED1_L4 = 0;}delay(DY_PWM);dis_off();i = d & 0x10;if(i == 0x10){DY_LED1_H1 = 1;DY_LED1_L5 = 0;}delay(DY_PWM);dis_off();i = d & 0x20;if(i == 0x20){DY_LED1_H1 = 1;DY_LED1_L6 = 0;}delay(DY_PWM);dis_off();i = d & 0x40;if(i == 0x40){DY_LED1_H1 = 1;DY_LED1_L7 = 0;}delay(DY_PWM);dis_off();i = d & 0x80;if(i == 0x80){DY_LED1_H1 = 1;DY_LED1_L8 = 0;}delay(DY_PWM);dis_off();}/******************************************************************************************* **/void displayHH2 (unsigned char d){ //第列横向显示程序unsigned char i;i = d & 0x01;if(i == 0x01){DY_LED1_H2 = 1;DY_LED1_L1 = 0;}delay(DY_PWM);dis_off();i = d & 0x02;if(i == 0x02){DY_LED1_H2 = 1;DY_LED1_L2 = 0;}delay(DY_PWM);dis_off();i = d & 0x04;if(i == 0x04){DY_LED1_H2 = 1;DY_LED1_L3 = 0;}delay(DY_PWM);dis_off();i = d & 0x08;if(i == 0x08){DY_LED1_H2 = 1;DY_LED1_L4 = 0;}delay(DY_PWM);dis_off();i = d & 0x10;if(i == 0x10){DY_LED1_H2 = 1;DY_LED1_L5 = 0;}delay(DY_PWM);dis_off();i = d & 0x20;if(i == 0x20){DY_LED1_H2 = 1;DY_LED1_L6 = 0;}delay(DY_PWM);dis_off();i = d & 0x40;if(i == 0x40){DY_LED1_H2 = 1;DY_LED1_L7 = 0;}delay(DY_PWM);dis_off();i = d & 0x80;if(i == 0x80){DY_LED1_H2 = 1;DY_LED1_L8 = 0;}delay(DY_PWM);dis_off();}/******************************************************************************************* **/void displayHH3 (unsigned char d){ //第列横向显示程序unsigned char i;i = d & 0x01;if(i == 0x01){DY_LED1_H3 = 1;DY_LED1_L1 = 0;}delay(DY_PWM);dis_off();i = d & 0x02;if(i == 0x02){DY_LED1_H3 = 1;DY_LED1_L2 = 0;}delay(DY_PWM);dis_off();i = d & 0x04;if(i == 0x04){DY_LED1_H3 = 1;DY_LED1_L3 = 0;}delay(DY_PWM);dis_off();i = d & 0x08;if(i == 0x08){DY_LED1_H3 = 1;DY_LED1_L4 = 0;}delay(DY_PWM);dis_off();i = d & 0x10;if(i == 0x10){DY_LED1_H3 = 1;DY_LED1_L5 = 0;}delay(DY_PWM);dis_off();i = d & 0x20;if(i == 0x20){DY_LED1_H3 = 1;DY_LED1_L6 = 0;}delay(DY_PWM);dis_off();i = d & 0x40;if(i == 0x40){DY_LED1_H3 = 1;DY_LED1_L7 = 0;}delay(DY_PWM);dis_off();i = d & 0x80;if(i == 0x80){DY_LED1_H3 = 1;DY_LED1_L8 = 0;}delay(DY_PWM);dis_off();}/******************************************************************************************* **/void displayHH4 (unsigned char d){ //第列横向显示程序unsigned char i;i = d & 0x01;if(i == 0x01){DY_LED1_H4 = 1;DY_LED1_L1 = 0;}delay(DY_PWM);dis_off();i = d & 0x02;if(i == 0x02){DY_LED1_H4 = 1;DY_LED1_L2 = 0;}delay(DY_PWM);dis_off();i = d & 0x04;if(i == 0x04){DY_LED1_H4 = 1;DY_LED1_L3 = 0;}delay(DY_PWM);dis_off();i = d & 0x08;if(i == 0x08){DY_LED1_H4 = 1;DY_LED1_L4 = 0;}delay(DY_PWM);dis_off();if(i == 0x10){DY_LED1_H4 = 1;DY_LED1_L5 = 0;}delay(DY_PWM);dis_off();i = d & 0x20;if(i == 0x20){DY_LED1_H4 = 1;DY_LED1_L6 = 0;}delay(DY_PWM);dis_off();i = d & 0x40;if(i == 0x40){DY_LED1_H4 = 1;DY_LED1_L7 = 0;}delay(DY_PWM);dis_off();i = d & 0x80;if(i == 0x80){DY_LED1_H4 = 1;DY_LED1_L8 = 0;}delay(DY_PWM);dis_off();}/******************************************************************************************* **/void diplay_data (unsigned char l,unsigned char d){switch (l){//显示的列位置case 1://displayHH1(d); //将显示数据送入break;//case 2://displayHH2(d); //将显示数据送入break;//case 3://displayHH3(d); //将显示数据送入break;//case 4://displayHH4(d); //将显示数据送入break;//}}/******************************************************************************************* **/void init (void){ //上电初始化P1M0 = DY_P1M0SET;P1M1 = DY_P1M1SET;P3M0 = DY_P3M0SET;P3M1 = DY_P3M1SET;////dis_off();DY_PWM = DY_LI;////TMOD = 0x11; // 定时/计数器,1工作于方式TH0 = 0x3c; // 预置产生ms时基信号EA = 1; // 开总中断ET0 = 1; // 定时/计数器允许中断TR0 = 1; // 开闭定时/计数器//////TIME_DD = 18; //时间在首次使用的值,之后会在EEPROM自动记录上一天的值//TIME_MO = 5; //初始时间:年月日周一,时分秒//TIME_YY = 9;//TIME_WW = 1;//TIME_HH = 22;//TIME_MM = 13;//TIME_SS = 40;}/******************************************************************************************* **/void main (void){ //主程序init();while (1){diplay_data (1,disdata[TIME_MM/10]);diplay_data (2,disdata[TIME_MM%10]);diplay_data (3,disdata[TIME_SS/10]+0x80);diplay_data (4,disdata[TIME_SS%10]+0x80);}}/******************************************************************************************* ***/void tiem0(void) interrupt 1{ // T/C0中断服务程序(产生ms时基信号)cou++; // 软计数器加if(cou > 19){ // 计数值到(1s)cou = 0; // 软计数器清零TIME_SS++; // 秒计数器加(进位ms*100=1s)if(TIME_SS > 59){ // 秒计数值到TIME_SS = 0; // 秒计数器清零TIME_MM++; // 分计数器加(进位s=1m)if(TIME_MM > 59){ // 分计数到TIME_MM = 0; // 分计数器清零TIME_HH++; // 时计数器加(进位m=1h)if(TIME_HH > 23){ // 时计数到TIME_HH = 0; // 时计数器清零}}}}TH0 = 0x3c; // 重置定时常数TL0 = 0xb0;}/******************************************************************************************* ***//*************************************************************/*************************************************************/。
《单片机原理及应用》实验指导书(C语言)
《单片机原理及应用》实验指导书(C语言)《单片机原理及应用》实验指导书(C语言)某某大学物电学院微机教研室某某2022前言由于单片机具有高可靠性、超小型、低价格、容易产品化等特点,在仪器仪表智能化、实时工业控制、实时数据采集、智能终端、通信设备、导航系统、家用电器等控制应用领域,具有十分广泛的用途。
由于目前在国内单片机应用中,MCS-51系列单片机仍然是一种主流单片机,所以本实验指导书为学习MCS-51单片机的学生,配合《单片机原理及应用》课程的教学,结合本学院自制单片机教学实验板编写了这本实验指导书。
《单片机原理应用及》是一门实践性很强的课程,提高教学质量的一个重要环节是上机实习和训练,无论是学习汇编语言程序设计,还是学习接口电路和外设与计算机的连接,或者软硬兼施地研制单片机应用系统,不通过加强动手是不能获得预期效果的。
本实验指导书提供多个实验的指导性材料,有些实验还有一些有一定难度的选做项目,可以根据课时的安排和教学要求进行取舍。
为了达到某些实验的目的,书中提供的参考程序与实际应用中的程序会有些差别,所以不一定是最优的。
由于时间紧迫,需要赶课程进度与实验时间的同步,加上编者学识有限,如有不妥之处,欢迎读者批评指正。
实验须知1.实验前必须阅读教科书的有关部分和本实验指导书,了解实验目的、内容、步骤,做好实验前的准备,编写好实验中要求自编或修改的程序;完成实验前要求完成的准备工作后方可以上机实验,否则不得上机操作。
2.各种电源的电压和极性不能接错,严禁带电接线和接插元器件。
通电前须经过指导教师检查认可后方能通电。
3.不准随意拨弄各种与实验无关的旋钮和开关,凡与本次实验无关的任何设备都禁止动用和摸弄,注意安全。
4.严禁用手触摸实验系统印制电路板和元器件的引脚,防止静电击穿芯片。
5.实验中若损坏仪器或元器件,应及时向指导教师报告。
6.在实验室内保持安静和卫生,不得随意走动和喧哗,集中精力完成实验。
7.实验完成后,关掉电源,及时整理实验台桌面,保持环境整洁。
单片机数码管动态显示1234-9999
一、实验目的1.掌握Keil软件的基本使用2.学习和掌握C语言编写程序的一般格式3.了解数码管与单片机的接口方法;4.了解数码管性能及动态显示编程方法;5.了解并掌握单片机系统中定时器中断控制的基本方法;二、实验内容用定时器中断实现四位数码管动态显示从1234-9999。
三、实验原理3.1基础知识介绍A.数码管是LED的升级,每位数码管里面继承了8个LED,点亮数码管就是点亮数码管里面的LED。
要在数码管上面显示相应的值,就是点亮不同位置的LED。
数码管有共阴和共阳两种,共阴数码管公共端是所有LED的负极连接在一起,相反共阳数码管公共端是所有LED的正极连接在一起。
一般公共端称作“位选”,控制每一个LED的称为“段选”。
数码管主要是利用视觉暂留的效果,通过快速循环点亮数码管方式,将数据呈现出来。
数码管如图1.2所示1.2数码管1.3数码管实物图/B.定时器定时器也可看作是对计算机机器周期的计数器。
因为每个机器周期包含12个振荡周期,故每一个机器周期定时器加1,可以把输入的时钟脉冲看成机器周期信号。
故其频率为晶振频率的1/12。
如果晶振频率为12MHz,则定时器每接收一个输入脉冲的时间刚好为1μs。
定时器有两种工作模式,分别为计数模式和定时模式。
对Px,y 的输入脉冲进行计数为计数模式。
定时模式,则是对MCU的主时钟经过12分频后计数。
因为主时钟是相对稳定的,所以可以通过计数值推算出计数所经过的时间。
计数器的计数值存放于特殊功能寄存器中。
T0(TL0-0x8A, TH0-0x8C), T1(TL1-0x8B, TH1-0x8D)定时器工作原理如下图由上图可见与定时器相关的寄存器主要有下面这几个:TMOD、TCON、TL0、TH0、TL1、TH1。
下面介绍一下这几个寄存器16位加法计数器:是定时计数器的核心,其中TL0、TH0、是定时计数器0的底八位和高八位;TL1、TH1是定时计数器1的底八位和高八位;并且高八位和底八位可单独使用。
51单片机汇编语言及C语言经典实例
51单片机汇编语言及C语言经典实例汇编语言是一种用来编写计算机指令的低级语言,它与机器语言十分接近,可以直接控制计算机硬件。
而C语言是一种高级程序设计语言,它具有结构化编程和模块化设计的特点。
本文将介绍51单片机汇编语言和C语言的经典实例,并进行详细解析。
一、LED指示灯的闪烁我们首先来看一个经典的51单片机汇编语言的实例——LED指示灯的闪烁。
我们可以通过控制单片机的IO口来实现LED的闪烁效果。
以下是汇编语言的代码:```assemblyORG 0 ; 程序起始地址MOV P1, #0; 将 P1 置为0,熄灭LEDLJMP $ ; 无限循环```以上代码使用了51单片机的MOV指令和LJMP指令。
MOV指令用来将一个立即数(这里是0)存储到寄存器P1中,控制对应的I/O口输出低电平,从而熄灭LED。
而LJMP指令则是无条件跳转指令,将程序跳转到当前地址处,实现了无限循环的效果。
对应的C语言代码如下:```c#include <reg51.h>void main() {P1 = 0; // 将 P1 置为0,熄灭LEDwhile(1); // 无限循环}```以上代码使用了reg51.h头文件,该头文件提供了对51单片机内部寄存器和外设的访问。
通过将P1赋值为0,控制IO口输出低电平,实现了熄灭LED的效果。
while(1)是一个无限循环,使得程序一直停留在这个循环中。
二、数码管的动态显示接下来我们介绍51单片机汇编语言和C语言实现数码管动态显示的经典实例。
数码管动态显示是通过控制多个IO口的高低电平来控制数码管显示不同的数字。
以下是汇编语言的代码:```assemblyORG 0 ; 程序起始地址MOV A, #0FH ; 设置数码管全亮,A存储数码管控制位MOV P2, A ; 将 A 的值存储到 P2,控制数码管的数码控制位DELAY: ; 延时循环MOV R7, #0FFH ; 设置延时计数值LOOP1: ; 内层循环MOV R6, #0FFH ; 设置延时计数值LOOP2: ; 内部延时循环DJNZ R6, LOOP2 ; 延时计数减1并判断是否为0,不为0则继续循环DJNZ R7, LOOP1 ; 延时计数减1并判断是否为0,不为0则继续循环DJNZ A, DELAY ; A减1并判断是否为0,不为0则继续循环JMP DELAY ; 无限循环,实现动态显示```以上代码中,我们通过MOV指令来将一个立即数(0x0F)存储到寄存器A中,控制数码管显示0-9的数字。
c语言四位数码管万年历程序
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 万年历&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& #include<reg51.h>#define uchar unsigned char#define uint unsigned intuchar code taba[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};uchar code tabb[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};uint a,b,c,i,j,n=0,nian=2010,yue=1,ri=1,shi=0,fen=0,miao=0;sbit K1=P3^2;sbit K2=P3^3;sbit K3=P3^4;sbit K4=P3^5;sbit F=P3^0;sbit D=P0^7;void int0()interrupt 1 //T0定时器中断{TH0=(65536-50000)/256;TL0=(65536-50000)%256;i++;if(i==20) i=0,miao++,P1=~P1; //定时满1秒,秒进1,流水灯明灭if(miao==60) miao=0,fen++; //秒钟数满59,秒归0,分进1if(fen==60) fen=0,shi++; //分钟数满59,分归0}void delay(uint j) //延时函数j*1ms{for(a=1;a<=j;a++) //延时j*1msfor(b=1;b<=121;b++);}void del_nian() //实现数码管动态显示年{while(miao<=5&&K1) //显示5秒,--年{P0=taba[nian/1000],P2=0xf7,delay(3),P0=0xff,P2=0xff; //数码管第1位显示P0=taba[nian/100%10],P2=0xfb,delay(3),P0=0xff,P2=0xff; //数码管第2位显示P0=taba[nian%100/10],P2=0xfd,delay(3),P0=0xff,P2=0xff; //数码管第3位显示P0=taba[nian%10],P2=0Xfe,delay(3),P0=0xff,P2=0xff;} //数码管第4位显示}void del_yue_ri() //实现数码管动态显示月,日{while(miao<=10&&K1) //显示5秒,--月--日{P0=taba[yue/10],P2=0xf7,delay(3),P0=0xff,P2=0xff; //数码管第1位显示P0=tabb[yue%10],P2=0xfb,delay(3),P0=0xff,P2=0xff; //数码管第2位显示P0=taba[ri/10],P2=0xfd,delay(3),P0=0xff,P2=0xff; //数码管第3位显示P0=taba[ri%10],P2=0Xfe,delay(3),P0=0xff,P2=0xff;} //数码管第4位显示}void del_shi_fen() //实现数码管动态显示时,分{while(miao>10&&miao<=60&&K1) //显示50秒,--分--钟{P0=taba[shi/10],P2=0xf7,delay(3),P0=0xff,P2=0xff; //数码管第1位显示P0=tabb[shi%10],P2=0xfb,delay(3),P0=0xff,P2=0xff; //数码管第2位显示P0=taba[fen/10],P2=0xfd,delay(3),P0=0xff,P2=0xff; //数码管第3位显示P0=taba[fen%10],P2=0Xfe,delay(3),P0=0xff,P2=0xff;} //数码管第4位显示}void del_tiao_nian(){while(K1) //按下K1返回{switch(n){case 2:{if(K3==0) delay(200),K3=1,nian++; //第2次按K1,按K3加,来调W2 if(K4==0) delay(200),K4=1,nian--;};break;}P0=taba[nian/1000],P2=0xf7,delay(3),P0=0xff,P2=0xff;P0=taba[nian/100%10],P2=0xfb,delay(3),P0=0xff,P2=0xff;P0=taba[nian%100/10],P2=0xfd,delay(3),P0=0xff,P2=0xff;P0=tabb[nian%10],P2=0Xfe,delay(3),P0=0xff,P2=0xff;} //用带点数组,表示调整的是哪个值---第四个点---调-年}void del_tiao_yue_ri(){ while(K1) //按下K1返回{switch(n){case 3:{if(K3==0) delay(200),K3=1,yue++; //第3次按K1,按K3加,来调W4 if(K4==0) delay(200),K4=1,yue--;P0=tabb[yue%10],P2=0xfb,delay(3),P0=0xff,P2=0xff;};break; //用带点数组,表示调整的是哪个值---第二个点---调-月case 4:{if(K3==0) delay(200),K3=1,ri++; //第4次按K1,按K3加,来调W4 if(K4==0) delay(200),K4=1,ri--;P0=tabb[ri%10],P2=0Xfe,delay(3),P0=0xff,P2=0xff;};break;} //用带点数组,表示调整的是哪个值---第四个点---调-日P0=taba[yue/10],P2=0xf7,delay(3),P0=0xff,P2=0xff;P0=taba[yue%10],P2=0xfb,delay(3),P0=0xff,P2=0xff;P0=taba[ri/10],P2=0xfd,delay(3),P0=0xff,P2=0xff;P0=taba[ri%10],P2=0Xfe,delay(3),P0=0xff,P2=0xff;}}void del_tiao_shi_fen(){while(K1) //按下K1返回{switch(n){case 5:{if(K3==0) delay(200),K3=1,shi++; //第5次按K1,按K3加,来调W4if(K4==0) delay(200),K4=1,shi--;P0=tabb[shi/10],P2=0xf7,delay(3),P0=0xff,P2=0xff; //P0=tabb[shi%10],P2=0xfb,delay(3),P0=0xff,P2=0xff;};break; //用带点数组,表示调整的是哪个值---前两个点---调-年case 6:{if(K3==0) delay(200),K3=1,fen++; //第6次按K1,按K3加,来调W4if(K4==0) delay(200),K4=1,fen--;P0=tabb[fen/10],P2=0Xfd,delay(3),P0=0xff,P2=0xff; //P0=tabb[fen%10],P2=0Xfe,delay(3),P0=0xff,P2=0xff;};break;} //用带点数组,表示调整的是哪个值---后两个点---调-年P0=taba[shi/10],P2=0xf7,delay(3),P0=0xff,P2=0xff;P0=taba[shi%10],P2=0xfb,delay(3),P0=0xff,P2=0xff;P0=taba[fen/10],P2=0xfd,delay(3),P0=0xff,P2=0xff;P0=taba[fen%10],P2=0Xfe,delay(3),P0=0xff,P2=0xff;}}void del_tiao() //暂停调整程序{while(n!=8) //第8次按下,调整循环了一圈,跳回主程序{if(K1==0)delay(300),K1=1,n++; //通过K1改变n值while(K1&&n!=8) //按下K2返回主程序{switch(n){case 1:P0=0x00,P1=0xff,P2=0x00;break; //第1次按下,显示管全亮case 2:del_tiao_nian();break; //第2次按下,进到调--年--状态case 3:del_tiao_yue_ri();break; //第3次按下,进到调--月--状态case 4:del_tiao_yue_ri();break; //第4次按下,进到调--日--状态case 5:del_tiao_shi_fen();break; //第5次按下,进到调--时--状态case 6:del_tiao_shi_fen();break; //第6次按下,进到调--分--状态case 7:P0=0x00,P1=0xff,P2=0x00;break;} //第7次按下,显示管全亮}}}void main() //主函数{TMOD=0X01; //TH0=(65536-50000)/256; //TL0=(65536-50000)%256; ////////定时初始化EA=1; //ET0=1; //while(1){TR0=1; //开启定时器n=0;if(yue==1^yue==3^yue==5^yue==7^yue==8^yue==10) ////实现1,3,5,7,8,10月,有31天{if(ri==32) ri=0,yue++;};if(yue==4^yue==6^yue==9^yue==11) //实现4,6,9,11月,有30天{if(ri==31) ri=0,yue++;};if(!nian%4) //实现闰年有28天{if(yue==2){if(ri==29) ri=0,yue++;}};if(nian%4) //实现平年有29天{if(yue==2){if(ri==30) ri=0,yue++;}};if(yue==12) //在12月份,满31天,年加1,月-日归0 {if(ri==32) ri=0,nian++;};if(shi==24) shi=0,ri++; //实现满24小时,时归0,日加1del_nian(); //调用-年----显示if(!K1) del_tiao(); //有按键按下,进入调整程序del_yue_ri(); //调用-月-日-显示if(!K1) del_tiao(); //有按键按下,进入调整程序del_shi_fen(); //调用-时-分-显示if(!K1) del_tiao(); //有按键按下,进入调整程序}}&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 抢答器&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& #include<reg52.h> //头文件#define uchar unsigned char //宏定义#define uint unsigned int //宏定义uchar code table[5]={0xC0,0xF9,0xA4,0xB0,0x99};// 0 , 1 , 2 , 3 , 4 ;uchar code tab[5]={0xF7, 0xFB, 0xFD, 0xFE, 0xFF};//数码管:一亮,二亮,三亮,四亮,全灭uint i,j=0,z=5,x=5,c=5,v=5,a,b;sbit K4=P3^5;sbit L4=P1^0;sbit K3=P3^4;sbit L3=P1^1;sbit K2=P3^3;sbit L2=P1^2;sbit K1=P3^2;sbit L1=P1^3;sbit M=P3^0;void delay(uint i) //延时子函数---延时:i*1ms{for(a=0;a<+i;a++)for(b=0;b<=121;b++);}void del(void) //子函数----倒计时{ for(i=3;i>0;i--) //倒计时3,2,1{P3=0xFF,P2=0xF0;for(j=0;j<=30000;j++) //循环扫描按键{P0=table[i];if(K1==0) { while(1) //数码管二,三闪烁锁定提前抢答者1,蜂鸣器报警{P2=0xF9,P0=table[1],M=0,delay(100),P2=0xFF,M=1,delay(100);}}if(K2==0) { while(1) //数码管二,三闪烁锁定提前抢答者2,蜂鸣器报警{P2=0xF9,P0=table[2],M=0,delay(100),P2=0xFF,M=1,delay(100);;}}if(K3==0) { while(1) //数码管二,三闪烁锁定提前抢答者3,蜂鸣器报警{P2=0xF9,P0=table[3],M=0,delay(100),P2=0xFF,M=1,delay(100);;}}if(K4==0) { while(1) //数码管二,三闪烁锁定提前抢答者4,蜂鸣器报警{P2=0xF9,P0=table[4],M=0,delay(100),P2=0xFF,M=1,delay(100);;}}}};}void main(){ del();if(i==0) M=0,delay(50),M=1; //蜂鸣器响后开始抢答P3=0xFF,j=0;while(1) //实现四人强答,动态显示{ if(K1==0){M=0,L1=0; //蜂鸣器响对应第一流水灯亮if(z==5) z=j++;}P2=tab[z],P0=table[1],delay(4),M=1,P0=0xFF,P2=0xFF;if(K2==0){M=0,L2=0; //蜂鸣器响对应第二流水灯亮if(x==5) x=j++;}P2=tab[x],P0=table[2],delay(4),M=1,P0=0xFF,P2=0xFF;if(K3==0){M=0,L3=0; //蜂鸣器响对应第三流水灯亮if(c==5) c=j++;}P2=tab[c],P0=table[3],delay(4),M=1,P0=0xFF,P2=0xFF;if(K4==0){M=0,L4=0; //蜂鸣器响对应第四流水灯亮if(v==5) v=j++;}P2=tab[v],P0=table[4],delay(4),M=1,P0=0xFF,P2=0xFF;}}。
四位数码管动态显示c语言程序
//这是一个四位数码管动态显示c语言程序,每隔一秒加一,直至加到9999为止//使用时需采用锁存器#include 〈reg52.h〉#include”stdio。
h"unsigned char code LED[]={0xc0,0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90};unsigned char LEDbuff[]={0xff,0xff,0xff,0xff};//定义数码管的位选段sbit SEG_bit_1 = P0^1;sbit SEG_bit_2 = P0^2;sbit SEG_bit_3 = P0^3;sbit SEG_bit_4 = P0^4;unsigned int cnt=0;unsigned int sec =0;unsigned int mini=0;unsigned int hour=0;unsigned char i=0;/*void delay(unsigned int z ){unsigned int x,y;for(x=z;x>0;x--)for(y=110;y>0;y-—);}*/void interrupttimer0() interrupt 1 /*设置中断函数*/{TH0=0xfc;TL0=0x18;cnt++;//P1=0x80;//delay(1);switch(i){case 0:SEG_bit_1 = 0;SEG_bit_4 = 1;P1=LEDbuff[0];i++;break;case 1:SEG_bit_4 = 0;SEG_bit_3 = 1;P1=LEDbuff[1];i++;break;case 2: SEG_bit_3 = 0;SEG_bit_2 = 1;P1=LEDbuff[2]&;i++;break;case 3:SEG_bit_2 = 0;SEG_bit_1 = 1;P1=LEDbuff[3];i=0;break;default:break;}}/************************************************ void serial_init(){//TMOD = 0x20;//定时器T/C1工作方式2SCON = 0x50; //串口工作方式1,允许串口接收(SCON = 0x40 时禁止串口接收) TH1 = 0xF3; //定时器初值高8位设置TL1 = 0xF3; //定时器初值低8位设置PCON = 0x80; //波特率倍频(屏蔽本句波特率为2400)TR1 = 1; //定时器启动}**********************************************/ void main(){//serial_init(); //串口初始化//TMOD=0x21;/*设置定时器*/TMOD=0x01;TH0=0xfc;TL0=0x18;TR0=1;EA=1; /*设置中断*/ET0=1;while(1){if(0==TF0){if(cnt〉=1000){cnt=0;sec++;if (sec>=60){sec=0;mini++;if (mini>=60){mini=0;hour++;if (hour>=24) hour=0;}}LEDbuff[0]=LED[sec%10];//*设置数码管显示位*/LEDbuff[1]=LED[sec/10%10];LEDbuff[2]=LED[mini%10];LEDbuff[3]=LED[mini/10%10];// TI=1; //使用printf函数前须先将发送标志位TI置1// printf(”%4d %x ,%x %x\n ”,sec,LEDbuff[0],LEDbuff[1],LEDbuff[2]);// TI=0;}}}}。
四位数码管(动态) - C51程序详解
/*-----------------------------------------------------方案要求:上电一个LED一直闪,四位数码管9999循环正计数思路:用两个定时器分别控制LED和数码管----------------------------------------------------------*/#include <reg51.h>//51头文件#define Uchar unsigned char//宏定义,用Uchar来代表关键词unsigned char(无符号字符型数据)#define Uint unsigned int//宏定义,用Uchar来代表关键词unsigned int(无符号整型数据)sbit seg = P2^6; //位声明,声明该位用于控制数码管的笔画.sbit com = P2^7;//位声明,声明该位用于控制数码管的公共端.sbit LED = P1^0;//位声明,声明该位用于控制一个LED亮灭.Uchar displ[]= //声明数组,displ是自定义数组名,[]是叫下标的,里面本应填元素个数,但可以不填.{0x3f,0x06,0x5b,0x4f, //这些都是叫数组的元素,按顺序排放,从左到右,从上到下.0x66,0x6d,0x7d,0x07,0x7f,0x6f,//这是共阴数码管,ox7f=01111111 ,如果该数(8字)是10000000则是共阳.};Uint number, number1, number2, qian, bai, shi, ge; //定义多个全局变量,以便后面要用到void delay_mS (Uint k)//延时子程序,k为形参,在显示子程序里会传递实参来进行计算{Uint i,j;//定义两个局部变量for(i=k; i>0; i--)//k接到实参后,如果i大于0,那么让i自减1,再执行{ }内的for语句,然后再判断i是否大于0,{for(j=110; j>0; j--);}//直到i=0(不大于0),该延时子程序才算执行完成,跳出。
单片机C语言程序(数码管动态静态显示)
0123动态显示:#inclu de<re g52.h>#de fineuchar unsi gnedchar#defi ne ui nt un signe d intuint num,numdu,numw e;uc har c ode t abled u[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};ucha r cod e tab lewe[]={0xfe,0xfd,0xfb,0xf7};sbit dula=P2^6;sbi t wel a=P2^7;vo id di splay();v oid m ain(){E A=1;ET1=1;T MOD=0x10;TH1=(65536-500)/256;TH0=(65536-500)%256;TR1=1;nu m=0;whil e(1){if(nu m==20){n um=0;i f(num du==4)numdu=0;if(numwe==4)nu mwe=0;displ ay();n umdu++;numw e++;}}}v oid t ime1() int errup t 3{TH1=(65536-500)/256;T H0=(65536-500)%256;num++;}voiddispl ay(){P0=0xff;we la=1;wel a=0;P0=t abled u[num du];dula=1;dula=0;P0=tab lewe[numwe];w ela=1;we la=0;}0123静态显示:#inclu de<re g52.h>#de fineuchar unsi gnedchar#defi ne ui nt un signe d intuint num,numdu,numw e;uc har c ode t abled u[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};ucha r cod e tab lewe[]={0xfe,0xfd,0xfb,0xf7};sbit dula=P2^6;sbi t wel a=P2^7;vo id de lay(u char);voi d mai n(){EA=1;E T1=1;TMO D=0x10;T H1=(65536-50000)/256;TH0=(65536-50000)%256;TR1=1;while(1){P0=0xf f;wela=1;wela=0;P0=t abled u[0];du la=1;du la=0;P0=tabl ewe[0];wela=1;wela=0;P0=0x ff;wela=1; wel a=0;P0=table du[1];d ula=1;d ula=0;P0=tab lewe[1];wela=1;wela=0;P0=0xff;wel a=1;we la=0;P0=tabl edu[2];dula=1;dula=0;P0=ta blewe[2];wel a=1;wel a=0;P0=0xff;we la=1;w ela=0;P0=tab ledu[3];dula=1;dula=0;P0=t ablew e[3];we la=1;we la=0;} }0-999循环跳变#in clude<reg52.h>#defi ne uc har u nsign ed ch ar#d efine uint unsi gnedintu int a,b,co unt,n um,nu mdu,n umwe; ucha r cod e tab ledu[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};u charcodetable we[]={0xf e,0xf d,0xf b,0xf7};s bit d ula=P2^6;sbitwela=P2^7;void dela y(uch ar);voiddispl ay(uc har,u char,uchar); vo id ma in(){EA=1;ET1=1;TM OD=0x10;TH1=(65536-50000)/256;T H0=(65536-50000)%256;TR1=1;coun t=0;whil e(1){if(nu m==20){nu m=0;if(count==1000)count=0;c ount++;}d ispla y(cou nt/100,cou nt%100/10,count%10);}}void time1() i nterr upt 3{T H1=(65536-50000)/256;TH0=(65536-50000)%256;num++;}void disp lay(u charbai,u charshi,u charge){P0=0xff;wel a=1;wela=0;P0=ta bledu[bai];du la=1;dul a=0;P0=t ablew e[1];wel a=1;wela=0;delay(1);P0=0xff;wela=1;wela=0;P0=tab ledu[shi];dul a=1;dula=0;P0=ta blewe[2];wela=1;wela=0;d elay(1); P0=0xff;wela=1;wela=0;P0=tab ledu[ge];dula=1;dula=0;P0=tab lewe[3];wela=1;w ela=0;de lay(1);}voiddelay(ucha r x){uc har a,b;for(a=x;a>0;a--)f or(b=200;b>0;b--); }。
数码管的动态显示设计与研究
单片机课程设计报告指导老师:张橙班级:自动化072姓名:廖岩学号: 07401100221日期: 2013年1月6日数码管的动态显示设计与研究一:概述动态显示主要就是利用人眼的视觉感来设计的,一般来说如果显示的频率过慢,则会有断断续续的显示;如果显示的频率加快,则人眼就分辨不出这种视觉残余!随着现代科学技术的不断地进步,人们已经走入了信息的高速时代。
科学的力量日益强大,技术的更新的速度也更加加快了。
计算机走进了千家万户,其中,单片机是一种应用十分广泛的单心片微型计算机,在我国的普及应用已有若干年,上至航天飞机,下至电动玩具,都能见到它的身影。
单片机比专用处理器更适合应用于嵌入式系统,因此它得到了最多的应用。
事实上单片机是世界上数量最多的计算机。
现代人类生活中所用的几乎每件电子和机械产品中都会集成有单片机。
手机、电话、计算器、家用电器、电子玩具、掌上电脑以及鼠标等电脑配件中都配有1-2部单片机。
而个人电脑中也会有为数不少的单片机在工作。
汽车上一般配备40多部单片机,复杂的工业控制系统上甚至可能有数百台单片机在同时工作!单片机的数量不仅远超过PC机和其他计算的综合,甚至比人类的数量还要多。
而本次单片机数码管动态显示设计中采用AT89C52。
AT89C52为8位通用微处理器,采用工业标准的C51内核,在内部功能及管脚排布上与通用的8xc52 相同,其主要用于会聚调整时的功能控制。
功能包括对会聚主IC 内部寄存器、数据RAM及外部接口等功能部件的初始化,会聚调整控制,会聚测试图控制,红外遥控信号IR的接收解码及与主板CPU通信等。
主要管脚有:XTAL1(19 脚)和XTAL2(18 脚)为振荡器输入输出端口,外接12MHz 晶振。
RST/Vpd(9 脚)为复位输入端口,外接电阻电容组成的复位电路。
vcc(40 脚)和VSS(20 脚)为供电端口,分别接+5V电源的正负端。
P0~P3 为可编程通用I/O 脚,其功能用途由软件定义,在本设计中,P0 端口(32~39 脚)被定义为N1 功能控制端口,分别与N1的相应功能管脚相连接,13 脚定义为IR输入端,10 脚和11脚定义为I2C总线控制端口,分别连接N1的SDAS(18脚)和SCLS(19脚)端口,12 脚、27 脚及28 脚定义为握手信号功能端口,连接主板CPU的相应功能端,用于当前制式的检测及会聚调整状态进入的控制功能。
单片机控制的四位数码管动态显示编程
时代农机TIMES AGRICULTURAL MACHINERY第46卷第2期Vol.46No.22019年2月Feb.20192019年第2期摘要:应用仿真软件,设计“2018”动态显示程序并进行计算机仿真。
关键词:程序;动态显示;单片机控制作者简介:谭明良(1998-),男,辽宁大连人,大学本科,主要研究方向:机电一体化技术。
通讯作者:王伟(1957-),男,山东菜州人,硕士,副教授,主要研究方向:机电一体化技术、机床电气与PLC 技术。
单片机控制的四位数码管动态显示编程谭明良,王伟(沈阳工学院,辽宁抚顺113122)1软件介绍与动态说明PROTEUS 软件是英国Lab Center Electronics公司出版的EDA (电子设计自动化)工具软件。
KeilC51是美国Keil Software 公司出品的51系列兼容单片机C 语言软件开发系统。
两软件的联合调试是单片机仿真的基础。
静态显示就是用单片机I/O 口输出固定的数值,每个数码管的驱动电平不会改变,一般用来显示固定的数值。
动态显示,也称扫描显示,是将所有数码管的8段即a~dp 段都连接在一起,分时使各个数码管的位选端有效,也就是在某一个时刻只能有1个数码管在显示。
由于人眼具有“视觉暂留”作用(通常在20ms 左右),因此只要使多个数码管显示的时间间隔较短,人眼一般是感绝不到数码管熄灭的,因此可以形成多个数码管在“静态显示”的假象。
动态显示优点是占用的I/O 接口较少,但需要消耗一定的时间。
2动态显示编程由四位数码管用动态显示“2018”,原理是由单片机的一个I/O 口输出显示段码,另一个I/O 口输出位码。
程序如下:#include<reg52.h>delay ();#define uchar unsigned char P2=0x00;#define uint unsigned intP2=a [2];uchar code a [4]={0x7f ,0x06,0x3f ,0x5b};P1=b [2];uchar code b [4]={0xfe ,0xfd ,0xfb ,0xf7};delay ();uint time ;P2=0x00;void delay ();P2=a [3];void main ()P1=b [3];{P0=0x00;delay ();while (1)P2=0x00;{P2=a [0];}P1=b [0];}delay ();void delay ()P2=0x00;{time=1300;P2=a [1];while (time--);}P1=b [1];3仿真效果4结语动态显示可以同时显示多位数码管,通过不停的刷新I/O 口的数据来实现多位的持续显示。
51单片机(四位数码管的显示)程序
51单片机(四位数码管的显示)程序基于单片机V1或V2实验系统,编写一个程序,实现以下功能:1)首先在数码管上显示“P_ _ _”4个字符;2)等待按键,如按了任何一个键,则将这4个字符清除,改为显示“0000”4个字符(为数字的0)。
最佳答案下面这个程序是4x4距阵键盘,LED数码管显示,一共可以到0-F显示,你可以稍微改一下就可以实现你的功能了,如还有问题请发信息,希望能帮上你!#include<at89x52.h>unsigned char codeDig[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1 ,0x86,0x8e}; //gongyang数码管0-F 代码unsigned char k; //设置全局变量k 为键盘的键值/************************************键盘延时函数****************************/void key_delay(void) //延时函数{int t;for(t=0;t<500;t++);}/************************************键盘扫描函数******************************/void keyscan(void) //键盘扫描函数{unsigned char a;P2 = 0xf0; //键盘初始化if(P2!=0xf0) //有键按下?{key_delay(); //延时if(P2!=0xf0) //确认真的有键按下?{P2 = 0xfe; //使行线P2.4为低电平,其余行为高电平key_delay();a = P2; //a作为缓存switch (a) //开始执行行列扫描{case 0xee:k=15;break;case 0xde:k=11;break;case 0xbe:k=7;break;case 0x7e:k=3;break;default:P2 = 0xfd; //使行线P2.5为低电平,其余行为高电平a = P2;switch (a){case 0xed:k=14;break;case 0xdd:k=10;break;case 0xbd:k=6;break;case 0x7d:k=2;break;default:P2 = 0xfb; //使行线P2.6为低电平,其余行为高电平a = P2;switch (a){case 0xeb:k=13;break;case 0xdb:k=9;break;case 0xbb:k=5;break;case 0x7b:k=1;break;default:P2 = 0xf7; //使行线P2.7为低电平,其余行为高电平a = P2;switch (a){case 0xe7:k=12;break;case 0xd7:k=8;break;case 0xb7:k=4;break;case 0x77:k=0;break;default:break;}}}break;}}}}/****************************** ***主函数*************************************/ void main(void){while(1){keyscan(); //调用键盘扫描函数switch(k) //查找按键对应的数码管显示代码{case 0:P0=Dig[0];break;case 1:P0=Dig[1];break;case 2:P0=Dig[2];break;case 3:P0=Dig[3];break;case 4:P0=Dig[4];break;case 5:P0=Dig[5];break;case 6:P0=Dig[6];break;case 7:P0=Dig[7];break;case 8:P0=Dig[8];break;case 9:P0=Dig[9];break;case 10:P0=Dig[10];break;case 11:P0=Dig[11];break;case 12:P0=Dig[12];break;case 13:P0=Dig[13];break;case 14:P0=Dig[14];break;case 15:P0=Dig[15];break;default:break; //退出}}}/**********************************end***************************************/。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
case 2: SEG_bit_3 = 0;SEG_bit_2 = 1;P1=LEDbuff[2]&;i++;break;
case 3: SEG_bit_2 = 0;SEG_bit_1 = 1;P1=LEDbuff[3];i=0;break;
//这就是一个四位数码管动态显示c语言程序,每隔一秒加一,直至加到9999为止
//使用时需采用锁存器
#include <reg52、h>
#include"stdio、h"
unsigned char code LED[]={0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90};
LEDbuff[3]=LED[mini/10%10];
// TI=1; //使用printf函数前须先将发送标志位TI置1
// printf("%4d %x ,%x %x\n ",sec,LEDbuff[0],LEDbuff[1],LEDbuff[2]);
// TI=0;
}
}
}
}
TH1 = 0xF3;//定时器初值高8位设置
TL1 = 0xF3;//定时器初值低8位设置
PCON = 0x80;//波特率倍频(屏蔽本句波特率为2400)
TR1 = 1;//定时器启动
}
**********************************************/
void main()
}
*/
void interrupttimer0() interrupt 1 /*设置中断函数*/
{
TH0=0xfc;
TL0=0x18;
cnt++;
//P1=0x80;
//delay(1);
switch(i)
{
case 0: SEG_bit_1 = 0;SEG_bit_4 = 1;P1=LEDbuff[0];i++;break;
unsigned char LEDbuff[]={0xff,0xff,0xff,0xff};
//定义数码管的位选段
sbit SEG_bit_1 = P0^1;
sbit SEG_bit_2 = P0^2;
sbit SEG_bit_3 = P0^3;
sbit SEG_bit_4 = P0^4;
unsigned int cnt=0;
unsigned int sec =0;
unsigned int mini=0;
unsigned int hour=0;
unsigned char i=0;
/*void delay(unsigned int z )
{
unsigned int x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
{
//serial_init(); //串口初始化
//TMOD=0x21; /*设置定时器*/
TMOD=0x01;
TH0=0xfc;
TL0=0x18;
TR0=1;
EA=1; /*设置中断*/
ET0=1;
while(1)
{
if(0==TF0)
{
if(cnt>=1000)
{
cnt=0;
sec++;
if (sec>=60) {
default:break;
}
}
/************************************************
void serial_init()
{
//TMOD = 0x20;//定时器T/C1工作方式2
SCON = 0x50;//串口工作方式1,允许串口接收(SCON = 0x40时禁止串口接收)
sec=0;mini++;
if (mini>=60) {
mini=0;hour++;
if (hour>=24) hourห้องสมุดไป่ตู้0;
}
}
LEDbuff[0]=LED[sec%10]; //*设置数码管显示位*/
LEDbuff[1]=LED[sec/10%10];
LEDbuff[2]=LED[mini%10];