新概1单片机C语言教程例程.pdf

上传人:文*** 文档编号:88917467 上传时间:2023-05-04 格式:PDF 页数:147 大小:12.90MB
返回 下载 相关 举报
新概1单片机C语言教程例程.pdf_第1页
第1页 / 共147页
新概1单片机C语言教程例程.pdf_第2页
第2页 / 共147页
点击查看更多>>
资源描述

《新概1单片机C语言教程例程.pdf》由会员分享,可在线阅读,更多相关《新概1单片机C语言教程例程.pdf(147页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、郭天祥-1 -目录例2.2.1编写程序,点亮第一个发光二极管(part2_l.c P27).-4-例 2.5.1利 用 fo r语句延时特性,编写第一个发光二极管以间隔1 S 亮灭闪动的程序(part2_3.c P42).-5-例2.6.1编写程序使第一个发光二极管以间隔500ms亮灭闪动。(part2_4.c P48).-5-例 2.7.1编写程序使第一个二极管以亮200ms、灭 800ms的方式闪动。(part2_5.c P49).-6-例 2.8.3利用C 51自带库_crol_(),以间隔500m s,实现流水灯程序(part2_6.c P53)-6例3.2.1编写程序使第一个数码管显

2、示8(part2.1_.lc P59).-7-例 3.2.2 让实验板上6 个数码管同时点亮,依次显示0 到 F,时间间隔为0.5m s,循环下去。(part2.1_2.c P61).-8-例 3.3.1第一个数码管显示1,时间为0.5 s,然后关闭它,立即让第二个数码管显示2,时间为0.5s,在关闭它一直到最后一个数码管显示6,时间同样为0.5 s,关闭它之后再回来显示第一个数码管,一直循环下去。(part2.1_3.c P62).-9-例 3.5.1利用定时器0 工作方式1.在实验板上实现第一个发光管以1 s 亮灭闪烁。(part2.1.4.c P74).-11-例 3.5.2 用定时器0

3、 的方式1 实现第一个发光二极管以200ms间隔闪烁,用定时器1的方式1 实现数码管前两位59s循环计时:(part2.1_5.c P75).-12-例 4.1.1用数码管前两位显示一个十进制数,变化范围为0059,开始时显示0 0,每按 下 S2键一次,数值加1;每按下S 3键 次,数值减1;每按下S4键一次,数值归零;按下S5键一次,利用定时器功能使数值开始自动每秒加1,再次按下S5键,数值停止加1,保持显示原数。(part2.2_l.c P82).-14-例 4.2.1 实验班上电时,数码管不显示,顺序按下矩阵键盘后,数码管上依次显示0F,六个数码管同时静态显示即可。(part2.2_2

4、.c P87).-17-例 5.3.1 用单片机控制ADC0804进行数模转换,当拧动实验板上A/D旁边的电位时,在数码管的前三位以十进制方式显示出A/D转换后的数字量(8 位 A/D转换后数值在0255变化)。(part2.3_l.c P107).-21-2013-11-2郭天祥-2-例 5.5.1 用单片机控制DAC0832芯片输出电流,让发光二级管D12由灭均匀变到最亮,再由最亮均匀熄灭。在最亮和最暗时使用蜂鸣器分别警报一声,完成整个周期时间控制在5s 左 右,循环变化。(part2.3_2.c P121).-23-例 6.5.1在上位机上用串口调试助手发送一个字符X,单片机收到字符后返

5、回给上位机“IgetX”,串 口波特率设为 9600bps。(part2.4_l.c P137).-25-例 6.6.1单片机上电后等待从上位机串口发来的命令,同时在数码管的前三位以十进制方式显示A/D采集的数值,在未收到上位机发送来的启动A/D转换命令之前数码管始终显示000。当收到上位机以十六进制发送来的01后,向上位机发送字符串“Turn on ad!”同时间隔Is 读取一次A/D的值,然后把A/D采集回来的8 位二进制转换成十进制表示的实际电压浮点数,并且从串口发送给上位机,形式如“The voltage is 3.398438V”,发送周期也是一秒一次,同时在数码管上也要每秒刷新现实

6、的数值。当收到上位机以十六进制发送过来的02后,向上位机发送字符串“Turn off ad!”,然后停止发送电压值,数码管上显示上次结束时保持的值。当收到上位机发来的其他任何数时,向上位机发送字符串“Error!”。.-27-例 7.2.1 实 现 1602液 晶 的 第 一 行 显 示“I LOVE M C U!”,在第二行显示WWW.TXMCU.COMo.-31-例 7.2.2 实 现 1602第一行从左侧移入Hello everyone!M同时第二行从右侧移入“Welcome to here!”,移入速度自定,然后停留在屏幕上。(part2.5_2.c P154).-33-例 7 3 1

7、 实 现 12232液晶的第一行显示“I LOVE MCU!”,第二行显示“我爱单片机”。(part2.5_3.c Pl 60).-34-例 7.3.2 实 现 12232液晶第一一行从右侧移入“Hello everyone!w,同时第二行从右侧移入“欢迎大家来学习!”移入速度自定,最后停留在屏幕上。(part2.5_4.c P163).-37-例 7 4 1 实现在12864液晶上第一行显示“0123456789”,并且让每一位数字随机变化,第二行 显 示“,第三行显示“天祥电子”,第四行对应第三行显示出下划线。(part2.5_5.c P173).-40-知识点:生成随机数(part2.5

8、_512232suiji.cP 176).-44-例 8.3.1利用定时器产生一个099秒变化的秒表,并且显示在数码管上,每过一秒将这个变化的数写入板上AT24co2 内部。当关闭实验板电源,并再次打开实验板电源时,单片机先从AT24C02中将原来写入的数读取出来,接着此数继续变化并显示在数码管上。(part2.6_l.c P188).-48-例 10.1.1利用定时器0 工作方式0,在实验板上实现第 个发光管以1s亮灭闪烁。(part3.1.1.c P203).-53-例 10.2.1 利用定时器0 工作方式2,在实验板上实现第一个发光管以I s 亮灭闪烁。(part3.1.2.c P204

9、).-54-例 10.3.1利用定时器工作方式3,在实验板上实现:用 TL0计数器对应的8 位定2013-11-2郭天祥-3-时器实现第一个发光管以1s亮灭闪烁,用 THO计数器对应的8 位定时器实现第二个发光管以 0.5s 亮灭闪烁。(part3.1.3.C P206).-54-例 10.5.1利用计数器0 工作方式1,在实验板上实现:用一根导线一端连接GND引脚,另一端去接触T0(P3.4)弓|脚,每接触一下,计数器计一次数,将所计的数值实时显示在数码管的前两位,计 满 100时清0,再从头计起。(part3.1.4.c P214).-55-例 11.1.1设置单片机串行口的工作模式0,间

10、隔循环发送十六进制数OxAA,然后用双路示波器观察P3.0和 P3.1 口波形。(.-58-例 11.3.1用交叉串口线连接两块实验板,或直接用短线交叉线连接连个单片机的P3.0和 P3.1 (共地)。在一块板上编写矩阵键盘扫描程序,当扫描到有键按下时,将键值通过串口发送出去,另一块板上单片机收到串口发送来的键值后,将对应键值以0-F 方式显示在数码管上。.-60-例 11.4.1 程序分为主机程序和从机程序,约定一次传送的数据为1 6 B,以02H地址的从机为例。(图 1142为多机通信主机程序流程图).-65-图 11.4.3为多机通信从机程序流程图。.-68-从机程序代码:(part3.

11、2.6.c P234).-68-例 12.8.1 指针使用例程:(point.c P264).-71-例 13.L1 编写程序实现:开启两个外部中断,设置低电平触发中断,用定时器计数并且显示在数码管的前两位,当计数到5 时,使单片机进入空闲(休眠)模式,同时关闭定时器,当单片机响应外部中断后,从空闲(休眠)模式返回,同时开启定时器。(.-72-例 13.2.1 实验板上实现如下描述:程序启动后设定看门狗溢出时间为2 s,然后点亮第一个发光二极管,稍延时一会,然后熄灭发光二极管,使程序进入等待死循环状态,并且在死循环中大约每隔1s喂狗一次,看程序运行是否正常。.-74-例 13.6.1 在实验板

12、上实现:操作STC单片机自带的E2PR0M,存储一组按秒递增的两位数据,并且将数据实时显示在数码管上,数据每变化一次就往E2PROM中写入一次,当关闭实验板电源并再次开启电源时.,从 E2PROM中读取先前存储的数据,接着递增显示。.-77-例 13.7.1STC89LE516AD/X2系列单片机的A/D转换功能。时 钟 11.0592MHz,转换结果以 16进制形式输出到串行口,可以用串行口调试程序,观察输出结果(本代码摘自宏晶科技芯片手册,经作者调试可正常运行)。.-80-例 13.8.1 给出一个 STC12c5412AD 应用的参考程序。(part3.4.6.c P287).-82-程

13、 序 14.3.1 利用51单片机的定时器设计一个时钟。.-89-程序15.5.1 使用DS12C887时钟芯片设计高精度时钟。.-97-2013-11-2郭天祥-4-程 序16.3.1 使用TX-lC实验板上的DS 18B20温度传感器设计温控系统C 语言源代码(part4.3 P349).-108-程序17.3.1 太阳能充/放电控制器C 语言源代码.-114-ISD400 x系列语音芯片C 语言参考程序:.-134-例 21.1.1 使用TX-1C实验板上两个独立按键调节直流电机的转速,同时在实验板的数码管上象征性的显示相应的转速值。通过控制单片机输出不同占空比的PWM信号来控制直流电机

14、的转速(感性认识)。(part5.3 P434).-138-例 21.2.1步进电机应用C 语言程序设计(part3.2 P444).-142-例 21.3.1 陀机应用C 语言程序设计实例:开机时舵机角度自动转为0 度,通过实验板上的独立按键调节舵机的角度转动,并且在实验板数码管上显示相应的角度。本例仅演示5个角度的控制,若想实现任意角度控制请大家自行编程实验。程序代码如下:(part5.3P453).-145-调节舵机使之转动5 个 角 度 0 45 90 135 180 PWM信号周期为20ms,.-145-/控制高电平的持续时间即可控制舵机停止制动的角度,0.5ms-0度 1-45 1

15、.5-90 2-135 2.5-180.-145-程序流程是:开机时舵机角度自动转为0 度,按 下 P3.7则转到45度,以后就根据两个按键的按下而转动.-145-例2.2.1编写程序,点亮第一个发光二极管(part2.l.cP27)#include/52系列单片机头文件sbit ledl=PlA0;声明单片机Pl 口的第一位void main()主函数(ledl=0;/*点亮第一个发光二极管*/)例 2.2.2编写程序,点亮P1 口的若干二极管(part2_2.c P39)#include /52系列单片机头文件void main()主函数(Pl=0 xaa;/while(l);)2013-

16、11-2郭天祥-5-例 2.5.1利用for语句延时特性,编写第一个发光二极管以间隔1S亮灭闪动的程序(part2_3.c P42)#include /52系列单片机头文件#define uint unsigned int 宏定义sbit ledl=PlA0;声明单片机Pl 口的第一位uint i,j;void main()主函数while(l)大循环led 1=0;for(i=l;i0;i)for(j=110;j0;j-);ledl=l;for(i=1000;i0;i-)for(j=110;j0;j-);/*点亮第一个发光二极管*/延时/*关闭第一个发光二极管*/延时例2 6 1 编写程序使

17、第一个发光二极管以间隔500ms亮灭闪动。(part2_4.c P48)#include#define uint unsigned intsbit ledl=PlAO;void delay ls();void main()(while(l)led 1=0;delayls();ledl=l;delay ls();/52系列单片机头文件宏定义声明单片机Pl 口的第一位声明子函数主函数大循环/*点亮第一个发光二极管*/调用延时子函数/*关闭第一个发光二极管*/调用延时子函数2013-11-2郭天祥-6-void delayls()子函数体(uint i,j;for(i=500;i0;i-)for(j

18、=110;j0;j-);例 一 编写程序使第一个二极管以亮200ms、灭800ms的方式闪动。(part2_5.c P49)#include/52系列单片机头文件#define uint unsigned int宏定义sbit ledl=PlA0;声明单片机Pl 口的第一位void delayms(uint);/声明子函数void main()(/主函数while(l)(大循环ledl=0;/*点亮第一个发光二极管*/delayms(200);/延时200毫秒ledl=l;/*关闭第一个发光二极管*/delayms(800);)/延时800毫秒void delayms(uint xms)(ui

19、nt i,j;for(i=xms;i0;i)/i=xms 即延时约 xms 毫秒for(j=110;j0;j-);例2.8.3利用C51自带库_cr,_以间隔500m s,实现流水灯程序(part2_6.c P53)#include/52系列单片机头文件#include#define uint unsigned int宏定义#define uchar unsigned charvoid delayms(uint);声明子函数uchar aa;void main()主函数2013-11-2郭天祥-7-aa=Oxfe;while(l)(Pl=aa;delayms(500);aa=_crol_(aa

20、,l);)void delayms(uint xms)(uint i,j;fbr(i=xms;iO;i-)for(j=110;j0;j-);/赋初值 11111110大循环延时500毫秒将aa循环左移1位后再赋给aa/i=xms即延时约xms毫秒例 3.2.1编写程序使第一个数码管显示8(part2.l.lcP59)#include sbit dula=P2A6;sbit wela=P2A7;/52系列单片机头文件申明U1锁存器的锁存端申明U2锁存器的锁存端2013-11-2郭天祥-8-void main()(wela=l;打开U2锁存器P0=0 xFE;送入位选信号wela=0;关闭U2锁存

21、器dula=l;打开U1锁存器P0=0 x7F;送入段选信号dula=0;关闭U2锁存器while(l);)程序停止到这里例3 2 2让实验板上6个数码管同时点亮,依次显示0到F,时间间隔为0.5m s,循环下去。(part2,2.c P61)#include /52系列单片机头文件#define uchar unsigned char#define uint unsigned intsbit dula=P2A6;申明U I锁存器的锁存端sbit wela=P2A7;申明U 2锁存器的锁存端uchar num;unchar code table=0 x3f,0 x06,0 x5b,0 x4f,

