



版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
51单片机C语言经典事例教程51单片机C语言经典事例教程目录目 -1•例1编写程序,点亮第一个发光二极管 -5-例2编写程序,点亮P1口的若干二极管 -5一例3利用for语句延时特性,编写第一个发光二极管以间隔1S亮灭闪动的程序.....-5一例4编写程序使第一个发光二极管以间隔500ms亮灭闪动 -6-例5编写程序使第一个二极管以亮200ms、灭800ms的方式闪动。 -6一例6利用C51自带库_crol_(),以间隔500ms,实现流水灯程序 -7一例3.2.1篇写重序使第一个数码管显示8(part2.1_.lcP59) - 7一例3.2.2让实验板上6个数码管同时点亮,依次显示〇到F,时间间隔为0.5ms,循环下去。(part2.1_2.cP61) -8•例3.3.1第一个数码管显示1,时间为0.5s,然后关闭它,立即让第二个数码管显示2,时间为0.5s,在关闭它,,,,一直到最后ー个数码管显示6,时间同样为0.5s,关闭它之后再回来显示第一个数码管,一直循环下去。(part2.1_3.cP62) - 9一例3.5.1利用定时器0工作方式1,在实验板上实现第一个发光管以!s亮灭闪烁。(part2.1.4.cP74) -11•例3.5.2用定时器〇的方式1实现第一个发光二极管以200ms间隔闪烁,用定时器1的方式1实现数码管前两位59s循环计时。(part2.1_5.cP75) - 11-例4.1.1用数码管前两位显示ー个十进制数,变化范围为〇〇〜59,开始时显示00,每按下S2键•次,数值加1;每按下S3键一次,数值减1;每按下S4键一次,数值归零;按下S5键一次,利为定时器功能使数值开始自动每秒加1,再次按下S5键,数值停止加1,保持显示 原 数。 ( part2.2_l.cP82) -14•例4.2.1实验班上电时,数码管不显示,顺序按下矩阵键盘后,数码管上依次显示〇〜F,六个数码管同时静态显示即可。(part2.2_2.cP87) - 17•例5.3.1用单片机控制ADC0804进行数模转换,当拧动实验板上A/D旁边的电位时,在数码管的前三位以十进制方式显示出A/D转换后的数字量(8位A/D转换后数值在0-255变化)。(part2.3_l.cP107) -21--1-51单片机C语言经典事例教程例5.5.1用单片机控制DAC0832芯片输出电流,让发光二级管D12由灭均匀变到最亮,再由最亮均匀熄灭。在最亮和最暗时使用蜂鸣器分别警报一声,完成整个周期时间控制在5S左右,循环变化。(part2.3_2.cP121) -23一例6.5.1在上位机上用串口调试助手发送ー个字符X,单片机收到字符后返回给上位机"IgetX”,串口波特率设为9600bps。(part2.4_l,cP137) -25一例6.6.1单片机上电后等待女上位机串口发来的命令,同时在数码管的前三位以十进制方式显示A/D采集的数值,在未收到上位机发送来的启动A/D转换命令之前数码管始终显示〇〇〇〇当收到上位机以十六进制发送来的01后,向上位机发送字符串“Turnonad!”同时间隔1s读取ー・次A/D的值,然后把A/D采集回来的8位二进制转换成十进制表示的实际电压浮点数,并且从串口发送给上位机,形式如“Thevoltageis3.398438V”,发送周期也是一秒一次,同时在数码管上也要每秒刷新现实的数值。当收到上位机以十六进制发送过来的02后,向上位机发送字符串“Turnoffad!”,然后停止发送电压值,数码管上显示上次结束时保持的值。当收到上位机发来的其他任何数时,向上位机发送字符串“Error!”。 -27一例7.2.1实现1602液晶的第一行显示“ILOVEMCU!”,在 第 二 行 显 示WWW.TXMCU.COM〇 -31•例7,2.2实现1602第一行从左侧移入“Helloeveryone!”同时第二行从右侧移入“Welcometohere!”,移入速度自定,然后停留在屏幕上。(part2.5_2.cP154) -33•例7.3.1实现12232液晶的第一行显示“ILOVEMCU!”,第二行显示“我爱单片机”。(part2.5_3.cP160) -34•例7.3.2实现12232液晶第一行从右侧移入“Helloeveryone!^^,同时第二行从右侧移入“欢迎大家来学习!”移入速度自定,最后停留在屏幕上。(part2.5_4.cP163) -37•例7.4.1实现在12864液晶上第一行显示“0123456789”,并且让每一位数字随机变化,第二行显示“/r/”,第三行显示“天祥电子”,第四行对应第三行显示出下划线。(part2,5_5.cP173) -40•知识点: 生成随机数( part2,5_512232suiji.cP176) - 44-例8.3.1利用定.器产生一个〇〜99秒变化的秒表,并且显示在数码管上,每过一秒将这个变化的数写入板上AT24C02P188) -48--2-51单片机C语言经典事例教程例10.1.1利用定时器〇工作方式〇,在实验板上实现第一个发光管以1s亮灭闪烁。 ( part3.1.1.cP203) -53-例10.2.1利用定时器〇工作方式2,在实验板上实现第一个发光管以1s亮灭闪烁。( part3.1.2.cP204) -54-例10.3.1利用定时器工作方式3,在实验板上实现:用TL0计数器对应的8位定时器实现第一个发光管以!s亮灭闪烁,用TH0计数器对应的8位定时器实现第二个发光管以0.5s亮灭闪烁。(part3.1.3.cP206) -54•例10.5.1利用计数器〇工作方式1,在实验板上实现:用・根导线一端连接GND引脚,另一端去接触T0(P3.4)引脚,每接触一下,计数器计ー次数,将所计的数值实时显示在数码管的前两位,计满100时清0,再从头计起。(part3.1.4.cP214) - 55一例11.1.1设置单片机串行口的工作模式〇,间隔循环发送十六进制数OxAA,然后用双路示波器观察P3.0和P3.1口波形。( -58一例11.3.1用交叉串口线连接两块实验板,或直接用短线交叉线连接连个单片机的P3.0和P3.1ロ(共地)。在ー块板上编写矩阵键盘扫描程序,当扫描到有键按下时,将键值通过串口发送出去,另ー块板上单片机收到串口发送来的键值后,将对应键值以0-F方式显示在数码管上。 .……-60-例11.4.I程序分为主机程序和从机程序,约定一次传送的数据为16B,以02H地址的从机为例。(图!1.4.2为多机通信主机程序流程图) -65-图11.4.3为多机通信从机程序流程图。 -68-从机程序代码:(part3.2.6.cP234) -68"例12.8.1指针使用例程: (point.cP264) - 71•例13.1.1编写程序实现:开启两个外部中断,设置低电平触发中断,用定时器计数并且显示在数码管的前两位,当计数到5时,使单片机进入空闲(休眠)模式,同时关闭定时器,当单片机响应外部中断后,从空闲(休眠)模式返回,同时开启定时器。( -72-例13.2.1实验板上实现如下描述:程序启动后设定看门狗溢出时间为2s,然后点亮第一个发光二极管,稍延时一会,然后熄灭发光二极管,使程序进入等待死循环状态,并且在死循环中大约每隔!s喂狗一次,看程序运行是否正常。 -74一例13.6.1.在实验板上实现:操作STC单片机自带的E2PROM,存储ー组按秒递增的两位数据,并且将数据实时显示在数码管上,数据每变化一次就往E2PR0M中写入一次,当关闭实验ー3-51单片机C语言经典事例教程板电源并再次开启电源时,从E2PROM中读取先前存储的数据,接着递增显示。......-77一例13.7.1STC89LE516AD/X2系列单片机的A/D转换功能。时钟11.0592MHz,转换结果以16进制形式输出到串行口,可以用串行口调试程序,观察输出结果(本代码摘自宏晶科技芯片手册,经作者调试可正常运行)。 - 80一例13.8.1给出一个STC12c5412AD应用的参考程序。(part3.4.6.cP287) -82•程序14.3.1利用51单片机的定时器设计ー个时钟。 -89-程序15.5.1使用DS12C887时钟芯片设计高精度时钟。 -97-程序16.3.1使用TX-1C实验板上的DS18B20温度传感器设计温控系统C语言源代码(part4.3P349) -108-程序17.3.1太阳能充ノ放电控制器C语言源代码 -114-ISD400X系列语音芯片C语言参考程序: -134-例21.1.1使用TX-1C实验板上两个独立按键调节直流电机的转速,同时在实验板的数码管上象征性的显示相应的转速值。通过控制单片机输出不同占空比的PWM信号来控制直流电机的转速(感性认识)。(part5.3P434) -138-例21.2.1步进电机应用C语言程序设计(part3.2P444) -142一例21.3.1舵机应用C语言程序设计实例:开机时舵机角度自动转为〇度,通过实验板上的独立按键调节舵机的角度转动,并且在实验板数码管上显示相应的角度。本例仅演示5个角度的控制,若想实现任意角度控制请大家自行编程实验。程序代码如下:(part5.3P453).-145-〃调节舵机使之转动5个角度04590135180PWM信号周期为20ms, -145ー〃控制高电平的持续时间即可控制舵机停止制动的角度, 0.5ms-0度 1-45 1.5-90 2-1352.5-180 -145 -〃程序流程是:开机时舵机角度自动转为〇度,按下P3.7则转到45度,以后就根据两个按键的按下而转动 -145--4-51单片机C语言经典事例教程例1编写程序,点亮第一个发光二极管#include<reg52.h>//52系列单片机头文件sbitledl=Pl;〃声明单片机Pl口的第一位voidmain() 〃主函数{led1=0; /・点亮第一个发光二极管*/}例2编写程序,点亮P1口的若干二极管#include<reg52.h>//52系列单片机头文件voidmain() 〃主函数{Pl=Oxaa;//while(l);例3利用for语句延时特性,编写第一个发光二极管以间隔1S亮灭闪动的程序#include<reg52.h> //52系列单片机头文件#defineuintunsignedint〃宏定义sbitledl=Pl;〃声明单片机Pl□的第一位uinti,j;voidmain()〃主函数{while(l)〃大循环led1=0; /・点亮第一个发光二极管*/for(i=l;i>0;i—)〃延时for(j=110;j>0;j-);ledl=l; /・关闭第一个发光二极管*/for(i=1000;i>0;i-)〃延时for(j=110;j>0;j-);~5-51单片机C语言经典事例教程例4编写程序使第一个发光二极管以间隔500ms亮灭闪动#include<reg52.h>#defineuintunsignedintsbitledl=Pl;voiddelayls();voidmain(){while(l){led1=0;delayls();ledl=l;delayls();}}voiddelayls()!uinti,j;for(i=500;i>0;i—)for(j=110;j>0;j-);)〃52系列单片机头文件〃宏定义〃声明单片机P1口的第一位〃声明子函数〃主函数 〃大循环/・点亮第一个发光二极管・/〃调用延时子函数/・关闭第一个发光二极管・/〃调用延时子函数〃子函数体例5编写程序使第一个二极管以亮200ms、灭800ms的方式闪动。#include<reg52.h>#defineuintunsignedintsbitled1=P1;voiddelayms(uint);voidmain()while(l){led1=0;delayms(200);ledl=l;delayms(800);voiddelayms(uintxms)〃52系列单片机头文件〃宏定义〃声明单片机P1口的第一位〃声明子函数〃主函数 〃大循环 /・点亮第一个发光二极管*/〃延时200毫秒/・关闭第一个发光二极管*/〃延时800毫秒 ー6-5I单片机C语言经典事例教程}uinti,j;for(i=xms;i>0;i—) //i=xms即延时约xms毫秒for(j=110;j>0;j-);例6利用C5I自带库_crol_(),以间隔500ms,实现流水灯程序#include<reg52.h>//52系列单片机头文件#include<intrins.h>#defineuintunsignedint 〃宏定义#defineucharunsignedcharvoiddelayms(uint); 〃声明子函数ucharaa;voidmain() 〃主函数{aa=0xfe; 〃赋初值11111110while(l)〃大循环{Pl=aa;delayms(500); 〃延时500毫秒aa=_crol_(aa,l);〃将aa循环左移1位后再赋给aa))voiddelayms(uintxms){uinti,j;for(i=xms;i>0;i—) //i=xms即延时约xms毫秒for(j=110;j>0;j-);例321编写程序使第一个数码管显示8(part2.l_.lcP59)#include<reg52.h> //52系列单片机头文件sbitdula=P2-; 〃申明UI锁存器的锁存端sbitwela=P2«; 〃申明U2锁存器的锁存端voidmain(){wela=l; 〃打开U2锁存器-7-51单片机C语言经典事例教程P0=0xFE; 〃送入位选信号wela=0; 〃关闭U2锁存器dula=l; 〃打开U1锁存器P0=0x7F; 〃送入段选信号dula=0; 〃关闭U2锁存器while(l); 〃程序停止到这里例3.2.2让实验板上6个数码管同时点亮,依次显示0到F,时间间隔为0.5ms,循环下去。(part2,1_2.cP61)#include<reg52,h> 〃52系列单片机头文件#defineucharunsignedchar#defineuintunsignedintsbitdula=P2-: 〃申明UI锁存器的锁存端sbitwela=P2・; 〃申明U2锁存器的锁存端ucharnum;uncharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};voiddelayms(uint);voidmain(){wela=1;〃打开U2锁存端P0=0xco;〃送入位选信号wela=0;〃关闭U2锁存端while(l){for(num=0;num<16;num++)//16个数循环显示{dula=l;〃打开U1锁存端P0=table[num]; 〃送入段选信号dula=O;〃关闭UI锁存端delay(500);〃延时0.5秒)voiddelayms(uintxms)-8-51单片机C语言经典事例教程uinti,j;for(i=xms;i>0;i—)//i=xms即延时约xms毫秒for(j=l10;j>0;j-);例331第一个数码管显示1,时间为0.5s,然后关闭它,立即让第二个数码管显示2,时间为0.5s,在关闭它,”,一直到最后ー个数码管显示6,时间同样为0.5s,关闭它之后再回来显示第一个数码管,一直循环下去。(part2.1_3.cP62)#include<reg52.h> //52系列单片机头文件#defineucharunsignedchar#defineuintunsignedintsbitdula=P2-; 〃申明UI锁存器的锁存端sbitwela=P2>; 〃申明U2锁存器的锁存端ucharnum;uncharcodetable[]={Ox3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};voiddelayms(uint);voidmain()(while(l){dula=l;PO=table[l];〃送段选数据dula=0;PO=Oxff: 〃送位选数据前关闭所有显示,防止打开位选锁存时wela=l; 〃原来段选数据通过位选锁存器造成混乱P0=0xfe; 〃送位选数据wela=0;delayms(500);〃延时dula=l;PO=table⑵;〃送段选数据
dula=O;PO=Oxff;dula=O;PO=Oxff;-9-〃送位选数据前关闭所有显示,防止打开位选锁存时5I单片机C语言经典事例教程wela=l; 〃原来段选数据通过位选锁存器造成混乱 PO=Oxfd;//送位选数据wela=O;delayms(500);〃延时dula=l;P0=table[3];〃送段选数据dula=O;PO=Oxff; 〃送位选数据前关闭所有显示,防止打开位选锁存时 wela=l;〃原来段选数据通过位选锁存器造成混乱 PO=Oxfb;〃送位选数据wela=O;delayms(500);〃延时dula=l;P0=table[4];〃送段选数据dula=O;PO=Oxff; 〃送位选数据前关闭所有显示,防止打开位选锁存时 wela=l;〃原来段选数据通过位选锁存器造成混乱 P0=0xf7; 〃送位选数据wela=O;delayms(500);〃延时dula=l;P0=table[5];〃送段选数据dula=O;PO=Oxff; 〃送位选数据前关闭所有显示,防止打开位选锁存时 wela=l;〃原来段选数据通过位选锁存器造成混乱 PO=Oxef: 〃送位选数据wela=O;delayms(500);〃延时dula=l;P0=table[6];〃送段选数据dula=O;PO=Oxff; 〃送位选数据前关闭所有显示,防止打开位选锁存时 wela=l;〃原来段选数据通过位选锁存器造成混乱 PO=Oxdf; 〃送位选数据wela=O;delayms(500);〃延时voiddelayms(uintxms)-10-51单片机C语言经典事例教程uinti,j;for(i=xms;i>0;i—)//i=xms即延时约xms毫秒for(j=110;j>0;j-);}例3.5.1利用定时器。工作方式!,在实验板上实现第一个发光管以1s亮灭闪烁。(part2.1.4.cP74)#include<reg52,h> //52系列单片机头文件#defineucharunsignedchar#defineuintunsignedintsbitledl=Pl;ucharnum;voidmain(){TMOD=0x01; 〃设置定时器〇为工作方式1(MIMO为01)TH0=(65536-45872)/256;〃装初值!1.0592M晶振定时50ms数为45872TL0=(65536-45872)%256;EA=1; 〃开总中断ETO=1: 〃开定时器〇中断TRO=1; 〃启动定时器〇while(l); 〃程序停止在这里等待中断中断发生voidTO_time()interrupt1!TH0=(65536-45872)/256; 〃重装初值TL0=(65536-45872)%256;num++;//num每加1次判断一次是否到20次if(num==20)〃如果到了20次,说明1秒时间到{num=0; 〃然后把num清0重新再计20次ledl=~ledl;〃让发光管状态取反例3.5.2用定时器0的方式1实现第一个发光二极管以200ms间隔闪烁,用定时器1的方式1实现数码管前两位-list单片机C语言经典事例教程59s循环计时。(part2.1_5.cP75)
#include<reg52.h>#defineucharunsignedchar#defineuintunsignedintsbitdula=P2-;#include<reg52.h>#defineucharunsignedchar#defineuintunsignedintsbitdula=P2-;sbitwela=P2e;//52系列单片机头文件〃申明U1锁存器的锁存端〃申明U2锁存器的锁存端sbitledl=Pl;uncharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};voiddelayms(uint);voiddisplay(uchar,uchar);ucharnum,num1,num2,shi,ge;voidmain()(TMOD=Oxll; 〃设置定时器0为工作方式1(M1M0为11)TH0=(65536-45872)/256;〃装初值!1.0592M晶振定时50ms数为45872TL0=(65536-45872)%256;TH1=(65536-45872)/256;〃装初值!1.0592M晶振定时50ms数为45872TLl=(65536-45872)%256;EA=1; 〃开总中断ET0=l; 〃开定时器〇中断ET1=1; 〃开定时器1中断TR0=l; 〃启动定时器〇TR1=1; /Z启动定时器1while(l); 〃程序停止在这里等待中断中断发生{display(shi,ge);voiddisplay(ucharshi,ucharge)〃显示子函数(dula=l;PO=table[shi]; 〃送段选数据dula=0;PO=Oxff; 〃送位选数据前关闭所有显示,防止打开位选锁存时 wela=l;〃原来段选数据通过位选锁存器造成混乱 P0=0xfe; 〃送位选数据wela=0;delayms⑸; 〃延时51单片机C语言经典事例教程dula=l;PO=table[ge];〃送段选数据dula=O;PO=Oxff; 〃送位选数据前关闭所有显示,防止打开位选锁存时 wela=l;〃原来段选数据通过位选锁存器造成混乱 PO=Oxfd; 〃送位选数据wela=O;delayms⑸; 〃延时voiddelayms(uintxms){uinti,j;for(i=xms;i>0;i—) //i=xms即延时约xms毫秒for(j=110;j>0;j-);voidT0_time()interrupt1{TH0=(65536-45872)/256;〃重装初值TL0=(65536-45872)%256;num++;if(numl==4) 〃如果到了4次,说明200ms时间到{num1=0; 〃然后把numl清〇重新再计4次ledl=~ledl;//让发光管状态取反}}voidTl_time()interrupt3{TH1=(65536-45872)/256;〃重装初值TL1=(65536-45872)%256;num2++;if(num2==20) 〃如果到了20次,说明1秒刷新时间到{num2=0; 〃然后把num2清〇重新再计4次num++;if(num==60) 〃这个数用来送数码管显示,到60后归0num=0;shi=num/10; 〃把ー个2位数分离后分别送数码管显示ge=num%10;〃十位和个位}51单片机C语言经典事例教程}例4.1.1用数码管前两位显示ー个十进制数,变化范围为。。〜59,开始时显示〇〇,每按下S2键一次,数值加1;每按下S3键一次,数值减1;每按下S4键一次,数值归零;按下S5键一次,利用定时器功能使数值开始自动每秒加1,再次按下S5键,数值停止加1,保持显示原数。(part2.2_l.cP82)#include<reg52.h>//52系列单片机头文件#defineucharunsignedchar#defineuintunsignedintsbitkeyl=P3J;sbitkey2=P3|;sbitkey3二P3-;sbitkey4=P3・;sbitdula=P2-;〃申明U!锁存器的锁存端sbitwela=P2・;〃申明U2锁存器的锁存端ucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};voiddelayms(uint);ucharnumt0,num;voiddisplay(ucharnumdis)〃显示子函数(51单片机C语言经典事例教程ucharshi,ge; 〃分离两个分别要显示的数shi=numdis/10;ge=numdis%10;dula=l;PO=table[shi]; 〃送十位段选数据dula=0;PO=Oxff;〃送位选数据前关闭所有显示,防止打开位选锁存时wela=l;//原来段选数据通过位选锁存器造成混乱P0=0xfe;〃送位选数据wela=0;delayms(5);〃延时dula=l;P0=table[ge];〃送个位段选数据dula=0;P0=0xff;wela=l;
PO=Oxfd;wela=O;delayms(5);uinti,j;for(i=xms;i>0;i-)uinti,j;for(i=xms;i>0;i-)//i=xms即延时约xms毫秒 for(j=l10;j>0;j—);voidinit() 〃初始化函数{TMOD=0x01;/Z设置定时器〇为工作方式1(00000001)TH0=(65536-45872)/256;〃装初值50ms一次中断TL0=(65536-45872)%256;EA=I;〃开总中断ET0=l;〃开定时器〇中断)voidkeyscan(){if(keyl==O){delayms(lO);if(keyl==O){num++;51单片机C语言经典事例教程if(num==60)〃当到60时重新归〇num=0;while(!keyl);〃等待按键释放 })if(key2=0){delayms(lO);if(key2==0)if(num==0)〃当至リ〇时重新归60 num=60;num—;while(!key2);if(key3==0)delayms(lO);if(key3==0){num=O;〃清0while(!key3);))if(key4==0){delayms(lO);if(key4==0){while(!key4);TRO=~TRO”启动或停止定时器〇 }voidmain(){init();〃初始化函数while(l)keyscan();display(num);}}5I单片机C语言经典事例教程voidT0_time()interrupt1!TH0=(65536-45872)/256;〃重装初值TL0=(65536-45872)%256;numtO++;if(numt0==20)〃如果到了20次,说明1秒时间到{numt0=0;〃然后把num清。重新再计20次num++;if(num==60)num=0;例4.2.1实验班上电时,数码管不显示,顺序按下矩阵键盘后,数码管上依次显示〇〜F,六个数码管同时静态显示即可。(part2,2_2.cP87)#include<reg52.h> //52系列单片机头文件#defineucharunsignedchar#defineuintunsignedintsbitdula=P2-;〃申明UI锁存器的锁存端sbitwela=P2*;〃申明U2锁存器的锁存端ucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};voiddelayms(uintxms){uinti,j;for(i=xms;i>0;i—) //i=xms即延时约xms毫秒for(j=110;j>0;j-);)voiddisplay(ucharnum)(P0:taHefnum];〃显示函数只送段选数据dula=l;dula=0;}voidmatrixkeyscan()51单片机C语言经典事例教程{uchartemp,key;P3=0xfe;temp=P3;temp=temp&0xf0;if(temp!=0xf0)(delayms(lO);temp=P3;temp=temp&0xf0;if(temp!=OxfO){temp=P3;switch(temp)(caseOxee:key=O;break;caseOxde:key=l;break;caseOxbe:key=2;break;case0x7e:key=3;break;}while(temp!=OxfO)(temp=P3;temp=temp&OxfD; }display(key);})P3=Oxfd;temp=P3;temp=temp&OxfO;if(temp!=OxfO){delayms(lO);temp=P3;temp=temp&OxfO;if(temp!=OxfO)5I单片机C语言经典事例教程{temp=P3;if(temp!=OxfO)switch(temp)(caseOxed:key=4;break;caseOxdd:key=5;break;caseOxbd:key=6;break;caseOx7d:key=7;break;}
while(temp!=OxfO)temp=P3;temp=temp&OxfO; }break;display(key);}}P3=0xfb;temp=P3;temp=temp&OxfO;if(temp!=OxfO)(delayms(lO);temp=P3;temp=temp&OxfO;if(temp!=OxfO){temp=P3;switch(temp)(caseOxeb:key=8;break;caseOxdb:key=9;-19-break;5I单片机C语言经典事例教程caseOxbb:key=10;break;case0x7b:key=ll;break;)while(temp!=OxfO){temp=P3;temp=temp&OxfO; }display(key);}}P3=Oxf7;temp=P3;temp=temp&OxfO;if(temp!=OxfD){delayms(lO);temp=P3;temp=temp&OxfO;if(temp!=OxfO)(temp=P3;switch(temp)(case0xe7:key=12;break;caseOxd7:key=13;break;caseOxb7:key=14;break;case0x77:key=15;break;}while(temp!=OxfO)(-20-51单片机C语言经典事例教程temp=P3;temp=temp&OxfO;}display(key);)})voidmain()(P0=0;〃关闭所有数码管段选dula=l;dula=0;P0=0xc0;〃位选中所有数码管wela=l;wela=0;while(l)matrixkeyscan。;〃不停调用键盘扫描程序例5.3.1用单片机控制ADC0804进行数模转换,当拧动实验板上A/D旁边的电位时,在数码管的前三位以十进制方式显示出A/D转换后的数字量(8位A/D转换后数值在〇〜255变化)。(part2.3_l.cP107)#include<reg52.h>//52系列单片机头文件#include<intrins.h>#defineucharunsignedchar#defineuintunsignedintsbitdula=P2-;〃申明U!锁存器的锁存端sbitwela=P2>;〃申明U2锁存器的锁存端sbitadwr=P3-;〃定义AD的WR端口sbitadrd=P3>;〃定义AD的RD端口-21-51单片机C语言经典事例教程ucharcodetable(]={Ox3f,OxO6,Ox5b,Ox4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};voiddelayms(uintxms){uinti,j;for(i=xms;i>0;i—)//i=xms即延时约xms毫秒 for(j=l10;j>0;j—);)voiddisplay(ucharbai,ucharshi,ucharge)〃显小寸,函数(dula=l;PO=table[bai];〃送段选数据dula=0;PO=Oxffi〃送位选数据前关闭所有显示,防止打开位选锁存时wela=l;//原来段选数据通过位选锁存器造成混乱P0=0x7e;〃送位选数据wela=0;delayms⑸; 〃延时dula=l;PO=table[shi];
dula=O;PO=Oxff;wela=l;P0=0x7d;wela=O;delayms(5);dula=l;PO=table[ge];dula=O;PO=Oxff;wela=l;P0=0x7b;wela=O;delayms(5);)voidmain()//主程序-22-51单片机C语言经典事例教程uchara,Al,A2,A3,adval;wela=l;P0=0x7f; 〃置CSAD为〇,选通ADCS以后不必再管ADCSwe!a=0;while(l)!adwr=1;_nop_();adwr=0;〃启动AD转换_nop_();Pl=Oxff;adrd=1;Pl=Oxff;adrd=1;〃读取Pl口之前先给其写全!〃选通ADCSadwr=l;for(a=10;a>O;a—)后要多留点时间用来转换(//TX-1C实验板AD工作频率较低,所以启动转换〃这里把显示部分放这里的原因也是为了延长转换时间display(Al,A2,A3);_nop_();adrd=O; //AD读使能_nop_();adval=Pl; 〃AD数据读取赋给Plロadrd=1;Al=adval/100;〃分出百,十,和个位A2=adval%100/10;A3=adval%10;例5.5.1用单片机控制DAC0832芯片输出电流,让发光二级管D12由灭均匀变到最亮,再由最亮均匀熄灭。在最亮和最暗时使用蜂鸣器分别警报一声,完成整个周期时间控制在5s左右,循环变化。(part2.3_2.cP121)#include<reg52.h>#defineucharunsignedchar-23-5I单片机C语言经典事例教程#defineuintunsignedintsbitdula=P2-;〃申明U!锁存器的锁存端sbitwela=P2・;〃申明U2锁存器的锁存端sbitdawr=P3-;〃定义DA的WR端口sbitdacs=P3];〃定义DA的CS端口sbitbeep=P2L;〃定义蜂鸣器端口voiddelayms(uintxms){uintij;for(i=xms;i>0;i—) //i=xms即延时约xms毫秒for(j=l10;j>0;j—);voidmain()(ucharval,flag;dula=0;wela=0;dacs=0;dawr=0;P0=0;while(l){if(flag==0)val+=5;PO=val;〃通过P0口给DA数据ロ赋值 if(val==255)flag=l;beep=O;delayms(lOO);beep=l;)delayms(5O);)else(val-=5;PO=val;〃通过PO口给DA数据ロ赋值 if(val==O){flag=O;beep=O;-24-5I单片机C语言经典事例教程} }delayms(lOO);beep=l;}delayms(50);例6.5.1在上位机上用串口调试助手发送ー个字符X,单片机收到字符后返回给上位机"IgetX”,串口波特率设为-25-51单片机C语言经典事例教程9600bps〇(part2.4_l.cP137)#include<reg52.h>#defineucharunsignedchar#defineuintunsignedintunsignedcharflag,a,i;ucharcodetable[]="Iget";//ucharcodetable[]={T,'','g','e','t',''};voidinit()TMOD=0x20;THl=0xfd;TLl=0xfd;TR1=1;REN=1;SM0=0;SM1=1;EA=1;ES=1;}voidmain(){init();while(l){if(flag==l){ES=0;for(i=0;i<6;i++){SBUF=table[i];while(!TI);TI=0;)SBUF=a;while(!TI);TI=0;ES=1;flag=0;voidser()interrupt4-26-5I单片机C语言经典事例教程RI=0;a=SBUF;flag=l;例6.6.1单片机上电后等待从上位机串口发来的命令,同时在数码管的前三位以十进制方式显示A/D采集的数值,在未收到上位机发送来的启动A/D转换命令之前数码管始终显示000。当收到上位机以十六进制发送来的01后,向上位机发送字符串“Turnonad!”同时间隔1s读取一次A/D的值,然后把A/D采集回来的8位二进制转换成上进制表示的实际电压浮点数,并且从串口发送给上位机,形式如“Thevoltageis3.398438V”,发送周期也是一秒ー次,同时在数码管上也要每秒刷新现实的数值。当收到上位机以上六进制发送过来的02后,向上位机发送字符串“Turnoffad!”,然后停止发送电压值,数码管上显示上次结束时保持的值。当收到上位机发来的其他任何数时,向上位机发送字符串“Error!”。(part2,4_2.cP140)#include<reg52.h>#include<intrins.h>#include<stdio.h>#defineucharunsignedchar#defineuintunsignedintsbitdula=P2-;〃申明UI锁存器的锁存端sbitwela=P2・;〃申明U2锁存器的锁存端sbitadw匸P3-;〃定义AD的WR端口sbitadrd=P3・;〃定义AD的RD端口ucharfl
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025部门级安全培训考试试题标准卷
- 2024-2025车间安全培训考试试题及参考答案(模拟题)
- 2024-2025安全培训考试试题【综合卷】
- 【部编版】四年级语文下册习作《故事新编》精美课件
- 2025钢筋班组承包合同
- 2025农产品采购合同样本协议
- 2025上海赛宝网络科技发展有限公司合同代理协议汇编
- 2025《设备购销合同模板》
- 2025年合成材料抗氧化剂项目建议书
- 2025二手房屋买卖合同官方版空白
- DB3301∕T 0451-2024 医学美容机构电子病历系统技术规范
- 《大国浮沉500年:经济和地理背后的世界史》记录
- 水工维护初级工技能鉴定理论考试题库(含答案)
- 运维项目进度计划
- 商场中央空调租赁协议模板
- 十八项核心制度
- 浙江省杭州市2023-2024学年六年级下学期期中模拟测试数学试卷(人教版)
- 国家开放大学《Python语言基础》实验4:条件分支结构基本应用参考答案
- OTA代运营协议文档
- 内分泌科常见急危重症抢救流程
- 污染源权重分析报告
评论
0/150
提交评论