51单片机控制数码管动态显示C语言源代码

合集下载

51单片机C语言实验及实践教程_13.动态数码显示技术

51单片机C语言实验及实践教程_13.动态数码显示技术

51单片机C语言实验及实践教程_13.动态数码显示技术发布: 2009-4-04 13:11 | 作者: 孙青安 | 查看: 82次1.实验任务如图4.13.1所示,P0端口接动态数码管的字形码笔段,P2端口接动态数码管的数位选择端,P1.7接一个开关,当开关接高电平时,显示“12345”字样;当开关接低电平时,显示“HELLO”字样。

2.电路原理图图4.13.13.系统板上硬件连线(1.把“单片机系统”区域中的P0.0/AD0-P0.7/AD7用8芯排线连接到“动态数码显示”区域中的a-h端口上;(2.把“单片机系统”区域中的P2.0/A8-P2.7/A15用8芯排线连接到“动态数码显示”区域中的S1-S8端口上;(3.把“单片机系统”区域中的P1.7端口用导线连接到“独立式键盘”区域中的SP1端口上;4.程序设计内容(1.动态扫描方法动态接口采用各数码管循环轮流显示的方法,当循环显示频率较高时,利用人眼的暂留特性,看不出闪烁显示现象,这种显示需要一个接口完成字形码的输出(字形选择),另一接口完成各数码管的轮流点亮(数位选择)。

(2.在进行数码显示的时候,要对显示单元开辟8个显示缓冲区,每个显示缓冲区装有显示的不同数据即可。

(3.对于显示的字形码数据我们采用查表方法来完成。

5.程序框图图4.13.26.汇编源程序ORG 00HSTART: JB P1.7,DIR1MOV DPTR,#TABLE1SJMP DIRDIR1: MOV DPTR,#TABLE2DIR: MOV R0,#00HMOV R1,#01HNEXT: MOV A,R0MOVC A,@A+DPTRMOV P0,AMOV A,R1MOV P2,ALCALL DAYINC R0RL AMOV R1,ACJNE R1,#0DFH,NEXTSJMP STARTDAY: MOV R6,#4D1: MOV R7,#248DJNZ R7,$DJNZ R6,D1RETTABLE1: DB 06H,5BH,4FH,66H,6DHTABLE2: DB 78H,79H,38H,38H,3FHEND7.C语言源程序#include <AT89X51.H>unsigned charcode table1[]={0x06,0x5b,0x4f,0x66,0x6d}; unsigned char codetable2[]={0x78,0x79,0x38,0x38,0x3f}; unsigned char i;unsigned char a,b;unsigned char temp;void main(void){while(1){temp=0xfe;for(i=0;i<5;i++){if(P1_7==1){P0=table1[i];}else{P0=table2[i];}P2=temp;a=temp<<(i+1);b=temp>>(7-i);temp=a|b;for(a=4;a>0;a--)for(b=248;b>0;b--);}} }。

单片机c语言版数码管动态显示实验报告

单片机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语言程序设计源代码

51单片机C语言程序设计源代码

新概念51单片机C语言教程----入门、提高、开发、拓展全攻略郭天祥编著电子工业出版社例2.2.1编写程序,点亮第一个发光二极管(part2_1.c P27)#include <reg52.h> //52系列单片机头文件sbit led1=P1^0; //声明单片机P1口的第一位void main() //主函数{led1=0; /*点亮第一个发光二极管*/}例2.2.2编写程序,点亮P1口的若干二极管(part2_2.c P39)#include <reg52.h> //52系列单片机头文件void main() //主函数{P1=0xaa;//while(1);}例2.5.1利用for语句延时特性,编写第一个发光二极管以间隔1S亮灭闪动的程序(part2_3.c P42)#include <reg52.h> //52系列单片机头文件#define uint unsigned int //宏定义sbit led1=P1^0; //声明单片机P1口的第一位uint i,j;void main() //主函数{while(1) //大循环{led1=0; /*点亮第一个发光二极管*/for(i=1000;i>0;i--) //延时for(j=110;j>0;j--);led1=1; /*关闭第一个发光二极管*/for(i=1000;i>0;i--) //延时for(j=110;j>0;j--);}}- 2 -例2.6.1编写程序使第一个发光二极管以间隔500ms亮灭闪动。

(part2_4.c P48)#include <reg52.h> //52系列单片机头文件#define uint unsigned int //宏定义sbit led1=P1^0; //声明单片机P1口的第一位void delay1s(); //声明子函数void main() //主函数{while(1) //大循环{led1=0; /*点亮第一个发光二极管*/delay1s(); //调用延时子函数led1=1; /*关闭第一个发光二极管*/delay1s(); //调用延时子函数}}void delay1s() //子函数体{uint i,j;for(i=500;i>0;i--)for(j=110;j>0;j--);}例2.7.1编写程序使第一个二极管以亮200ms、灭800ms的方式闪动。

基于51单片机的led数码管动态显示

基于51单片机的led数码管动态显示

基于51单片机的LED数码管动态显示LED数码管动态显示就是一位一位地轮流点亮各位数码管,对于每一位LED数码管来说,每隔一段时间点亮一次,利用人眼的“视觉暂留"效应,采用循环扫描的方式,分时轮流选通各数码管的公共端,使数码管轮流导通显示。

当扫描速度达到一定程度时,人眼就分辨不出来了。

尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,认为各数码管是同时发光的。

若数码管的位数不大于8位时,只需两个8位I/O口。

1 硬件设计利用51单片机的P0口输出段码,P2口输出位码,其电路原理图如下所示。

在桌面上双击图标,打开ISIS 7 Professional窗口(本人使用的是v7.4 SP3中文版)。

单击菜单命令“文件”→“新建设计”,选择DEFAULT模板,保存文件名为“DT.DSN”。

在器件选择按钮中单击“P”按钮,或执行菜单命令“库”→“拾取元件/符号”,添加如下表所示的元件。

51单片机A T89C51 一片晶体CRYSTAL 12MHz 一只瓷片电容CAP 22pF 二只电解电容CAP-ELEC 10uF 一只电阻RES 10K 一只电阻RES 4.7K 四只双列电阻网络Rx8 300R(Ω) 一只四位七段数码管7SEG-MPX4-CA一只三极管PNP四只若用Proteus软件进行仿真,则上图中的晶振和复位电路以及U1的31脚,都可以不画,它们都是默认的。

在ISIS原理图编辑窗口中放置元件,再单击工具箱中元件终端图标,在对象选择器中单击POWER 和GROUND放置电源和地。

放置好元件后,布好线。

左键双击各元件,设置相应元件参数,完成电路图的设计。

2 软件设计LED数码管动态显示是一位一位地轮流点亮各位数码管的,因此要考虑每一位点亮的保持时间和间隔时间。

保持时间太短,则发光太弱而人眼无法看清;时间太长,则间隔时间也将太长(假设N位,则间隔时间=保持时间X(N-1)),使人眼看到的数字闪烁。

数码管动态显示C语言和汇编程序

数码管动态显示C语言和汇编程序

1.要求:使用两个数码管,并从01开始,每隔1s数码管加1,一直显示到60.C语言:#include <>#define uchar unsigned char#define uint unsigned intsbit dula=P2^6; //段选,申明锁存器1的锁存端sbit wela=P2^7; //位选,申明锁存器2的锁存端uchar code table[]= //共阴极数码管编码{ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f } ;void delayms(uint xms) //延时xms{ uint i,j;for(i=xms;i>0;i--)for(j=110;j>0;j--);}void display(uchar,uchar);uchar num,num1=1,shi,ge=1; //赋初值void main(){TMOD=0x10; //设定时器1方式1定时50ms,循环20次实现1s延时 TH1=(65536-50000)/256; //装初值TL1=(65536-50000)%256;EA=1; //开总中断ET1=1; //开定时器1中断TR1=1; //启动定时器1while(1) //在这里不停的对数码管动态扫描等待中断发生{display(shi,ge);}}void display(uchar shi,uchar ge) //显示子函数{ dula=1;P0=table[shi]; //送段选数据dula=0;P0=0xff; //消影,送位选数据前关闭所有显示,防止打开位选锁存时wela=1; //原来段选数据通过位选锁存器造成混乱P0=0xfe; //送位选数据wela=0;delayms(5); //延时dula=1;P0=table[ge];dula=0;P0=0xff;wela=1;P0=0xfd;wela=0;delayms(5);}void T1_time()interrupt 3{TH1=(65536-50000)/256; //重装初值TL1=(65536-50000)%256;num++;if(num==20) //20次循环,50ms 20次=1s{ num=0; //到20次以后清零重新再计数20次 num1++; //数码管显示加1if(num1==61) //数码管显示到60后又从01开始num1=1;shi=num1/10; //把两位数分离后分别送数码管显示十位和个位ge=num1%10;}}汇编: ORG 0000HAJMP MainORG 000BH //定时器0的中断入口地址AJMP ZDORG 0030HMain:MOV R0,#1 //初始值从01开始MOV R4,#20 //循环20次来实现1s延时MOV DPTR,#TABLE //表头地址送给DPTRMOV TMOD,#01H //定时器0方式1定时50msMOV TH0,#03CH //赋初值MOV TL0,#0B0HSETB EA //开总中断SETB ET0 //开定时器0中断SETB TR0 //启动定时器0中断LP1:MOV A,R0MOV B,#10DIV AB //A为整数B为余数MOVC A,@A+DPTRSETB //数码管显示十位MOV P0,#0FEHCLRSETBMOV P0,ACLRACALL DELAY5MSMOV A,B //数码管显示个位MOVC A,@A+DPTRSETBMOV P0,#0FDHCLRSETBMOV P0,ACLRACALL DELAY5MSAJMP LP1ZD: MOV TH0,#03CH //重新赋初值MOV TL0,#0B0HDJNZ R4,LP2 //是否循环20次MOV R4,#20INC R0CJNE R0,#61,LP2MOV R0,#01LP2: RETI //中断返回DELAY5MS: MOV R6,#5 //延时5ms LOP1: MOV R5,#250LOP2: NOPNOPDJNZ R5,LOP2DJNZ R6,LOP1RETTABLE:DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH //共阴极数码管编码END。

C51动态数码管显示

C51动态数码管显示

/*************************************************************************** ***********实验现象:下载程序后"动态数码管模块"从左至右显示0-7接线说明:单片机-->动态数码管模块(具体接线图可见开发攻略对应实验的“实验现象”章节)注意事项:*************************************************************************** ************/#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器typedef unsigned int u16; //对数据类型进行声明定义typedef unsigned char u8;sbit LSA=P2^2;sbit LSB=P2^3;sbit LSC=P2^4;u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值/*************************************************************************** ***** 函数名 : delay* 函数功能 : 延时函数,i=1时,大约延时10us*************************************************************************** ****/void delay(u16 i){while(i--);}/*************************************************************************** ***** 函数名 : DigDisplay* 函数功能 : 数码管动态扫描函数,循环扫描8个数码管显示*************************************************************************** ****/void DigDisplay(){u8 i;for(i=0;i<8;i++){switch(i) //位选,选择点亮的数码管,{case(0):LSA=1;LSB=1;LSC=1; break;//显示第0位case(1):LSA=0;LSB=1;LSC=1; break;//显示第1位case(2):LSA=1;LSB=0;LSC=1; break;//显示第2位case(3):LSA=0;LSB=0;LSC=1; break;//显示第3位case(4):LSA=1;LSB=1;LSC=0; break;//显示第4位case(5):LSA=0;LSB=1;LSC=0; break;//显示第5位case(6):LSA=1;LSB=0;LSC=0; break;//显示第6位case(7):LSA=0;LSB=0;LSC=0; break;//显示第7位}P0=smgduan[i];//发送段码delay(100); //间隔一段时间扫描P0=0x00;//消隐}}/*************************************************************************** ***** 函数名 : main* 函数功能 : 主函数* 输入 : 无* 输出 : 无*************************************************************************** ****/void main(){while(1){DigDisplay(); //数码管显示函数}}。

基于51单片机的18b20数码管C语言代码

基于51单片机的18b20数码管C语言代码

基于51单片机的18b20数码管C语言代码#include#include#define uchar unsigned char#define uint unsigned intsbit DQ=P1^4;sbit bell=P0^6;uchar code table[]= {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; uchar code led_t[]={25,30};uchar led_quan[],led_n=0,t_n=0;bit mim;bit flag;void delay1(uint t){while(t--);}void delay(uchar del){uchar x,y;for(x=0;x<del;x++)< p="">{for(y=0;y<=148;y++);}}//DS18B20初始化函数bit init_ds18b20(void){bit initflag = 0;DQ = 1;delay1(12);DQ = 0;delay1(80); // 延时大于480usDQ = 1;delay1(10); // 14initflag = DQ; // initflag等于1初始化失败delay1(5);return initflag;}//通过单总线向从器件写一个字节void wr_ds18b20(unsigned char byt){unsigned char i;for(i=0;i<8;i++){DQ = 0;DQ = byt&0x01;delay1(5);DQ = 1;byt >>= 1;}delay1(5);}//通过单总线从从器件读一个字节unsigned char rd_ds18b20(void){unsigned char i;unsigned char byt;for(i=0;i<8;i++){DQ = 0;byt >>= 1;DQ = 1;if(DQ){byt |= 0x80;}delay1(5);}return byt;}//温度转换、读取及数据处理器函数unsigned char rd_temperature(void) {unsigned char low,high;char temp;init_ds18b20();wr_ds18b20(0xCC);wr_ds18b20(0x44); //启动温度转换delay1(200);init_ds18b20();wr_ds18b20(0xCC);wr_ds18b20(0xBE); //读取寄存器low = rd_ds18b20(); //低字节high = rd_ds18b20(); //高字节temp = high<<4;temp |= (low>>4);return temp;}void dingwen(){if(rd_temperature()>=30) { bell=1;P2|=0xa0;P2&=0x5f;}if(rd_temperature()<=25) { bell=1;P2|=0xa0;P2&=0x5f;}}void tine0(){TMOD=0X01;TH0 = 0xDC; // 定时10ms TL0 = 0x00;EA=1;ET0=1;TR0=1;}void time1_isr() interrupt 1 {TH0 = 0xDC; // 定时10ms TL0 = 0x00;t_n++;if (t_n == 100) // 1s{t_n = 0;flag=~flag;}void led_shuju(){led_quan[0]=table[rd_temperature()%10];led_quan[1]=table[rd_temperature()%100/10]; led_quan[2]=table[led_t[1]%10];led_quan[3]=table[led_t[1]/10];led_quan[4]=0xbf;led_quan[5]=table[led_t[0]%10];led_quan[6]=table[led_t[0]/10];}void flash1(mim){ switch(mim){case 0:led_quan[0]=table[rd_temperature()%10];led_quan[1]=table[rd_temperature()%100/10]; led_quan[2]=table[led_t[1]%10];led_quan[3]=table[led_t[1]/10];led_quan[4]=0xbf;led_quan[5]=table[led_t[0]%10];led_quan[6]=table[led_t[0]/10];case 1:led_quan[0]=table[rd_temperature()%10];led_quan[1]=table[rd_temperature()%100/10]; led_quan[2]=0xff;led_quan[3]=0xff;led_quan[4]=0xbf;led_quan[5]=table[led_t[0]%10];led_quan[6]=table[led_t[0]/10];}void flash2(mim){ switch(mim){case 0:led_quan[0]=table[rd_temperature()%10];led_quan[1]=table[rd_temperature()%100/10]; led_quan[2]=table[led_t[1]%10];led_quan[3]=table[led_t[1]/10];led_quan[4]= 0xbf;led_quan[5]= 0xff;led_quan[6]= 0xbf;case 1:led_quan[0]=table[rd_temperature()%10];led_quan[1]=table[rd_temperature()%100/10]; led_quan[2]=table[led_t[1]%10];led_quan[3]=table[led_t[1]/10];led_quan[4]=0xff;led_quan[5]=table[led_t[0]%10];led_quan[6]=table[led_t[0]/10];}}void display( uchar *del){switch(led_n){case 0:P0=del[0];P2=0xe0;P2&=0x1f;P0=0x80;P2=0xc0; P2&=0x3f; delay(3); break; case 1:P0=del[1]; P2=0xe0; P2&=0x1f; P0=0x40; P2=0xc0; P2&=0x3f; delay(3); break; case 2:P0=del[1]; P2=0xe0; P2&=0x1f; P0=0x40; P2=0xc0; P2&=0x3f; delay(3); break; case 3:P0=del[1]; P2=0xe0; P2&=0x1f; P0=0x40; P2=0xc0; P2&=0x3f; delay(3);break; case 4:P0=del[1]; P2=0xe0;P2&=0x1f; P0=0x40;P2=0xc0;P2&=0x3f; delay(3); break; case 5:P0=del[1]; P2=0xe0;P2&=0x1f; P0=0x40;P2=0xc0;P2&=0x3f; delay(3); break; case 6:P0=del[1]; P2=0xe0;P2&=0x1f; P0=0x40;P2=0xc0;P2&=0x3f; delay(3); break;}if(led_n==7)led_n=0;elseled_n++;}void main() {init_ds18b20(); while(1){display(); dingwen();}}</del;x++)<>。

51单片机C语言程序设计源代码

51单片机C语言程序设计源代码

新概念51单片机C语言教程----入门、提高、开发、拓展全攻略郭天祥编著电子工业出版社例2.2.1编写程序,点亮第一个发光二极管(part2_1.c P27)#include <reg52.h> //52系列单片机头文件sbit led1=P1^0; //声明单片机P1口的第一位void main() //主函数{led1=0; /*点亮第一个发光二极管*/}例2.2.2编写程序,点亮P1口的若干二极管(part2_2.c P39)#include <reg52.h> //52系列单片机头文件void main() //主函数{P1=0xaa;//while(1);}例2.5.1利用for语句延时特性,编写第一个发光二极管以间隔1S亮灭闪动的程序(part2_3.c P42)#include <reg52.h> //52系列单片机头文件#define uint unsigned int //宏定义sbit led1=P1^0; //声明单片机P1口的第一位uint i,j;void main() //主函数{while(1) //大循环{led1=0; /*点亮第一个发光二极管*/for(i=1000;i>0;i--) //延时for(j=110;j>0;j--);led1=1; /*关闭第一个发光二极管*/for(i=1000;i>0;i--) //延时for(j=110;j>0;j--);}}- 2 - 例2.6.1编写程序使第一个发光二极管以间隔500ms亮灭闪动。

(part2_4.c P48)#include <reg52.h> //52系列单片机头文件#define uint unsigned int //宏定义sbit led1=P1^0; //声明单片机P1口的第一位void delay1s(); //声明子函数void main() //主函数{while(1) //大循环{led1=0; /*点亮第一个发光二极管*/delay1s(); //调用延时子函数led1=1; /*关闭第一个发光二极管*/delay1s(); //调用延时子函数}}void delay1s() //子函数体{uint i,j;for(i=500;i>0;i--)for(j=110;j>0;j--);}例2.7.1编写程序使第一个二极管以亮200ms、灭800ms的方式闪动。

51单片机汇编语言及C语言经典实例

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的数字。

51单片机C语言源代码例程附带电路图

51单片机C语言源代码例程附带电路图

闪烁灯[实验要求]点亮与单片机P1.0口相连的发光二极管,延时0.2S,然后熄灭,延时0.2S,再点亮,如此循环下去。

[实验目的]初步了解单片机IO口输出高低电平的作用,延时函数的时间估算。

[硬件电路][源代码]#include<reg51.h>/**********************************************************上面这行是一个"文件包含"处理。

所谓"文件包含"是指一个文件将另外一个文件的内容全部包含进来这里的程序虽然只写了一行,但C编译器在处理的时候却要处理几十或几百行,这里包含reg51.h的目的在于本程序要使用P1这个符号,而P1是在reg51.h这个头文件中定义的。

大家可以在编译器目录下面用记事本打开这个文件看看。

*********************************************************/sbit P1_0=P1^0; //定义IO口这步的目的是让编//译器知道P1_0代表的就是单片机的P1.0口void delay02s(void) //延时0.2秒子程序{unsigned char i,j,k; //定义3个无符号字符型变量。

for(i=20;i>0;i--) //三个FOR循环用来延时,这里为for(j=20;j>0;j--) //什么是0.2S大家可以用WAVE for(k=248;k>0;k--); //高断点仿真一下,就可知道大概 } //是0.2S了。

void main(void) //每一个C语言程序有且只有一个主函数,{while(1) //循环条件永远为真,以下程序一直执行下去。

{P1_0=0; // I/O口P1.0输出低电平,小灯被点亮。

delay02s(); //延时经过0.2秒。

P1_0=1; // I/O口P1.0输出高电平,小灯熄灭。

单片机源程序-动态数码管

单片机源程序-动态数码管
Delay50us();
switch(GPIO_KEY)
{
case(0X70): KeyValue=KeyValue;break;
case(0Xb0): KeyValue=KeyValue+4;break;
case(0Xd0): KeyValue=KeyValue+8;break;
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码
unsigned char KeyValue;
//用来存放读取到的键值
unsigned char KeyState; //记录按键的状态,0没有,1有
DisplayData[4]=DisplayData[3];
DisplayData[3]=DisplayData[2];
DisplayData[2]=DisplayData[1];
DisplayData[1]=DisplayData[0];
DisplayData[0]=DIG_CODE[KeyValue];
KeyState=0; //初始化按键状态
while(1)
{
KeyDown();
if(KeyState==1)
{
DisplayData[7]=DisplayData[6];
DisplayData[6]=DisplayData[5];
DisplayData[5]=DisplayData[4];
void TimerConfiguration();//定时器初始化设置
/*******************************************************************************

51单片机C语言编程100例单片机c语言编程

51单片机C语言编程100例单片机c语言编程

51单片机C语言编程100例单片机c语言编程单片机是一种常用于嵌入式系统的微型计算机,可以根据预设的程序来执行指令。

而C语言是一种高级编程语言,具有较强的可读性和可移植性。

在单片机编程中,C语言是常用的编程语言之一。

本文将介绍51单片机C语言编程中的100个实例,帮助读者了解单片机编程的基本概念和技巧。

1. LED灯闪烁这是一个简单的实例,用于让LED灯交替闪烁。

在C语言中,可以使用宏定义和循环语句来实现:```c#include <reg52.h>#define LED P1void delay(unsigned int t) //延时函数{unsigned int i, j;for (i = t; i > 0; i--)for (j = 110; j > 0; j--);}void main(){while (1) //循环执行{LED = 0xFF; //LED灯亮delay(1000); //延时1秒LED = 0x00; //LED灯灭delay(1000); //延时1秒}}```2. 数码管显示这个实例演示了如何使用数码管进行数字显示。

在C语言中,可以通过控制IO口状态来实现:```c#include <reg52.h>#define LED P0unsigned char code digit[] ={ //数码管显示值表0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; void delay(unsigned int t) //延时函数{unsigned int i, j;for (i = t; i > 0; i--)for (j = 110; j > 0; j--);}void main(){unsigned int i;while (1) //循环执行{for(i=0;i<10;i++){LED = digit[i]; //显示数字delay(1000); //延时1秒}}```3. 蜂鸣器发声这个实例展示了如何使用蜂鸣器进行声音发声。

单片机C语言程序(数码管动态静态显示)

单片机C语言程序(数码管动态静态显示)

0123动‎态显示:‎#incl‎u de<r‎e g52.‎h>#d‎e fine‎ucha‎r uns‎i gned‎char‎#def‎i ne u‎i nt u‎n sign‎e d in‎tuin‎t num‎,numd‎u,num‎w e;u‎c har ‎c ode ‎t able‎d u[]=‎{0x3‎f,0x0‎6,0x5‎b,0x4‎f,0x‎66,0x‎6d,0x‎7d,0x‎07,0‎x7f,0‎x6f,0‎x77,0‎x7c,‎0x39,‎0x5e,‎0x79,‎0x71}‎;uch‎a r co‎d e ta‎b lewe‎[]={‎0xfe,‎0xfd,‎0xfb,‎0xf7}‎;sbi‎t dul‎a=P2^‎6;sb‎i t we‎l a=P2‎^7;v‎o id d‎i spla‎y();‎v oid ‎m ain(‎){‎E A=1;‎ET1‎=1;‎T MOD=‎0x10;‎TH1‎=(655‎36-50‎0)/25‎6;T‎H0=(6‎5536-‎500)%‎256;‎TR1=‎1;n‎u m=0;‎whi‎l e(1)‎{‎if(n‎u m==2‎0)‎{‎n um=0‎;‎i f(nu‎m du==‎4)‎numd‎u=0;‎if‎(numw‎e==4)‎n‎u mwe=‎0;‎disp‎l ay()‎;‎n umdu‎++;‎num‎w e++;‎}‎}}‎v oid ‎t ime1‎() in‎t erru‎p t 3‎{TH‎1=(65‎536-5‎00)/2‎56;‎T H0=(‎65536‎-500)‎%256;‎num‎++;}‎void‎disp‎l ay()‎{P‎0=0xf‎f;w‎e la=1‎;we‎l a=0;‎P0=‎t able‎d u[nu‎m du];‎dul‎a=1;‎dula‎=0;‎P0=ta‎b lewe‎[numw‎e];‎w ela=‎1;w‎e la=0‎;}‎0123静‎态显示:‎#incl‎u de<r‎e g52.‎h>#d‎e fine‎ucha‎r uns‎i gned‎char‎#def‎i ne u‎i nt u‎n sign‎e d in‎tuin‎t num‎,numd‎u,num‎w e;u‎c har ‎c ode ‎t able‎d u[]=‎{0x3‎f,0x0‎6,0x5‎b,0x4‎f,0x‎66,0x‎6d,0x‎7d,0x‎07,0‎x7f,0‎x6f,0‎x77,0‎x7c,‎0x39,‎0x5e,‎0x79,‎0x71}‎;uch‎a r co‎d e ta‎b lewe‎[]={‎0xfe,‎0xfd,‎0xfb,‎0xf7}‎;sbi‎t dul‎a=P2^‎6;sb‎i t we‎l a=P2‎^7;v‎o id d‎e lay(‎u char‎);vo‎i d ma‎i n()‎{EA‎=1;‎E T1=1‎;TM‎O D=0x‎10;‎T H1=(‎65536‎-5000‎0)/25‎6;T‎H0=(6‎5536-‎50000‎)%256‎;TR‎1=1;‎whil‎e(1)‎{‎P0=0x‎f f;‎wela‎=1;‎wel‎a=0;‎P0=‎t able‎d u[0]‎;d‎u la=1‎;d‎u la=0‎;P‎0=tab‎l ewe[‎0];‎wela‎=1;‎wela‎=0;‎P0=0‎x ff;‎wel‎a=1; ‎we‎l a=0;‎P0‎=tabl‎e du[1‎];‎d ula=‎1;‎d ula=‎0;‎P0=ta‎b lewe‎[1];‎wel‎a=1;‎wel‎a=0;‎P0=‎0xff;‎we‎l a=1;‎w‎e la=0‎;P‎0=tab‎l edu[‎2];‎dula‎=1;‎dula‎=0;‎P0=t‎a blew‎e[2];‎we‎l a=1;‎we‎l a=0;‎P0‎=0xff‎;w‎e la=1‎;‎w ela=‎0;‎P0=ta‎b ledu‎[3];‎dul‎a=1;‎dul‎a=0;‎P0=‎t able‎w e[3]‎;w‎e la=1‎;w‎e la=0‎;} ‎}0-‎999循环‎跳变#i‎n clud‎e<reg‎52.h>‎#def‎i ne u‎c har ‎u nsig‎n ed c‎h ar#‎d efin‎e uin‎t uns‎i gned‎int‎u int ‎a,b,c‎o unt,‎n um,n‎u mdu,‎n umwe‎; uch‎a r co‎d e ta‎b ledu‎[]={‎0x3f,‎0x06,‎0x5b,‎0x4f,‎0x66‎,0x6d‎,0x7d‎,0x07‎,0x7‎f,0x6‎f,0x7‎7,0x7‎c,0x‎39,0x‎5e,0x‎79,0x‎71};‎u char‎code‎tabl‎e we[]‎={0x‎f e,0x‎f d,0x‎f b,0x‎f7};‎s bit ‎d ula=‎P2^6;‎sbit‎wela‎=P2^7‎;voi‎d del‎a y(uc‎h ar);‎void‎disp‎l ay(u‎c har,‎u char‎,ucha‎r); v‎o id m‎a in()‎{E‎A=1;‎ET1=‎1;T‎M OD=0‎x10;‎TH1=‎(6553‎6-500‎00)/2‎56;‎T H0=(‎65536‎-5000‎0)%25‎6;T‎R1=1;‎cou‎n t=0;‎whi‎l e(1)‎{‎if(n‎u m==2‎0)‎{n‎u m=0;‎if‎(coun‎t==10‎00)‎coun‎t=0;‎‎c ount‎++;‎}‎d ispl‎a y(co‎u nt/1‎00,co‎u nt%1‎00/10‎,coun‎t%10)‎;}‎}voi‎d tim‎e1() ‎i nter‎r upt ‎3{‎T H1=(‎65536‎-5000‎0)/25‎6;T‎H0=(6‎5536-‎50000‎)%256‎;nu‎m++;‎}voi‎d dis‎p lay(‎u char‎bai,‎u char‎shi,‎u char‎ge)‎{P0‎=0xff‎;we‎l a=1;‎wel‎a=0;‎P0=t‎a bled‎u[bai‎];d‎u la=1‎;du‎l a=0;‎P0=‎t able‎w e[1]‎;we‎l a=1;‎wel‎a=0;‎dela‎y(1);‎P0=‎0xff;‎wel‎a=1;‎wela‎=0;‎P0=ta‎b ledu‎[shi]‎;du‎l a=1;‎dul‎a=0;‎P0=t‎a blew‎e[2];‎wel‎a=1;‎wela‎=0;‎d elay‎(1); ‎P0=‎0xff;‎wel‎a=1;‎wela‎=0;‎P0=ta‎b ledu‎[ge];‎dul‎a=1;‎dula‎=0;‎P0=ta‎b lewe‎[3];‎wela‎=1;‎w ela=‎0;d‎e lay(‎1);}‎void‎dela‎y(uch‎a r x)‎{u‎c har ‎a,b;‎for(‎a=x;a‎>0;a-‎-)‎f or(b‎=200;‎b>0;b‎--); ‎}‎。

51单片机数码管显示实验报告

51单片机数码管显示实验报告

51单片机数码管显示实验实验内容:1)编写程序让8只数码管初始显示0,每隔大约1s加1显示(可以用延时函数实现),到数码管显示9后,再从0开始显示,如此循环反复。

2)C语言程序#include<reg52.h>#define uint unsigned intvoid display();void num();int i;unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x83, 0xc6,0xa1,0x86,0x8e}; //共阳极数码管0-F编码表void delayms(uint);void main(){while(1){num();display();}}void display(){P2=0xff;//消隐P0连接段选,P1节位选P1=0x00;//8个数码管同时显示P2=table[i];//数码管显示数码0 delayms(1000);//延时5ms}void num(){if(i<9)i++;elsei=0;}void delayms(uint x){uint i,j;for(i=0;i<x;i++)for(j=0;j<110;j++);}3)汇编语言:ORG 0000HLJMP MAINORG 0100H;P2连接段选,P1节位选MAIN: MOV P1,#00H ;所有的数码管都显示MOV R2,#00H ;从0开始显示LOOP: MOV A,R2 ;为下面的基址加变址寄存器寻址方式做准备MOV DPTR,#TAB1 ;把数组的首地址赋给DPTRMOVC A,@A+DPTR ;取数组中的数字MOV P2,A ;把取得的值送给P0口显示ACALL DELAY ;延时一会INC R2 ;为取下一个数加一CJNE R2,#10,LOOP ;只要数小于10就继续循环显示MOV R2,#00H ;如果加到10后重新从0开始LJMP LOOP ;进入循环函数;****************************************** TAB1: DB 0C0H,0F9H,0A4H,0B0H,99H; 数组DB 92H,82H,0F8H,80H,90HRET;****************************************** DELAY: MOV R3,#3 ;延时函数DE1: MOV R4,#0FFHDE2: MOV R5,#0FFHDJNZ R5,$DJNZ R4,DE2DJNZ R3,DE1RET;*************************************************END(3)编写程序学习数码管的动态显示,让8只数码管从从左往右显示1、2、3……8。

51单片机数码管c代码集合

51单片机数码管c代码集合

51单片机:数码管c代码集合/*点亮第一个数码管,因为板子是自已做的,到电子城买数码管时说好要共阴的,拿来测时才发现是共阳的。

*///------------------------------------------------------------/*#include ;#define uchar unsigned charsbit duan=P2^5 ; //注意,有分号sbit wei=P2^6; //注意,有分号+P是大写的,若你写成小写的则会提示说找不到const unsigned chartable[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8, 0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E}; //共阳极数码管数组,请注意,我使用的共阳极的数码管,如果你是用买的现成板,一般是使用共阴极的void main(){duan=1;P0=table[1];duan=0;wei=1;P0=0x01;wei=0;while(1);}*///-----------------------------------------------------------------/*//静态显示,第一个数码管显示1#include ;sbit duan=P2^5;sbit wei=P2^6;void main(){duan=1;P0=0xF9; //共阳极数码管显示1的编码值是F9,如果你是买的开发板(共阴的数码管)则为0x06;duan=0;wei=1;P0=0x01; //选中第1个数码管wei=0;while(1); //一直显示,以便我们观察}*///-----------------------------------------------------------------/*//静态显示,全为1#include ;sbit duan=P2^5;sbit wei=P2^6;void main(){duan=1;P0=0xF9; //共阳极数码管显示1的编码值是F9,如果你是买的开发板(共阴的数码管)则为0x06;duan=0;wei=1;P0=0xff; //选中所有的数码管wei=0;while(1); //一直显示,以便我们观察}*///-----------------------------------------------------------------//静态显示:从0到F (所有的数码管)#include ;#define uchar unsigned charsbit duan=P2^5 ; //注意,有分号+P是大写的,若你写成小写的则会提示说找不到sbit wei=P2^6;const unsigned chartable[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8, 0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E}; //数码管数组void delay(int x){int a,b;for(a=x;a>;0;a--)for(b=110;b>;0;b--);}void main(){while(1){uchar n=0;for(n=0;n;#include ; //LED灯用到移动关键字crol,调用此关键字#define uchar unsigned charconst unsigned chartable[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8, 0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E}; //数码管数组sbit wei=P2^6;sbit duan=P2^5;void delay(uchar x){uchar a,b;for(a=x;a>;0;a--)for(b=110;b>;0;b--);}void LED(){uchar a,temp;temp=0xfe;for (a=8;a>;0;a--) //循环8次,即流水灯8个循环8次即可点亮8个{P1=temp;temp=_crol_(temp,1); //移动delay(200);}delay(5);temp=0x7f;for (a=8;a>;0;a--) //循环8次,即流水灯8个循环8次即可点亮8个{P1=temp;temp=_crol_(temp,-1); //移动delay(170);}}void scan(){uchar n=0;for(n=0;n。

51单片机数码管的程序代码

51单片机数码管的程序代码
for (x=s;x>0;x--) for (y=100;y>0;y--);
}
3.依次流水作业
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit line= P1^3; //点阵
sbit led= P1^2;
duan=1; P0=table[shi]; _nop_();
//显示十位
_nop_(); _nop_(); duan=0; P0=0xff; wei=1; P0=0xFb; wei=0; delay(3);
duan=1; P0=table[ge]; _nop_(); _nop_(); _nop_(); duan=0; P0=0xff; wei=1; P0=0xF7; wei=0; delay(3);
unsigned char code weisn[]=
{
0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uint y,s,a,b;
void delay ( uint);
void main ()
{
P0=0X00;
line=0;//关闭点阵
P0=0xff; led=0;//关闭 led
5,DS18B20 温度计程序代码
#include "reg52.h"
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int
sbit ds=P1^4; //18B20 信号端口 sbit duan=P1^0; //数码管段码控制端
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

//此表为 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 ; //变量定义
} */
delay(150); //扫描间隔时间 太长会数码管会有闪烁感
} } Biblioteka } /*******************延时函数**********************************************/
LedOut[4]=Disp_Tab[LedNumVal%10000/1000]; //千位
LedOut[5]=Disp_Tab[LedNumVal%1000/100]|0x80; //百位带小数点
LedOut[6]=Disp_Tab[LedNumVal%100/10]; //十位
case 3:P1 = 0xeF; break;
case 4:P1 = 0xf7; break;
case 5:P1 = 0xfb; break;
case 6:P1 = 0xfd; break;
case 7:P1 = 0xfe; break;
}
LedOut[0]=Disp_Tab[LedNumVal%10000/1000];
LedOut[1]=Disp_Tab[LedNumVal%1000/100]|0x80;
LedOut[2]=Disp_Tab[LedNumVal%100/10];
LedOut[3]=Disp_Tab[LedNumVal%10];
LedOut[7]=Disp_Tab[LedNumVal%10]; //个位
for( i=0; i<9; i++)
{
P0 = LedOut[i];
P1 = dispbit[i]; //使用查表法进行位选
void delay(unsigned int i)
{
char j;
for(i; i > 0; i--)
for(j = 200; j > 0; j--);
}
/* switch(i) //使用switch 语句控制位选
{
case 0:P1 = 0x7F; break;
case 1:P1 = 0xbF; break;
case 2:P1 = 0xdF; break;
***********************************************************************************/
#include <reg51.h>
void delay(unsigned int i); //函数声名
char DelayCNT;//定义变量
相关文档
最新文档