22、0 x66,0 x6d,0 x7d,0 x07,0 x7f,0 x6f,0 x77,0 x7c,0 x39,0 x5e,0 x79,0 x71;void delayms(uint);void main()(wela=l;/打开U 2锁存端P0=0 xco;送入位选信号wela=0;关闭U 2锁存端while(l)(for(num=0;num0;i)/i=xms 即延时约 xms 毫秒for(j=110;j0;j-);例3.3.第一个数码管显示,时间为0.5 s,然后关闭它,立即让第二个数码管显示2,时同为0.5s,在关闭它一直到最后一个数码管显示6,时间同样为0.5 s,关闭它之后再回来显示第

23、一个数码管,一直循环下去,part2.1 3.c P62)#include /52系列单片机头文件#define uchar unsigned char#define uint unsigned intsbit dula=P2A6;申明U I锁存器的锁存端sbit wela=P2A7;申明U2锁存器的锁存端uchar num;unchar code table=0 x3f,0 x06,0 x5b,0 x4f;0 x66,0 x6d,0 x7d,0 x07,0 x7f,0 x6f,0 x77,0 x7c,0 x39,0 x5e,0 x79,0 x71;void delayms(uint);voi

24、d main()(while(l)(dula=l;P0=table 1 ;送段选数据dula=0;PO=Oxff;送位选数据前关闭所有显示,防止打开位选锁存时wela=l;原来段选数据通过位选锁存器造成混乱P0=0 xfe;送位选数据wela=0;delayms(500);延时dula=l;2013-11-2郭天祥-10-P0=table2;送段选数据dula=0;P0=0 xff;送位选数据前关闭所有显示,防止打开位选锁存时wela=l;/原来段选数据通过位选锁存器造成混乱P0=0 xfd;送位选数据wela=0;delayms(500);/延时dula=l;P0=table3;送段选数据d

25、ula=0;P0=0 xff;送位选数据前关闭所有显示,防止打开位选锁存时wela=l;原来段选数据通过位选锁存器造成混乱P0=0 xfb;,/送位选数据wela=0;delayms(500);/延时dula=l;P0=table4;/送段选数据dula=0;P0=0 xff;送位选数据前关闭所有显示,防止打开位选锁存时wela=l;/原来段选数据通过位选锁存器造成混乱P0=0 xf7;/送位选数据wela=0;delayms(500);延时dula=l;P0=table5;/送段选数据dula=0;P0=0 xff;送位选数据前关闭所有显示,防止打开位选锁存时wela=l;/原来段选数据通过

26、位选锁存器造成混乱P0=0 xef;送位选数据wela=0;delayms(500);/延时dula=l;P0=table6;/送段选数据dula=0;P0=0 xff;送位选数据前关闭所有显示,防止打开位选锁存时wela=l;原来段选数据通过位选锁存器造成混乱P0=0 xdf;/送位选数据wela=0;delayms(500);延时2013-11-2郭天祥-11-void delayms(uint xms)(uintij;for(i=xms;i0;i-)/i=xms 即延时约 xms 毫秒for(j=110;j0;j-);例 3.5利用定时器0 工作方式,在实验板上实现第一个发光管以1s亮灭

27、闪烁。(part2.L4.c P74)#include/52系列单片机头文件#define uchar unsigned char#define uint unsigned intsbit ledl=PlA0;uchar num;void main()(TMOD=0 x01;设置定时器0 为工作方式1 (MIMO为 01)TH0=(65536-45872)/256;装初值 11.0592M 晶振定时 50ms 数为 45872TL0=(65536-45872)%256;EA=1;开总中断ETO=1;开定时器0 中断TRO=1;/启动定时器0while(l);程序停止在这里等待中断中断发生voi

28、d T0_time()interrupt 1(TH0=(65536-45872)/256;重装初值TL0=(65536-45872)%256;num+;/num每 加 1次判断一次是否到20次if(num=20)如果到了 20次,说 明 1秒时间到(num=0;然后把num清 0 重新再计20次ledl=ledl;让发光管状态取反2013-11-2郭天祥-12-例3.5.2用定时器0的方式1实现第一个发光二极管以200ms间隔闪烁,用定时器1的方式1实现数码管前两位59s 循环计时。(part2.1_5.c P75)#include /52系列单片机头文件#define uchar unsig

29、ned char#define uint unsigned intsbit dula=P2A6;申明U I锁存器的锁存端sbit wela=P2A7;申明U2锁存器的锁存端sbit ledl=PlA0;unchar code table|=0 x3f,0 x06,0 x5b,0 x4f,0 x66,0 x6d,0 x7d,0 x07,0 x7f,0 x6f,0 x77,0 x7c,0 x39,0 x5e,0 x79,0 x71;void delayms(uint);void display(uchar,uchar);uchar num,num 1 ,num2,shi,ge;void main(

30、)(TMOD=Oxll;设置定时器。为工作方式1 (MIMO为 11)TH0=(65536-45872)/256;装初值 U.0592M 晶振定时 50ms 数为 45872TL0=(65536-45872)%256;THl=(65536-45872)/256;装初值 11.0592M 晶振定时 50ms 数为 45872TLl=(65536-45872)%256;EA=1;开总中断ET0=l;开定时器。中断ET1=1;开定时器1中断TR0=l;/启动定时器0TR1=1;/启动定时器1while(l);程序停止在这里等待中断中断发生(display(shi,ge);)void display(

31、uchar shi,uchar ge)显示子函数(dula=l;PO=tableshi;送段选数据dula=0;PO=Oxff;送位选数据前关闭所有显示,防止打开位选锁存时2013-11-2郭天祥-13-wela=l;P0=0 xfe;wela=0;delayms(5);/原来段选数据通过位选锁存器造成混乱送位选数据延时dula=l;PO=table|ge|;/送段选数据dula=0;PO=Oxff;wela=l;送位选数据前关闭所有显示,防止打开位选锁存时/原来段选数据通过位选锁存器造成混乱PO=Oxfd;送位选数据)wela=0;delayms(5);延时void delayms(uint

32、 xms)uint i,j;fbr(i=xms;i0;i)/i=xms即延时约xms毫秒for(j=l 10;j0;j-);)void T0_time()interrupt 1(TH0=(65536-45872)/256;重装初值TL0=(65536-45872)%256;num+;ledl=ledl;让发光管状态取反if(numl=4)(num 1=0;如果到了 4 次,说明200ms时间到然后把num l清 0 重新再计4 次)void Tl_time()interrupt 3(TH 1=(65536-45872)/256;重装初值TL1=(65536-45872)%256;num2+;i

33、f(num=60)这个数用来送数码管显示,到 60后归0if(num2=20)如果到了 20次,说 明 1秒刷新时间到1num2=0;num+;然后把num2清 0 重新再计4 次2013-11-2郭天祥-14-num=0;shi=num/10;ge=num%10;/把一个2 位数分离后分别送数码管显示十位和个位例 4.1.1用数码管前两位显示一个十进制数,变化范围为0 0-5 9,开始时显示0 0,每按下S2键一次,数值加1;每按下S3键一次,数值减1;每按下S4键一次,数值归零;按下S5键一次,利用定时器功能使数值开始自动每秒加1,再次按下S5键,数值停止加1,保持显示原数。(part2.

34、2_LcP82)#include /52系列单片机头文件#define uchar unsigned char#define uint unsigned intsbit keyl=P3A4;sbit key2=P3A5;sbit key3=P3A6;sbit key4=P3A7;sbit dula=P2A6;申明U I锁存器的锁存端sbit wela=P2A7;申明U2锁存器的锁存端uchar code tabie=0 x3f,0 x06,0 x5b,0 x4f,0 x66,0 x6d,0 x7d,0 x07,0 x7f,0 x6f,0 x77,0 x7c,0 x39,0 x5e,0 x79,

35、0 x71;void delayms(uint);2013-11-2郭天祥-15-uchar numtO,num;void display(uchar numdis)显示子函数(uchar shi,ge;分离两个分别要显示的数shi=numdis/10;ge=numdis%10;dula=l;PO=tableshiJ;送十位段选数据dula=0;PO=Oxff;送位选数据前关闭所有显示,防止打开位选锁存时wela=l;原来段选数据通过位选锁存器造成混乱P0=0 xfe;送位选数据wela=0;delayms(5);延时dula=l;PO=tablege;送个位段选数据dula=0;PO=Oxf

36、f;wela=1;P0=0 xfd;wela=0;delayms(5);)void delayms(uint xms)(uint i,j;for(i=xms;i0;i)/i=xms 即延时约 xms 毫秒forG=110;j0;j-);)void init()初始化函数TMOD=0 x01;设置定时器0 为工作方式1(0000 0001)TH0=(65536-45872)/256;装初值 50ms 一次中断TL0=(65536-45872)%256;EA=1;开总中断ET0=l;开定时器0 中断)void keyscan()|if(keyl=O)delayms(lO);2013-11-2郭天祥

37、-16-if(keyl=O)(num+;if(num=60)当到60时重新归0num=0;while(!keyl);等待按键释放)if(key2=0)(delayms(lO);if(key2=0)(if(num=0)当到0 时重新归60num=60;num;while(!key2);)if(key3=0)(delayms(lO);if(key3=0)(num=0;清 0while(!key3);)1if(key4=0)(delayms(lO);if(key4=0)(while(!key4);TRO=TRO;启动或停止定时器0void main()(init();初始化函数while(l)key

38、scan();2013-11-2郭天祥-17-display(num);)voidTO_time()interrupt 1(TH0=(65536-45872)/256;重装初值TL0=(65536-45872)%256;numtO+;if(numt0=20)如果到了 20次,说 明 1 秒时间到(numt0=0;然后把num清 0 重新再计20次num+;if(num=60)num=0;)例421.实验班上电时,数码管不显示,顺序按下矩阵键盘后,数码管上依次显示0F,六个数码管同时静态显示即可。(part2.2_2.c P87)#include /52系列单片机头文件#define uchar

39、 unsigned char#define uint unsigned intsbit dula=P2A6;申明U I锁存器的锁存端sbit wela=P2A7;申明U 2锁存器的锁存端uchar code table|=0 x3f,0 x06,0 x5b,0 x4f,0 x66,0 x6d,0 x7d,0 x07,0 x7f,0 x6f,0 x77,0 x7c,0 x39,0 x5e,0 x79,0 x71;void delayms(uint xms)(uint i,j;for(i=xms;i0;i)/i=xms 即延时约 xms 毫秒for(j=110;j0;j-);)void displ

40、ay(uchar num)(P0=tablenum;显示函数只送段选数据dula=l;2013-11-2郭天祥-18-dula=O;)void matrixkeyscan()(uchar temp,key;P3=Oxfe;temp=P3;te m p=te mp&Ox fO;if(temp!=OxfO)delayms(lO);temp=P3;temp=temp&OxfO;if(temp!=OxfO)(temp=P3;switch(temp)(case Oxee:key=O;break;case Oxde:key=l;break;case Oxbe:key=2;break;case 0 x7e:

41、key=3;break;)while(temp!=OxfO)(temp=P3;te m p=te mp&Ox fO;)display(key);)P3=Oxfd;temp=P3;te mp=te mp&OxfO;if(temp!=OxfO)2013-11-2郭天祥-19-delayms(lO);temp=P3;temp=temp&OxfO;if(temp!=OxfO)(temp=P3;switch(temp)(case Oxed:key=4;break;case Oxdd:key=5;break;case Oxbd:key=6;break;case 0 x7d:key=7;break;)whi

42、le(temp!=OxfO)(temp=P3;temp=temp&OxfO;)display(key);)P3=0 xfb;temp=P3;te m p=te mp&Ox fO;if(temp!=OxfO)delayms(lO);temp=P3;temp=temp&OxfO;if(temp!=OxfO)(temp=P3;switch(temp)(case Oxeb:key=8;2013-11-2郭天祥-20-break;case Oxdb:key=9;break;case Oxbb:key=10;break;case 0 x7b:key=l 1;break;)while(temp!=OxfO)

43、(temp=P3;temp=temp&OxfO;)display(key);)P3=Oxf7;temp=P3;temp=temp&OxfO;if(temp!=OxfO)(delayms(lO);temp=P3;temp=temp&OxfO;if(temp!=OxfO)(temp=P3;switch(temp)(case 0 xe7:key=12;break;case 0 xd7:key=13;break;case 0 xb7:key=14;break;case 0 x77:key=15;break;2013-11-2郭天祥-21-while(temp!=OxfO)(temp=P3;temp=t

44、emp&OxfO;)display(key);)void main()(P0=0;关闭所有数码管段选dula=l;dula=0;P0=0 xc0;位选中所有数码管wela=l;wela=0;while(l)(matrixkeyscan();不停调用键盘扫描程序)例5.3.1用单片机控制ADC0804进行数模转换,当拧动实验板上A/D旁边的电位时,在数码管的前三位以十进制方式显示出A/D转换后的数字量(8位A/D转换后数值在0-255变 化(part2.3_l.c P107)#include /52系列单片机头文件#include#define uchar unsigned char#defin

45、e uint unsigned intsbit dula=P2A6;申明U I锁存器的锁存端2013-11-2郭天祥-22-sbit wela=P2A7;申明U2锁存器的锁存端sbit adwP=P3A6;定义 AD 的 WR 端 口sbit adrd=P3A7;定义 AD 的 RD 端口uchar code table=0 x3f,0 x06,0 x5 b,0 x4f,0 x66,0 x6d,0 x7d,0 x07,0 x7f,0 x6f,0 x77,0 x7c,0 x39,0 x5e,0 x79,0 x71;void delayms(uint xms)(uint i,j;for(i=xms

46、;i0;i)/i=xms 即延时约 xms 毫秒for(j=110;j0;j-);)void display(uchar bai,uchar shi,uchar ge)显示子函数(dula=l;PO=tablebai;送段选数据dula=0;P0=0 xff;送位选数据前关闭所有显示,防止打开位选锁存时wela=1;原来段选数据通过位选锁存器造成混乱P0=0 x7e;送位选数据wela=0;delayms;延时dula=l;PO=tableshi;dula=0;PO=Oxff;wela=1;P0=0 x7d;wela=0;delayms(5);dula=l;PO=tablege;dula=0;

47、P0=0 xff;wela=l;P0=0 x7b;wela=0;delayms(5);2013-11-2郭天祥-23-void main()/主程序(uchar a,Al,A2,A3,adval;wela=l;P0=0 x7f;置CSAD为 0,选 通 ADCS以后不必再管ADCSwela=0;while(l)(adwr=1;_nop_();adwr=0;启动AD转换_nop_();adwr=l;for(a=10;a0;a-)/X1C实验板AD工作频率较低,所以启动转换后要多留点时间用来转换 这里把显示部分放这里的原因也是为了延长转换时间display(A1,A2,A3);Pl=Oxff;读取

48、Pl 口之前先给其写全1adrd=1;/选通ADCS_nop_();adrd=0;/AD读使能_nop_();adval=PI;AD数据读取赋给Pl 口adrd=1;Al=adval/100;分出百,十,和个位A2=adval%100/10;A3=adval%10;)例5.5.1用单片机控制DAC0832芯片输出电流,让发光二级管D12由灭均匀变到最亮,再由最亮均匀熄灭。在最亮和最暗时使用蜂鸣器分别警报一声,完成整个周期时间控制在5s左右,循环变化。(part2.3_2,c P121)2013-11-2郭天祥-24-#include#define uchar unsigned char#def

49、ine uint unsigned intsbit dula=P2A6;sbit wela=P2A7;sbit dawuP3A6;申明U I锁存器的锁存端申明U 2锁存器的锁存端定义DA 的 W R端口sbit dacs=P3A2;/定义D A 的 C S端口sbit beep=P2A3;定义蜂鸣器端口void delayms(uint xms)uint i,j;fbr(i=xms;iO;i-)for(j=110;j0;j-);/i=xms即延时约xms毫秒void main()(uchar val,flag;dula=0;wela=0;dacs=0;dawr=0;P0=0;while(l)(

50、if(flag=O)(val+=5;P0=val;通过PO 口给DA数据口赋值if(val=255)(flag=l;beep=0;delayms(lOO);beep=1;)delayms(50);)else(val-=5;P0=val;通过PO 口给DA数据口赋值if(val=0)2013-11-2郭天祥-25-)flag=O;beep=O;delayms(lOO);beep=1;delayms(50);例 6.5.1在上位机上用串口调试助手发送一个字符X,单片2013-11-2郭天祥-26-机收到字符后返回给上位机IgetX”,串口波特率设为9600bpSo(part2.4_l.c P137

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