单片机c语言编程_第1页
单片机c语言编程_第2页
单片机c语言编程_第3页
单片机c语言编程_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

单片机c语言编程

一、系统的编写程序许多学生认为学习单词很困难。这里将结合例文介绍怎样编写一个简单的单片机C语言程序。(电路很简单,已经用文字描述了这里不再画出了。)二、按一次摩擦法显示数值用两位数码管显示00~99十进制数,上电复位后显示00;每按一次按键Key1显示的数值加1;每按一次按键Key2显示的数值减1;每按一次按键Key3显示的数值清零;每按一次按键Key4数值在原来的基础上每秒自动加1;再次按下按键Key4时,数值停止自动加1,保持原来的数值。三、控制锁存器的使能端1是头文件,内部定义了单片机内部的特殊功能寄存器和位寄存器。常用的有3个,Reg51.h、Reg52.h和Intrins.h。头文件有两种表示方法,#include<reg51.h>和#include”reg51.h”一般用前者。注意:(1)编写程序时要将输入法切换成英文半角状态。(2)每次编译前要先保存文件,避免编译时,Keil错误运行导致计算机死机而丢失文件。2和3为宏定义语句。格式为:#define新名称原内容。如例文中,宏定义的目的就是用unit来代替unsignedint,程序后面再定义变量numt0和num时写成了ucharnumt0,unm,程序简洁了。注意:(1)宏定义后没有分号。(2)对于同一个内容,宏定义只能定义一次。(3)在自定义新名称时不能使用单片机默认的关键词和特殊寄存器的名称。4至9Sbit----声明某一个特殊功能寄存器的某一位。与头文件中定义位的用法相同。自定义的地址要与硬件连接相对应。例sbitkey1=P1^0,说明按键1连接的是单片机的P1^0口。8和9定义数码管位锁存器的使能控制端和数码管段锁存器的使能控制端。表明单片机的P1^5口和P1^6口分别连接两个锁存器的使能端,控制寄存器的锁存功能,实现锁存器对数据的保护。注意:(1)P口由用户设计的硬件接线决定。(2)P口中的P要大写。10一个显示用的数组,与C语言的区别是数组类型后有Code关键字,Code表示编码。例Uchar(Unsignedchar)表示数组中元素的类型。Table数组名,定义时不能和关键字相同,Table后的括号中要注明数组中元素的个数。一般不必写;编译器在编译时会自动计算出元素个数,以分配相应的存储空间。大括号中为数组中的元素,每个元素占用一个字符空间,送入数码管就会显示相应的数字,0x3f至0x6f是数字0至9的ASCII码。注意:数组中各元素之间用逗号隔开。14定义两个字符型变量,之间用逗号隔开最后加分号。15显示子函数的声明,子函数可以写在主函数的前面或后面;如子函数在主函数后面,必须在主函数前面加上子函数的声明。如例文,将返回值特性,函数名及后面的小括号完全复制。若是无参函数,小括号中为空;若是有参函数,需要在小括号里依次写上参数类型,参数可以省略。当子函数在主函数前面时可以省去声明,写函数体的同时就已经相当于声明了函数本身。注意:例文中函数voiddisplay(ucharaddnum)中调用了函数voiddelayms(uintxms),是子程序调用下一级子程序。16自定义显示子函数,void表示是个无返回值的子函数执行后不返回任何的数据。Display子函数的名称,定义时不要和关键字相同。括号中内容是函数的参数,如括号中没有任何数据或符号,为一个无参数函数。例文中,括号内有数据即此函数为有参数函数,参数addnum的变量类型为uchar类型,又称函数的形参。调用函数时用数据代替此形参,这个数据称为实参,实参代替形参后,在子函数中所有和形参名相同的变量都将被实参所代替。18定义了分别存储十位和个位数据的无符号字符型变量。19和20在函数定义的参数中分离出十位和个位数据。“/”算术运算符,用来求模运算;例11/3=3,即11中有多少个整数3。2位数求10的模有特殊意义是分离十位数,同理“%”求余运算符,例11%3=2,而2位数求10的余是分离个位数。22至29送数码管个位数据。需要用两个锁存器74LS373起到对数据的锁存,片选使能端分别和单片机的P1^4和P1^5口连接;一个锁存器控制数码管的位选信号,另一个寄存器控制数码管的段选信号。两寄存器数据输入端都和单片机的P0口相连。控制段选信号的寄存器数据输出端和两个数码管的8个LED的引脚相连,控制位选信号的寄存器数据输出端最低两位分别和数码管的的两个公共端相连;这是由于采用数码管的动态扫描方式。首先22送段选信号给段选锁存器,当锁存器的使能端为高电平1时,打开锁存器,通过单片机P0口向锁存器写入数据。23向锁存器送个位数据;上面定义数组中的数据为共阴极数码管的显示数据,分离出的数据便与数组元素相对应。51单片机的数据输出端是P0口,P0口不仅可以作为普通的I/O口使用,还是单片机数据和低8位地址的输出端。P2口是高8位地址的输出端。24关闭段选信号送低电平0;否则,它会随着P0口数据的改变而相应改变。25是消隐程序,防止打开位选锁存器时原来的段选锁存器的数据通过位选锁存器造成混乱。26送位选信号高电平1给位选锁存器开启锁存器和段选锁存器意义相同。27是选通显示个位的数码管,此时个位数码管便显示相应的数据,因为数据已经储存在段选锁存器中。28送低电平0关闭位选锁存器,使锁存器保持当前的数据而不会跟随P0口的数据而变化。29为视觉延时,适当的延时可使显示的数据更稳定、清晰。31至38是送十位数码管显示的十位数据和送个位数据相同。注意:(1)送完段选信号和位选信号给锁存器时要关闭锁存器避免程序混乱。(2)送段选信号之后或位选信号之前要编写消隐程序避免造成短暂的视觉混乱。(3)程序控制端的编写要和单片机与周围电气元件的连接相对应。23和32是软件译码。(4)每个数码管显示之间要有适当的延时,时间过短或过长都会导致显示混乱。注意:(1)当for语句的内部语句只有一句时,可省去大括号。(2)延时子函数延时为大概值,如果要精确的延时使用单片机内部定时器延时。46至53初始化子函数。48设定单片机定时器T1的工作方式为1。TMOD是单片机定时器/计数器工作方式寄存器。这设为工作方式1,为16位定时器/计数器,按单片机外接12MHz的时钟频率,计算公式TH0=(65536-50000)/256分离高8位、TL0=(65536-50000)%256分离低8位。51和52开定时器1中断,EA和ET1分别是单片机特殊功能寄存器中中断允许控制寄存器中的第七位和第三位。当EA=1时中断总允许;当ET1为1时开启该中断。注意:单片机中特殊功能寄存器每位的含义要知道。要先赋初值给定时器,然后开启定时器,否则,误差较大。58去抖动延时。有时按键会受到外部因素或自身机械特性的影响,按键在按下或释放的瞬间会有抖动现象,一般为5到15ms。也有专门的去抖电路芯片,读者可以通过示波器去观察按键的抖动现象的波形。64等待按键释放语句。当按下按键,按键为低电平0,而!key1(取反符号)为高电平1;while语句后直接跟分号说明是个空语句,只要!key1始终为高电平1,while语句就始终执行这个空语句,直到按键释放后!key1变为低电平0,跳出while循环语句。如去掉按键释放语句,由于单片机执行代码的速度非常快,且是循环检测按键,按下按键的时间比单片机的执行速度大的多,单片机会多次检测到按键被按下,从而造成结果的错误。按键2至4的程序与按键1相似。93开启或停止定时器1。TR1是单片机特殊功能寄存器TCON中的一位,作用是当TR1为高点平1时,开启单片机内部定时器/计数器1;当为低电平0时,则关闭。符号“~”是取反的意思。和“!”的区别是“!”是关系运算符,类似于“==”的用法,“~”是位运算符,类似于赋值符号。注意:相似或意义相近的运算符不要乱用。例如:“==”和“=”,“!”和“~”。97为主函数。主函数非常简单,只调用三个函数就OK了。这是编程的一个习惯,把整个程序分成几个相关联的部分,如按键扫描部分、数据显示部分、延时部分、初始化部分,每一部分看上去思路都非常清晰,也便于调试和查找错误,这同时也大大简化了主函数的任务,因此主函数只需直接调用这些子函数就可以了。注意:主函数调用子函数的前后顺序要符合事物的前因后果。106定时器中断的子函数,每进一次中断都要重装一次初值,以便下次进入中断使用。111判断中断次数是否为20次,因为例文设定的定时器中断的时间是50ms,而功能需要1s的间隔,所以定时器中断要满足20次。40延时子函数,是带参数的函数。子函数中是两个嵌套的for语句,两个for语句是不同的。一个后面有分号而另一个没有。第一个for语句后没有分号,编译器默认第二个for语句是第一个for语句的内部语句,而第二个for语句的内部什么都没有,即为空语句;程序在执行时,第一个for语句中的i每减一次,第二个for语句执行110次。如果需要更长的延时,可以进行3层、4层的嵌套,或改变变量的类型和增大变量的初值都是可以的。54键盘扫描子函数。函数中的“==”符号与“=”符号不同,“==”是关系运算符。用于比较两个数值或表达式大小是否相等,在比较语句中做为判断的条件是否成立而去执行相应的代码。例文中,if(key1==0)判

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论