单片机数码管加减程序
- 格式:docx
- 大小:3.29 KB
- 文档页数:2
单只数码管循环显示0-9报告设计题目:单只数码管循环显示0~9设计要求:单片机控制1只数码管,循环显示0~9需求分析:本设计要求单只数码管循环显示0~9,这里采用的是共阴极数码管。
让数码管显示数字的步骤为:1〕使数码管的公共端接地(共阴极〕上。
2〕将显示码送到单片机的P0口,向数码管的各个段输出不同的电平,使单个数码管循环显示0-9这10个数字。
复位电路:在上电或复位过程中,控制CPU的复位状态:这段时间内让CPU保持复位状态,而不是一上电或刚复位完毕就工作,防止CPU发出错误的指令、执行错误操作,也可以提高电磁兼容性能。
无论用户使用哪种类型的单片机,总要涉及到单片机复位电路的设计。
而单片机复位电路设计的好坏,直接影响到整个系统工作的可靠性。
许多用户在设计完单片机系统,并在实验室调试成功后,在现场却出现了“死机〞、“程序走飞〞等现象,这主要是单片机的复位电路设计不可靠引起的。
基本的复位方式单片机在启动时都需要复位,以使CPU及系统各部件处于确定的初始状态,并从初态开始工作。
89系列单片机的复位信号是从RST引脚输入到芯片内的施密特触发器中的。
当系统处于正常工作状态时,且振荡器稳定后,如果RST引脚上有一个高电平并维持2个机器周期(24个振荡周期)以上,那么CPU就可以响应并将系统复位。
设计原理:一、数码管显示原理我们最常用的是七段式和八段式LED数码管,八段比七段多了一个小数点,其他的基本相同。
所谓的八段就是指数码管里有八个小LED发光二极管,通过控制不同的LED的亮灭来显示出不同的字形。
数码管又分为共阴极和共阳极两种类型,其实共阴极就是将八个LED的阴极连在一起,让其接地,这样给任何一个LED的另一端高电平,它便能点亮。
而共阳极就是将八个LED的阳极连在一起。
其原理图如下。
其中引脚图的两个COM端连在一起,是公共端,共阴数码管要将其接地,共阳数码管将其接正5伏电源。
一个八段数码管称为一位,多个数码管并列在一起可构成多位数码管,它们的段选线〔即a,b,c,d,e,f,g,dp〕连在一起,而各自的公共端称为位选线。
最近天气热了,想要是做个能显示温度的小设备就好了,于是想到DIY个电子温度计,网上找了很多资料,结合自己的材料,设计了这个用单片机控制的实时电子温度计。
作为单片机小虾的我做这个用了2天时间,当然是下班后,做工不行见谅了。
主要元件用到了单片机STC89C54RD+,DB18B20温度传感器,4为共阳数码管,PNPS8550三极管等。
先上原理图:洞洞板布局图:然后就是实物图了:附上源程序:程序是别人写的,我只是自己修改了下,先谢谢原程序者的无私奉献。
#include"reg52.h"#define uchar unsigned char#define uint unsigned intsbit DQ=P3^4; //温度数据口sbit wx1=P2^0; //位选1sbit wx2=P2^1; //位选2sbit wx3=P2^2; //位选3sbit wx4=P2^3; //位选4unsigned int temp, temp1,temp2, xs;uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99, //共阳数码管0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6};/******延时程序*******/void delay1(unsigned int m){unsigned int i,j;for(i=m;i>0;i--)for(j=110;j>0;j--);}void delay(unsigned int m) //温度延时程序{while(m--);}void Init_DS18B20(){unsigned char x=0;DQ = 1; //DQ复位ds18b20通信端口delay(8); //稍做延时DQ = 0; //单片机将DQ拉低delay(80); //精确延时大于480usDQ = 1; //拉高总线delay(4);x=DQ; //稍做延时后如果x=0那么初始化成功x=1那么初始化失败delay(20);}/***********ds18b20读一个字节**************/uchar ReadOneChar(){unsigned char i=0;unsigned char dat = 0;for (i=8;i>0;i--){DQ = 0; // 高电平拉成低电平时读周期开始dat>>=1;DQ = 1; // 给脉冲信号if(DQ)dat|=0x80; //delay(4);}return(dat);}/*************ds18b20写一个字节****************/void WriteOneChar(unsigned char dat){unsigned char i=0;for (i=8; i>0; i--){DQ = 0; //从高电平拉至低电平时,写周期的开始DQ = dat&0x01; //数据的最低位先写入delay(5); //60us到120us延时DQ = 1;dat>>=1; //从最低位到最高位传入}}/**************读取ds18b20当前温度************/void ReadTemperature(){unsigned char a=0;unsigned b=0;unsigned t=0;Init_DS18B20();WriteOneChar(0xCC); // 跳过读序号列号的操作/WriteOneChar(0x44); // 启动温度转换delay(5); // this message is wery importantInit_DS18B20();WriteOneChar(0xCC); //跳过读序号列号的操作WriteOneChar(0xBE); //读取温度存放器等〔共可读9个存放器〕前两个就是温度/ delay(5);a=ReadOneChar(); //读取温度值低位/b=ReadOneChar(); //读取温度值高位/temp1=b<<4; //高8位中后三位数的值temp1+=(a&0xf0)>>4; //低8位中的高4位值加上高8位中后三位数的值temp1室温整数值temp2=a&0x0f; //小数的值temp=((b*256+a)>>4); //当前采集温度值除16得实际温度值zhenshuxs=temp2*0.0625*10; //小数位,假设为0.5那么算为5来显示xs小数xiaoshu }void wenduxianshi(){wx1=0;P0=table[temp/10]; //显示百位delay1(5);wx1=1;wx2=0;P0=table[temp%10]+0x80; //显示十位加上0x80就显示小数点了。
引言概述:单片机指令是嵌入式系统设计中至关重要的一部分,它们定义了单片机的功能和操作。
本文是单片机指令大全系列的第二部分,旨在提供更多全面的单片机指令信息,帮助读者更好地理解和应用单片机指令。
正文内容:一、移位指令1.逻辑左移指令:将操作数的每一位向左移动一位,并且最低位填充0。
2.逻辑右移指令:将操作数的每一位向右移动一位,并且最高位填充0。
3.算术右移指令:将操作数的每一位向右移动一位,并且最高位保持不变。
4.循环左移指令:将操作数的每一位向左循环移动一位,即最高位移动到最低位。
5.循环右移指令:将操作数的每一位向右循环移动一位,即最低位移动到最高位。
二、逻辑运算指令1.逻辑与指令:对操作数进行逻辑与运算,将两个二进制数对应位上的值进行逻辑与操作。
2.逻辑或指令:对操作数进行逻辑或运算,将两个二进制数对应位上的值进行逻辑或操作。
3.逻辑非指令:对操作数进行逻辑非运算,将二进制数的每一位取反。
4.逻辑异或指令:对操作数进行逻辑异或运算,将两个二进制数对应位上的值进行逻辑异或操作。
5.逻辑移位指令:将操作数进行逻辑左移或右移。
三、算术运算指令1.加法指令:对操作数进行加法运算,并将运算结果保存到指定的寄存器或存储器中。
2.减法指令:对操作数进行减法运算,并将运算结果保存到指定的寄存器或存储器中。
3.乘法指令:对操作数进行乘法运算,并将运算结果保存到指定的寄存器或存储器中。
4.除法指令:对操作数进行除法运算,并将运算结果保存到指定的寄存器或存储器中。
5.移位指令:对操作数进行移位运算,包括算术左移、算术右移、循环左移和循环右移。
四、输入输出指令1.读取输入指令:从指定的输入设备读取数据,并将数据保存到指定的寄存器或存储器中。
2.输出显示指令:将指定的数据从寄存器或存储器中读取,并显示到指定的输出设备上。
3.端口输入指令:从指定的端口读取数据,并将数据保存到指定的寄存器或存储器中。
4.端口输出指令:将指定的数据从寄存器或存储器中读取,并输出到指定的端口上。
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。
单片机add指令全文共四篇示例,供读者参考第一篇示例:单片机是一种广泛应用于电子产品中的微型计算机芯片,它被用来控制各种各样的设备和系统。
在单片机的指令集中,有一种常用的指令叫做“add指令”,它的作用是将两个数据相加并将结果存储到指定的寄存器中。
在本文中,我们将详细介绍add指令的工作原理、应用场景和一些注意事项。
一、add指令的工作原理在单片机的指令集中,add指令是一种基本的算术运算指令,它主要用来执行加法运算。
add指令通常包含两个操作数:一个是要相加的数据,另一个是存储结果的目标寄存器。
当执行add指令时,单片机将两个操作数相加,并将结果存储到目标寄存器中。
假设我们有两个数据A和B,我们想要将它们相加并将结果存储到寄存器R中,那么我们可以使用add指令来实现这个功能。
add指令的具体操作步骤如下:1. 将数据A加载到一个寄存器中(例如寄存器A);2. 将数据B加载到另一个寄存器中(例如寄存器B);3. 执行add指令,将寄存器A和寄存器B中的数据相加,并将结果存储到目标寄存器R中。
通过这样的操作,我们就可以实现将两个数据相加的功能。
add 指令在单片机中被广泛应用于各种算术运算和逻辑运算中,是非常基础和重要的指令之一。
二、add指令的应用场景除了简单的加法运算,add指令还可以用来执行更复杂的算术运算,比如乘法、除法和高精度运算等。
通过组合多条add指令,我们可以实现更复杂的数学运算,从而满足程序的需求。
在实际应用中,add指令还常常用来处理传感器数据、控制执行器、进行数据传输和通信等。
通过add指令,单片机可以实现各种功能,提高系统的性能和灵活性。
三、add指令的注意事项尽管add指令是一种简单的算术运算指令,但在实际应用中仍需要注意一些事项,以确保程序的正确运行和性能优化。
要注意add指令的操作数类型和长度。
在单片机中,数据通常是以二进制格式表示的,所以在进行add操作时需要确保操作数的类型和长度一致,否则可能会导致数据溢出或截断,影响计算结果的准确性。
STC12C5410AD单片机的AD程序两位数码管显示/*用的是主程序中转换AD,在以后的使用中要用中断的方法才能节约CPU的使用率,本程序中是用P1.0为输入,用的是单片机本身的10位AD,最大1024分辨率,除以10后最大为102,用两位的数码管,所以只能在99以内,在程序中大于99的数,就只能显示99,也可用三位数码管显示.*/#include;#define uchar unsigned char#define uint unsigned int#define duan P1 //数码管段码输出端sfr ADC_CONTR = 0xc5;sfr ADC_DATA = 0xc6;sfr ADC_LOW2 = 0xbe;sfr P1M0 =0x91;sfr P1M1 =0x92;sbit sw=P2^7; //数码管的十位选通sbit gw=P2^6; //数码管的个位选通uint shu,ad_shu;uchar code tab[]={ 0xEE,/*0*/0x48,/*1*/0xD6,/*2*/0xDC,/*3*/0x78,/*4*/0xBC,/*5*/0xBE,/*6*/0xC8,/*7*/0xFE,/*8*/0xFC,/*9*/};void delay( ){uchar a;for(a=10;a>;0;a--); }void desplay(int bb) {uint ab;ab=bb;if(ab>;99) ab=99; duan=tab[ab/10];sw=0;delay();sw=1;duan=tab[ab%10];gw=0;delay();gw=1;}void main(){ADC_CONTR=0xe0; //开A/D转换器P1M0=0x01; //定义P1.0为AD输入端口,让P1.0为高阻态P1M1=0x01; //定义P1.0为AD输入端口,让P1.0为高阻态while(1){ADC_CONTR|=0x08;while((ADC_CONTR & 0x10)==0);ADC_CONTR&=0xe7;ad_shu=ADC_DATA;ad_shu。
下面是一个51单片机计数器的简单程序,使用C语言编写。
c
#include <reg51.h>
// 定义计数器的值
volatile unsigned int counter = 0;
// 定义外部中断0的服务函数
void INT0_Handler() interrupt 0 {
// 清除外部中断0标志位
EX0 = 0;
// 计数器值加1
counter++;
}
void main() {
// 设置外部中断0触发方式为下降沿触发
IT0 = 1;
// 使能外部中断0
EX0 = 1;
// 全局中断使能
EA = 1;
while(1) {
// 在此处添加处理计数器值的代码,例如:
// if (counter >= 100) {
// // 计数器值达到100,执行某些操作
// counter = 0; // 计数器清零
// }
}
}
此代码实现了51单片机的外部中断0的计数器功能。
当INT0引脚检测到下降沿时,会触发外部中断0,并执行INT0_Handler()函数,使counter值加1。
在main()函数中,可以添加处理counter值的代码。
例如,当counter值达到某个阈值时,可以执行特定的操作。
注意,这只是一个基础的示例,具体的代码可能会因具体硬件和应用需求而略有不同。
单片机驱动LED数码管电路及编程单片机I/O的应用最典型的是通过I/O口与7段LED数码管构成显示电路,我们从常用的LED显示原理开始,详尽讲解利用单片机驱动LED数码管的电路及编程原理,目的在于通过这一编程范例,让初学者了解I/O口的编程原理,意在起举一反三,抛砖引玉的作用。
左图为实验电路图,我们使用80C51单片机,电容C1、C2和CRY1组成时钟振荡电路,这部分基本无需调试,只要元件可靠即会正常起振。
C3和R1为单片机的复位电路,80C51的并行口P1.0-P1.7直接与LED数码管的a-f引脚相连,中间接上限流电阻R3-R10。
值得一提的是,80C51并行口的输出驱动电流并非很大,为使LED有足够的亮度,LED数码管应选用高亮度的器件。
此外,图中的80C51还可选用C51系列的其它单片机,只要它们的指令系统兼容C51即可正常运行,程序可直接移植,例如选用低价Flash型的AT89C1051或2051(详细技术手册)等,它们的ROM可反复擦写,非常适合作实验用途。
程序清单:01 START: ORG 0100H ;程序起始地址02 MAIN: MOV R0,#00H ;从“0”开始显示03 MOV DPTR,#TABLE ;表格地址送数据指针04 DISP: MOV A,R0 ;送显示05 MOVC A,@A+ADPTR ;指向表格地址06 MOV P1,A ;数据送LED07 ACALL DELAY ;延时08 INC R0 ;指向下一个字符09 CJNE R0,#0AH,DISP ;未显示完,继续10 AJMP MAIN ;下一个循环11 DELAY: MOV R1,#0FFH ;延时子程序,延时时间赋值12 LOOP0: MOV R2,#0FFH13 LOOP1: DJNZ R2,LOOP114 DJNZ R1,LOOP015 RET ;子程序返回16 TABLE: DB 0C0H ;字型码表17 DB 0F9H18 DB 0A4H19 DB 0B0H20 DB 99H21 DB 92H22 DB 82H23 DB 0F8H24 DB 80H25 DB 90H26 END ;程序结束。
单⽚机-4x4个矩阵按键控制数码管显⽰数字程序1 #include "8051.h"2 typedef unsigned char u8;3 typedef unsigned int u16;4 u8 smgduan[]= {5/*0 1 2 3 4 5 6 7 */60x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,7/*8 9 A B C D E F */80x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};910// P0⼝为数码管的位选的8位输⼊引脚11// P0 = 0x00;121314void Delayms(u16 ms);15void shumaguan(u8 n);16void DigDisplay();17void KeyTest();18void smg(u8 n, u8 m);19void key_4x4();2021void main()22 {23while(1)24 {25 key_4x4();26 }27 }2829// 不精确的延时函数30void Delayms(u16 ms)31 {32 unsigned int i, j;33for(i = ms; i > 0; i--)34for(j = 110; j > 0; j--);35return;36 }3738// 数码管根据74HC138译码器选择对应的段(选择哪个数码管显⽰)39void shumaguan(u8 n)40 {41switch(n)42 {43case0:44 LSA = 0;LSB = 0;LSC = 0;break;45case1:46 LSA = 1;LSB = 0;LSC = 0;break;47case2:48 LSA = 0;LSB = 1;LSC = 0;break;49case3:50 LSA = 1;LSB = 1;LSC = 0;break;51case4:52 LSA = 0;LSB = 0;LSC = 1;break;53case5:54 LSA = 1;LSB = 0;LSC = 1;break;55case6:56 LSA = 0;LSB = 1;LSC = 1;break;57case7:58 LSA = 1;LSB = 1;LSC = 1;break;59 }60 }6162// 数码管显⽰数字,并以⼗进制递增63void DigDisplay()64 {65 u8 i1 = 0;66 u8 i2 = 0;67 u8 i3 = 0;68 u8 i4 = 0;69 u8 i5 = 0;70 u8 i6 = 0;71 u8 i7 = 0;72 u8 i8 = 0;7374757677for (i8 = 0; i8 < 10; i8++)78for (i7 = 0; i7 < 10; i7++)79for (i6 = 0; i6 < 10; i7++)80for (i5 = 0; i5 < 10; i5++)81for (i4 = 0; i4 < 10; i4++)82for (i3 = 0; i3 < 10; i3++)83for (i2 = 0; i2 < 10; i2++)84for (i1 = 0; i1 < 10; i1++)85 {86 u16 cnt = 10;87while (cnt--)88 {89 shumaguan(0); //选中第⼀个数码管90 P0 = smgduan[i1]; //给他送⼀个数字91 Delayms(1); //稍微延时⼀下下92 shumaguan(1); //然后切换到第⼆个数码管。
单片机数码管控制方式数码管是一种常见的数字显示器件,广泛应用于各种仪器仪表、电子设备和时钟等场合。
单片机是一种集成了微处理器、存储器和各种输入输出接口的芯片,具有高度集成、易编程和强大的控制能力。
本文将介绍单片机数码管的控制方式。
一、静态控制方式静态控制方式是指数码管的每一位数字的显示都是通过单片机直接控制的。
在静态控制方式下,单片机需要逐位给数码管发送数字信号,以实现数字的显示。
具体的控制步骤如下:1. 设置数码管的显示位数,即选择要显示的数码管。
2. 将需要显示的数字转换为对应的数码管段码。
3. 将段码通过单片机的输出口发送给对应的数码管。
静态控制方式的优点是控制简单,可实现多个数码管同时显示不同数字。
但其缺点是需要占用较多的IO口,适用于数码管较少的应用场合。
二、动态控制方式动态控制方式是指数码管的每一位数字的显示是通过单片机按照一定的时间间隔循环控制的。
在动态控制方式下,单片机通过快速的切换显示位数,使人眼产生视觉暂留效应,从而实现数字的连续显示。
具体的控制步骤如下:1. 设置数码管的显示位数,即选择要显示的数码管。
2. 将需要显示的数字转换为对应的数码管段码。
3. 按照一定的时间间隔,循环将段码发送给对应的数码管。
动态控制方式的优点是只需要占用一个IO口,适用于数码管较多的应用场合。
但其缺点是需要较高的刷新频率,可能会引起闪烁现象。
三、扫描控制方式扫描控制方式是指单片机逐位地将数字信号发送给数码管,依次控制每一位数字的显示。
在扫描控制方式下,单片机通过快速的切换显示位数,使每个数码管都能显示出对应的数字。
具体的控制步骤如下:1. 设置数码管的显示位数,即选择要显示的数码管。
2. 将需要显示的数字转换为对应的数码管段码。
3. 按照一定的时间间隔,依次将段码发送给每一个数码管。
扫描控制方式的优点是控制简单,占用IO口较少,适用于大量数码管的应用场合。
但其缺点是刷新频率较低,可能会引起扫描现象。
单片机数码管加减程序
数码管加减程序是一种常见的单片机应用程序,用于控制数码管显示数字,并实现加减运算。
本文将从人类视角出发,介绍数码管加减程序的原理和实现方法,帮助读者理解和掌握这一技术。
一、数码管加减程序的原理
数码管是一种常见的数字显示装置,由多个发光二极管组成,可以显示0-9的数字。
单片机通过控制数码管的亮灭和显示的数字,实现加减运算的功能。
二、数码管加减程序的实现方法
1. 连接电路:首先,需要将数码管连接到单片机的IO口上。
具体的连接方式可以参考数码管和单片机的引脚定义,确保连接正确。
2. 初始化设置:在程序开始时,需要对单片机进行初始化设置,包括设置IO口的输入输出方向和数码管的亮度等参数。
3. 输入数字:接下来,用户可以通过按下按钮或其他输入方式,输入需要进行加减运算的数字。
程序需要读取用户输入的数字,并将其保存在变量中。
4. 加减运算:根据用户输入的数字和加减运算符,进行相应的加减运算。
可以使用单片机的加减指令或函数来实现这一步骤。
5. 显示结果:最后,将运算结果通过数码管显示出来。
可以将结果
拆分成多个数字,并依次在数码管上显示。
三、数码管加减程序的应用
数码管加减程序广泛应用于计算器、计数器等场景。
通过编程控制数码管的显示,可以实现简单的加减运算,并方便用户进行数字输入和结果显示。
四、总结
数码管加减程序是一种常见的单片机应用程序,通过控制数码管的亮灭和显示的数字,实现加减运算的功能。
通过连接电路、初始化设置、输入数字、加减运算和显示结果等步骤,可以实现数码管加减程序的功能。
这一技术在计算器、计数器等场景中有广泛的应用。
希望本文能够帮助读者理解和掌握数码管加减程序的原理和实现方法。