单片机仿真50例说明
单片机C语言程序设计实训100例
//恢复定时器 1 初值 //500ms 转换状态
名称:10s 的秒表 说明:首次按键计时开始,再次按键暂停,第三次按键清零。
*/ #include<reg51.h> #define uchar unsigned char #define uint unsigned int sbit K1=P3^7; uchar i,Second_Counts,Key_Flag_Idx; bit Key_State; uchar
34 上海师范大学信息与机电工程学院—倪继锋
《单片机 C 语言程序设计实训 100 例---基于 8051 和 PROTEUS 仿真》案例
34 /*
100 000s 以内的计时程序 名称:100 000s 以内的计时程序 说明:在 6 只数码管上完成 0~99 999.9s。
*/ #include<reg51.h> #include<intrins.h> #define uchar unsigned char #define uint unsigned int //段码 ucha 中断函数 void LED_Flash_and_Scroll() interrupt 1 { if(++k<35) return; //定时中断若干次后执行闪烁 k=0; switch(i) { case 0: B1=~B1;break; case 1: G1=~G1;break; case 2: R1=~R1;break; case 3: Y1=~Y1;break; default:i=0; } if(++j<300) return; //每次闪烁持续一段时间 j=0; P0=0xff; //关闭显示 i++; //切换到下一个 LED } 30 /* T0 控制 LED 实现二进制计数
单片机代码例子
单片机代码例子
单片机是一种集成电路,具有微处理器、存储器和各种输入输出接口,可用于控制各种电子设备。
下面是一些单片机代码例子:
1. LED闪烁:通过控制IO口的高低电平,使LED灯交替闪烁,实现简单的呼吸灯效果。
2. 温度测量:利用温度传感器采集环境温度,并将温度值转换为数字信号,通过串口输出或显示在LCD屏幕上。
3. 红外遥控:通过接收红外信号,并解码得到对应的遥控指令,实现对电视、空调等家电的遥控操作。
4. 超声波测距:利用超声波传感器发射超声波,并接收反射回来的信号,通过计算时间差来测量到障碍物的距离。
5. 矩阵键盘输入:通过矩阵键盘将按键输入转换为数字或字符信息,并进行相应的处理和反馈。
6. 电机控制:通过PWM技术控制直流电机的转速和方向,实现电机的正转、反转和变速等操作。
7. 温湿度监测:利用温湿度传感器采集环境的温度和湿度值,并将数据通过无线通信模块传输到上位机进行实时监测。
8. 蜂鸣器控制:通过控制IO口输出高低电平,实现蜂鸣器的开关
和不同音调的发声。
9. 光线感应:利用光敏电阻或光电二极管检测环境光线强度,并根据光线强度的变化做出相应的控制。
10. 电子钟:通过RTC模块获取当前的时间,并在LCD屏幕上显示或通过蜂鸣器报时。
以上是一些常见的单片机代码例子,涵盖了单片机在各个领域的应用。
通过编写这些代码,可以深入理解单片机的工作原理和应用技巧,为后续的项目开发打下基础。
当然,这只是冰山一角,单片机的应用领域非常广泛,还有许多其他有趣的项目等待我们去探索。
单片机程序100范例+详细注释
100例程序设计范例汇总第一章 (4)【实例1】使用累加器进行简单加法运算: (4)【实例2】使用B寄存器进行简单乘法运算: (4)【实例3】通过设置RS1,RS0选择工作寄存器区1: (4)【实例4】使用数据指针DPTR访问外部数据数据存储器: (4)【实例5】使用程序计数器PC查表: (4)【实例6】IF语句实例: (4)【实例7】SWITCH-CASE语句实例: (4)【实例8】FOR语句实例: (4)【实例9】WHILE语句实例: (5)【实例10】DO...WHILE语句实例: . (5)【实例11】语句形式调用实例: (5)【实例12】表达式形式调用实例: (5)【实例13】以函数的参数形式调用实例: (5)【实例14】函数的声明实例: (5)【实例15】函数递归调用的简单实例: (5)【实例16】数组的实例: (6)【实例17】指针的实例: (6)【实例18】数组与指针实例: (6)【实例19】P1口控制直流电动机实例 (6)第二章 (8)【实例20】用74LS165实现串口扩展并行输入口 (8)【实例21】用74LS164实现串口扩展并行输出口 (10)【实例22】P0I/O扩展并行输入口 (12)【实例23】P0I/O扩展并行输出口 (12)【实例24】用8243扩展I/O端口 (12)【实例25】用8255A扩展I/O口 (14)【实例26】用8155扩展I/O口 (19)第三章 (26)【实例29】与AT24系列EEPROM接口及驱动程序 (26)【实例30】EEPROM(X5045)接口及驱动程序 (30)【实例31】与铁电存储器接口及驱动程序 (33)【实例32】与双口RAM存储器接口及应用实例 (35)【实例33】与NANDFLASH(K9F5608)接口及驱动程序 (35)第四章 (43)【实例34】独立键盘控制 (43)【实例35】矩阵式键盘控制 (44)【实例36】改进型I/O端口键盘 (46)【实例37】PS/2键盘的控制 (49)【实例39】段数码管(HD7929)显示实例 (54)【实例40】16×2字符型液晶显示实例 (55)【实例41】点阵型液晶显示实例 (61)【实例42】LCD显示图片实例 (63)第五章 (70)【实例43】简易电子琴的设计 (70)【实例44】基于MCS-51单片机的四路抢答器 (71)【实例45】电子调光灯的制作 (76)【实例46】数码管时钟的制作 (81)【实例47】LCD时钟的制作 (96)【实例48】数字化语音存储与回放 (103)【实例49】电子标签设计 (112)第六章 (120)【实例50】指纹识别模块 (121)【实例51】数字温度传感器 (121)第七章 (124)【实例53】超声波测距 (124)【实例54】数字气压计 (125)【实例55】基于单片机的电压表设计 (132)【实例56】基于单片机的称重显示仪表设计 (133)【实例57】基于单片机的车轮测速系统 (136)第八章 (138)【实例58】电源切换控制 (138)【实例59】步进电机控制 (140)【实例60】单片机控制自动门系统 (141)【实例61】控制微型打印机 (144)【实例62】单片机控制的EPSON微型打印头 (144)【实例63】简易智能电动车 (145)【实例64】洗衣机控制器 (149)第九章 (152)【实例65】串行A/D转换 (152)【实例66】并行A/D转换 (153)【实例67】模拟比较器实现A/D转换 (154)【实例68】串行D/A转换 (155)【实例69】并行电压型D/A转换 (156)【实例70】并行电流型D/A转换 (156)【实例71】2I C接口的A/D转换 (157)【实例72】2I C接口的D/A转换 (161)【实例73】单片机间双机通信 (164)【实例74】单片机间多机通信方法之一 (166)【实例75】单片机间多机通信方法之二 (171)【实例76】PC与单片机通信 (176)【实例77】红外通信接口 (178)第十一章 (180)【实例79】单片机实现PWM信号输出 (180)【实例80】实现基于单片机的低频信号发生器 (182)【实例81】软件滤波方法 (183)【实例82】FSK信号解码接收 (186)【实例83】单片机浮点数运算实现 (187)【实例84】神经网络在单片机中的实现 (192)【实例85】信号数据的FFT变换 (194)第十二章 (198)【实例86】2I C总线接口的软件实现 (198)【实例87】SPI总线接口的软件实现 (200)【实例88】1-WIRE总线接口的软件实现 (205)【实例89】单片机外挂CAN总线接口 (207)【实例90】单片机外挂USB总线接口 (210)【实例91】单片机实现以太网接口 (214)【实例92】单片机控制GPRS传输 (221)【实例93】单片机实现TCP/IP协议 (223)第十三章 (229)【实例94】读写U盘 (229)【实例95】非接触IC卡读写 (234)【实例96】SD卡读写 (238)【实例97】高精度实时时钟芯片的应用 (242)第十四章 (247)【实例98】智能手机充电器设计 (247)【实例99】单片机控制门禁系统 (248)第一章【实例1】使用累加器进行简单加法运算:MOV A,#02H ;A←2ADD A,#06H ;A←A+06H【实例2】使用B寄存器进行简单乘法运算:MOV A,#02H ; A←2MOV B,#06H ; B←6MUL AB ; BA←A*B=6*2【实例3】通过设置RS1,RS0选择工作寄存器区1:CLR PSW.4 ; PSW.4←0SETB PSW.5 ; PSW.5←1【实例4】使用数据指针DPTR访问外部数据数据存储器:MOV DPTR, #data16 ; DPTR←data16MOVX A, @ DPTR ; A←((DPTR))MOVX @ DPTR, A ; (DPTR)←A【实例5】使用程序计数器PC查表:MOV A, #data ;A←dataMOVC A, @ A+DPTR ; PC←(PC)+1 ,A←((A)+(PC)) 【实例6】if语句实例:void main(){ int a,b,c,min;printf("\n please input three number:");scanf("%d%d%d ",&a,&b,&c);if(a<b&&a<c) printf("min=%d\n",a );else if(b<a&&b<c) printf("min=%d\n",b);else if(c<a&&c<c) printf("min=%d\n",c);else printf("There at least two numbers are equal\n");}【实例7】switch-case语句实例:void main(){ int num; printf("input one number:");scanf("%d",& num);switch(num){ case 1: printf("num =%d\n", num);break;case 2: printf("num =%d\n", num);break;case 3: printf("num =%d\n", num);break;case 4: printf("num =%d\n", num);break;default: printf("The number is out of the range\n", num);}}【实例8】for语句实例:void main(){ for(int a=10;n>0;a --)printf("%d",a);}【实例9】while语句实例:void main(){ int i=0;while(i<=10) i++;}【实例10】do…while语句实例:void main(){ int i=0;do{ i++;}while(i<=10);}【实例11】语句形式调用实例:void main(){ int i=0; while(i<=10) i++; ……Sum(); /*函数调用*/}【实例12】表达式形式调用实例:void main(){ int a,b,i=0; while(i<=10) i++; ……i=4*Sum(a,b); /*函数调用*/}【实例13】以函数的参数形式调用实例:void main(){ int a,b,c,i=0; while(i<=10) i++; ……i= max(c,Sum(a,b)); /*函数调用*/ }【实例14】函数的声明实例:void main(){ int max(int x,int y); /*函数的声明*/ int a,b,c,i=0; while(i<=10) i++; ……i= max(c,Sum(a,b)); /*函数调用*/ }【实例15】函数递归调用的简单实例:void fun(){ int a=1, result,i;for(i=0;i<10;){ i=a+I;result = fun(); /*函数调用*/}return result;}【实例16】数组的实例:void main(){ char num[3] [3]={{ '','#',''},{'#','','#'},{'','#',''}}; /*定义多维数组*/ int i=0,j=0;for(;i<3;i++){ for(;j<3;j++) printf(“%c”,num[i][j]);printf(“/n”);}【实例17】指针的实例:void main(){ int a=3,*p;p=&a; /*将变量a的地址赋值给指针变量p*/printf(“%d,%d”,a,*p); /*输出二者的数值进行对比*/}【实例18】数组与指针实例:void main(){ int i=3,num[3]={1,2,3},*p;p=num; /*将数组num[]的地址赋值给指针变量p*/result =max(p,3); /*函数调用,计算数组的最大值*/}【实例19】P1口控制直流电动机实例sfr p1=0x90;sbit p10=p1^0;sbit p11=p1^1;void main (){int i, m;int j=100;int k=20;// 正快转for (i=0; i<100; i++){P10=1;for (j=0; j<50; j++){m=0;}}P10=0;for (j=0; j<10; j++){m=0}//正慢转for (i=0; i<100; i++) {P10=1;for (j=0; j<10; j++) {m=0}}p10=0;for (j=0; j<50; j++) {m=0}// 负快转for (i=0; i<100; i++) {p11=1;for (j=0; j<50; j++) {m=0;}}p11=0;for (j=0; j<10; j++) {m=0;}// 负慢转for (i=0; i<100; i++) {p11=1;for (j=0;j<10;j++) {m=0;}}p11=0for (j=0; j<50; j++) {m=0;}}第二章【实例20】用74LS165实现串口扩展并行输入口(1)函数声明管脚定义//---------------------------------------库函数声明,管脚定义------------------------------------------ #include<reg52.h>sbit LOAD=P1^7;//用P1^7控制SH/ 管脚(2)串口初始化函数UART_init()//-------------------------------------------------------------------------------------------------------------- // 函数名称:UART_init()// 功能说明:串口初始化,设定串口工作在方式0//-------------------------------------------------------------------------------------------------------------- void UART_init(void){SCON=0x10;//设串行口方式0,允许接收,启动接收过程ES=0;//禁止串口中断}(3)数据接收函数PA()//-------------------------------------------------------------------------------------------------------------- // 函数名称:PA()// 输入参数:无// 输出参数:返回由并口输入的数据// 功能说明:接收八位串行数据//-------------------------------------------------------------------------------------------------------------- unsigned char PA(void){unsigned char PA_data;LOAD=0;//当P1.7输出低电平,74LS165将并行数据装入寄存器//当中LOAD=1;//当P1.7输出高电平,74LS165在时钟信号下进行移位UART_init();//74LS165工作在时钟控制下的串行移位状态while(RI==0);//循环等待RI=0;PA_data=SBUF;return PA_data;//返回并行输入的数据}(1)函数声明管脚定义//---------------------------------------库函数声明,管脚定义------------------------------------------ #include<reg52.h>sbit a7=ACC^7;sbit simuseri_CLK=P1^6;//用P1^6模拟串口时钟sbit simuseri_DATA=P1^5;//用P1^5模拟串口数据sbit drive74165_LD=P1^7;//用P1^7控制SH/ 管脚(2)数据输入函数in_simuseri()//-------------------------------------------------------------------------------------------------------------- // 函数名称:in_simuseri()// 输入参数:无// 输出参数:data_buf// 功能说明:8位同位移位寄存器,将simuseri_DATA串行输入的数据按从低位到// 高位// 保存到data_buf//-------------------------------------------------------------------------------------------------------------- unsigned char in_simuseri(void){unsigned char i;unsigned char data_buf;i=8;do{ACC=ACC>>1;for(;simuseri_CLK==0;);a7= simuseri_DA TA;for(;simuseri_CLK==1;);}while(--i!=0);simuseri_CLK=0;data_buf=ACC;return(data_buf);}(3)数据输出函数PAs()//-------------------------------------------------------------------------------------------------------------- // 函数名称:PAs()// 输入参数:无// 输出参数:PAs _buf,返回并行输入74LS165的数据// 功能说明:直接调用,即可读取并行输入74LS165的数据,不需要考虑74LS165的// 工作原理//--------------------------------------------------------------------------------------------------------------unsigned char PAs(void){unsigned char PAs_buf;drive74165_LD=0;drive74165_LD=1;PAs_buf= in_simuseri();return(PAs_buf);}【实例21】用74LS164实现串口扩展并行输出口单片机串口驱动74LS164的程序主要包括函数声明管脚定义部分、串口初始化函数以及数据发送函数。
51单片机仿真实例
51单片机仿真实例l示例6—扫描与判断—(单端口)位扫描与字节(多端口)扫描这是一个常用程序段—子程序—标准程序,通过端口扫描而获得输入数据或控制输出数据,达到节省位或字节的目的—节约硬件资源。
关于扫描,可以从位及其取反实现流水灯着手来理解。
可以通过移位实现流水灯—扫描。
可以通过字节数据(01H,02H,04H,08H,10H,20H,40H,80H—阳极管)的端口发送实现流水灯—扫描。
可以通过数据表(DB01H,02H,04H,08H,10H,20H,40H,80H—阴极管)实现流水灯—扫描。
可以通过循环跳转实现流水灯—扫描。
扫描注意入比出查—获得输入要比较数据、发送输出要检查出口扫描获取端口字节扫描输出位移动产生动态效果(01、02、04、08、10、20、40、80),可以用字节表扫描输出字符字节,通过延时可以变换字符以便造成数字进位效果ORG 0000HSTART:dbufequ30h;置存储区首址tempequ40h;置缓冲区首址org 00hmov 30h,#2 ;存入数据mov 31h,#0mov 32h,#1mov 33h,#0mov 34h,#7mov 35h,#1mov r0,#dbufmov r1,#tempmov r2,#6;六位显示器mov dptr,#segtab ;段码表首地址dp00:mov a,@r0;取要显示的数据movc a,@a+dptr ;查表取段码mov @r1,a;段码暂存inc r1inc r0djnz r2,dp00disp0:mov r0,#temp;显示子程序mov r1,#6;扫描6次mov r2,#01h;从第一位开始dp01:mov a,@r0mov p2,a;段码输出mov a,r2 ;取位码mov p1,a;位码输出acall delay;调用延时mov a,r2rl amov r2,ainc r0djnz r1,dp01sjmp disp0segtab:db 0C0H,0F9H,0A4H,0B0H,99H,92H;共阳极管db 82H,0F8H,80H,90H,88H,88H,83Hdelay:mov r4,#29h;延时子程序aa1:mov r5,0ffhaa:djnz r5,aadjnz r4,aa1retend************************************************* ***********************还可以用其他程序形式进行扫描,像循环、递增或递减判断程序等。
单片机在工业控制系统中的应用案例
单片机在工业控制系统中的应用案例工业控制系统是现代工业生产中不可或缺的一部分,它通过对生产过程的监测、控制和调节,提高生产效率、保证产品质量,降低人力成本。
而在工业控制系统中,单片机作为一种重要的核心控制组件,发挥着重要的作用。
本文将通过介绍几个实际的应用案例,来阐述单片机在工业控制系统中的应用。
案例一:温度控制系统在许多工业生产过程中,温度是一个重要的参数。
例如,化工、制药、食品加工等行业都需要严格控制温度。
单片机可以通过接收温度传感器的反馈信号,实时检测温度,并根据设定的温度范围进行控制。
通过控制加热或制冷设备,单片机可以精确调节温度,并保持在所需的范围内。
这种温度控制系统可以大大提高生产过程的稳定性和准确性。
案例二:流量控制系统在涉及到流体控制的工业过程中,流量控制是非常重要的。
例如,水处理、油气管道、风机控制等领域都需要准确控制流量。
单片机可以通过读取流量传感器的信号,实时监测流体的流量,并根据设定的目标值,通过控制阀门或泵,实现精确的流量控制。
这种流量控制系统可以确保流量稳定,同时减少能源消耗和资金成本。
案例三:速度控制系统在许多工业设备中,例如电机、输送带、机械手等,需要精确的速度控制。
单片机可以通过接收速度传感器的信号,实时监测设备的运行速度,并根据设定的速度要求,通过控制电机或变频器,实现精确的速度控制。
这种速度控制系统可以提高设备的运行效率,减少能源消耗,并保护设备免受过载和损坏。
案例四:定时控制系统在一些周期性的工业生产过程中,例如轨道交通信号系统、灯光控制系统等,需要按照特定的时间模式进行控制。
单片机可以通过内置的计时器和时钟模块,实现精确的定时控制。
它可以根据预设的时间表,自动进行任务的开启和关闭,从而实现智能化的定时控制,提高生产效率和安全性。
综上所述,单片机在工业控制系统中的应用是多种多样的,涵盖了温度控制、流量控制、速度控制、定时控制等多个方面。
通过合理利用单片机的功能,并与其他传感器、执行器等设备结合,可以实现精确、稳定、智能的工业生产控制。
单片机仿真实例
#include<reg51.h>
#include<intrins.h>
#defineucharunsignedchar
#defineuintunsignedint
//延时
voidDelayMS(uintx)
{
uchari;
while(x--)
{
for(i=0;i<120;i++);
}
}
//主程序
while(x--)
{
for(i=0;i<120;i++);
}
}
//主程序
voidmain()
0xe7,0xdb,0xbd,0x7e,0xbd,0xdb,0xe7,0xff,0xe7,0xc3,0x81,0x00,0x81,0xc3,0xe7,0xff,
0xaa,0x55,0x18,0xff,0xf0,0x0f,0x00,0xff,0xf8,0xf1,0xe3,0xc7,0x8f,0x1f,0x3f,0x7f,
0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,
P2=0x01;
while(1)
{
for(i=0;i<7;i++)
{
P2=_crol_(P2,1);//P2的值向左循环移动
DelayMS(150);
}
for(i=0;i<7;i++)
单片机c语言程序设计实例100例--基于805i+proteus仿真
以下是一个基于8051单片机和Proteus仿真环境的C语言程序设计实例:实例1:点亮LED灯
在这个例子中,我们将使用C语言编写一个简单的程序来控制8051单片机的一个I/O引脚,使其驱动一个LED灯。
c代码:
要使用Proteus进行仿真,你需要按照以下步骤操作:
1. 打开Proteus软件,创建一个新的设计工程。
2. 在元件库中搜索并添加相应的8051单片机型号(如AT89C51)和LED 元件到工作区。
3. 根据实际硬件连接,正确配置单片机的引脚和LED的连接。
4. 右键单击单片机元件,选择“Edit Component”打开编辑窗口。
5. 在“Program File(s)”区域,点击右侧的浏览按钮,选择你的C语言源文件(如上述的main.c)。
6. 点击“OK”关闭编辑窗口,然后点击工具栏上的“Play”按钮开始仿真。
在仿真过程中,你应该能看到LED灯被点亮,这表明你的C语言程序已经在Proteus环境中成功运行。
以上只是一个基础的例子,实际的"单片机C语言程序设计实例100例--基于8051+Proteus仿真"会包含更复杂和多样化的应用场景,包括定时器/计数器
应用、中断处理、串口通信、ADC/DAC转换、液晶显示等等。
每个实例都会详细介绍程序设计思路、代码实现以及如何在Proteus中进行仿真调试。
通过这些实例的学习和实践,你可以逐步掌握8051单片机的C语言编程技巧和Proteus仿真环境的使用方法。
单片机汇编语言入门实例
一、用单片机控制发光二极管图1为单片机控制发光二极管的实验电路图。
图中用P1口作为输出端,P1口的P1.0~P1.7引脚分别接了8个LED。
实例1:用单片机控制LED闪烁发光源程序如下:MAIN:SETB P1.0LCALL DELAYCLR P1.0LCALL DELAYLJMP MAINDELAY:MOV R7,#250D1:MOV R6,#250D2:DJNZ R6,D2DJNZ R7,D1RETEND程序说明:1、SETB P1.0:将P1.0口置“1”,既让P1.0输出高电平,让LED 熄灭。
2、LCALL DELAY:LCALL称为子程序调用指令,指令后面的参数DELAY是一个标号,用于标识第6行程序,执行LCALL指令时,程序转到LCALL后面的标号所指示的程序行处执行,如果执行指令过程中遇到RET指令,则程序就返回到LCALL指令下面的一条指令继续执行。
3、CLR P1.0:将P1.0口置“0”,既让P1.0输出低电平,让LED 亮。
4、LCALL DELAY:调用延时子程序DELAY。
5、LJMP MAIN:跳转到第1条指令处执行第1条指令。
6、第6~10条指令是一段延时子程序,子程序只能在被调用时运行,并有固定的结束指令RET。
7、END:不是S51单片机的指令,不会产生单片机可执行的代码,而是用于告诉汇编软件“程序到此结束”,这类用于汇编软件控制的指令称为“伪指令”。
延时程序说明:1、程序中的R6、R7代表工作寄存器的单元,用来暂时存放一些数据。
2、MOV指令的含义是传递数据。
指令“MOV R7,#250”的含义是:将数据250送到R7中。
250前面的“#”号表示250是一个数,而不是一个地址,“#”号后面的数称为立即数。
3、DJNZ指令后面有两个符号,一个是R6,一个是D2。
R6是寄存器,D2是标号。
DJNZ指令的执行过程是:将其后面第一个参数中的值减1,然后看这个值是否等于0,如果等于0,往下执行,如果不等于0,则转移到第二个参数所指定的位置去执行,这里是转移到由D2所标识的这条语句去执行。
单片机实验——精选推荐
实验一认识实验一.实验目的1.了解仿真器的硬件结构与接线。
2.了解MCS-51单片机复位功能及复位后的内部状态。
3.通过示例程序的键入与执行,学习仿真器的使用与操作方法。
二.实验内容1.对照实验指导书,查对实验机具体接线。
2.按照开发系统的使用方法,分别查看复位后PC、SP、DPTR等特殊功能寄存器及片内、片外RAM的内容。
3.熟悉开发器的使用,将下面程序键入实验机。
ORG 2000H2000 74AA MOV A,#0AAH2002 75F0BB MOV B,#0BBH2005 E5F0 MOV A,B2007 78CC MOV R0,#0CCH2009 E8 MOV A,R0200A 80FE SJMP $4.程序键入后,检查各存储单元所储机器码是否正确如有误,重新键入,达到修正的目的。
5.单步执行示例程序,逐步检查执行结果,核查与分析结果是否相符,直到执行完最后一条指令。
6.练习连续执行示例程序,检查执行结果,核查与分析结果是否相符。
7.自己在示例程序中插入一条指令,执行并查看结果,然后删除,熟悉插入/删除操作。
8.将示例程序移到另外一个存储区,执行并查看结果,熟悉程序块移动操作。
三.实验预习要求1.认真阅读指导书的相关内容,熟悉开发系统的各种操作。
2.实验前应写出规定操作任务的具体操作方法步骤。
四.思考题1.MCS-51单片机怎样实现内部复位,画出一种复位电路。
2.PC、SP、P0、P1、P2、P3复位状态是什么?各有何意义?3.示例程序中最后一条指令SJMP $的作用是什么?如果取掉这一条指令,程序的执行将发生什么变化?4.实验机监控系统怎样实现程序“单步执行”功能?五.实验报告要求1.按实验顺序,写出实验操作的方法步骤。
2.写出实验中所遇到的问题与解决过程。
写出思考题的答案。
实验二建立数据区、数据块传送一.实验目的1.进一步熟悉实验机操作,练习程序调试方法。
2.理解并掌握建立数据区与数据块传送程序。
Proteus单片机仿真实验内容
实验1 PROTUES环境及LED闪烁实验1.实验任务做一个闪烁灯:在P1.0端口上接一个发光二极管D1,使D1在不停地一亮一灭,一亮一灭的时间间隔为0.2秒,重复循环。
2.电路原理图3.程序设计内容(1)延时程序的设计方法作为单片机的指令的执行的时间是很短,数量大多是微秒级。
实验要求的闪烁时间间隔为0.2秒,所以在执行某一指令时,需要插入延时程序,来达到实验的要求。
延时子程序如下:DELAY: MOV R5, #20D1: MOV R6, #20D2: MOV R7, #248DJNZ R7, $DJNZ R6, D2DJNZ R5, D1RET(2)输出控制如上图所示,当P1.0端口输出高电平,即P1.0=1时,根据发光二极管的单向导电性可知,这时发光二极管L1熄灭;当P1.0端口输出低电平,即P1.0=0时,发光二极管L1亮;我们可以使用SETB P1.0指令使P1.0端口输出高电平,使用CLR P1.0指令使P1.0端口输出低电平。
实验2 外部中断实验1.实验任务设计一个交通灯正常工作程序,并在有意外情况发生的情况下,能自动中断进入到中断服务程序运行,进行紧急事故处理,处理完成后能回到正常工作程序继续运行。
如原理图所示,P1接一位数码管用于显示时间,P2端口接东西方向和南北方向红绿灯,P3.2接一个按钮用于模拟一个外部中断源,当正常工作时,东西方向绿灯亮8秒,然后南北方向绿灯亮9秒;当模拟中断源发出中断信号时,东西和南北红灯亮5秒后返回正常工作程序。
(注:这里数码管选用了共阳极的数码管)数码管的段选码如下表所示:2.电路原理图3.程序设计内容(1)从proteus库中选取元器件:单片机AT89C51、磁片电容CAP、电解电容CAP-ELEC,晶振CRYSTAL、电阻RES、数码管7SEG-COM-CAT-GRN,按钮BUTTON,发光二极管等。
(2)设计延时程序。
实验3 T0波形发生器实验1.实验任务(1)首先用AT89C51单片机定时器/计数器0的定时功能构成一方波发生器,实现周期为400us的方波输出,如图所示,P3.5,p3.7是两个波形输出端,分别输出反相波形,两路波形输入虚拟示波器的A通道和B通道,用示波器观察方波的周期是否是400us。
单片机实验仿真50例说明
《单片机实验仿真50例》说明《单片机原理与控制技术》(第3版)和《单片机学习指导及习题解答》(第2版)已经出版,该书封面广告词中有一句“免费下载仿真DSN文件和hex文件”。
《单片机实验仿真50例》即为与该二本书配套的Proteus仿真文件包,50例全部取自于二本书中例题和习题。
但仅提供仿真电路DSN文件和驱动程序hex文件,没有源程序(源程序印在书上)。
读者从网上免费下载后,可对照书中程序,边学边练。
文件包共分8章50例(不计一题多解),每章用一个大文件夹,大文件夹中包含若干子文件夹。
每个子文件夹即为一个仿真题目,取一简明名称,体现其内容和功能。
子文件夹中,包含一个DSN文件、若干hex文件和一个调试提示。
hex文件分两类:一类是汇编程序形成的hex文件,用“×××asm.hex”表示;另一类是C51程序形成的hex文件,用“×××c.hex”表示。
其中,“×××”通常用“例×-×”或“习题×-×”表示,以表明其在书中的位置,便于读者查照。
有的题目还一题多解,有几个同类hex文件。
“例×-×”程序在《单片机原理与控制技术》(第3版)中,“习题×-×”程序在与教材书配套的《单片机学习指导及习题解答》(第2版)中。
为帮助读者操作,每一题均附有调试提示。
一般给出原理电路图,少量解释和调试操作步骤。
除标题按目录标示,题号、图号仍沿用书中原题号、图号,以便读者查照。
为便于读者观察仿真运行效果,有的题目增加了原书中没有的显示电路和显示程序,增加部分程序均在调试提示中给出。
需要注意的是,原书为节省版面,有的程序在调用前面已用过的子程序时,没有将子程序同时刊出(例如延时程序),读者在自行输入程序并Keil调试时,必须同时补充输入该子程序,否则编译器会提示出错。
单片机c语言程序设计实训100例——基于arduino+proteus仿真
单片机c语言程序设计实训100例——基于arduino+proteus仿真单片机C语言程序设计是电子信息类专业中的一门重要课程,通过学习这门课程可以掌握基本的嵌入式系统开发技术。
为了提高学生对于单片机编程能力和实践操作能力的培养,通常会进行相关实训。
在这篇文章中,我将介绍一个基于Arduino+Proteus仿真环境下的100个例题来帮助大家更好地理解和掌握单片机C语言程序设计。
每个例题都包含详细说明、代码示例以及相应功能模块在Proteus上面运行效果图等内容。
1. 闪烁LED灯:使用延时函数使得连接到Arduino引脚13上面的LED灯周期性地闪烁。
2. 控制舵机角度:根据输入信号改变舵机转动角度,并且利用串口监视器显示当前角度值。
3. 温湿度传感器读取数据并显示:通过DHT11温湿度传感器获取周围环境温湿度数值,并将其显示出来。
4. 数码管计数器: 使用74HC595芯片驱动四位共阳极数字管,在7段数码管上循环从0-9递增或者递减展示数字5. 蜂鸣器播放音调: 通过PWM信号控制蜂鸣器发出不同频率的声音。
6. 红外遥控LED灯: 使用红外接收模块读取来自红外遥控器发送的指令,并根据指令点亮或者熄灭连接到Arduino引脚上面的LED灯。
这些例题涵盖了单片机C语言程序设计中常见且基础性较强的内容,可以帮助学生逐步提高编程能力和实践操作技巧。
在Proteus仿真环境下进行实验也有以下几个优点:1. 安全可靠:在环境下进行实验,不存在电路元件损坏、线路错误等问题,保证了安全性和稳定性。
2. 节约成本:无需购买昂贵而易损耗品(如传感器、舵机等),只需要使用软件即可完成相关功能测试。
3. 方便快速:Proteus具备图形化界面以及大量现成组建库文件, 只要简单地将所需元素放入画布并连好线就可以开始调试代码4.多样化场景设置: Proteus支持各种设备与芯片之间相互联动关系搭配总结起来说,“100例——基于arduino+proteus仿真”这个实训项目是一个非常有价值的单片机C语言程序设计学习资源。
51单片机C语言编程100例
51单片机C语言编程100例1. 引言51单片机是一款常用于嵌入式系统的微控制器,其强大的功能和广泛的应用使得掌握51单片机C语言编程成为许多电子工程师和学习者的首选。
本文将介绍并讲解51单片机C语言编程的100个例子,帮助读者逐步掌握编程技巧和开发经验。
2. 闪烁LED灯第一个例子是闪烁LED灯。
我们将通过C语言编写程序,控制51单片机上的一个LED灯以固定的频率闪烁,展示基本的输入输出操作。
通过学习这个例子,读者可以了解到C语言与单片机的交互方式。
3. 数码管计数器第二个例子是数码管计数器。
我们将使用C语言编写程序,通过按键操作控制数码管上的数字进行计数。
这个例子展示了如何使用中断和定时器来实现交互功能和多任务处理。
4. PWM波控制第三个例子是PWM波控制。
我们将使用C语言编程,通过调整占空比来控制51单片机上的PWM波输出。
这个例子展示了如何利用51单片机的定时器和中断模式来生成模拟信号。
5. 温度采集与显示第四个例子是温度采集与显示。
我们将利用51单片机内置的ADC模块,通过连接温度传感器来实现温度采集,并将采集到的数据在液晶屏上显示。
这个例子展示了如何使用模拟到数字转换和外部模块的接口技术。
6. 蓝牙通信控制第五个例子是蓝牙通信控制。
我们将利用51单片机的串口功能和蓝牙模块,实现与蓝牙设备之间的通信和控制。
通过学习这个例子,读者可以熟悉串口通信和外部设备的接口编程。
7. 距离测量与报警第六个例子是距离测量与报警。
我们将使用超声波传感器和蜂鸣器,通过C语言编程实现距离的测量和报警功能。
这个例子展示了如何使用外部传感器和控制器进行物理量的检测和反馈。
8. 数字音乐播放器第七个例子是数字音乐播放器。
我们将使用51单片机的PWM功能和SD卡模块,通过C语言编程实现音乐的播放和控制。
这个例子展示了如何使用定时器和外部存储设备进行数据的读取和解码。
9. 图形液晶显示第八个例子是图形液晶显示。
我们将利用51单片机的并行接口和图形液晶屏,通过C语言编程实现图形和字符的显示功能。
基于proteus的51单片机仿真实例八十三-PROTEUS技术交流区-PROTE...
基于proteus的51单片机仿真实例八十三-PROTEUS技术交流区-PROTE...proteus, 单片机, 实例, 仿真1、SPI总线器件与单片机的连接需要3跟线:时钟线SCK,数据线MOSI(主机发送,从机接收)和MISO(主机接收,从机发送)。
X5045是一种集合了看门狗、电压监控和串行EEPROM三种功能于一身的器件。
上电复位功能:在系统上电时产生一个足够长时间的复位信号,以确保单片机正常工作前,系统电路已处于稳定状态。
看门狗功能:如果在规定的时间内单片机没有在CS引脚产生规定的电平变化(喂狗信号),芯片内的看门狗电路将产生复位信号。
利用该功能,可让单片机死机后自动复位并开始工作。
电压检测:当电源电压下降到一定的值后,虽然单片机仍能工作,但可能已经不能稳定工作了,此时X5045将产生复位信号,直到电压恢复正常后,才能正常工作。
串行EEPROM:X5045自带512字节的数据存储空间,数据可掉电保存。
2、x5045的引脚及功能CS/WDI:片选输入端。
低电平时选中该芯片SO:串行数据输出端,数据在sck的下降沿输出WP:写保护端,该脚接地,写操作被禁止,接高电平,所有功能正常VSS:电源地SI:串行数据输入端,数据在sck的上升沿写入(高位在前)SCK:串行时钟端,RESET:复位输出端,用于电源监测和看门狗超时输出VCC:电源3、使用方法1)上电复位:当器件通电并超过规定值时,X5045内部的复位电路将会产生一个约200ms的复位脉冲,使单片机正常复位。
2)电压检测:工作过程中,X5045能不断检测VCC端的电压,在电压下降到一定值后,将产生一个复位脉冲,使单片机停止工作,这个复位脉冲一直有效,直到VCC下降到1V以下,整个系统停止工作。
如果VCC在下降后又升高,则当超过规定值后200ms,复位信号消失,单片机可以继续工作。
3)看门狗定时器:看门狗定时器电路通过检测WDI端的输入来判断单片机工作是否正常,在规定的时间内,单片机必须在WDI端口产生一个由高到低的电平变化。
C51单片机实战100例
目录目录 1函数的使用和熟悉 6实例3:用单片机控制第一个灯亮7实例4:用单片机控制一个灯闪烁:认识单片机的工作频率7实例5:将P1口状态分别送入P0、P2、P3口:认识I/O口的引脚功能8实例6:使用P3口流水点亮8位LED 9实例7:通过对P3口地址的操作流水点亮8位LED 11实例8:用不同数据类型控制灯闪烁时间13实例9:用P0口、P1 口分别显示加法和减法运算结果15实例10:用P0、P1口显示乘法运算结果15实例11:用P1、P0口显示除法运算结果16实例12:用自增运算控制P0口8位LED流水花样17实例13:用P0口显示逻辑"与"运算结果18实例14:用P0口显示条件运算结果18实例15:用P0口显示按位"异或"运算结果 19实例16:用P0显示左移运算结果19实例17:"万能逻辑电路"实验20实例18:用右移运算流水点亮P1口8位LED 20实例19:用if语句控制P0口8位LED的流水方向 22实例20:用swtich语句的控制P0口8位LED的点亮状态23 实例21:用for语句控制蜂鸣器鸣笛次数25实例22:用while语句控制LED 27实例23:用do-while语句控制P0口8位LED流水点亮29 实例24:用字符型数组控制P0口8位LED流水点亮30实例25:用P0口显示字符串常量 32实例26:用P0 口显示指针运算结果33实例27:用指针数组控制P0口8位LED流水点亮34实例28:用数组的指针控制P0 口8 位LED流水点亮35实例29:用P0 、P1口显示整型函数返回值37实例30:用有参函数控制P0口8位LED流水速度38实例31:用数组作函数参数控制流水花样40实例32:用指针作函数参数控制P0口8位LED流水点亮41 实例33:用函数型指针控制P1口灯花样44实例34:用指针数组作为函数的参数显示多个字符串45实例35:字符函数ctype.h应用举例48实例36:内部函数intrins.h应用举例48实例37:标准函数stdlib.h应用举例49实例38:字符串函数string.h应用举例 51实例39:宏定义应用举例2 52实例40:宏定义应用举例2 52实例41:宏定义应用举例3 53中断、定时器54实例42:用定时器T0查询方式P2口8位控制LED闪烁54 实例43:用定时器T1查询方式控制单片机发出1KHz音频55 实例44:将计数器T0计数的结果送P1口8位LED显示56 实例45:用定时器T0的中断控制1位LED闪烁57实例46:用定时器T0的中断实现长时间定时59实例47:用定时器T1中断控制两个LED以不同周期闪烁60 实例48:用计数器T1的中断控制蜂鸣器发出1KHz音频62实例49:用定时器T0的中断实现"渴望"主题曲的播放64 实例50-1:输出50个矩形脉冲69实例50-2:计数器T0统计外部脉冲数70实例51-2:定时器T0的模式2测量正脉冲宽度71实例52:用定时器T0控制输出高低宽度不同的矩形波72 实例53:用外中断0的中断方式进行数据采集75实例54-1:输出负脉宽为200微秒的方波76实例54-2:测量负脉冲宽度77实例55:方式0控制流水灯循环点亮78实例56-1:数据发送程序80实例56-2:数据接收程序83实例57-1:数据发送程序84实例57-2:数据接收程序86实例58:单片机向PC发送数据88实例59:单片机接收PC发出的数据90数码管显示 92实例60:用LED数码显示数字5 92实例61:用LED数码显示器循环显示数字0~9 92实例62:用数码管慢速动态扫描显示数字"1234" 94实例63:用LED数码显示器伪静态显示数字1234 95实例64:用数码管显示动态检测结果96实例65:数码秒表设计100实例66:数码时钟设计103实例67:用LED数码管显示计数器T0的计数值110实例68:静态显示数字“59”112键盘控制113实例69:无软件消抖的独立式键盘输入实验113实例70:软件消抖的独立式键盘输入实验114实例71:CPU控制的独立式键盘扫描实验115实例72:定时器中断控制的独立式键盘扫描实验121实例73:独立式键盘控制的4级变速流水灯128实例74:独立式键盘的按键功能扩展:"以一当四" 132实例75:独立式键盘调时的数码时钟实验135实例76:独立式键盘控制步进电机实验143实例77:矩阵式键盘按键值的数码管显示实验148实例78:矩阵式键盘按键音154实例79:简易电子琴157实例80:矩阵式键盘实现的电子密码锁169液晶显示LCD 175实例81:用LCD显示字符'A' 175实例82:用LCD循环右移显示"Welcome to China" 182 实例83:用LCD显示适时检测结果188实例84:液晶时钟设计196一些芯片的使用*****24c02 DS18B20 X5045 ADC0832 DAC0832 DS1302 红外遥控 208实例85:将数据"0x0f"写入AT24C02再读出送P1口显示208实例86:将按键次数写入AT24C02,再读出并用1602LCD显示216 实例87:对I2C总线上挂接多个AT24C02的读写操作231实例88:基于AT24C02的多机通信读取程序242实例88:基于AT24C02的多机通信写入程序249实例90:DS18B20温度检测及其液晶显示271实例91:将数据"0xaa"写入X5045再读出送P1口显示 289实例92:将流水灯控制码写入X5045并读出送P1口显示296实例93:对SPI总线上挂接多个X5045的读写操作303实例94:基于ADC0832的数字电压表312实例95:用DAC0832产生锯齿波电压324实例96:用P1口显示红外遥控器的按键值 325实例97:用红外遥控器控制继电器 330实例98:基于DS1302的日历时钟335实例99:单片机数据发送程序353实例100:电机转速表设计 355//模拟霍尔脉冲 365函数的使用和熟悉实例3:用单片机控制第一个灯亮#include<reg51.h> //包含51单片机寄存器定义的头文件void main(void){P1=0xfe; //P1=1111 1110B,即P1.0输出低电平}实例4:用单片机控制一个灯闪烁:认识单片机的工作频率#include<reg51.h> //包含单片机寄存器的头文件/****************************************函数功能:延时一段时间*****************************************/void delay(void) //两个void意思分别为无需返回值,没有参数传递{unsigned int i; //定义无符号整数,最大取值范围65535for(i=0;i<20000;i++) //做20000次空循环; //什么也不做,等待一个机器周期}/*******************************************************函数功能:主函数(C语言规定必须有也只能有1个主函数)********************************************************/void main(void){while(1) //无限循环{P1=0xfe; //P1=1111 1110B,P1.0输出低电平delay(); //延时一段时间P1=0xff; //P1=1111 1111B,P1.0输出高电平delay(); //延时一段时间}}实例5:将P1口状态分别送入P0、P2、P3口:认识I/O口的引脚功能#include<reg51.h> //包含单片机寄存器的头文件/*******************************************************函数功能:主函数(C语言规定必须有也只能有1个主函数)********************************************************/void main(void){while(1) //无限循环{P1=0xff; // P1=1111 1111B,熄灭LEDP0=P1; // 将P1口状态送入P0口P2=P1; // 将P1口状态送入P2口P3=P1; // 将P1口状态送入P3口}}实例6:使用P3口流水点亮8位LED#include<reg51.h> //包含单片机寄存器的头文件/****************************************函数功能:延时一段时间*****************************************/void delay(void){unsigned char i,j;for(i=0;i<250;i++)for(j=0;j<250;j++);}/******************************************************* 函数功能:主函数********************************************************/ void main(void){while(1){P3=0xfe; //第一个灯亮delay(); //调用延时函数P3=0xfd; //第二个灯亮delay(); //调用延时函数P3=0xfb; //第三个灯亮delay(); //调用延时函数P3=0xf7; //第四个灯亮delay(); //调用延时函数P3=0xef; //第五个灯亮 delay(); //调用延时函数P3=0xdf; //第六个灯亮delay(); //调用延时函数P3=0xbf; //第七个灯亮 delay(); //调用延时函数P3=0x7f; //第八个灯亮 delay(); //调用延时函数}}实例7:通过对P3口地址的操作流水点亮8位LED#include<reg51.h> //包含单片机寄存器的头文件sfr x=0xb0; //P3口在存储器中的地址是b0H,通过sfr可定义8051内核单片机//的所有内部8位特殊功能寄存器,对地址x的操作也就是对P1口的操作/****************************************函数功能:延时一段时间*****************************************/void delay(void){unsigned char i,j;for(i=0;i<250;i++)for(j=0;j<250;j++); //利用循环等待若干机器周期,从而延时一段时间}/*****************************************函数功能:主函数******************************************/void main(void){while(1){x=0xfe; //第一个灯亮delay(); //调用延时函数x=0xfd; //第二个灯亮delay(); //调用延时函数x=0xfb; //第三个灯亮delay(); //调用延时函数x=0xf7; //第四个灯亮delay(); //调用延时函数x=0xef; //第五个灯亮 delay(); //调用延时函数x=0xdf; //第六个灯亮delay(); //调用延时函数x=0xbf; //第七个灯亮 delay(); //调用延时函数x=0x7f; //第八个灯亮 delay(); //调用延时函数}}实例8:用不同数据类型控制灯闪烁时间#include<reg51.h> //包含单片机寄存器的头文件/******************************************************函数功能:用整形数据延时一段时间******************************************************/void int_delay(void) //延时一段较长的时间{unsigned int m; //定义无符号整形变量,双字节数据,值域为0~65535 for(m=0;m<36000;m++); //空操作}/******************************************************函数功能:用字符型数据延时一段时间******************************************************/void char_delay(void) //延时一段较短的时间{unsigned char i,j; //定义无符号字符型变量,单字节数据,值域0~255 for(i=0;i<200;i++)for(j=0;j<180;j++); //空操作}/****************************************************** 函数功能:主函数******************************************************/ void main(void){unsigned char i;while(1){for(i=0;i<3;i++){P1=0xfe; //P1.0口的灯点亮int_delay(); //延时一段较长的时间P1=0xff; //熄灭int_delay(); //延时一段较长的时间}for(i=0;i<3;i++){P1=0xef; //P1.4口的灯点亮char_delay(); //延时一段较长的时间P1=0xff; //熄灭char_delay(); //延时一段较长的时间}}}实例9:用P0口、P1 口分别显示加法和减法运算结果#include<reg51.h>void main(void){unsigned char m,n;m=43; //即十进制数2x16+11=43n=60; //即十进制数3x16+12=60P1=m+n; //P1=103=0110 0111B,结果P1.3、P1.4、P1.7 口的灯被点亮P0=n-m; //P0=17=0001 0001B,结果P0.0、P0.4的灯被熄灭}实例10:用P0、P1口显示乘法运算结果#include<reg51.h> //包含单片机寄存器的头文件void main(void){unsigned char m,n;unsigned int s;n=71;s=m*n; //s=64*71=4544,需要16位二进制数表示,高8位送P1口,低8位送P0口//由于4544=17*256+192=H3*16*16*16+H2*16*16+H1*16+H0//两边同除以256,可得17+192/256=H3*16+H2+(H1*16+H0)/256//因此,高8位16进制数H3*16+H2必然等于17,即4544除以256的商//低8位16进制数H1*16+H0必然等于192,即4544除以256的余数P1=s/256; //高8位送P1口,P1=17=11H=0001 0001B, P1.0和P1.4口灭,其余亮P0=s%256; //低8位送P0口, P3=192=c0H=11000000B,P3.1,P3.6,P3.7口灭,其余亮}实例11:用P1、P0口显示除法运算结果#include<reg51.h> //包含单片机寄存器的头文件void main(void){P1=36/5; //求整数P0=((36%5)*10)/5; //求小数while(1); //无限循环防止程序“跑飞”}实例12:用自增运算控制P0口8位LED流水花样#include<reg51.h> //包含单片机寄存器的头文件/****************************************************** 函数功能:延时一段时间******************************************************/ void delay(void){unsigned int i;for(i=0;i<20000;i++);}/****************************************************** 函数功能:主函数******************************************************/void main(void){unsigned char i;for(i=0;i<255;i++) //注意i的值不能超过255{P0=i; //将i的值送P0口delay(); //调用延时函数}}实例13:用P0口显示逻辑"与"运算结果#include<reg51.h> //包含单片机寄存器的头文件void main(void){P0=(4>0)&&(9>0xab);//将逻辑运算结果送P0口while(1); //设置无限循环,防止程序“跑飞”}实例14:用P0口显示条件运算结果#include<reg51.h> //包含单片机寄存器的头文件void main(void){P0=(8>4)?8:4;//将条件运算结果送P0口,P0=8=0000 1000B while(1); //设置无限循环,防止程序“跑飞”}实例15:用P0口显示按位"异或"运算结果#include<reg51.h> //包含单片机寄存器的头文件void main(void){P0=0xa2^0x3c;//将条件运算结果送P0口,P0=8=0000 1000B while(1); //设置无限循环,防止程序“跑飞”}实例16:用P0显示左移运算结果#include<reg51.h> //包含单片机寄存器的头文件void main(void){P0=0x3b<<2;//将左移运算结果送P0口,P0=1110 1100B=0xec while(1); //无限循环,防止程序“跑飞”}实例17:"万能逻辑电路"实验#include<reg51.h> //包含单片机寄存器的头文件sbit F=P1^4; //将F位定义为P1.4sbit X=P1^5; //将X位定义为P1.5sbit Y=P1^6; //将Y位定义为P1.6sbit Z=P1^7; //将Z位定义为P1.7void main(void){while(1){F=((~X)&Y)|Z; //将逻辑运算结果赋给F;}}实例18:用右移运算流水点亮P1口8位LED#include<reg51.h> //包含单片机寄存器的头文件/*****************************函数功能:延时一段时间*****************************/void delay(void){unsigned int n;for(n=0;n<30000;n++);}/*****************************函数功能:主函数*****************************/void main(void){unsigned char i;while(1){P1=0xff;delay();for(i=0;i<8;i++)//设置循环次数为8{P1=P1>>1; //每次循环P1的各二进位右移1位,高位补0delay(); //调用延时函数}}}实例19:用if语句控制P0口8位LED的流水方向#include<reg51.h> //包含单片机寄存器的头文件sbit S1=P1^4; //将S1位定义为P1.4sbit S2=P1^5; //将S2位定义为P1.5/*****************************函数功能:主函数*****************************/void main(void){while(1){if(S1==0) //如果按键S1按下P0=0x0f; //P0口高四位LED点亮if(S2==0) //如果按键S2按下P0=0xf0; //P0口低四位LED点亮}}实例20:用swtich语句的控制P0口8位LED的点亮状态#include<reg51.h> //包含单片机寄存器的头文件sbit S1=P1^4; //将S1位定义为P1.4/*****************************函数功能:延时一段时间*****************************/void delay(void){unsigned int n;for(n=0;n<10000;n++);}/*****************************函数功能:主函数*****************************/void main(void){unsigned char i;i=0; //将i初始化为0while(1){if(S1==0) //如果S1键按下{delay(); //延时一段时间if(S1==0) //如果再次检测到S1键按下i++; //i自增1if(i==9) //如果i=9,重新将其置为1i=1;}switch(i) //使用多分支选择语句{case 1: P0=0xfe; //第一个LED亮break;case 2: P0=0xfd; //第二个LED亮break;case 3:P0=0xfb; //第三个LED亮break;case 4:P0=0xf7; //第四个LED亮break;case 5:P0=0xef; //第五个LED亮break;case 6:P0=0xdf; //第六个LED亮break;case 7:P0=0xbf; //第七个LED亮break;case 8:P0=0x7f; //第八个LED亮break;default: //缺省值,关闭所有LEDP0=0xff;}}}实例21:用for语句控制蜂鸣器鸣笛次数#include<reg51.h> //包含单片机寄存器的头文件sbit sound=P3^7; //将sound位定义为P3.7/****************************************函数功能:延时形成1600Hz音频****************************************/void delay1600(void){unsigned char n;for(n=0;n<100;n++);}/**************************************** 函数功能:延时形成800Hz音频****************************************/ void delay800(void){unsigned char n;for(n=0;n<200;n++);}/**************************************** 函数功能:主函数****************************************/ void main(void){unsigned int i;while(1){for(i=0;i<830;i++){sound=0; //P3.7输出低电平delay1600();sound=1; //P3.7输出高电平delay1600();}for(i=0;i<200;i++){sound=0; //P3.7输出低电平delay800();sound=1; //P3.7输出高电平delay800();}}}实例22:用while语句控制LED#include<reg51.h> //包含单片机寄存器的头文件/****************************************函数功能:延时约60ms (3*100*200=60000μs)****************************************/void delay60ms(void){unsigned char m,n;for(m=0;m<100;m++)for(n=0;n<200;n++);}/****************************************函数功能:主函数****************************************/void main(void){unsigned char i;while(1) //无限循环{i=0; //将i初始化为0while(i<0xff) //当i小于0xff(255)时执行循环体{P0=i; //将i送P0口显示delay60ms(); //延时i++; //i自增1}}}实例23:用do-while语句控制P0口8位LED流水点亮#include<reg51.h> //包含单片机寄存器的头文件/****************************************函数功能:延时约60ms (3*100*200=60000μs)****************************************/void delay60ms(void){unsigned char m,n;for(m=0;m<100;m++)for(n=0;n<200;n++);}/****************************************函数功能:主函数****************************************/void main(void){do{P0=0xfe; //第一个LED亮delay60ms();P0=0xfd; //第二个LED亮delay60ms();P0=0xfb; //第三个LED亮delay60ms();P0=0xf7; //第四个LED亮delay60ms();P0=0xef; //第五个LED亮delay60ms();P0=0xdf; //第六个LED亮delay60ms();delay60ms();P0=0xbf; //第七个LED亮delay60ms();P0=0x7f; //第八个LED亮delay60ms();}while(1); //无限循环,使8位LED循环流水点亮}实例24:用字符型数组控制P0口8位LED流水点亮#include<reg51.h> //包含单片机寄存器的头文件/****************************************函数功能:延时约60ms (3*100*200=60000μs)****************************************/void delay60ms(void){unsigned char m,n;for(m=0;m<100;m++)for(n=0;n<200;n++);}/****************************************函数功能:主函数****************************************/void main(void){unsigned char i;unsigned char code Tab[ ]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //定义无符号字符型数组while(1){for(i=0;i<8;i++){P0=Tab[i];//依次引用数组元素,并将其送P0口显示delay60ms();//调用延时函数}}}实例25:用P0口显示字符串常量#include<reg51.h> //包含单片机寄存器的头文件/*************************************************函数功能:延时约150ms (3*200*250=150 000μs=150ms*************************************************/void delay150ms(void){unsigned char m,n;for(m=0;m<200;m++)for(n=0;n<250;n++);}/*************************************************函数功能:主函数*************************************************/void main(void){unsigned char str[]={"Now,Temperature is :"}; //将字符串赋给字符型全部元素赋值unsigned char i;while(1){i=0; //将i初始化为0,从第一个元素开始显示while(str[i]!='\0') //只要没有显示到结束标志'\0'{P0=str[i]; //将第i个字符送到P0口显示delay150ms(); //调用150ms延时函数i++; //指向下一个待显字符}}}实例26:用P0 口显示指针运算结果#include<reg51.h>void main(void){unsigned char *p1,*p2; //定义无符号字符型指针变量p1,p2 unsigned char i,j; //定义无符号字符型数据i=25; //给i赋初值25j=15;p1=&i; //使指针变量指向i ,对指针初始化p2=&j; //使指针变量指向j ,对指针初始化P0=*p1+*p2; //*p1+*p2相当于i+j,所以P0=25+15=40=0x28 //则P0=0010 1000B,结果P0.3、P0.5引脚LED熄灭,其余点亮while(1); //无限循环,防止程序“跑飞”}实例27:用指针数组控制P0口8位LED流水点亮#include<reg51.h>/*************************************************函数功能:延时约150ms (3*200*250=150 000μs=150ms*************************************************/void delay150ms(void){unsigned char m,n;for(m=0;m<200;m++)for(n=0;n<250;n++);}/*************************************************函数功能:主函数void main(void){unsigned char code Tab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; unsigned char *p[ ]={&Tab[0],&Tab[1],&Tab[2],&Tab[3],&Tab[4],&Tab[5], &Tab[6],&Tab[7]};unsigned char i; //定义无符号字符型数据while(1){for(i=0;i<8;i++){P0=*p[i];delay150ms();}}}实例28:用数组的指针控制P0 口8 位LED流水点亮#include<reg51.h>/*************************************************函数功能:延时约150ms (3*200*250=150 000μs=150msvoid delay150ms(void){unsigned char m,n;for(m=0;m<200;m++)for(n=0;n<250;n++);}/*************************************************函数功能:主函数*************************************************/void main(void){unsigned char i;unsigned char Tab[ ]={0xFF,0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE,0xFE,0xFC,0xFB,0xF0,0xE0,0xC0,0x80,0x00,0xE7,0xDB,0xBD,0x7E,0x3C,0x18,0x00,0x81,0xC3,0xE7,0x7E,0xBD,0xDB,0xE7,0xBD,0xDB};//流水灯控制码unsigned char *p; //定义无符号字符型指针p=Tab; //将数组首地址存入指针pwhile(1){for(i=0;i<32;i++) //共32个流水灯控制码{P0=*(p+i); //*(p+i)的值等于a[i]delay150ms(); //调用150ms延时函数}}}实例29:用P0 、P1口显示整型函数返回值#include<reg51.h>/************************************************* 函数功能:计算两个无符号整数的和*************************************************/ unsigned int sum(int a,int b){unsigned int s;s=a+b;return (s);}/************************************************* 函数功能:主函数*************************************************/ void main(void){unsigned z;z=sum(2008,2009);P1=z/256; //取得z的高8位P0=z%256; //取得z的低8位while(1);}实例30:用有参函数控制P0口8位LED流水速度#include<reg51.h>/************************************************* 函数功能:延时一段时间*************************************************/ void delay(unsigned char x){unsigned char m,n;for(m=0;m<x;m++)for(n=0;n<200;n++);}/*************************************************函数功能:主函数*************************************************/void main(void){unsigned char i;unsigned char code Tab[ ]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};//流水灯控制码while(1){//快速流水点亮LEDfor(i=0;i<8;i++) //共8个流水灯控制码{P0=Tab[i];delay(100); //延时约60ms, (3*100*200=60 000μs)}//慢速流水点亮LEDfor(i=0;i<8;i++) //共8个流水灯控制码{P0=Tab[i];delay(250); //延时约150ms, (3*250*200=150 000μs)}}}实例31:用数组作函数参数控制流水花样#include<reg51.h>/*************************************************函数功能:延时约150ms*************************************************/void delay(void){unsigned char m,n;for(m=0;m<200;m++)for(n=0;n<250;n++);}/*************************************************函数功能:流水点亮P0口8位LED*************************************************/void led_flow(unsigned char a[8]){unsigned char i;for(i=0;i<8;i++){P0=a[i];delay();}}/*************************************************函数功能:主函数*************************************************/void main(void){unsigned char code Tab[ ]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};//流水灯控制码led_flow(Tab);}实例32:用指针作函数参数控制P0口8位LED流水点亮#include<reg51.h>/*************************************************函数功能:延时约150ms*************************************************/void delay(void){unsigned char m,n;for(m=0;m<200;m++)for(n=0;n<250;n++);}/*************************************************函数功能:流水点亮P0口8位LED*************************************************/void led_flow(unsigned char *p) //形参为无符号字符型指针{unsigned char i;while(1){i=0; //将i置为0,指向数组第一个元素while(*(p+i)!='\0') //只要没有指向数组的结束标志{P0=*(p+i);// 取的指针所指变量(数组元素)的值,送P0口delay(); //调用延时函数i++; //指向下一个数组元素}}}/*************************************************函数功能:主函数*************************************************/void main(void){unsigned char code Tab[ ]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE, 0xFF,0xFE,0xFC,0xFB,0xF0,0xE0,0xC0,0x80,0x00,0xE7,0xDB,0xBD,0x7E,0xFF,0xFF,0x3C,0x18,0x0,0x81,0xC3,0xE7,0xFF, 0xFF,0x7E};//流水灯控制码unsigned char *pointer;pointer=Tab;led_flow(pointer);}实例33:用函数型指针控制P1口灯花样#include<reg51.h> //包含51单片机寄存器定义的头文件unsigned char code Tab[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F}; //流水灯控制码,该数组被定义为全局变量/**************************************************************函数功能:延时约150ms**************************************************************/void delay(void){unsigned char m,n;for(m=0;m<200;m++)for(n=0;n<250;n++);}/**************************************************************函数功能:流水灯左移**************************************************************/void led_flow(void){unsigned char i;for(i=0;i<8;i++) //8位控制码{P0=Tab[i];delay();}}/**************************************************************函数功能:主函数**************************************************************/void main(void){void (*p)(void); //定义函数型指针,所指函数无参数,无返回值p=led_flow; //将函数的入口地址赋给函数型指针pwhile(1)(*p)(); //通过函数的指针p调用函数led_flow()}实例34:用指针数组作为函数的参数显示多个字符串#include<reg51.h> //包含51单片机寄存器定义的头文件unsigned char code str1[ ]="Temperature is tested by DS18B20";//C语言中,字符串是作为字符数组来处理的unsigned char code str2[ ]="Now temperature is:"; //所以,字符串的名字就是字符串的首地址unsigned char code str3[ ]="The Systerm is designed by Zhang San"; unsigned char code str4[ ]="The date is 2008-9-30";unsigned char *p[ ]={str1,str2,str3,str4}; //定义p[4]为指向4个字符串的字符型指针数组/**************************************************************函数功能:延时约150ms**************************************************************/void delay(void){unsigned char m,n;for(m=0;m<200;m++)for(n=0;n<250;n++);}/**************************************************************函数功能:流水点亮P0口8位LED**************************************************************/void led_display(unsigned char *x[ ]) //形参必须为指针数组{unsigned char i,j;for(i=0;i<4;i++) //有4个字符串要显示{j=0; //指向待显字符串的第0号元素while(*(x[i]+j)!='\0') //只要第i个字符串的第j号元素不是结束标志{P0=*(x[i]+j); //取得该元素值送到P0口显示delay(); //调用延时函数j++; //指向下一个元素}}}/**************************************************************函数功能:主函数**************************************************************/void main(void){unsigned char i;while(1){for(i=0;i<4;i++)led_display(p); //将指针数组名作实际参数传递}}实例35:字符函数ctype.h应用举例#include<reg51.h> //包含51单片机寄存器定义的头文件#include<ctype.h>void main(void){while(1){P3=isalpha('_')?0xf0:0x0f;//条件运算,若'_'是英文字母,P3=0xf0 }}实例36:内部函数intrins.h应用举例#include<reg51.h> //包含51单片机寄存器定义的头文件#include<intrins.h> //包含函数isalpha()声明的头文件/*************************************************函数功能:延时约150ms*************************************************/void delay(void){unsigned char m,n;for(m=0;m<200;m++)for(n=0;n<250;n++);}/*************************************************函数功能:主函数*************************************************/void main(void){P3=0xfe; //P3=1111 1110Bwhile(1){P3=_crol_(P3,1);// 将P3的二进制位循环左移1位后再赋给P3 delay(); //调用延时函数}}实例37:标准函数stdlib.h应用举例#include<reg51.h> //包含51单片机寄存器定义的头文件#include<stdlib.h> //包含函数isalpha()声明的头文件/*************************************************函数功能:延时约150ms*************************************************/void delay(void){unsigned char m,n;for(m=0;m<200;m++)for(n=0;n<250;n++);}/*************************************************函数功能:主函数*************************************************/void main(void){unsigned char i;while(1){for(i=0;i<10;i++) //产生10个随机数{P3=rand()/160; //将产生的随机数缩小160倍后送P3显示。
51单片机50个实例代码
51单片机50个例程代码程序里有中断,串口等驱动,直接复制即可使用1-IO输出-点亮1个LED灯方法1/*-----------------------------------------------名称:IO口高低电平控制论坛:编写:shifang日期:修改:无内容:点亮P1口的一个LED灯该程序是单片机学习中最简单最基础的,通过程序了解如何控制端口的高低电平------------------------------------------------*/#include<> //包含头文件,一般情况不需要改动,//头文件包含特殊功能寄存器的定义sbit LED=P1^0;// 用sbit 关键字定义LED到端口,//LED是自己任意定义且容易记忆的符号/*------------------------------------------------主函数------------------------------------------------*/void main (void){//此方法使用bit位对单个端口赋值LED=1; //将口赋值1,对外输出高电平LED=0; //将口赋值0,对外输出低电平while (1) //主循环{//主循环中添加其他需要一直工作的程序}}2-IO输出-点亮1个LED灯方法2/*-----------------------------------------------名称:IO口高低电平控制论坛:编写:shifang日期:修改:无内容:点亮P1口的一个LED灯该程序是单片机学习中最简单最基础的,通过程序了解如何控制端口的高低电平------------------------------------------------*/#include<> //包含头文件,一般情况不需要改动,//头文件包含特殊功能寄存器的定义/*------------------------------------------------主函数------------------------------------------------*/void main (void){//此方法使用1个字节对单个端口赋值P1 = 0xFF; //P1口全部为高电平,对应的LED灯全灭掉,//ff换算成二进制是1111 1111P1 = 0xfe; //P1口的最低位点亮,可以更改数值是其他的灯点亮//0xfe是16进制,0x开头表示16进制数,//fe换算成二进制是1111 1110while (1) //主循环{//主循环中添加其他需要一直工作的程序}}3-IO输出-点亮多个LED灯方法1/*-----------------------------------------------名称:IO口高低电平控制论坛:编写:shifang日期:修改:无内容:点亮P1口的多个LED灯该程序是单片机学习中最简单最基础的,通过程序了解如何控制端口的高低电平------------------------------------------------*/#include<> //包含头文件,一般情况不需要改动,//头文件包含特殊功能寄存器的定义sbit LED0=P1^0;// 用sbit 关键字定义LED到端口,sbit LED1=P1^1;//LED是自己任意定义且容易记忆的符号sbit LED2=P1^2;sbit LED3=P1^3;sbit LED4=P1^4;sbit LED5=P1^5;sbit LED6=P1^6;sbit LED7=P1^7;/*------------------------------------------------主函数------------------------------------------------*/void main (void){//此方法使用bit位对单个端口赋值LED0=0; //将口赋值0,对外输出低电平LED1=1;LED2=0;LED3=1;LED4=0;LED5=1;LED6=0;LED7=1;while (1) //主循环{//主循环中添加其他需要一直工作的程序}}4-IO输出-点亮多个LED灯方法2/*-----------------------------------------------名称:IO口高低电平控制论坛:编写:shifang日期:修改:无内容:点亮P1口的多个LED灯该程序是单片机学习中最简单最基础的,通过程序了解如何控制端口的高低电平------------------------------------------------*/#include<> //包含头文件,一般情况不需要改动,//头文件包含特殊功能寄存器的定义/*------------------------------------------------主函数------------------------------------------------*/void main (void){//此方法使用bit位对单个端口赋值P1=0x55; //换成二进制是0101 0101while (1) //主循环{//主循环中添加其他需要一直工作的程序}}5-闪烁1个LED/*-----------------------------------------------名称:IO口高低电平控制论坛:编写:shifang日期:修改:无内容:点亮P1口的1个LED灯闪烁该程序是单片机学习中最简单最基础的,通过程序了解如何控制端口的高低电平------------------------------------------------*/#include<> //包含头文件,一般情况不需要改动,//头文件包含特殊功能寄存器的定义sbit LED0=P1^0;// 用sbit 关键字定义LED到端口,//LED是自己任意定义且容易记忆的符号void Delay(unsigned int t); //函数声明/*------------------------------------------------主函数------------------------------------------------*/void main (void){//此方法使用bit位对单个端口赋值while (1) //主循环{LED0=0; //将口赋值0,对外输出低电平Delay(10000); //调用延时程序;更改延时数字可以更改延时长度;//用于改变闪烁频率LED0=1; //将口赋值1,对外输出高电平Delay(10000);//主循环中添加其他需要一直工作的程序}}/*------------------------------------------------延时函数,含有输入参数unsigned int t,无返回值unsigned int 是定义无符号整形变量,其值的范围是0~65535------------------------------------------------*/void Delay(unsigned int t){while(--t);}6-不同频率闪烁1个LED灯/*-----------------------------------------------名称:IO口高低电平控制论坛:编写:shifang日期:修改:无内容:点亮P1口的1个LED灯闪烁该程序是单片机学习中最简单最基础的,通过程序了解如何控制端口的高低电平------------------------------------------------*/#include<> //包含头文件,一般情况不需要改动,//头文件包含特殊功能寄存器的定义sbit LED0=P1^0;// 用sbit 关键字定义LED到端口,//LED是自己任意定义且容易记忆的符号void Delay(unsigned int t); //函数声明/*------------------------------------------------主函数------------------------------------------------*/void main (void){//此方法使用bit位对单个端口赋值unsigned char i; //定义一个无符号字符型局部变量i 取值范围0~255while (1) //主循环{for(i=0;i<10;i++) //加入for循环,表明for循环大括号中的程序循环执行10次{LED0=0; //将口赋值0,对外输出低电平Delay(5000); //调用延时程序;更改延时数字可以更改延时长度;//用于改变闪烁频率LED0=1; //将口赋值1,对外输出高电平Delay(5000);}for(i=0;i<10;i++){LED0=0; //将口赋值0,对外输出低电平Delay(60000); //调用延时程序;更改延时数字可以更改延时长度;//用于改变闪烁频率LED0=1; //将口赋值1,对外输出高电平Delay(60000);}//主循环中添加其他需要一直工作的程序}}/*------------------------------------------------延时函数,含有输入参数unsigned int t,无返回值unsigned int 是定义无符号整形变量,其值的范围是0~65535------------------------------------------------*/void Delay(unsigned int t){while(--t);}7-不同频率闪烁多个LED灯/*-----------------------------------------------名称:IO口高低电平控制论坛:编写:shifang日期:修改:无内容:点亮P1口的多个LED灯闪烁该程序是单片机学习中最简单最基础的,通过程序了解如何控制端口的高低电平------------------------------------------------*/#include<> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义sbit LED0=P1^0;// 用sbit 关键字定义LED到端口,LED是自己任意定义且容易记忆的符号sbit LED1=P1^1;sbit LED2=P1^2;sbit LED3=P1^3;sbit LED4=P1^4;sbit LED5=P1^5;sbit LED6=P1^6;sbit LED7=P1^7;void Delay(unsigned int t); //函数声明/*------------------------------------------------主函数------------------------------------------------*/void main (void){//此方法使用bit位对单个端口赋值unsigned char i; //定义一个无符号字符型局部变量i 取值范围0~255while (1) //主循环{for(i=0;i<10;i++) //加入for循环,表明for循环大括号中//的程序循环执行10次{LED0=0; //将口赋值0,对外输出低电平LED2=1;LED4=0;Delay(5000); //调用延时程序;更改延时数字可以更改延时长度;//用于改变闪烁频率LED0=1; //将口赋值1,对外输出高电平LED2=0;LED4=1;Delay(5000);}for(i=0;i<10;i++){LED0=0; //将口赋值0,对外输出低电平LED2=1;LED4=0;Delay(60000); //调用延时程序;更改延时数字可以更改延时长度;//用于改变闪烁频率LED0=1; //将口赋值1,对外输出高电平LED2=0;LED4=1;Delay(60000);}//主循环中添加其他需要一直工作的程序}}/*------------------------------------------------延时函数,含有输入参数unsigned int t,无返回值unsigned int 是定义无符号整形变量,其值的范围是0~65535------------------------------------------------*/void Delay(unsigned int t){while(--t);}8-8位LED左移/*-----------------------------------------------名称:IO口高低电平控制论坛:编写:shifang日期:修改:无内容:左移,直至LED全部点亮,左移符号<<------------------------------------------------*/#include<> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义void Delay(unsigned int t); //函数声明/*------------------------------------------------主函数------------------------------------------------*/void main (void){unsigned char i; //定义一个无符号字符型局部变量i 取值范围0~255Delay(50000);P1=0xfe; //赋初始值for(i=0;i<8;i++) //加入for循环,表明for循环大括号中的程序循环执行8次{Delay(50000);P1<<=1;}while (1) //主循环{//主循环中添加其他需要一直工作的程序}}/*------------------------------------------------延时函数,含有输入参数unsigned int t,无返回值unsigned int 是定义无符号整形变量,其值的范围是0~65535------------------------------------------------*/void Delay(unsigned int t){while(--t);}9-8位LED右移/*-----------------------------------------------名称:IO口高低电平控制论坛:编写:shifang日期:修改:无内容:右移,直至LED全部点亮,右移符号>>------------------------------------------------*/#include<> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义void Delay(unsigned int t); //函数声明/*------------------------------------------------主函数------------------------------------------------*/void main (void){unsigned char i; //定义一个无符号字符型局部变量i 取值范围0~255Delay(50000);P1=0x7f; //赋初始值for(i=0;i<8;i++) //加入for循环,表明for循环大括号中的程序循环执行8次{Delay(50000);P1>>=1;}while (1) //主循环{//主循环中添加其他需要一直工作的程序}}/*------------------------------------------------延时函数,含有输入参数unsigned int t,无返回值unsigned int 是定义无符号整形变量,其值的范围是0~65535------------------------------------------------*/void Delay(unsigned int t){while(--t);}10-LED循环左移/*-----------------------------------------------名称:IO口高低电平控制论坛:编写:shifang日期:修改:无内容:循环左移,始终一个led点亮,并循环执行流水动作,左移符号<< 逻辑或符号|------------------------------------------------*/#include<> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义void Delay(unsigned int t); //函数声明/*------------------------------------------------主函数------------------------------------------------*/void main (void){unsigned char i; //定义一个无符号字符型局部变量i 取值范围0~255Delay(50000);P1=0xfe; //赋初始值while (1) //主循环{for(i=0;i<8;i++) //加入for循环,表明for循环大括号中的程序循环执行8次{Delay(50000);P1<<=1;P1=P1|0x01; //左移后,最右端自动赋值0,所以需要该语句赋值1}P1=0xfe; //重新赋初始值//主循环中添加其他需要一直工作的程序}}/*------------------------------------------------延时函数,含有输入参数unsigned int t,无返回值unsigned int 是定义无符号整形变量,其值的范围是0~65535------------------------------------------------*/void Delay(unsigned int t){while(--t);}11-LED循环右移/*-----------------------------------------------名称:IO口高低电平控制论坛:编写:shifang日期:修改:无内容:循环右移,始终一个led点亮,并循环执行流水动作,右移符号>> 逻辑或符号|------------------------------------------------*/#include<> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义void Delay(unsigned int t); //函数声明/*------------------------------------------------主函数------------------------------------------------*/void main (void){unsigned char i; //定义一个无符号字符型局部变量i 取值范围0~255Delay(50000);P1=0x7f; //赋初始值while (1) , //主循环{for(i=0;i<8;i++) //加入for循环,表明for循环大括号中的程序循环执行8次{Delay(50000);P1>>=1;P1=P1|0x80; //右移后,最左端自动赋值0,所以需要该语句赋值1}P1=0x7f; //重新赋初始值//主循环中添加其他需要一直工作的程序}}/*------------------------------------------------延时函数,含有输入参数unsigned int t,无返回值unsigned int 是定义无符号整形变量,其值的范围是0~65535------------------------------------------------*/void Delay(unsigned int t){while(--t);}12-查表显示LED灯/*-----------------------------------------------名称:IO口高低电平控制论坛:编写:shifang日期:修改:无内容:通过查表获得1个字节的值然后赋值给P1端口,ROM允许情况可以设置更多表格------------------------------------------------*/#include<> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义/*------------------------------------------------查表表格------------------------------------------------*/unsigned char code table[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0xff,0xff,0x00,0x00,0x55,0x55,0xaa,0xaa};//rom允许情况可以无限添加/*------------------------------------------------函数声明------------------------------------------------*/void Delay(unsigned int t); //函数声明/*------------------------------------------------主函数------------------------------------------------*/void main (void){unsigned char i; //定义一个无符号字符型局部变量i 取值范围0~255while (1) //主循环{for(i=0;i<16;i++) //加入for循环,表明for循环大括号中的程序循环//执行16次,表明表格中有16个元素{P1=table[i];Delay(30000);}//主循环中添加其他需要一直工作的程序}}/*------------------------------------------------延时函数,含有输入参数unsigned int t,无返回值unsigned int 是定义无符号整形变量,其值的范围是0~65535------------------------------------------------*/void Delay(unsigned int t){while(--t);}13-双灯左移右移闪烁/*-----------------------------------------------名称:IO口高低电平控制论坛:编写:shifang日期:修改:无内容:2个led灯先左移,然后右移,然后同时闪烁------------------------------------------------*/#include<> //包含头文件,一般情况不需要改动,//头文件包含特殊功能寄存器的定义void Delay(unsigned int t); //函数声明/*------------------------------------------------主函数------------------------------------------------*/void main (void){unsigned char i; //定义一个无符号字符型局部变量i//取值范围0~255unsigned char temp;//定义临时变量用于转换while (1) //主循环{temp=0xfc;P1=temp;for(i=0;i<7;i++) //加入for循环,表明for循环大括号//中的程序循环执行7次{Delay(50000); //调用延时程序;更改延时数字可//以更改延时长度;用于改变闪烁频率temp<<=1;temp=temp|0x01; //也可以直接把temp换成P1P1=temp; //之所以加入temp做中间变量,转换//完成后直接赋值到端口,防止直接//操作端口造成的短暂闪烁}temp=0x3f;P1=temp;for(i=0;i<7;i++) //加入for循环,表明for循环大括号//中的程序循环执行7次{Delay(50000); //调用延时程序;更改延时数字可以//更改延时长度;用于改变闪烁频率temp>>=1;temp|=0x80; //等效于temp=temp|0x80P1=temp;}for(i=0;i<3;i++) //加入for循环,表明for循环大括号//中的程序循环执行3次{P1=0xff;Delay(50000);P1=0x00;Delay(50000);} //主循环中添加其他需要一直工作的程序}}/*------------------------------------------------延时函数,含有输入参数unsigned int t,无返回值unsigned int 是定义无符号整形变量,其值的范围是0~65535------------------------------------------------*/void Delay(unsigned int t){while(--t);}14-花样灯/*-----------------------------------------------名称:IO口高低电平控制论坛:编写:shifang日期:修改:无内容:花样灯一般有两种方法实现:1、程序循环执行2、查表法这里我们两种都使用一下------------------------------------------------*/#include<> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义/*------------------------------------------------花样表格------------------------------------------------*/unsigned char code seg[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0xff,0xff,0x00,0x00,0x55,0x55,0xaa,0xaa};//rom允许情况可以无限添加void Delay(unsigned int t); //函数声明/*------------------------------------------------主函数------------------------------------------------*/main(){unsigned char i; //定义一个无符号字符型//局部变量i 取值范围0~255 while(1){P1=0xFE; //第1个LED亮for(i=0;i<8;i++){Delay(20000);P1 <<=1;}P1=0x7F; //第8个LED亮for(i=0;i<8;i++){Delay(20000);P1 >>=1;}P1=0xFE; //第1个LED亮for(i=0;i<8;i++){Delay(20000);P1 <<=1;P1 |=0x01;}P1=0x7F; //第8个LED亮for(i=0;i<8;i++){Delay(20000);P1 >>=1;P1 |=0x80;}//下面通过查表方法获得花样参数for(i=0;i<16;i++)//查表可以简单的显示各种花样实用性更强{Delay(20000);P1=seg[i];}}}/*------------------------------------------------延时函数,含有输入参数unsigned int t,无返回值unsigned int 是定义无符号整形变量,其值的范围是0~65535------------------------------------------------*/void Delay(unsigned int t){while(--t);}15-PWM调光/*-----------------------------------------------名称:PWM调光论坛:编写:shifang日期:修改:无内容:通过PWM(脉宽调制)调节LED的亮度------------------------------------------------*/#include<> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义sbit LED0=P1^0;// 用sbit 关键字定义LED到端口,LED是自己任意定义且容易记忆的符号void Delay(unsigned int t); //函数声明/*------------------------------------------------主函数------------------------------------------------*/void main (void){unsigned int CYCLE=600,PWM_LOW=0;//定义周期并赋值while (1) //主循环{LED0=1;Delay(60000); //特意加延时,可以看到熄灭的过程for(PWM_LOW=1;PWM_LOW<CYCLE;PWM_LOW++){ //PWM_LOW表示低//电平时间,这个循环中低电平时长从1累加到CYCLE(周期)的值,即600次LED0=0; //点亮LEDDelay(PWM_LOW);//延时长度,600次循环中从1加至599LED0=1; //熄灭LEDDelay(CYCLE-PWM_LOW);//延时长度,600次循环中从599减至1}LED0=0;for(PWM_LOW=CYCLE-1;PWM_LOW>0;PWM_LOW--){ //与逐渐变亮相反的过程LED0=0;Delay(PWM_LOW);LED0=1;Delay(CYCLE-PWM_LOW);}//主循环中添加其他需要一直工作的程序}}/*------------------------------------------------延时函数,含有输入参数unsigned int t,无返回值unsigned int 是定义无符号整形变量,其值的范围是0~65535------------------------------------------------*/void Delay(unsigned int t){while(--t);}16-共阳数码管静态显示/*-----------------------------------------------名称:单个共阳数码管静态显示论坛:编写:shifang日期:修改:无内容:通过赋值给P1,让数码管显示特定的字符或者数字------------------------------------------------*/#include<> //包含头文件,一般情况不需要改动,//头文件包含特殊功能寄存器的定义void main (void){P1=0xc0; //二进制为1100 0000 参考数码管排列,//可以得出0对应的段点亮,1对应的段熄灭,结果显示数字"0"while(1){}}17-1个共阳数码管显示变化数字/*-----------------------------------------------名称:单个共阳数码管动态显示变化数字论坛:编写:shifang日期:修改:无内容:通过循环赋值给P1,让数码管显示特定的字符或者数字------------------------------------------------*/#include<> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义unsigned char code dofly_table[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x77,0x7c,0x39,0x5e,0x79, 0x71,};// 显示数值表0-9void Delay(unsigned int t); //函数声明/*------------------------------------------------主函数------------------------------------------------*/void main (void){unsigned char i; //定义一个无符号字符型局部变量i 取值范围0~255while (1) //主循环{for(i=0;i<16;i++) //加入for循环,表明for循环大括号中的程序循环执行10次{P1=dofly_table[i]; //循环调用表中的数值Delay(60000); //延时,方便观看数字变化}//主循环中添加其他需要一直工作的程序}}/*------------------------------------------------延时函数,含有输入参数unsigned int t,无返回值unsigned int 是定义无符号整形变量,其值的范围是0~65535------------------------------------------------*/void Delay(unsigned int t){while(--t);}18-单个数码管模拟水流/*-----------------------------------------------名称:单个共阳数码管模拟水流论坛:编写:shifang日期:修改:无内容:通过循环赋值给P1,让数码管显示特定流动样式------------------------------------------------*/#include<> //包含头文件,一般情况不需要改动,//头文件包含特殊功能寄存器的定义void Delay(unsigned int t); //函数声明/*------------------------------------------------主函数------------------------------------------------*/void main (void){unsigned char i; //定义一个无符号字符型局部变量i 取值范围0~255while (1) //主循环{P1=0xfe;for(i=0;i<6;i++) //加入for循环,表明for循环大括号中的程序循环执行6次Delay(10000);P1<<=1;P1|=0x01;}//主循环中添加其他需要一直工作的程序}}/*------------------------------------------------延时函数,含有输入参数unsigned int t,无返回值unsigned int 是定义无符号整形变量,其值的范围是0~65535------------------------------------------------*/void Delay(unsigned int t){while(--t);}19-按键控制单个数码管显示/*-----------------------------------------------名称:单个共阳数码管动态显示变化数字论坛:编写:shifang日期:修改:无内容:通过循环检测P1口按键输入值,然后用数码管输出,没有按键按下时原值不变------------------------------------------------*/#include<> //包含头文件,一般情况不需要改动,//头文件包含特殊功能寄存器的定义unsigned char code dofly_table[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,};// 显示数值表0-9/*------------------------------------------------主函数------------------------------------------------*/void main (void){while (1) //主循环{switch(P3) //P3口作为独立按键输入端,检测端口电平并做如下判断{case 0xfe:P1=dofly_table[1];break;//0xfe = 1111 1110,//说明连接在端口的按键被按下,显示对应的数字然后跳出循环case 0xfd:P1=dofly_table[2];break;//调用表中的第三个//元素0xa4 下标0 才表示数组中的第一个元素case 0xfb:P1=dofly_table[3];break;case 0xf7:P1=dofly_table[4];break;case 0xef:P1=dofly_table[5];break;case 0xdf:P1=dofly_table[6];break;case 0xbf:P1=dofly_table[7];break;case 0x7f:P1=dofly_table[8];break;default:break; //如果都没按下,直接跳出}//主循环中添加其他需要一直工作的程序}}20-单个数码管指示逻辑电平/*-----------------------------------------------名称:单个共阳数码管指示逻辑电平论坛:编写:shifang日期:修改:无内容:通过循环检测口电平输入值,然后用数码管输出"H" or "L",表示该端口现在连接的是高电平还是低电平------------------------------------------------*/#include<> //包含头文件,一般情况不需要改动,//头文件包含特殊功能寄存器的定义sbit IO_IN=P3^2; //定义IO 信号输入端/*------------------------------------------------主函数------------------------------------------------*/void main (void){while (1) //主循环{if(IO_IN==1)//如果端口检测到1表示高电平P1=0x89; //"H"elseP1=0xc7; //"L"//否则表示低电平,这里使用条件语句if 。
9单片机接口技术及实例仿真
独立式键盘与单片机的接口
行列式键盘与单片机的接口
行列式键盘结构
检测键盘有无闭合以及查找闭合键的键号,一般采用扫
描法。
1.先向所有连接线的I/O线输出0,然后检测连接行线
的按键状态,由相应的I/O线读入累加器A中。有键按下 时,对应的行线输入0,无键按下时所有的行线输入为1 。
9.2 键盘接口应用实例与仿真 27
74HC595是具有8位移位寄存器和一个存储器,三态输
出功能。 移位寄存器和存储器使用独立的时钟。数据 在SH_CP的上升沿输入,在ST_CP的上升沿进入的存 储寄存器中去。如果两个时钟连在一起,则移位寄存器 总是比存储寄存器早一个脉冲。移位寄存器有一个串行 移位输入端DS,一个串行输出Q7’。当多个74HC595并 列使用时,可以将第一片74HC595的Q7’和第二片 74HC595的DS连接实现多片扩展。 是输出使能端,该 端为低电平时,数据从74HC595寄存器内输出到数据总 线上。下面以例9.2说明74HC595扩展并驱动LED点阵 的方法。
例5 4×4矩阵键盘扫描
功能:4×4矩阵键盘共16个键,第一行按键从左到右依次
对应数字1~4;第二行按键从左到右依次对应数字5~8; 第三行和第四行按键按同样的设臵方法,按键分别对应数 字9~16。每按一次键,数码管就显示一次按键代表的数字
LED数码管有静态显示和动态显示两种方式
9.1 显示器接口应用实例与仿真 7
发光二级管(LED)及数码管
例1 74LS244驱动数码管实现静态显示
功能:实现0 ~9循环计数,计数时间间隔1s。
说明:在电路中使用了74LS244 驱动芯片。该芯片引
脚A0~A3为输入口,Y0~Y3为输出口, 是低电平 有效三态允许端。74LS244在使用的时候, 需接低电 平,A0~A3输入高电平或低电平时,Y0~Y3相应的 输出高电平或低电平。若 接高电平,无论输入端是 什么电平,输出端都是高阻状态。74LS244的实物是 8个输入端和8个输出端,在proteus仿真库内只显示 了4组输入输出,这一点请读者学习时注意参考 74LS244的说明书。
单片机仿真代码
单片机仿真代码1. 简介单片机(Microcontroller)是一种集成了微处理器、内存和外围设备的集成电路芯片。
它广泛应用于嵌入式系统中,能够实现各种控制和处理功能。
在开发单片机应用程序时,我们通常需要进行仿真测试,以确保代码的正确性和稳定性。
本文将介绍单片机仿真代码的相关知识,并提供一些常见的仿真代码示例。
2. 单片机仿真工具在编写单片机仿真代码之前,我们需要选择合适的仿真工具。
以下是几个常用的单片机仿真工具:•Proteus:Proteus是一款功能强大的电子电路设计软件,它提供了完整的单片机仿真环境。
•Keil:Keil是一款集成开发环境(IDE),提供了强大的编译、调试和仿真功能。
•MPLAB X IDE:MPLAB X IDE是为Microchip系列单片机设计的IDE,支持多种编程语言和调试工具。
选择合适的仿真工具可以根据自己熟悉程度、项目需求以及软件特点等因素进行权衡。
3. 单片机仿真代码示例3.1 LED闪烁程序以下是一个使用C语言编写的LED闪烁程序的仿真代码示例:#include <reg51.h>sbit LED = P1^0;void delay(unsigned int count) {unsigned int i, j;for(i = 0; i < count; i++)for(j = 0; j < 1000; j++);}void main() {while(1) {LED = 0;LED = 1;delay(100);}}这段代码使用了51系列单片机的寄存器定义和延时函数,通过控制LED引脚的电平实现LED的闪烁效果。
3.2 温度传感器读取程序以下是一个使用C语言编写的温度传感器读取程序的仿真代码示例:#include <reg51.h>sbit SDA = P2^0;sbit SCL = P2^1;void delay_us(unsigned int us) {while(us--);}void start() {SDA = 1;SCL = 1;delay_us(5);SDA = 0;delay_us(5);SCL = 0;}void stop() {SDA = 0;SCL = 1;delay_us(5);SDA = 1;}unsigned char read_byte() {unsigned char i, byte = 0;for(i=0; i<8; i++) {byte <<= 1;SCL = 1;byte |= SDA;SCL = 0;delay_us(5);}return byte;}void main() {unsigned char temperature;while(1) {start();write_byte(0x90); // 发送温度传感器地址write_byte(0x00); // 发送温度传感器数据地址start();write_byte(0x91); // 发送温度传感器地址(读取模式)temperature = read_byte(); // 读取温度值stop();// 在这里进行温度值的处理和显示delay_ms(1000);}}这段代码通过I2C总线协议与温度传感器通信,读取并处理温度值,并可以在外部设备上显示出来。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《单片机实验仿真50例》说明
《单片机原理与控制技术》(第3版)和《单片机学习指导及习题解答》(第2版)已经出版,该书封面广告词中有一句“免费下载仿真DSN文件和hex文件”。
《单片机实验仿真50例》即为与该二本书配套的Proteus仿真文件包,50例全部取自于二本书中例题和习题。
但仅提供仿真电路DSN文件和驱动程序hex文件,没有源程序(源程序印在书上)。
读者从网上免费下载后,可对照书中程序,边学边练。
文件包共分8章50例(不计一题多解),每章用一个大文件夹,大文件夹中包含若干子文件夹。
每个子文件夹即为一个仿真题目,取一简明名称,体现其内容和功能。
子文件夹中,包含一个DSN文件、若干hex文件和一个调试提示。
hex文件分两类:一类是汇编程序形成的hex文件,用“×××asm.hex”表示;另一类是C51程序形成的hex文件,用“×××c.hex”表示。
其中,“×××”通常用“例×-×”或“习题×-×”表示,以表明其在书中的位置,便于读者查照。
有的题目还一题多解,有几个同类hex文件。
“例×-×”程序在《单片机原理与控制技术》(第3版)中,“习题×-×”程序在与教材书配套的《单片机学习指导及习题解答》(第2版)中。
为帮助读者操作,每一题均附有调试提示。
一般给出原理电路图,少量解释和调试操作步骤。
除标题按目录标示,题号、图号仍沿用书中原题号、图号,以便读者查照。
为便于读者观察仿真运行效果,有的题目增加了原书中没有的显示电路和显示程序,增加部分程序均在调试提示中给出。
需要注意的是,原书为节省版面,有的程序在调用前面已用过的子程序时,没有将子程序同时刊出(例如延时程序),读者在自行输入程序并Keil调试时,必须同时补充输入该子程序,否则编译器会提示出错。
仿真运行方法和步骤:打开DSN文件(须事先下载安装Proteus7.6以上软件),若运行已经装入的hex文件,可直接左键单击全速运行按钮;若需运行子文件夹中其它hex文件,可左键双击仿真电路图中A T89C51,选择处于同一文件夹中的其它hex文件,再全速运行。
张志良。