单片机程序源代码
51单片机数码管0到99循环程序代码

51单片机数码管0到99循环程序代码1. 概述在嵌入式系统的开发中,数码管是一种常见的输出设备,可以用于显示数字、字符等信息。
而51单片机是一种广泛应用的微控制器,其结合了强大的功能和灵活的应用,能够很好地驱动数码管。
本文将介绍如何使用51单片机编写一个循环显示0到99的程序,通过数码管输出这些数字。
2. 电路连接我们需要连接51单片机和数码管。
通常我们使用的是共阴数码管,其连接方式如下:- VCC连接到5V电源- GND连接到GND- DIO(数据输入/输出)连接到51单片机的IO口3. 程序设计下面是一个简单的C语言程序设计,用于控制数码管显示0到99的数字。
```c#include <reg51.h>sbit DIO = P2^0; // 数码管数据输入/输出sbit CL = P2^1; // 数码管片选信号unsigned char code numCode[10] = { 0xc0, // 00xf9, // 10xa4, // 20xb0, // 30x99, // 40x92, // 50x82, // 60xf8, // 70x80, // 80x90 // 9};//延时函数void delay(unsigned int i) {unsigned int j,k;for (j=i;j>0;j--)for(k=110;k>0;k--);}void display(unsigned char num) { CL = 1; //关闭片选DIO = numCode[num / 10]; //十位 delay(2);CL = 0;DIO = 0xff; //消隐delay(2);CL = 1; //关闭片选DIO = numCode[num 10]; //个位 delay(2);CL = 0;DIO = 0xff; //消隐delay(2);}void m本人n() {unsigned char i,j;while(1) {for(i=0;i<10;i++) {for(j=0;j<10;j++) {display(i * 10 + j);}}}}```4. 程序说明- 首先定义了数码管的连接引脚,以及0~9的显示编码。
单片机程序源代码

步进电机程序源代码#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。
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语言可以打开和关闭中断。
单片机源代码

