单片机编程源代码
单片机程序源代码
步进电机程序源代码#include<reg52.h>unsigned char step[]={0x01,0x02,0x04,0x08};sbit beep=P3^4;void delay_50us(unsigned int){unsigned int j;for(;t>0;t--)for(j=19;j>0;j--);}void main(){unsigned int i,k;for(i=512;i>=0;i--){for(k=0;k<4;k++){P1=step[k];delay_50us(200);}delay_50us(2000);if(i==0){beep=1;delay_50us(1000);}elsebeep=0;}}数码管电子时钟程序源代码#include<reg52.h> //在数码管上显示1~65536的数字,间隔1秒。
#define uint unsigned int#define uchar unsigned charuchar code d[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};uchar code w[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//8个数码管的排列是从左到右:0,1,2,3,4,5,6,7sbit Exint0 = P3^2;sbit Exint1 = P3^3;sbit keyinc = P0^0; //单片机的第39脚sbit keydec = P0^1; //单片机的第38脚sbit SetH = P0^2; //单片机的第37脚sbit SetM = P0^3; //单片机的第36脚//sbit SetS = P0^4;char s,m,h; //定义秒、分、时变量uchar num=0,Stopgo = 1,hm = 0; void ExInt0init(void);void ExInt1init(void);void KeyScan(void);void delay(uint z){uint x,y;for(x=10;x>0;x--)for(y=z;y>0;y--);}void delay_50us(uint t){uint j;for(;t>0;t--)for(j = 19;j > 0;j--);}void display(){P1 = d[s%10];P2 = w[0];delay(10);P1 = d[s/10];P2 = w[1];delay(10);P1 = d[10]; //显示“-”P2 = w[2];delay(10);P2 = w[5];delay(10);delay(10);P1 = d[m%10];P2 = w[3];delay(10);P1 = d[m/10];P2 = w[4];delay(10);P1 = d[h%10];P2 = w[6];delay(10);P1 = d[h/10];P2 = w[7];delay(10);}void changenum(){if(num==20){num=0;if(Stopgo) s++; //让“ClockSet”来控制是否数字加1}if(s>=60){ s=0;if(++m>=60){ m=0;if(++h>=24)h=0;}}display();}void init_timer(){TMOD=0x01;TH0=(65535-50000)/256; //如果时间要完全精确,需用12MHZ的晶振TL0=(65535-50000)%256;EA=1; //开总中断开关ET0=1; //开定时器0中断开关TR0=1; //开始定时}void main(){init_timer(); //调用定时器初始化函数ExInt0init(); //调用外部中断0初始化函数ExInt1init(); //调用外部中断1初始化函数while(1){Exint0 = 1; //P3.2 = 1Exint1 = 1; //P3.3 = 1if(Stopgo == 0)KeyScan();elsechangenum();display();}}void ExInt0init(void){Exint0 = 1; //P3.2 = 1PX0 = 1;EX0 = 1; //打开外部中断0中断开关IT0 = 1; //设置外部中断的触发方式,IT0 = 0代表低电平触发;IT0 = 1代表下降沿触发EA = 1; //打开总中断开关}void ExInt1init(void){Exint1 = 1; //P3.3 = 1PX1 = 1;EX1 = 1;IT1 = 1; //设置外部中断的触发方式,IT0 = 0代表低电平触发;IT0 = 1代表下降沿触发EA = 1;}void timer() interrupt 1{TH0=(65535-50000)/256;TL0=(65535-50000)%256;TF0 = 0;num++;}void exInt0(void) interrupt 0{Stopgo = 0; //当按下停止按钮时,产生外部中断0,将标志“Stopgo”清0,停止数字加1。
单片机c语言实例程序300篇
单片机c语言实例程序300篇单片机C语言【程序1】题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?1.程序分析:可填在百位、十位、个位的数字都是1、2、3、4。
组成所有的排列后再去掉不满足条件的排列。
2.程序源代码:main(){inti,j,k;printf("\n");for(i=1;i<5;i++)/某以下为三重循环某/for(j=1;j<5;j++)for(k=1;k<5;k++){if(i!=k&&i!=j&&j!=k)/某确保i、j、k三位互不相同某/printf("%d,%d,%d\n",i,j,k);}}==============================================================【程序2】题目:企业发放的奖金根据利润提成。
利润(I)低于或等于10万元时,奖金可提10%;利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数?1.程序分析:请利用数轴来分界,定位。
注意定义时需把奖金定义成长整型。
2.程序源代码:main()单片机C语言{longinti;intbonu1,bonu2,bonu4,bonu6,bonu10,bonu;canf("%ld",&i);bonu1=100000某0.1;bonu2=bonu1+100000某0.75;bonu4=bonu2+200000某0.5;bonu6=bonu4+200000某0.3;bonu10=bonu6+400000某0.15;if(i<=100000)bonu=i某0.1;eleif(i<=200000)bonu=bonu1+(i-100000)某0.075;eleif(i<=400000)bonu=bonu2+(i-200000)某0.05;eleif(i<=600000)bonu=bonu4+(i-400000)某0.03;eleif(i<=1000000)bonu=bonu6+(i-600000)某0.015;elebonu=bonu10+(i-1000000)某0.01;printf("bonu=%d",bonu);}============================================================ ==【程序3】题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?1.程序分析:在10万以内判断,先将该数加上100后再开方,再将该数加上268后再开方,如果开方后的结果满足如下条件,即是结果。
51单片机操作系统的实现+源代码
51单片机操作系统开发中的问题与技巧附代码引言51系列单片机是美国Intel公司在1980年推出的高性能8位单片机,在我国的应用非常广泛。
目前,在软件设计中需要软件工程师从底层做起,在系统软件设计方面需要做大量的重复性劳动。
如果开发一套基于51系列单片机的操作系统,那么用户只需要编写各个任务的程序,不必同时将所有任务运行的各种情况记在心中,不但大大减少了程序编写的工作量,而且减少了出错的可能性。
1 开发平台的选择和论证开发平台的选择至关重要,因为有时它不光影响进度、产品质量、可维护性等一般问题,还涉及到方案的可实现性。
在本系统中,选择51系列单片机作为操作系统的运行平台有以下原因。
首先,51系列单片机应用非常广泛,一大批性能优越的51兼容单片机相继推出。
这里包括:低功耗、高速度和增强型的Philips公司的系列产品;完美地将Flash(非易失闪存技术)EEPROM与80C51内核结合起来的Atmel公司的系列产品;在抗干扰性能,电磁兼容和通信控制总线功能上独树一帜,其产品常用于工作环境恶劣场合的Siemens公司的系列产品以及一些其它公司的产品。
既然产品如此丰富,性能如此优越,那么在处理多任务并且对实时性要求严格的系统设计中,为了充分挖掘单片机的潜能(尤其是在实时性方面),也是为了简化开发的过程,基于51系列单片机的实时操作系统的需求就十分强烈了。
Keil公司的RTX51 Full就是一个基于51系列单片机的有实用价值的实时操作系统,但该操作系统是一个源码不公开的收费软件。
其次,借助于Keil C51的集成开发环境,完全可以开发出适用于51系列单片机的操作系统代码。
Keil C51软件提供丰富的库函数和功能强大的Windows界面集成开发调试工具。
另外重要的一点,Keil C51生成的目标代码效率非常高,多数语句生成的汇编代码很紧凑,容易理解。
在开发大型软件时,更能体现高级语言的优势。
C编译器能产生可重入代码,而且用C语言可以打开和关闭中断。
单片机程序流程图及源代码
单片机上机实验报告【实验一】端口实验,掌握通过端口编程实现数据输出和输入的方法,并观察结果。
实验内容:1)输出实验:假定4个端口全部连接发光二极管,编程实现所有发光二极管同时亮,延迟一定时间(自定)后,又同时灭,如此循环。
2)输入:从P0口输入某个数据到累加器A,打开观察窗口观察数据是否进入累加器A。
实现方式:通过peripherals实现端口数据观察实验。
程序流程图:将P0到P3端口先赋值为0,调用延迟后,再赋1,然后循环执行。
源代码:ORG 0000H ;程序入口地址LJMP MAIN ;跳转到主程序ORG 0300H ;主程序地址MAIN:MOV P0,#00H;MOV P1 ,#00H;MOV P2 ,#00H;MOV P3 ,#00H ;P0~P3均赋值为0ACALL DEL;调用延迟MOV P0 ,#0FFH;MOV P1 ,#0FFH;MOV P2 ,#0FFH;MOV P3 ,#0FFH;P0~P3均设为1MOV A,P0;将P0口值赋给累加器ACALL DEL;AJMP MAIN;跳转到主程序入口ORG 0200H;延迟程序入口地址DEL:MOV R5,#04H;寄存器实现延迟,F3:MOV R6,#0FFH;若主频为12MHZ则F2:MOV R7,#0FFH;延时为256*256*4F1:DJNZ R7,F1;0.26S,人眼可分辨DJNZ R6,F2;DJNZ R5,F3;RET;从延迟程序返回END;结束3.假设P0口外接一个数码管(共阴),如图,请在数码管上轮流显示数字0~9(采用软件延时)。
程序流程图:将数码管的真值编码0~9依次赋给P0并调用延迟,然后循环运行程序即可。
源代码:ORG 0000H; 程序入口SJMP MAIN; 跳转到主程序ORG 0300H; 主程序入口地址MAIN:MOV P0,#0FCH; 将数码管0的编码赋给P0口ACALL DELAY; 调用延迟,使数码管亮0持续0.33SMOV P0,#60H; show 1ACALL DELAY;MOV P0,#0DAH; show 2ACALL DELAY;MOV P0,#0F2H; show 3ACALL DELAY;MOV P0,#66H; show 4ACALL DELAY;MOV P0,#0B6H; show 5ACALL DELAY;MOVP0,#0BEH; show 6ACALL DELAY;MOV P0,#0E0H; show 7ACALL DELAY;MOV P0,#0FEH; show 8ACALL DELAY;MOV P0,#0F6H; show 9ACALL DELAY;AJMP LOOP; 跳转到主程序入口ORG 0200H; 延迟程序入口DEL:MOV R5,#05H; 采用软件延迟,若主频为12MHz,则DEL1:MOV R6,#0FFH; 定时时间为256*256*5*1uS=0.33S,DEL2:MOV R7,#0FFH; 人眼可分辨。
单片机指令代码
1、数据传送类指令助记符功能说明字节数振荡周期MOV A,Rn 寄存器内容送入累加器 1 12MOV A,direct 直接地址单元中的数据送入累加器 2 12MOV A,@Ri 间接RAM中的数据送入累加器 1 12MOV A,#data8 8位立即数送入累加器 2 12MOV Rn,A 累加器内容送入寄存器 1 12MOV Rn,direct 直接地址单元中的数据送入寄存器 2 24MOV Rn,#data8 8位立即数送入寄存器 2 12MOV direct,A 累加器内容送入直接地址单元 2 12MOV direct,Rn 寄存器内容送入直接地址单元 2 24MOV direct,direct 直接地址单元中的数据送入直接地址单元 3 24MOV direct,@Ri 间接RAM中的数据送入直接地址单元 2 24 MOV direct,#data8 8位立即数送入直接地址单元 3 24MOV @Ri,A 累加器内容送入间接RAM单元 1 12MOV @Ri,direct 直接地址单元中的数据送入间接RAM单元 2 24MOV @Ri,#data8 8位立即数送入间接RAM单元 2 12MOV DPTR,#data16 16位立即数地址送入地址寄存器 3 24MOVC A,@A+DPTR 以DPTR为基地址变址寻址单元中的数据送入累加器 1 24 MOVC A,@A+PC 以PC为基地址变址寻址单元中的数据送入累加器 1 24MOVX A,@Ri 外部RAM(8位地址)送入累加器 1 24MOVX A,@DPTR 外部RAM(16位地址)送入累加器 1 24 MOVX @Ri,A 累加器送入外部RAM(8位地址) 1 24MOVX @DPTR,A 累加器送入外部RAM(16位地址) 1 24PUSH direct 直接地址单元中的数据压入堆栈 2 24POP DIRECT 堆栈中的数据弹出到直接地址单元 2 24XCH A,Rn 寄存器与累加器交换 1 12XCH A,direct 直接地址单元与累加器交换 2 12XCH A,@Ri 间接RAM与累加器交换 1 12XCHD A,@Ri 间接RAM与累加器进行低半字节交换 1 12 2、算术操作类指令助记符功能说明字节数振荡周期ADD A,Rn 寄存器内容加到累加器 1 12ADD A,direct 直接地址单元加到累加器 2 12ADD A,@Ri 间接RAM内容加到累加器 1 12 ADD A,#data8 8位立即数加到累加器 2 12ADDC A,Rn 寄存器内容带进位加到累加器 1 12ADDC A,dirct 直接地址单元带进位加到累加器 2 12ADDC A,@Ri 间接RAM内容带进位加到累加器 1 12ADDC A,#data8 8位立即数带进位加到累加器 2 12SUBB A,Rn 累加器带借位减寄存器内容 1 12SUBB A,dirct 累加器带借位减直接地址单元 2 12SUBB A,@Ri 累加器带借位减间接RAM内容 1 12SUBB A,#data8 累加器带借位减8位立即数 2 12INC A 累加器加1 1 12INC Rn 寄存器加1 1 12INC direct 直接地址单元内容加1 2 12INC @Ri 间接RAM内容加1 1 12 INC DPTR DPTR加1 1 24DEC A 累加器减1 1 12DEC Rn 寄存器减1 1 12DEC direct 直接地址单元内容减1 2 12DEC @Ri 间接RAM内容减1 1 12MUL A,B A乘以B 1 48 DIV A,B A除以B 1 48 DA A 累加器进行十进制转换 1 123、逻辑操作类指令助记符功能说明字节数振荡周期ANL A,Rn 累加器与寄存器相“与” 1 12ANL A,direct 累加器与直接地址单元相“与” 2 12ANL A,@Ri 累加器与间接RAM内容相“与” 1 12 ANL A,#data8 累加器与8位立即数相“与” 2 12 ANL direct,A 直接地址单元与累加器相“与” 2 12ANL direct,#data8 直接地址单元与8位立即数相“与” 3 24ORL A,Rn 累加器与寄存器相“或” 1 12 ORL A,direct 累加器与直接地址单元相“或” 2 12ORL A,@Ri 累加器与间接RAM内容相“或” 1 12 ORL A,#data8 累加器与8位立即数相“或” 2 12 ORL direct,A 直接地址单元与累加器相“或” 2 12ORL direct,#data8 直接地址单元与8位立即数相“或” 3 24XRL A,Rn 累加器与寄存器相“异或” 1 12XRL A,direct 累加器与直接地址单元相“异或” 2 12XRL A,@Ri 累加器与间接RAM内容相“异或” 1 12 XRL A,#data8 累加器与8位立即数相“异或” 2 12 XRL direct,A 直接地址单元与累加器相“异或” 2 12XRL direct,#data8 直接地址单元与8位立即数相“异或” 3 24CLR A 累加器清0 1 12 CPL A 累加器求反 1 12 RL A 累加器循环左移 1 12 RLC A 累加器带进位循环左移 1 12RR A 累加器循环右移 1 12RRC A 累加器带进位循环右移 1 12SWAP A 累加器半字节交换 1 124、控制转移类指令助记符功能说明字节数振荡周期ACALL addr11 绝对短调用子程序 2 24LACLL addr16 长调用子程序 3 24RET 子程序返回 1 24RETI 中断返回 1 24AJMP addr11 绝对短转移 2 24LJMP addr16 长转移 3 24SJMP rel 相对转移 2 24JMP @A+DPTR 相对于DPTR的间接转移 1 24 JZ rel 累加器为零转移 2 24JNZ rel 累加器非零转移 2 24CJNE A,direct,rel 累加器与直接地址单元比较,不等则转移 3 24CJNE A,#data8,rel 累加器与8位立即数比较,不等则转移 3 24CJNE Rn,#data8,rel 寄存器与8位立即数比较,不等则转移 3 24(相等则执行本指令的下一条)CJNE @Ri,#data8,rel 间接RAM单元,不等则转移 3 24(但有时还想得知两数比较之后哪个大,哪个小,本条指令也具有这样的功能,如果两数不相等,则CPU还会反映出哪个数大,哪个数小,这是用CY(进位标志位)来实现的。
AVR单片机C语言编程
定时器与计数器的工作原理
定时器
定时器是单片机内部的一个硬件资源,可以通过编程控制其产生一定时间间隔的时序。定时器的工作原理是将 单片机内部的某个固定时间单位(通常为时钟周期)进行计数,当达到设定的计数值时,定时器就会产生一个 中断信号或者输出一个脉冲信号。
计数器
计数器是单片机内部另一个重要的硬件资源,用于对外部信号进行计数。计数器的工作原理是当外部信号输入 时,计数器的值就会自动加1或者减1。通过编程控制计数器的初始值和溢出值,可以实现不同的计数功能。
定时器与计数器的编程实例
要点一
定时器的编程实例
以AVR单片机的定时器0为例,通过编程控制定时器的 初始值和溢出值,实现一个1秒的定时器。首先需要设 置定时器的控制寄存器,包括选择定时器模式、设置定 时器初始值和启动定时器。然后通过读取定时器的当前 值,判断是否已经到达设定的溢出值,如果到达则产生 一个中断信号或者输出一个脉冲信号。
如用于设置中断的寄存器、设置时钟频率的寄 存器等
AVR单片机的内存管理
了解AVR的内存映射以及如何使用指针访问内存地址等
C语言编译器及开发环境
GCC for AVR
是AVR单片机常用的编译器,可以将C语言源代码编译成AVR能 理解的汇编代码
Atmel Studio
Atmel公司提供的集成开发环境,内含GCC for AVR,可用于编 写、编译和调试AVR的C语言代码
中断处理函数
编写中断处理函数,用于处理各个中断源 的中断事件。
中断使能
通过使能全局中断或特定中断源来启动中 断处理。
中断处理的扩展方法
中断嵌套
支持多层嵌套中断,确保关键任务得到优先处理。
可编程中断控制器
通过可编程中断控制器对中断进行更灵活的控制。
STCCAS单片机各个模块程序代码
//**************************************************************************** //// STC12C5A60S2可编程时钟模块////// 说明:STC12C5A60S2单片机有三路可编程时钟输出CLKOUT0/T0/P3.4// CLKOUT1/T1/P3.5、CLKOUT2/P1.0//// 涉及寄存器:AUXR(辅助寄存器)、WAKE_CLKO(时钟与系统掉电唤醒控制寄存器) // BRT(独立波特率发生器定时器寄存器)//// 程序说明:// 本程序可选实现P3.4输出CLKOUT0时钟、P3.5输出CLKOUT1时钟// P1.0输出CLKOUT2时钟//////************************************************************************** **//#include <STC12C5A60S2.H>#include <intrins.h>//#define Port_BRT //如果想测试独立波特率发生器时钟输出请打开此句//若想测试CLKOUT1和CLKOUT0请注释此句#ifdef Port_BRT /*条件编译独立波特率发生器时钟输出*///*********************************//// CLKOUT2时钟初始化 ////*********************************//void CLKOUT_init(void){WAKE_CLKO = 0x04; //Bit2-BRTCLKO 允许P1.0配置为独立波特率发生器的时钟输出//BRT工作在1T模式下时的输出频率 = Sysclk/(256-BRT)/2 //BRT工作在12T模式下时输出频率 = Sysclk/12/(256-BRT)/2 AUXR = 0x14; //Bit4-BRTR 允许独立波特率发生器运行//Bit2-BRTx12 BRT工作在1T模式下BRT = 0xff; //更改该寄存器的值可实现对输出的时钟频率进行分频}#else /*条件编译CLKOUT0时钟输出*///*********************************//// CLKOUT0时钟和CLKOUT1初始化 ////*********************************//void CLKOUT_init(void){WAKE_CLKO = 0x03; //允许将P3.4/T0脚配置为定时器0的时钟输出CLKOUT0//T0工作在1T模式时的输出频率 = SYSclk/(256-TH0)/2//T0工作在12T模式时的输出频率 = SYSclk/12/(256-TH0)/2 //1T指的是每1个时钟加1,是普通C51的12倍//12T指的是每12个时钟加1与普通C51一样//允许将P3.5/T1脚配置为定时器1的时钟输出CLKOUT1,只能工作在定时器模式2下//T1工作在1T模式时的输出频率 = SYSclk/(256-TH0)/2//T1工作在12T模式时的输出频率 = SYSclk/12/(256-TH0)/2 //1T指的是每1个时钟加1,是普通C51的12倍//12T指的是每12个时钟加1与普通C51一样AUXR = 0xc0; //T0定时器速度是普通8051的12倍,即工作在1T模式下//T1定时器速度是普通8051的12倍,即工作在1T模式下TMOD = 0x22; //定时器0工作模式为方式2,自动装载时间常数//定时器1工作模式为方式2,自动装载时间常数TH0 = 0xff; //更改该寄存器的值可实现对输出的时钟频率进行分频TL0 = 0xff;TH1 = 0xff; //更改该寄存器的值可实现对输出的时钟频率进行分频TL1 = 0xff;TR1 = 1;TR0 = 1;}#endif//**********************************//// 主程序////**********************************//void main(){CLKOUT_init();while(1);}//**************************************************************************** //// STC12C5A60S2系统时钟模块////// 说明: STC12C5A60S2单片机有两个时钟源,内部R/C振荡时钟和外部晶体时钟// 出厂标准配置是使用外部晶体或时钟////// 涉及寄存器:CLK_DIV(时钟分频寄存器)// 由该寄存器的Bit0-2组合可实现对时钟源进行0、2、4、8、16 // 32、64、128分频// //// 程序说明:// 对外部时钟进行分频得到Sysclk,然后经过P1.0的独立波特率// 时钟输出功能Sysclk/2输出时钟频率//**************************************************************************** //#include <STC12C5A60S2.h>#include <intrins.h>#define Bus_clk 12 //若要修改系统时钟直接在此处修改//12 为 12M 的sysclk//6 为 6M 的sysclk//3 为 3M 的sysclk//1500 为 1.5M 的sysclk//750 为 750kHz 的sysclk//375 为 375kHz 的sysclk//187500 为 187.5kHz 的sysclk//93750 为 93.75kHz 的sysclk//*********************************************//// 系统时钟初始化 ////*********************************************//void Sysclk_init(void){WAKE_CLKO = 0x04; //配置P1.0口为频率输出AUXR = 0x14; //允许波特率时钟工作//工作模式为1TBRT = 0xff;#if( Bus_clk == 12 )CLK_DIV = 0x00;#elif( Bus_clk == 6 )CLK_DIV = 0x01;#elif( Bus_clk == 3 )CLK_DIV = 0x02;#elif( Bus_clk == 1500 )CLK_DIV = 0x03;#elif( Bus_clk == 750 )CLK_DIV = 0x04;#elif( Bus_clk == 375 )CLK_DIV = 0x05;#elif( Bus_clk == 187500 )CLK_DIV = 0x06;#elif( Bus_clk == 93750 )CLK_DIV = 0x07;#endif}//**********************************************//// 主程序////**********************************************//void main(){Sysclk_init();while(1);}//**************************************************************************** //// STC12C5A60S2系统省电模块////// 说明: STC12C5A60S2单片机有三种省电模式以降低功耗.空闲模式,低速模式// 掉电模式////// 涉及寄存器:PCON(电源控制寄存器)// Bit0 - IDL 控制单片机进入IDLE空闲模式// Bit1 - PD 控制单片机进入掉电模式// //// 程序说明:程序实现让单片机先工作一阵子(通过P0^3指示灯显示)// 然后进入掉电状态,利用外部中断0口来唤醒单片机工作// 唤醒后单片机将通过P0^0-3口的灯闪烁显示开始工作////************************************************************************** **//#include <STC12C5A60S2.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intuchar Power_Down_Flag = 0; //进入掉电状态标志sbit Chip_Start_LED = P0^0; //单片机开始工作指示灯sbit Power_Down_LED_INT0 = P0^1; //INT0口掉电唤醒指示灯sbit N_Power_Down_LED_INT0 = P0^2; //INT0口没有唤醒指示灯sbit Normal_Work_LED = P0^3; //正常工作指示灯sbit Power_Down_Wakeup_INT0= P3^2; //外中断唤醒输入口void Delay_ms( uint time );void Normal_work(void);void Intp_init(void);void After_Powr_Down(void);//***********************************//// 软件延时 ////***********************************//void Delay_ms( uint time ){uint t; //延时时间 = (time*1003+16)us while(time--){for( t = 0; t < 82; t++ );}}//***********************************//// 正常工作指示//***********************************//void Normal_work(void){Normal_Work_LED = 1;Delay_ms(500);Normal_Work_LED = 0;Delay_ms(500);}void After_Power_Down(void){uchar i ;for( i = 0; i < 100; i++ ){P0 = 0x0f;Delay_ms(500);P0 = 0x00;Delay_ms(500);}}//***********************************//// 中断初始化 ////***********************************//void Intp_init(void){IT0 = 0; //外部中断源0为低电平触发EX0 = 1; //允许外部中断EA = 1; //开总中断}//***********************************//// 主程序 ////***********************************//void main(){uchar j = 0;uchar wakeup_counter = 0; //记录掉电次数P0 = 0x00;Chip_Start_LED = 1; //单片机开始工作Intp_init(); //外中断0初始化while(1){P2 = wakeup_counter;wakeup_counter++;for( j = 0; j < 250; j++ ){Normal_work(); //系统正常工作指示}Power_Down_Flag = 1; //系统开始进入掉电状态PCON = 0x02;_nop_();_nop_();_nop_();_nop_();After_Power_Down(); //掉电唤醒后}}//**********************************//// 中断服务//**********************************//void INT0_Service(void) interrupt 0{if( Power_Down_Flag ) //掉电唤醒状态指示 {Power_Down_Flag = 0;Power_Down_LED_INT0 = 1;while( Power_Down_Wakeup_INT0 == 0 ){_nop_(); //等待高电平}Power_Down_LED_INT0 = 0;}else //未掉电状态{N_Power_Down_LED_INT0 = 1; //不是掉电唤醒指示while( Power_Down_Wakeup_INT0 == 0 ){_nop_();}N_Power_Down_LED_INT0 = 0;}}//**************************************************************************** //// STC12C5A60S2 A/D转换模块////// 说明: STC12C5A60S2单片机有8路10位高速AD转换器,P1^0-P1^7//// 涉及寄存器:P1ASF(模拟功能控制寄存器)、ADC_CONTR(ADC控制寄存器)// ADC_RES、ADC_RESL(转换结果寄存器)//// 注意: 1、初次打开内部A/D模拟电源需适当延时等内部模拟电源稳定后,再启动A/D转换// 启动A/D后,在转换结束前不改变任何I/O口的状态,有利于高精度A/D 转换// 若能将定时器/串行/中断系统关闭更好。
STC12C5A60S2单片机各个模块程序代码
//****************************************************************************// // STC12C5A60S2可编程时钟模块////// 说明:STC12C5A60S2单片机有三路可编程时钟输出CLKOUT0/T0/P3.4// CLKOUT1/T1/P3.5、CLKOUT2/P1.0//// 涉及寄存器:AUXR(辅助寄存器)、W AKE_CLKO(时钟与系统掉电唤醒控制寄存器)// BRT(独立波特率发生器定时器寄存器)//// 程序说明:// 本程序可选实现P3.4输出CLKOUT0时钟、P3.5输出CLKOUT1时钟// P1.0输出CLKOUT2时钟//////****************************************************************************/ /#include <STC12C5A60S2.H>#include <intrins.h>//#define Port_BRT //如果想测试独立波特率发生器时钟输出请打开此句//若想测试CLKOUT1和CLKOUT0请注释此句#ifdef Port_BRT /*条件编译独立波特率发生器时钟输出*///*********************************//// CLKOUT2时钟初始化////*********************************//void CLKOUT_init(void){WAKE_CLKO = 0x04; //Bit2-BRTCLKO 允许P1.0配置为独立波特率发生器的时钟输出//BRT工作在1T模式下时的输出频率= Sysclk/(256-BRT)/2//BRT工作在12T模式下时输出频率= Sysclk/12/(256-BRT)/2 AUXR = 0x14; //Bit4-BRTR 允许独立波特率发生器运行//Bit2-BRTx12 BRT工作在1T模式下BRT = 0xff; //更改该寄存器的值可实现对输出的时钟频率进行分频}#else /*条件编译CLKOUT0时钟输出*///*********************************//// CLKOUT0时钟和CLKOUT1初始化////*********************************//void CLKOUT_init(void){WAKE_CLKO = 0x03; //允许将P3.4/T0脚配置为定时器0的时钟输出CLKOUT0//T0工作在1T模式时的输出频率= SYSclk/(256-TH0)/2//T0工作在12T模式时的输出频率= SYSclk/12/(256-TH0)/2//1T指的是每1个时钟加1,是普通C51的12倍//12T指的是每12个时钟加1与普通C51一样//允许将P3.5/T1脚配置为定时器1的时钟输出CLKOUT1,只能工作在定时器模式2下//T1工作在1T模式时的输出频率= SYSclk/(256-TH0)/2//T1工作在12T模式时的输出频率= SYSclk/12/(256-TH0)/2//1T指的是每1个时钟加1,是普通C51的12倍//12T指的是每12个时钟加1与普通C51一样AUXR = 0xc0; //T0定时器速度是普通8051的12倍,即工作在1T模式下//T1定时器速度是普通8051的12倍,即工作在1T模式下TMOD = 0x22; //定时器0工作模式为方式2,自动装载时间常数//定时器1工作模式为方式2,自动装载时间常数TH0 = 0xff; //更改该寄存器的值可实现对输出的时钟频率进行分频TL0 = 0xff;TH1 = 0xff; //更改该寄存器的值可实现对输出的时钟频率进行分频TL1 = 0xff;TR1 = 1;TR0 = 1;}#endif//**********************************//// 主程序////**********************************//void main(){CLKOUT_init();while(1);}//****************************************************************************// // STC12C5A60S2系统时钟模块////// 说明:STC12C5A60S2单片机有两个时钟源,内部R/C振荡时钟和外部晶体时钟// 出厂标准配置是使用外部晶体或时钟////// 涉及寄存器:CLK_DIV(时钟分频寄存器)// 由该寄存器的Bit0-2组合可实现对时钟源进行0、2、4、8、16// 32、64、128分频// //// 程序说明:// 对外部时钟进行分频得到Sysclk,然后经过P1.0的独立波特率// 时钟输出功能Sysclk/2输出时钟频率//****************************************************************************// #include <STC12C5A60S2.h>#include <intrins.h>#define Bus_clk 12 //若要修改系统时钟直接在此处修改//12 为12M 的sysclk//6 为6M 的sysclk//3 为3M 的sysclk//1500 为 1.5M 的sysclk//750 为750kHz 的sysclk//375 为375kHz 的sysclk//187500 为187.5kHz 的sysclk//93750 为93.75kHz 的sysclk//*********************************************//// 系统时钟初始化////*********************************************//void Sysclk_init(void){WAKE_CLKO = 0x04; //配置P1.0口为频率输出AUXR = 0x14; //允许波特率时钟工作//工作模式为1TBRT = 0xff;#if( Bus_clk == 12 )CLK_DIV = 0x00;#elif( Bus_clk == 6 )CLK_DIV = 0x01;#elif( Bus_clk == 3 )CLK_DIV = 0x02;#elif( Bus_clk == 1500 )CLK_DIV = 0x03;#elif( Bus_clk == 750 )CLK_DIV = 0x04;#elif( Bus_clk == 375 )CLK_DIV = 0x05;#elif( Bus_clk == 187500 )CLK_DIV = 0x06;#elif( Bus_clk == 93750 )CLK_DIV = 0x07;#endif}//**********************************************//// 主程序////**********************************************//void main(){Sysclk_init();while(1);}//****************************************************************************// // STC12C5A60S2系统省电模块////// 说明:STC12C5A60S2单片机有三种省电模式以降低功耗.空闲模式,低速模式// 掉电模式////// 涉及寄存器:PCON(电源控制寄存器)// Bit0 - IDL 控制单片机进入IDLE空闲模式// Bit1 - PD 控制单片机进入掉电模式// //// 程序说明:程序实现让单片机先工作一阵子(通过P0^3指示灯显示)// 然后进入掉电状态,利用外部中断0口来唤醒单片机工作// 唤醒后单片机将通过P0^0-3口的灯闪烁显示开始工作////****************************************************************************/ /#include <STC12C5A60S2.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intuchar Power_Down_Flag = 0; //进入掉电状态标志sbit Chip_Start_LED = P0^0; //单片机开始工作指示灯sbit Power_Down_LED_INT0 = P0^1; //INT0口掉电唤醒指示灯sbit N_Power_Down_LED_INT0 = P0^2; //INT0口没有唤醒指示灯sbit Normal_Work_LED = P0^3; //正常工作指示灯sbit Power_Down_Wakeup_INT0= P3^2; //外中断唤醒输入口void Delay_ms( uint time );void Normal_work(void);void Intp_init(void);void After_Powr_Down(void);//***********************************//// 软件延时////***********************************//void Delay_ms( uint time ){uint t; //延时时间= (time*1003+16)us while(time--){for( t = 0; t < 82; t++ );}}//***********************************//// 正常工作指示//***********************************//void Normal_work(void){Normal_Work_LED = 1;Delay_ms(500);Normal_Work_LED = 0;Delay_ms(500);}void After_Power_Down(void){uchar i ;for( i = 0; i < 100; i++ ){P0 = 0x0f;Delay_ms(500);P0 = 0x00;Delay_ms(500);}}//***********************************//// 中断初始化////***********************************//void Intp_init(void){IT0 = 0; //外部中断源0为低电平触发EX0 = 1; //允许外部中断EA = 1; //开总中断}//***********************************//// 主程序////***********************************//void main(){uchar j = 0;uchar wakeup_counter = 0; //记录掉电次数P0 = 0x00;Chip_Start_LED = 1; //单片机开始工作Intp_init(); //外中断0初始化while(1){P2 = wakeup_counter;wakeup_counter++;for( j = 0; j < 250; j++ ){Normal_work(); //系统正常工作指示}Power_Down_Flag = 1; //系统开始进入掉电状态PCON = 0x02;_nop_();_nop_();_nop_();_nop_();After_Power_Down(); //掉电唤醒后}}//**********************************//// 中断服务//**********************************//void INT0_Service(void) interrupt 0{if( Power_Down_Flag ) //掉电唤醒状态指示{Power_Down_Flag = 0;Power_Down_LED_INT0 = 1;while( Power_Down_Wakeup_INT0 == 0 ){_nop_(); //等待高电平}Power_Down_LED_INT0 = 0;}else //未掉电状态{N_Power_Down_LED_INT0 = 1; //不是掉电唤醒指示while( Power_Down_Wakeup_INT0 == 0 ){_nop_();}N_Power_Down_LED_INT0 = 0;}}//****************************************************************************// // STC12C5A60S2 A/D转换模块////// 说明:STC12C5A60S2单片机有8路10位高速AD转换器,P1^0-P1^7//// 涉及寄存器:P1ASF(模拟功能控制寄存器)、ADC_CONTR(ADC控制寄存器)// ADC_RES、ADC_RESL(转换结果寄存器)//// 注意: 1、初次打开内部A/D模拟电源需适当延时等内部模拟电源稳定后,再启动A/D转换// 启动A/D后,在转换结束前不改变任何I/O口的状态,有利于高精度A/D转换// 若能将定时器/串行/中断系统关闭更好。
C51单片机代码
摘要摘要本课程设计以AT89S52单片机为核心芯片,与型号为DS1302时钟芯片以及液晶显示器构成的数字电子时钟电路。
利用外部按键的操作可实现对时间的修改和定时功能。
另外焊接了DS18B20温度测试芯片,使得电子时钟在实现时间显示、定时、报时功能外可以实时监测当前环境温度。
系统电路由时钟模块、主控模块、键盘及显示模块、电源模块组成。
这样设计的结果使电路结构十分简洁,功能较为完善,且各种要求能完全保证,使系统电路的稳定性得到提高。
同时,它采用C 语言对系统的各功能模块进行编程实现,并且系统具有键盘控制功能,方便校对时间。
关键词:单片机AT89S52 、时钟芯片DS1302、电子时钟、C语言ABSTRACTABSTRACTThis course design of AT89S52 single chip microcomputer as the core chip, and models for the DS1302 clock chip and digital electronic clock circuit composed of liquid crystal display. Using external key operation can realize modification and timing function of time. The other welding the test chip DS18B20 temperature, making electronic clock chimes on implementation time display, timing, function can real-time monitor the environment temperature. System circuit consists of the clock module, main control module, keyboard and display module, power supply module. This design make the circuit structure is simple, the result of the function is relatively perfect, and can completely guarantee that all kinds of demand, make the system of the circuit stability was improved. At the same time, it on each function module of the system using C language programming, and the system has the function of the keyboard control, convenient to check the time.Key words: single chip microcomputer AT89S52, clock chip DS1302, electronic clock, C language目录第1章引言 (1)1.1 概述 (1)1.2 课程设计的目的及意义 (1)1.3 课程设计的要求 (1)第2章总体方案设计与论证 (3)2.1 系统整体方案设计 (3)2.2 系统整体方案论证 (3)2.2.1 方案的选择 (3)第3章硬件电路设计 (5)3.1.1 单片机功能介绍 (5)3.1.2 单片晶振电路 (6)3.2 单片机复位电路 (7)3.3 系统供电系统电路设计 (7)3.4 按键调整电路设计 (8)3.5 LCD1602显示电路设计 (8)3.6 核心芯片DS1302介绍 (10)3.6.1 DS1302的主要性能指标 (10)3.6.2 DS1302芯片引脚图 (10)第4章软件程序设计 (12)4.1 主程序流程图 (12)4.2 编程程序介绍 (12)4.3 主界面程序 (15)第5章仿真与软硬联调 (18)5.1 仿真软件介绍 (18)5.2 电路仿真图 (18)图5-1电子时钟系统整体电路 (18)5.3 Protel DXP绘制PCB电路板的流程 (18)图5-2电子闹钟系统PCB版 (22)第6章系统焊接与调试 (23)6.1 电路焊接调试 (23)6.2 系统功能测试 (23)6.3 系统误差分析 (24)6.4 焊接实体展示 (24)6.5 设计总结 (24)参考文献 (26)致谢 (27)附录 (28)附录一: 程序 (28)第1章引言第1章引言1.1概述现在是一个知识爆炸的新时代。
单片机程序源代码
第二章任务一:闪烁广告灯的设计利用89c51单片机的端口控制两个LED(D0和D1),编写程序,实现两个LED互闪。
#include<reg52.h>#define uint unsigned int#define uchar unsigned charsbit LED1=P0^0;sbit LED2=P0^1;void delayms(uint ms){uint i;while(ms--){for(i=0;i<120;i++);}}void main(){while(1){LED1=0;LED2=1;delayms(500);LED1=1;LED2=0;delayms(500);}}任务二:流水广告灯的设计利用89c51单片机的端口控制8个LED(D0~D7)循环点亮,刚开始时D0点亮,延时片刻后,接着D1点亮,然后依次点亮D2->D3->D4->D5 ->D6->D7 ,然后再点亮D7->D6->D5->D4 ->D3->D2->D1->D0,重复循环。
#include<reg52.h>#include <intrins.h>#define uint unsigned int#define uchar unsigned charuint i;uchar temp;uint a[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};void delayms(uint ms){while(ms--){ uint j;for(j=0;j<120;j++);}}void main(){while(1){P0=0xfe;while(P0!=0x7f){//P1=temp;//delayms(500);P0=_crol_(P0,1);delayms(250);}temp=0x7f;while(P0!=0xfe){P0=temp;delayms(500);temp=_cror_(temp,1);}}}任务三:拉幕式与闭幕式广告灯的设计利用89c51单片机的P0端口实现8个LED D0~D7的拉幕式与闭幕式广告灯设计。
单片机C语言编程实例
单片机C语言编程实例前言INTEL公司的MCS-51单片机是目前在我国应用得最广泛的单片机之一.随着单片机应用技术的不断发展,许多公司纷纷以51单片机为内核,开发出与其兼容的多种芯片,从而扩充和扩展了其品种和应用领域.C语言已成为当前举世公认的高效简洁而又贴近硬件的编程语言之—。
将C语言向单片机上的移植,始于20世纪80年代的中后期。
经过十几年的努力,C语言终于成为专业化单片机上的实用高级语言。
用C语言编写的8051单片机的软件,可以大大缩短开发周期,且明显地增加软件的可读性,便于改进和扩充,从而研制出规模更大、性能更完善的系统。
因此,不管是对于新进入这一领域的开发者来说,还是对于有多年单片机开发经验的人来说,学习单片机的C语言编程技术都是十分必要的..C语言是具有结构化.模块化编译的通用计算机语言,是国际上应用最广。
最多的计算语言之一。
C51是在通用C语言的基础上开发出的专门用于51系列单片机编程的C语言。
与汇编语言相比,C51在功能上.结构上以及可读性。
可移植性。
可维护性等方面都有非常明显的优势.目前最先进、功能最强大、国内用户最多的C51编译器是Keil Soft ware公司推出的KeilC51.第一章单片机C语言入门1。
1建立您的第一个C项目使用C语言肯定要使用到C编译器,以便把写好的C程序编译为机器码,这样单片机才能执行编写好的程序。
KEIL uVISION2是众多单片机应用开发软件中优秀的软件之一,它支持众多不同公司的MCS51架构的芯片,它集编辑,编译,仿真等于一体,同时还支持PLM、汇编和C语言的程序设计,它的界面和常用的微软VC++的界面相似,界面友好,易学易用,在调试程序,软件仿真方面也有很强大的功能.因此很多开发51应用的工程师或普通的单片机爱好者,都对它十分喜欢。
以上简单介绍了KEIL51软件,要使用KEIL51软件,必需先要安装它。
KEIL51是一个商业的软件,对于我们这些普通爱好者可以到KEIL中国代理周立功公司的网站上下载一份能编译2K的DEMO版软件,基本可以满足一般的个人学习和小型应用的开发。
51单片机DHT11芯片,1603显示屏程序代码
51单片机DHT11芯片,1603显示屏程序代码#include<reg52.h>#include<intrins。
h>typedefunsignedcharuchar;typedefunsignedintuint;typedefunsignedlongulong;ucharcom,flag;ucharn,m,y,x,v,u,a1,a2;//温湿度上下限的参数,其中,nm是温湿度超标与否的标准,值为0或者1.这代码的温湿度报警没有用LED或者蜂鸣器,只用了一个软件参数n、m存储报警信息。
需要添加报警功能的可以自己写额外的功能代码,然后nm两个参数就是功能传递参数。
也可以写多一个串口输出代码,用串口调试助手输出n、m的值验证温湿度是否超标判断正确。
voidDelay1000ms()//@11.0592MHz延时{unsignedchari,j,k;_nop_();i=8;j=1;k=243;do{do{while(--k);}while(--j);}while(--i);}voidDelay500us()//@11.0592MHz {ucharb;_nop_();b=227;while(--b);}voidDelay10us()//@11.0592MHz {uchara;a=2;while(--a);}voiddelay(uintz){uchari,j;for(i=z;i>0;i--)for(j=110;j>0;j--);//ÑÓʱº¯Êý}//************************引脚定义************* /*******按键控制引脚定义*********/sbity_tem_inse=P1^0;//sbity_tem_duce=P1^1;//sbitx_tem_inse=P1^2;//sbitx_tem_duce=P1^3;//sbitu_hum_inse=P1^4;//sbitu_hum_duce=P1^5;//sbitv_hum_inse=P1^6;//sbitv_hum_duce=P1^7;///***********其他功能引脚*****/sbitDQ=P2^1;//DTH11//****LCD的****sbitRS=P2^7;sbitRW=P2^6;sbitEN=P2^5;#defineDataPortP0//LCD的接线,我的是8线接发//-----------------函数声明------------- voiddelay_us(uchart);voiddelay_ms(uchart);bitLCD_Check_Busy(void);voidLCD_Write_Com(ucharcom);voidLCD_Write_Data(ucharData);voidLCD_Clear(void);voidLCD_Write_String(ucharx,uchary,uchar*s);voidLCD_Write_Char(ucharx,uchary,ucharData);voidLCD_Init(void);voidCOMdata();//*************************以下是函数定义***************************//**************液晶屏显示原函数由此开始*************************bitLCD_Check_Busy(void)//检忙{DataPort=0xFF;RS=0;RW=1;EN=0;_nop_();EN=1;return(bit)(DataPort&0x80);voidLCD_Write_Com(ucharcom)//写指令原函数{while(LCD_Check_Busy());RS=0;RW=0;EN=1;DataPort=com;_nop_();EN=0;}voidLCD_Write_Data(ucharData)//写数据原函数{while(LCD_Check_Busy());RS=1;RW=0;EN=1;DataPort=Data;_nop_();EN=0;}voidLCD_Clear(void)//清屏LCD_Write_Com(0x01);delay(1);}voidLCD_Write_String(ucharx,uchary,uchar*s)//操作-显示LCD屏的哪个位置{if(y==0)LCD_Write_Com(0x80+x);elseLCD_Write_Com(0xC0+x);while(*s){LCD_Write_Data(*s);s++;}}voidLCD_Write_Char(ucharx,uchary,ucharData)//操作-显示的数据(字符类型,显示数字需找到该数字的ASCII码){if(y==0)LCD_Write_Com(0x80+x);elseLCD_Write_Com(0xC0+x);LCD_Write_Data(Data);}voidLCD_Init(void)//LCD初始化(可以理解为唤醒){delay(15);LCD_Write_Com(0x38);delay(5);LCD_Write_Com(0x38);delay(5);LCD_Write_Com(0x38);delay(5);LCD_Write_Com(0x38);LCD_Write_Com(0x08);LCD_Write_Com(0x01);LCD_Write_Com(0x06);delay(5);LCD_Write_Com(0x0C);}//****************LCD源码结束***********//*********DHT11原函数以下开始*******//*************************************************** ucharcodeASCII[]="0123456789%c";//普通数字需用该数组转成字符ucharcodetable0[]="Hum:";ucharcodetable1[]="Tem:";uchartem;ucharhum;display0[2]={0,0};display1[2]={0,0};//*************************初始化DTH11voidCOMdata()//读数据{uchari,t;for(i=0;i<8;i++){flag=2;while((!DQ)&&flag++);Delay10us();Delay10us();Delay10us();//先看懂DHT11的工作时序图就知道我这个延时操作的含义了,读高电平多少秒可以对应数据0或1t=0;if(DQ)t=1;while((DQ)&&flag++);if(flag==1)break;com<<=1;com|=t;}}voidRH(void)//该函数包括唤醒DHT11发送数据给单片机也包括单片机把数据提取{DQ=0;delay(21);DQ=1;Delay10us();Delay10us();Delay10us();Delay10us();DQ=1;if(!DQ){flag=2;while((!DQ)&&flag++);while((DQ)&&flag++);COMdata();hum=com;COMdata();COMdata();tem=com;COMdata();COMdata();//小数位这里我不显示,所以不用读取tem或hum 第二次的COMdata()函数获取的数据DQ=1;}}//*********************************LCD显示温湿度数据voidDisplay_DTH11(){ucharxh,xl,yh,yl,vh,vl,uh,ul;xh=x/10%10;xl=x%10;yh=y/10%10;yl=y%10;uh=u/10%10;ul=u%10;vh=v/10%10;vl=v%10;LCD_Write_String(8,0,"L");LCD_Write_Char(9,0,ASCII[uh]);LCD_Write_Char(10,0,ASCII[ul]);LCD_Write_String(12,0,"H");LCD_Write_Char(13,0,ASCII[vh]);LCD_Write_Char(14,0,ASCII[vl]);LCD_Write_String(8,1,"L");LCD_Write_Char(9,1,ASCII[xh]);LCD_Write_Char(10,1,ASCII[xl]);LCD_Write_String(12,1,"H");LCD_Write_Char(13,1,ASCII[yh]);LCD_Write_Char(14,1,ASCII[yl]);display0[1]=hum/10%10;//读hum十位display0[0]=hum%10;//个位LCD_Write_String(0,0,table0);LCD_Write_Char(4,0,ASCII[display0[1]]);LCD_Write_Char(5,0,ASCII[display0[0]]);LCD_Write_Char(6,0,ASCII[10]);//显示在LCD的第几行第几位(这一行是指在第0行,第6位开始显示ASCII[10]里面的字符数据,下同),运行结果是显示了“hum:”这四个字符display1[1]=tem/10%10;display1[0]=tem%10;LCD_Write_String(0,1,table1);LCD_Write_Char(4,1,ASCII[display1[1]]);LCD_Write_Char(5,1,ASCII[display1[0]]);LCD_Write_Char(6,1,0xdf);LCD_Write_Char(7,1,ASCII[11]);}//***************原函数结束*************//voidkeyscan(){if(y_tem_inse==0){delay(10);if(y_tem_inse==0)//这里是消抖,下同{y=y+5;while(y==55)y=50;while(y_tem_inse==0);}if(y_tem_duce==0){delay(10);if(y_tem_duce==0);{y=y-5;while(y==5)y=10;while(y_tem_duce==0);}}if(x_tem_inse==0){delay(10);if(x_tem_inse==0){x=x+5;while(x==55)x=50;while(x_tem_inse==0);}}if(x_tem_duce==0)delay(10);if(x_tem_duce==0);{x=x-5;while(x==5)x=10;while(x_tem_duce==0);}}if(u_hum_inse==0){delay(10);if(u_hum_inse==0){u=u+5;while(u==85)u=80;while(u_hum_inse==0);}}if(u_hum_duce==0){delay(10);if(u_hum_duce==0);u=u-5;while(u==25)u=30;while(u_hum_duce==0);}}if(v_hum_inse==0){delay(10);if(v_hum_inse==0){v=v+5;while(v==85)v=80;while(v_hum_inse==0);}}if(v_hum_duce==0){delay(10);if(v_hum_duce==0);{v=v-5;while(v==25)v=20;while(v_hum_duce==0);}}}//*******************************上面是按键扫描,以下开始是主函数main(){LCD_Clear();x=10,y=50,u=30,v=80;//温湿度上下限初值,按键函数里可调tem=0;hum=0;//赋初值LCD_Init();Delay1000ms();//DTH11上电一秒后才工作正常while(1){EA=0;keyscan();RH();if((tem>y)||(tem<x))n=1;elsen=0;//LED或蜂鸣器亮灭判断,下同if((hum>v)||(hum<u))m=1;elsem=0;Display_DTH11();Time0_Init();Delay1000ms();Delay1000ms();Delay1000ms();}}。
单片机编程全集(含源代码)
单片机编程全集(含源代码)单片机编程全集(含源代码)引言:单片机编程是一门重要的技术,它在各个行业中都有广泛的应用。
本文将介绍单片机编程所需的基础知识、常用的编程语言和相关的实例代码,以及如何进行单片机的调试和测试。
一、单片机编程基础知识1.1 单片机概述单片机是一种集成电路,它集成了中央处理器、存储器和输入输出设备等功能单元。
它具有体积小、功耗低、成本低等优点,适用于各种嵌入式系统中。
1.2 单片机体系结构单片机的体系结构包括CPU、存储器、输入输出端口、计时/计数器等模块。
理解单片机的体系结构对于编程非常重要。
1.3 常用的单片机常见的单片机有AT89S52、STM32F103C8T6等,它们具有不同的性能和功能特点。
选择适合自己项目需求的单片机是编程的第一步。
二、单片机编程语言2.1 汇编语言汇编语言是一种低级语言,直接操作单片机的寄存器和内存。
虽然难以学习和理解,但它可以精确控制硬件。
2.2 C语言C语言是一种高级语言,易于学习和使用,可以编写出高效的代码。
许多单片机开发板都支持C语言编程,方便开发者进行开发。
2.3 基本编程指令无论是汇编语言还是C语言,都有一些基本的编程指令,如赋值、条件判断、循环等。
掌握这些指令对于编程非常关键。
三、单片机编程实例3.1 LED闪烁通过编程控制单片机的GPIO口,可以实现LED灯的闪烁效果。
代码如下:```c#include <reg52.h>void Delay(unsigned int t){while(t--);}void main()while(1){P1=0xFF; // 点亮LED灯Delay(60000);P1=0x00; // 关闭LED灯Delay(60000);}}```3.2 温度检测通过连接温度传感器到单片机的模拟输入引脚,可以实现对环境温度的检测。
代码如下:```c#include <reg52.h>sbit AD = P2^0; // 温度传感器连接的引脚void Delay(unsigned int t){while(t--);void main(){unsigned int temp;while(1){temp = AD; // 读取温度传感器的值if(temp > 50){P1=0xFF; // 温度超过50度时点亮LED灯 }else{P1=0x00; // 温度低于50度时关闭LED灯 }Delay(60000);}}```四、单片机的调试与测试4.1 调试工具常用的单片机调试工具有Keil、IAR等,它们提供了仿真功能,可以在计算机上模拟单片机的运行。
单片机控制交通灯程序代码
单片机控制交通灯程序代码第一篇:单片机控制交通灯程序代码毕业设计程序源代码ORG 0000H;主程序的入口地址LJMP MAIN;跳转到主程序的开始处ORG 0003H;外部中断0的中断程序入口地址ORG 000BH;定时器0的中断程序入口地址LJMP T0_INT;跳转到中断服务程序处ORG 0013H;外部中断1的中断程序入口地址MAIN : MOV SP,#50HMOV IE,#8EH;CPU开中断,允许T0中断,T1中断和外部中断1中断MOV TMOD,#51H;设置T1为计数方式,T0为定时方式,且都工作于模式1 MOV TH1,#00H;T1计数器清零MOV TL1,#00HSETB TR1;启动T1计时器SETB EX1;允许INT1中断SETB IT1;选择边沿触发方式MOV DPTR ,#0003HMOV A, #80H;给8255赋初值,8255工作于方式0MOVX @DPTR, A AGAIN: JB P3.1,N0;判断是否要设定东西方向红绿灯时间的初值,若P3.1为1 则跳转MOV A,P1JB P1.7,RED;判断P1.7是否为1,若为1则设定红灯时间,否则设定绿灯时间MOV R0,#00H;R0清零MOV R0,A;存入东西方向绿灯初始时间MOV R3,ALCALL DISP1LCALL DELAYAJMP AGAIN RED:MOV A,P1ANL A,#7FH;P1.7置0MOV R7,#00H;R7清零MOV R7,A;存入东西方向红灯初始时间MOV R3,ALCALL DISP1LCALL DELAYAJMP AGAIN毕业设计;------------N0:SETB TR0;启动T0计时器MOV 76H,R7;红灯时间存入76H N00:MOV A,76H;东西方向禁止,南北方向通行MOV R3,AMOV DPTR,#0000H;置8255A口,东西方向红灯亮,南北方向绿灯亮MOV A,#0DDHMOVX @DPTR, A N01:JB P2.0,B0 N02:SETB P3.0CJNE R3,#00H,N01;比较R3中的值是否为0,不为0转到当前指令处执行;------黄灯闪烁5秒程序------N1:SETB P3.0MOV R3,#05HMOV DPTR,#0000H;置8255A口,东西,南北方向黄灯亮MOV A,#0D4HMOVX @DPTR,A N11:MOV R4,#00H N12:CJNE R4,#7DH,$;黄灯持续亮0.5秒N13:MOV DPTR,#0000H;置8255A口,南北方向黄灯灭MOV A,#0DDHMOVX @DPTR,A N14:MOV R4,#00HCJNE R4,#7DH,$;黄灯持续灭0.5秒CJNE R3,#00H,N1;闪烁时间达5秒则退出;-----------------------------N2:MOV R7,#00HMOV A,R0;东西通行,南北禁止MOV R3,AMOV DPTR,#0000H;置8255A口,东西方向绿灯亮,南北方向红灯亮MOV A,#0EBHMOVX @DPTR,A N21:JB P2.0,T03N22:CJNE R3,#00H,N21;------黄灯闪烁5秒程序------N3:MOV R3,#05HMOV DPTR,#0000H;置8255A口,东西,南北方向黄灯亮毕业设计MOV A,#0E2HMOVX @DPTR,A N31:MOV R4,#00HCJNE R4,#7DH,$;黄灯持续亮0.5秒N32:MOV DPTR,#0000H;置8255A口,南北方向黄灯灭MOV A,#0EBHMOVX @DPTR,A N33:MOV R4,#00HCJNE R4,#7DH,$;黄灯持续灭0.5秒CJNE R3,#00H,N3;闪烁时间达5秒则退出SJMP N00;------闯红灯报警程序------B0:MOV R2,#03H;报警持续时间3秒 B01:MOV A,R3JZ N1;若倒计时完毕,不再报警CLR P3.0;报警CJNE R2,#00H,B01;判断3秒是否结束SJMP N02;------1秒延时子程序-------N7:RETI T0_INT:MOV TL0,#9AH;给定时器T0送定时10ms的初值MOV TH0,#0F1HINC R4INC R5CJNE R5,#0FAH,T01;判断延时是否够一秒,不够则调用显示子程序MOV R5,#00H;R5清零DEC R3;倒计时初值减一DEC R2;报警初值减一 T01:ACALL DISP;调用显示子程序RETI;中断返回;------显示子程序------DISP: JNB P2.4,T02 DISP1:MOV B,#0AHMOV A,R3;R3中值二转十显示转换DIV ABMOV 79H,AMOV 7AH,B DIS:MOV A,79H;显示十位毕业设计MOV DPTR,#TABMOVC A,@A+DPTRMOV DPTR,#0002HMOVX @DPTR,AMOV DPTR,#0001HMOV A,#0F7HMOVX @DPTR,ALCALL DELAY DS2:MOV A,7AH;显示个位MOV DPTR,#TABMOVC A,@A+DPTRMOV DPTR,#0002HMOVX @DPTR,AMOV DPTR,#0001HMOV A,#0FBHMOVX @DPTR,ARET;------东西方向车流量检测程序------T03: MOV A,R3SUBB A,#00H;若绿灯倒计时完毕,不再检测车流量JZN3JB P2.0,T03INC R7CJNE R7,#64H,E1MOV R7,#00H;中断到100次则清零 E1:SJMP N22;------东西方向车流量显示程序------T02: MOV B,#0AH MOVA,R7;R7中值二转十显示转换DIV ABMOV 79H,AMOV 7AH,B DIS3: MOV A,79H;显示十位MOV DPTR,#TABMOVC A,@A+DPTRMOV DPTR,#0002HMOVX @DPTR,AMOV DPTR,#0001H毕业设计MOV A,#0F7HMOVX @DPTR,ALCALL DELAY DS4:MOV A,7AH;显示个位MOV DPTR,#TABMOVC A,@A+DPTRMOV DPTR,#0002HMOVX @DPTR,AMOV DPTR,#0001HMOV A,#0FBHMOVX @DPTR,ALJMP N7;------延时4MS子程序----------DELAY: MOV R1,#0AH LOOP: MOV R6,#64HNOP LOOP1: DJNZ R6,LOOP1DJNZ R1,LOOPRET;------字符表------TAB:DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FHEND第二篇:单片机实现交通灯控制智能交通灯设计与实现基于单片机的智能交通灯控制系统的设计与实现,系统能够根据十字路口双车道车流量的情况控制交通讯号灯按特定的规律变化。
单片机编程全集(含源代码)
前言 (2)基础知识:单片机编程基础 (2)第一节:单数码管按键显示 (4)第二节:双数码管可调秒表 (6)第三节:十字路口交通灯 (7)第四节:数码管驱动 (9)第五节:键盘驱动 (10)第六节:低频频率计 (15)第七节:电子表 (18)第八节:串行口应用 (19)前言本文是本人上课的一个补充,完全自写,难免有错,请读者给予指正,可发邮件到************.CN,或郑郁正@中国;以便相互学习。
结合课堂的内容,课堂上的部分口述内容,没有写下来;有些具体内容与课堂不相同,但方法是相通的。
针对当前的学生情况,尽可能考虑到学生水平的两端,希望通过本文都学会单片机应用。
如果有不懂的内容,不管是不是本课的内容,都可以提出来,这些知识往往代表一大部分同学的情况,但本人通常认为大家对这些知识已精通,而在本文中没有给予描述,由此影响大家的学习。
对于这些提出问题的读者,本人在此深表谢意。
想深入详细学习单片机的同学,可以参考其它有关单片机的书籍和资料,尤其是外文资料。
如果有什么问题,我们可以相互探讨和研究,共同学习。
本文根据教学的情况,随时进行修改和完善,所以欢迎同学随时注意本文档在课件中的更新情况。
基础知识:单片机编程基础单片机的外部结构:1、DIP40双列直插;2、P0,P1,P2,P3四个8位准双向I/O引脚;(作为I/O输入时,要先输出高电平)3、电源VCC(PIN40)和地线GND(PIN20);4、高电平复位RESET(PIN9);(10uF电容接VCC与RESET,即可实现上电复位)5、内置振荡电路,外部只要接晶体至X1(PIN18)和X0(PIN19);(频率为主频的12倍)6、程序配置EA(PIN31)接高电平VCC;(运行单片机内部ROM中的程序)7、P3支持第二功能:RXD、TXD、INT0、INT1、T0、T1单片机内部I/O部件:(所为学习单片机,实际上就是编程控制以下I/O部件,完成指定任务)1、四个8位通用I/O端口,对应引脚P0、P1、P2和P3;2、两个16位定时计数器;(TMOD,TCON,TL0,TH0,TL1,TH1)3、一个串行通信接口;(SCON,SBUF)4、一个中断控制器;(IE,IP)针对AT89C52单片机,头文件AT89x52.h给出了SFR特殊功能寄存器所有端口的定义。
单片机的C编程语言
长整型数 使用CPU内部寄存器变量 函数返回 短整型 有符号整型数 计算表达式或数据类型得字节数 静态变量 结构体类型数据 构成switch选择结构 重新进行数据类型定义 联合类型数据 无符号数据 无类型数据或函数 声明该变量在程序执行中可被隐含地改变 构成while和do…while循环结构
12
表4-2 C51编译器扩充关键字
?C0001: D2B2 20B204 D2A0 80F7 ?C0003: C2A0 80F3
SETB P32 JB P32,?C0003 SETB P20 SJMP ?C0001
CLR P20 SJMP ?C0001
可以看出,C编译器编译得结果与我们大多人用汇编语言得编程结果 相同,但就是C51语言得可读性更好,特别就是当程序更加复杂时 ,C51语言有明显得优势。
单片机的C编程语言
第4章 单片机得C51编程语言
4、1 C51编程语言概述 4、2 C51得标识符和关键字 4、3 C51得变量与数据类型 4、4 C51语言得数组、指针与结构 4、5 C51得运算符和表达式 4、6 C51语言得程序结构 4、7 C51语言得函数 4、8 中断服务程序 4、9 C51得预处理 4、10 C51得库函数 4、11 使用C5I编译器时得注意事项
关键字
用途
_at_
地址定位
_priority_
多任务优先声明
_task_
任务声明
alien
函数特性声明
bdata
存储器类型声明
bit
位变量声明
code
存储器类型声明
pact
存储器模式
data
存储器类型声明
说明 为变量进行绝对地址定位 规定RTX51或RTX51 Tiny得任务优先级 定义实时多任务函数 用于声明与PL/M51兼容得函数 可位寻址得MCS-51内部数据存储器 声明一个位变量或位类型函数 MCS-51得程序存储空间 按pact模式分配变量得存储空间 直接寻址MCS-51得内部数据寄存器
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
前言 (2)基础知识:单片机编程基础 (2)第一节:单数码管按键显示 (4)第二节:双数码管可调秒表 (6)第三节:十字路口交通灯 (7)第四节:数码管驱动 (9)第五节:键盘驱动 (10)第六节:低频频率计 (15)第七节:电子表 (18)第八节:串行口应用 (19)前言本文是本人上课的一个补充,完全自写,难免有错,请读者给予指正,可发邮件到ZYZ@,或郑郁正@中国;以便相互学习。
结合课堂的内容,课堂上的部分口述内容,没有写下来;有些具体内容与课堂不相同,但方法是相通的。
针对当前的学生情况,尽可能考虑到学生水平的两端,希望通过本文都学会单片机应用。
如果有不懂的内容,不管是不是本课的内容,都可以提出来,这些知识往往代表一大部分同学的情况,但本人通常认为大家对这些知识已精通,而在本文中没有给予描述,由此影响大家的学习。
对于这些提出问题的读者,本人在此深表谢意。
想深入详细学习单片机的同学,可以参考其它有关单片机的书籍和资料,尤其是外文资料。
如果有什么问题,我们可以相互探讨和研究,共同学习。
本文根据教学的情况,随时进行修改和完善,所以欢迎同学随时注意本文档在课件中的更新情况。
基础知识:单片机编程基础单片机的外部结构:1、DIP40双列直插;2、P0,P1,P2,P3四个8位准双向I/O引脚;(作为I/O输入时,要先输出高电平)3、电源VCC(PIN40)和地线GND(PIN20);4、高电平复位RESET(PIN9);(10uF电容接VCC与RESET,即可实现上电复位)5、内置振荡电路,外部只要接晶体至X1(PIN18)和X0(PIN19);(频率为主频的12倍)6、程序配置EA(PIN31)接高电平VCC;(运行单片机内部ROM中的程序)7、P3支持第二功能:RXD、TXD、INT0、INT1、T0、T1单片机内部I/O部件:(所为学习单片机,实际上就是编程控制以下I/O部件,完成指定任务)1、四个8位通用I/O端口,对应引脚P0、P1、P2和P3;2、两个16位定时计数器;(TMOD,TCON,TL0,TH0,TL1,TH1)3、一个串行通信接口;(SCON,SBUF)4、一个中断控制器;(IE,IP)针对AT89C52单片机,头文件AT89x52.h给出了SFR特殊功能寄存器所有端口的定义。
教科书的160页给出了针对MCS51系列单片机的C语言扩展变量类型。
C语言编程基础:1、十六进制表示字节0x5a:二进制为01011010B;0x6E为01101110。
2、如果将一个16位二进数赋给一个8位的字节变量,则自动截断为低8位,而丢掉高8位。
3、++var表示对变量var先增一;var—表示对变量后减一。
4、x |= 0x0f;表示为 x = x | 0x0f;5、TMOD = ( TMOD & 0xf0 ) | 0x05;表示给变量TMOD的低四位赋值0x5,而不改变TMOD的高四位。
6、While( 1 ); 表示无限执行该语句,即死循环。
语句后的分号表示空循环体,也就是{;}在某引脚输出高电平的编程方法:(比如P1.3(PIN4)引脚)#include <AT89x52.h> //该头文档中有单片机内部资源的符号化定义,其中包含P1.3void main( void ) //void 表示没有输入参数,也没有函数返值,这入单片机运行的复位入口{P1_3 = 1; //给P1_3赋值1,引脚P1.3就能输出高电平VCCWhile( 1 ); //死循环,相当 LOOP: goto LOOP;}注意:P0的每个引脚要输出高电平时,必须外接上拉电阻(如4K7)至VCC电源。
在某引脚输出低电平的编程方法:(比如P2.7引脚)#include <AT89x52.h> //该头文档中有单片机内部资源的符号化定义,其中包含P2.7void main( void ) //void 表示没有输入参数,也没有函数返值,这入单片机运行的复位入口{P2_7 = 0; //给P2_7赋值0,引脚P2.7就能输出低电平GNDWhile( 1 ); //死循环,相当 LOOP: goto LOOP;}在某引脚输出方波编程方法:(比如P3.1引脚)#include <AT89x52.h> //该头文档中有单片机内部资源的符号化定义,其中包含P3.1void main( void ) //void 表示没有输入参数,也没有函数返值,这入单片机运行的复位入口{While( 1 ) //非零表示真,如果为真则执行下面循环体的语句{P3_1 = 1; //给P3_1赋值1,引脚P3.1就能输出高电平VCCP3_1 = 0; //给P3_1赋值0,引脚P3.1就能输出低电平GND} //由于一直为真,所以不断输出高、低、高、低……,从而形成方波}将某引脚的输入电平取反后,从另一个引脚输出:(比如 P0.4 = NOT( P1.1) )#include <AT89x52.h> //该头文档中有单片机内部资源的符号化定义,其中包含P0.4和P1.1void main( void ) //void 表示没有输入参数,也没有函数返值,这入单片机运行的复位入口{P1_1 = 1; //初始化。
P1.1作为输入,必须输出高电平While( 1 ) //非零表示真,如果为真则执行下面循环体的语句{if( P1_1 == 1 ) //读取P1.1,就是认为P1.1为输入,如果P1.1输入高电平VCC{ P0_4 = 0; } //给P0_4赋值0,引脚P0.4就能输出低电平GNDelse //否则P1.1输入为低电平GND//{ P0_4 = 0; } //给P0_4赋值0,引脚P0.4就能输出低电平GND{ P0_4 = 1; } //给P0_4赋值1,引脚P0.4就能输出高电平VCC } //由于一直为真,所以不断根据P1.1的输入情况,改变P0.4的输出电平}将某端口8个引脚输入电平,低四位取反后,从另一个端口8个引脚输出:(比如 P2 = NOT( P3 ) )#include <AT89x52.h> //该头文档中有单片机内部资源的符号化定义,其中包含P2和P3void main( void ) //void 表示没有输入参数,也没有函数返值,这入单片机运行的复位入口{P3 = 0xff; //初始化。
P3作为输入,必须输出高电平,同时给P3口的8个引脚输出高电平While( 1 ) //非零表示真,如果为真则执行下面循环体的语句{ //取反的方法是异或1,而不取反的方法则是异或0P2 = P3^0x0f //读取P3,就是认为P3为输入,低四位异或者1,即取反,然后输出} //由于一直为真,所以不断将P3取反输出到P2}注意:一个字节的8位D7、D6至D0,分别输出到P3.7、P3.6至P3.0,比如P3=0x0f,则P3.7、P3.6、P3.5、P3.4四个引脚都输出低电平,而P3.3、P3.2、P3.1、P3.0四个引脚都输出高电平。
同样,输入一个端口P2,即是将P2.7、P2.6至P2.0,读入到一个字节的8位D7、D6至D0。
第一节:单数码管按键显示单片机最小系统的硬件原理接线图:1、接电源:VCC(PIN40)、GND(PIN20)。
加接退耦电容0.1uF2、接晶体:X1(PIN18)、X2(PIN19)。
注意标出晶体频率(选用12MHz),还有辅助电容30pF3、接复位:RES(PIN9)。
接上电复位电路,以及手动复位电路,分析复位工作原理4、接配置:EA(PIN31)。
说明原因。
发光二极的控控制:单片机I/O输出将一发光二极管LED的正极(阳极)接P1.1,LED的负极(阴极)接地GND。
只要P1.1输出高电平VCC,LED就正向导通(导通时LED上的压降大于1V),有电流流过LED,至发LED发亮。
实际上由于P1.1高电平输出电阻为10K,起到输出限流的作用,所以流过LED的电流小于(5V-1V)/10K = 0.4mA。
只要P1.1输出低电平GND,实际小于0.3V,LED就不能导通,结果LED不亮。
开关双键的输入:输入先输出高一个按键KEY_ON接在P1.6与GND之间,另一个按键KEY_OFF接P1.7与GND之间,按KEY_ON后LED亮,按KEY_OFF后LED灭。
同时按下LED半亮,LED保持后松开键的状态,即ON亮OFF灭。
#include <at89x52.h>#define LED P1^1 //用符号LED代替P1_1#define KEY_ON P1^6 //用符号KEY_ON代替P1_6#define KEY_OFF P1^7 //用符号KEY_OFF代替P1_7void main( void ) //单片机复位后的执行入口,void表示空,无输入参数,无返回值{KEY_ON = 1; //作为输入,首先输出高,接下KEY_ON,P1.6则接地为0,否则输入为1KEY_OFF = 1; //作为输入,首先输出高,接下KEY_OFF,P1.7则接地为0,否则输入为1 While( 1 ) //永远为真,所以永远循环执行如下括号内所有语句{if( KEY_ON==0 ) LED=1; //是KEY_ON接下,所示P1.1输出高,LED亮if( KEY_OFF==0 ) LED=0; //是KEY_OFF接下,所示P1.1输出低,LED灭} //松开键后,都不给LED赋值,所以LED保持最后按键状态。
//同时按下时,LED不断亮灭,各占一半时间,交替频率很快,由于人眼惯性,看上去为半亮态}数码管的接法和驱动原理一支七段数码管实际由8个发光二极管构成,其中7个组形构成数字8的七段笔画,所以称为七段数码管,而余下的1个发光二极管作为小数点。
作为习惯,分别给8个发光二极管标上记号:a,b,c,d,e,f,g,h。
对应8的顶上一画,按顺时针方向排,中间一画为g,小数点为h。
我们通常又将各二极与一个字节的8位对应,a(D0),b(D1),c(D2),d(D3),e(D4),f(D5),g(D6),h(D7),相应8个发光二极管正好与单片机一个端口Pn的8个引脚连接,这样单片机就可以通过引脚输出高低电平控制8个发光二极的亮与灭,从而显示各种数字和符号;对应字节,引脚接法为:a(Pn.0),b(Pn.1),c(Pn.2),d(Pn.3),e(Pn.4),f(Pn.5),g(Pn.6),h(Pn.7)。
如果将8个发光二极管的负极(阴极)内接在一起,作为数码管的一个引脚,这种数码管则被称为共阴数码管,共同的引脚则称为共阴极,8个正极则为段极。