num=0;
while(1)
{
p2_0=num;
}
}
void int_1()interrupt 3
{
unsigned char n;
TH1=0x3c;
TL1=0xb0;
TR1=1;
n++;
if(n==10)
{
num=~num;
n=0;}
}
左右跑马灯
for(j=255;j>0;j--);
}
二进制加法实验
#include<reg52.h>
void delay(unsigned int i);//声明延时 函数
main()
{
unsigned char Num=oxff;
while(1)
{
p2=Num;
delay(1000);
#include<Function.h>
bit ISendstr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no)
{
unsigned char i;
start_12c();//启动总线
sendByte(sla);//发送器件地址
SendByte(suba);//发送器件子地址
if(ack==0)return(0);
for(i==o;i<no;i++)
{
SendByte(*s);//发送数据
if(ack==0)return(0);
单片机编程源代码

前言 (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特殊功能寄存器所有端口的定义。
单片机程序流程图及源代码

单片机上机实验报告【实验一】端口实验,掌握通过端口编程实现数据输出和输入的方法,并观察结果。
实验内容: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; 人眼可分辨。
基于51单片机的CAN通讯源代码

EA=1;
}
/////////////////////////////////////////////////////////////
void can_rcv_prg(void)
{can_over_prg();}
if(_testbit_(rcv_flag)) //can总线接收数据
{can_rcv_prg();}
if(_testbit_(send_flag)) //can总线发送数据
*说明: CAN控制器进入复位工作模式 *
************************************************************************/
bit BCAN_ENTER_RETMODEL(void)
for(j=2;j<10;j++) //发送8组数据到串口
{
SBUF=rcv_data[j];
while(TI==0)
{}
TI=0;
}
ES=1; //串口中断开放
void T1_int(void);
void Sja_1000_Init(void);
//************************变量定义*****************************//
unsigned char data send_data[10],rcv_data[10]; //发送和接收数组定义
/*RS232_basiccan.c*/
#include<REG52.H>
#include <intrins.h>
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 转换// 若能将定时器/串行/中断系统关闭更好。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
0X80,0X90};
uint key=0;
void int_int()
{
EA=1;
IT0=1;
EX0=1;
}
void count_num() interrupt 0
{
if(key==9)key=0;
else key++;
}
void main()
{
int_int();
void delayms(uint ms)
{
uint i;
while(ms--)
{
for(i=0;i<120;++);
}
}
void main()
{
while(1)
{
LED1=0;
LED2=1;
delayms(500);
LED1=1;
LED2=0;
delayms(500);
}
}
任务二:流水广告灯的设计
for(j=0;j<2;j++)
{
P0=xx[j];
delayms(500);
}
for(i=0;i<2;i++)
for(j=0;j<2;j++)
{
P0=yy[j] ;
delayms(500);
}
for(i=0;i<3;i++)
for(j=0;j<2;j++)
{
P0=zz[j] ;
delayms(500);
{
case 0xe0:num=5;break;
case 0xd0:num=6;break;
case 0xb0:num=7;break;
case 0x70:num=8;
}
}
if(temp==0x0b)
{
P2=0xf0;
temp=P2;
temp&=0xf0;
switch(temp)
{
case 0xe0:num=9;break;
闭幕式:开始D0~D7全亮,延时片刻后首先D0和D7灭,其次是D1和D6灭,再是D2和D5灭,最后是D3和D4灭。
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar code table[]={0xe7,0xc3,0x81,0x00};
if(temp!=0x0f)
keyscan();
display(num);
}
}
(2)
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit LED1=P2^0;
sbit LED2=P2^1;
uchar num;
#define uint unsigned int
#include<intrins.h>
void delayms(uint ms)
{
uint i;
while(ms--)
{
for(i=0;i<110;i++);
}
}
void main()
{
uint i,j,xx[2]={0xaa,0xff},yy[2]={0xf0,0x0f},zz[2]={0xb6,0xff};
利用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 char
uint i;
uchar temp;
uint a[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
void delayms(uint ms)
{
while(ms--)
uchar b[8]={0x08,0x07,0x02,0x0a,0x0f,0x06,0x03,0x05},j;
uint i;
while(1)
{ j=0x01;
for(i=0;i<8;i++)
{
P2=j;
P0=a[b[i]];
j=_crol_(j,1);
delay(3);
}
}
}
任务七:查询式按键设计
将8个按键从1~8进行编号,如果其中一个键被按下,则在LED数码管上显示相应的键值。
}
}
}
任务五:单个LED数码管显示设计
使用89c51的P0口作为输出口,外接LED数码管,编写程序,使数码管循环显示从0~9的加1计数。
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar table[10]={ 0XC0,0XF9,0XA4,0XB0,
uint num=0;
void delay(uint x)
{
uchar i,j;
for(i=x;i>0;i--)
for(j=120;j>0;j--);
}
keyscan()
{ uint temp;
temp=P2;
temp&=0x0f;
if(temp==0x0e)
{
P2=0xf0;
temp=P2;
temp&=0xf0;
void delay(uint x)
{
uint i,j;
for(i=x;i>0;i--)
for(j=120;j>0;j--);
}
void main()
{
uint i;
while(1)
{
P1=0xff;
delay(500);
for(i=0;i<4;i++)
{
P1=table[i];
delay(500);
}
for(i=3;i>0;i--)
{
P1=table[i-1];
delay(500);
}
}
}
任务四:复杂广告灯的设计
利用89c51单片机的端口实现8个LED(D0~D7)复杂广告灯的控制,要求显示规律为:正向流水->反向流水->隔灯闪烁3次->高四盏、低四盏闪烁2次->隔两盏闪烁3次,再重复循环。
#include<reg52.h>
uchar code LED_code[]=
{
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e
};//数码管字形码编码
void delay(uint x)
{
uchar i,j;
for(i=x;i>0;i--)
unsigned char aa;
while(1)
{
aa=0xfe;
for(i=0;i<7;i++)
{
P0=aa;
aa=_crol_(aa,1);
delayms(500);
}
for(i=0;i<8;i++)
{
P0=aa;
aa=_cror_(aa,1);
delayms(500);
}
for(i=0;i<3;i++)
#define uchar unsigned char
delay(ms)
{
while(ms--)
{ int i;
for(i=0;i<110;i++);
}
}
main()
{
uchar a[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
第二章
任务一:闪烁广告灯的设计
利用89c51单片机的端口控制两个LED(D0和D1),编写程序,实现两个LED互闪。
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbitLED1=P0^0;
sbit LED2=P0^1;
case 0xb0:num=15;break;
case 0x70:num=16;
}
}
return num;
}
void display(uint num)
{if(num==0)
P0=0xbf;
P0=table[num] ;
}
main()
{
uint temp;
while(1)
{
P2=0x0f;
temp=P2;
case 0xdf:
P2=a[6]; break;
case 0xbf: