c程序简单介绍单片机学习.docx_第1页
c程序简单介绍单片机学习.docx_第2页
c程序简单介绍单片机学习.docx_第3页
c程序简单介绍单片机学习.docx_第4页
c程序简单介绍单片机学习.docx_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

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

文档简介

c程序简单介绍c语言基本知识包含头文件:现学习的是c51单片机,所以需要的头文件是#include程序的主函数,main函数例:#includevoid main()最常用的一些语句例:1.while(ib) /;不能少c=10; elsec=1;3.doa=a+1;while(a10) /先执行do后面的语句,再执行whlie,如果while后面为真,再执行do,直到while后面不成立,退出。4.for(a=0;a10;a+) /先赋值a,再判断是否小于10,若不成立,退出循环,如果成立先执行大括号,执行完成再执行a+(a=a+1),执行完成后再判断是否小于10b=10;5.switch(a) /首先将a的值与case中的值比较,如果a=0,则执行b=0,然后退出,如果a0也1,则执行b=3,然后退出,如果没有两个break,且a=0,那么执行b=0,无需判断再继续执行b=1,再执行b=3,然后退出。循序向下执行的。case(0):b=0;break;case(1):b=1;break;default:b=3;do-while,while,for,可以用break语句退出循环。函数的定义返回变量的类型 函数名(输入变量类型)返回变量的类型 变量名; /定义一个变量存放返回值函数程序return 变量名; /返回函数的返回值例:unsigned char read(unsigned char addr) unsigned char dat; /定义一个变量存放返回值return dat; /返回函数的返回值数据类型的定义sfr:特殊功能寄存器声明sfr 变量名=地址值;sfr scon=0x98; /sfr相当于int,short等有8位有16位,变量地址可类比于威纶屏,但是这个特殊功能寄存器在reg51.h这个头文件中已经定义好了,所以平时不用自己去定义寄存器的名字sbit:特殊功能位声明sbit 变量名=地址值;sbit led=p0.2; /这里的地址值可以类比plc的输入输出变量对应的地址c51中常用的预处理命令#define a po(不用分号) /将p0定义成a#typedef unsigned char uint;(加分号) /将前面unsigned char 定义成uint,这里是重新定义关键词#ifndef#endif /条件编译,表示如果没有定义,定义,然后endif与&,或|,非,异或单片机基础知识单片机电路是数字电路,只有两种电平,高和低高电平5v或者3.3v,取决于单片机电源低电平:0vrs232电平:计算机串口电平高电平:-12v低电平:12v所以单片机和电脑通信需要将单片机的电平通过各种元件转化成计算机可识别电平才能通信。keil软件的基本使用下载keil v4软件安装破解之后,需要在网上下载一个uv3.cdb文件,将这个文件改名为uv4.cdb,然后将软件安装位置处的uv4.cdb文件替换掉,就可以发现stc90c516rd+这个型号在列表中出现。具体位置:如何兴建一个工程菜单栏中【project】-【new uvision project】-弹出对话框,这里可以指定工程文件的位置和名称接下来选择单片机的cpu(按照前述方法,可以解决找不到对应型号的问题)弹出下面对话框(如果是c语言编程,需要选择y,汇编语言可选n)然后点击新建一个空文档,点击保存,然后命名为mian.c,这是指用c编程,如果用汇编语言编程,扩展名是.asm。在左侧工程目录下的source group1中双击或者右键以添加mian.c文件到这。在main.c 文件中编写一个延时函数程序如下:#include /使用51单片机必须带上这个头文件void delay(); /先声明延时函数void main() while(1) delay(); void delay() /延时函数 unsigned char i,j; for(i=100;i0;i-); for(j=100;j0;j-);对这个程序编译:最左边的这个纯粹是编译,不会生成.hex文件,后面两个都可以生成,只不过中间一个是对修改的函数编译,最右边的是对整体编译,时间长。要是成.hex文件,需要点击,在打开的对话框中勾选create hex file后确定即可(关闭程序后重新打开这个勾选不会保持)如何软件仿真使用软件仿真来观察delay函数用时。首先程序编写好了之后需要编译无误,并且是带有hex文件的编译。然后点击,在打开的对话框中target中有个晶振频率xtal(mhz),这里面填写使用的单片机的晶振频率,这个频率的确切数值可以先打开烧录软件,任意找一个模板程序的.hex文件,然后将此文件下载到单片机就能够在其界面上看到当前使用的晶振的频率。输入正确的数值之后确认即可。然后点击模拟,出现如下界面如何建立多模块任务如何将上面定义的延时函数能够像引用头文件一样引用?首先重新建立两个txt文档,然后分别保存后改名为delay.c,delay.h,将延时函数放在delay.c中,并且加上delay.h头文件程序如下#include delay.h void delay() /延时函数 unsigned char i,j; for(i=100;i0;i-); for(j=100;j0;j-);在delay.h文件中如下定义#ifndef _delay_h_ /#不能少,且中间有空格,这个定义要大写#define _delay_h_#include /最好加上这个头文件void delay();#endif主函数如下:#include #includedelay.h /这里就直接引用头文件了,与“”的区别是前者在安装目录keil文件夹中寻找 /后者是在工程文件中寻找头文件void main() while(1) delay(); 如何包含 在不同文件夹内的头文件如果将这个.c文件和.h的头文件的位置改变了,即使在其原文件夹下建立一个文件夹,将这个文件放在里面,系统任然打不开这个头文件,要想系统能打开这个头文件需要两个步骤假如将工程文件中的delay.c和delay.h转移动另外一个文件夹了,编译出现错误解决方法是线删除上面已添加的delay.c文件重新添加,然后添加这个目录后编译不会有问题。c语言编写的单片机程序点亮一个led灯新建一个工程-添加一个main.c文档编写程序编译并生成.hex文件接线下载文件到单片机。程序如下#includesbit led=p20; /给p2.0定义一个变量名,因为此时的p20是一个地址void main() p2=0x00; /将p2口置0,使上电后所有led灯熄灭。 while(1) led=1; /使led灯亮起来 接线:将j12与p2口接起来。需要将短路帽接在电源端,这样为47hc573供电。47hc573电路图指定某些口所接的led亮起来程序:#includevoid main() p2=0x00; while(1) p2=0x01; p2口流水灯程序(从原位置重新开始):#include /-声明全局函数-/void delay10ms(unsigned int c); /延时10ms main()unsigned char led;led = 0x01; while (1) p2 = led;/* delay10ms(50); led = led 0;c-)for (b=38;b0;b-)for (a=130;a0;a-); p2口流水灯程序(左右循环):#include /-声明全局函数-/void delay10ms(unsigned int c); /延时10ms main()unsigned char led;unsigned int i,j;led = 0x01; /* while (1) for(i=7;i0;i-) /循环跳出之后才会执行下面的 p2 = led; delay10ms(50); led=led0;j-) p2 = led; delay10ms(50); led=led1; void delay10ms(unsigned int c) unsigned char a, b; for (;c0;c-)for (b=38;b0;b-)for (a=130;a0;a-); 独立键盘将单片机的p2口和led灯接口相联接,独立键盘的k1建和单片机的p0口相接,实现的效果是每按下依次k1,led的指示灯循环移动一位。#include#include /循环移动,所以需要这个头文件#define led p2sbit k1=p00; /sbit 变量名=地址值;void delay10ms( ); /延时10msvoid main(void)unsigned int i,j;j=0x01;while(1)led=j; if(k1=0)/检测按键k1是否按下delay10ms();/消除抖动if(k1=0)j=_cror_(j,1);/这个是首位循环指令i=0;while(i0;c-) for(b=38;b0;b-) for(a=130;a0;a-);静态数码管将p0口用排线接到静态数码管接口,实现显示0的效果程序:#include #define gpio p0unsigned char code dig_code10=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f ;/char后面的code表示存储在ram或者rom中,是只读的void main(void) while(1) gpio=dig_code0; 矩阵键盘就方法2编写按下键盘矩阵按键时候led数码管能够显示按下按钮的编号。接线根据下面程序,矩阵键盘的按键和p1口相接,p0口和led数码管接头相接程序如下:(此程序目前还没有调试成功,暂不知错误原因,思路正确)#include #define gpio_dig p0 #define gpio_key p1 unsigned char code dig_code17= 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71; /数码管显示的0-f的值 unsigned char keyvalue; void delay10ms(); void keydown(); /检测按键的函数 void main(void) while(1) keydown(); gpio_dig=dig_codekeyvalue+1; void keydown(void) char a=0; gpio_key=0xff;/写io口 if(gpio_key!=0xff) /读io口 (由于读写地址在一起,所以值可能不一样) delay10ms(); if(gpio_key!=0xff) /再次检测是否按下(前面说明已经按下,下面是测试行列) /测试列 gpio_key=0x0f; /写io口(高4位全部输出低电平,低4位全部输出高电平)switch(gpio_key) /读io口(读io口,看看是否有低4位不全位高电平) case(0x07):keyvalue=0;break; case(0x0b):keyvalue=1;break; case(0x0d):keyvalue=2;break; case(0x0e):keyvalue=3;break;/测试行gpio_key=0xf0; / 写io口(高4位全部输出高电平,低4位全部输出低电平)switch(gpio_key) /读io口(读io口,看看是否有高4位不全位高电平)case(0x70):keyvalue=keyvalue;break;case(0xb0):keyvalue=keyvalue+4;break;case(0xd0): keyvalue=keyvalue+8;break;case(0xe0):keyvalue=keyvalue+12;break; while(a0;c-) for(b=38;b0;b-) for(a=130;a0;a-);动态数码管动态数码管是共阴极,所以io口输出高电平数码管上每一位才会亮起来。现说明的是不用译码器时候数码管的动态显示,j16连接单片机p2口,p2哪一位输出0则选中对应数码管。将p0口接j12,用于输出数码管显示的数字。实验效果 : 数码管显示76543210。程序如下:#include#define gpio_dig p0#define gpio_place p2/1111-1101unsigned char code dig_place8=0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f;/位选控制 查表的方法控制unsigned char code dig_code17=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71;/0、1、2、3、4、5、6、7、8、9、a、b、c、d、e、f的显示码void digdisplay(); /动态显示函数void main(void)while(1)digdisplay();void digdisplay()unsigned char i;unsigned int j;for(i=0;i8;i+)gpio_place=dig_placei;gpio_dig=dig_codei; /发送段码j=10; /扫描间隔时间设定(作用是如果没有它们,扫描时间将很短, while(j-);/ 从而在大循环中置位时间很短,小循环结束之后又重新开始,所以看到的灯亮的很暗) gpio_dig=0x00;/消隐实现同样试验效果,但是使用译码器138译码器工作需要加电压,这都已经接好了,4,5,6三个接口必须是高低低,如图所示揭发才能正常使用此译码器,其原理如下图。abc接片选信号,此时是和p2.2,2.3,2.4相连,分别给他们置高低电平,可以选择哪一个数码管导通,原理如下如,注意,同样是低电平导通。j15是和j16相连,从而就由j6片选,而不是上面一个方式举例的io口直接选择。程序如下:#include#define gpio_dig p0sbit lsa=p22; /sbit 变量名=地址值;(这个不是赋值)sbit lsb=p23;sbit lsc=p24;unsigned char code dig_code17=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71;void digdisplay(); /动态显示函数void main(void)while(1)digdisplay();void digdisplay()unsigned char i;unsigned int j;for(i=0;i8;i+)switch(i) /位选,选择点亮的数码管,case(0):lsa=0;lsb=0;lsc=0; break;/显示第0位case(1):lsa=1;lsb=0;lsc=0; break;/显示第1位case(2):lsa=0;lsb=1;lsc=0; break;/显示第2位case(3):lsa=1;lsb=1;lsc=0; break;/显示第3位case(4):lsa=0;lsb=0;lsc=1; break;/显示第4位case(5):lsa=1;lsb=0;lsc=1; break;/显示第5位case(6):lsa=0;lsb=1;lsc=1; break;/显示第6位case(7):lsa=1;lsb=1;lsc=1; break;/显示第7位gpio_dig=dig_codei;/发送段码j=10; /扫描间隔时间设定while(j-);gpio_dig=0x00;/消隐中断中断标志:串口中断是scon,外部中断和定时计数器中断是tcon对于中断地址,c语言编程只需要中断编号,入口地址是用汇编编程的时候用到的实例:(接线可通过程序变量定义以及说明连接)/*实验名 :外部中断实验*注意:由于p3.2口跟红外线共用,所以做按键实验时为了不让红外线影响实验效果,最好把红外线先*取下来。*实验效果:k3按下led左循环,k4按下led变右循环*/#include#include#define gpio_ledp2/外部中断的iosbit k3=p32;sbit k4=p33;void intconfiguration();void delay(unsigned int n);unsigned char keyvalue=0;void main(void)gpio_led=0xfe;intconfiguration();while(1)if(keyvalue)gpio_led=_crol_(gpio_led,1);elsegpio_led=_cror_(gpio_led,1);delay(20000);/* 函数名 : intconfiguration()* 函数功能 : 设置外部中断* 输入 : 无* 输出 : 无*/void intconfiguration()/设置int0it0=1;/跳变沿出发方式(下降沿);直接操作tcon的位ex0=1;/打开int0的中断允许。/设置int1it1=1;ex1=1;/中断优先级可以保持默认,51只有两个优先级,高和低ea=1;/打开总中断/* 函数名 : delay(unsigned int n)* 函数功能 : 延时* 输入 : n* 输出 : 无*/void delay(unsigned int n) /延时50us误差 0us unsigned char a,b;for(;n0;n-) for(b=1;b0;b-) for(a=22;a0;a-);/* 函数名 : int0()interrupt 0* 函数功能 : 外部中断0的中断函数* 输入 : 无* 输出 : 无*/ /因为主函数中已经开中断了,只要外部输入有下降沿或者低电平,下面函数才会运行,/所以下面延时函数后面是再次确认是否真的被按下了。void int0()interrupt 0/外部中断0的中断函数delay(1); /延时消抖if(k3=0)keyvalue=1;void int1() interrupt 2/外部中断1的中断函数delay(1);/延时消抖if(k4=0)keyvalue=0;/实际上如果把上面两个子函数改成如下 :按下k4键或者其他与单片机相接的按钮,/同样可以使得keyvalue=1;也就是说只要检测到有下降沿就能使得中断触发。/而没有指定谁来触发,为了避免其他东西触发,可以在后面检测是不是由所期望/的东西触发,如k=0;void int0()interrupt 0/外部中断0的中断函数delay(1); /延时消抖/if(k3=0)keyvalue=1;/void int1() interrupt 2/外部中断1的中断函数/delay(1);/延时消抖/if(k4=0)/keyvalue=0;/lcd1602可以显示字母数字符号的点阵型模块,由若干点阵字符块组成,每个字符块可以显示一个字符。lcd1602_writecom(0x38); /开显示(在下图所示初始化之前需要有)如需更详细的资料可参考1602液晶资料。主函数:#include#includelcd.huchar enchar_puzh16= pechin science ; /需要显示的字符串void main()uchar i;lcd1602_init();while(1) lcd1602_writecom(0x80); /这个如果没有会显示两行,且第二行的显示是science pechinfor(i=0;i0;c-)for(b=110;b0;b-);/* 函数名 : lcd1602_writecom* 函数功能 : 向lcd写入一个字节的命令* 输入 : com* 输出 : 无*/#ifndef lcd1602_4pins /当没有定义这个lcd1602_4pins时void lcd1602_writecom(uchar com) /写入命令lcd1602_e=0;/防止使用此程序之前用过这个变量所连接的接口,所以先将其复位lcd1602_rs=0;lcd1602_rw=0;lcd1602_datapins=com;delay1us(10);lcd1602_e=1;delay1us(10);lcd1602_e=0;#else void lcd1602_writecom(uchar com) /写入命令lcd1602_e=0;lcd1602_rs=0;lcd1602_rw=0;lcd1602_datapins=com;/由于4位的接线是接到p0口的高四位,所以传送高四位不用改delay1us(10);lcd1602_e=1;delay1us(10);lcd1602_e=0;delay1us(10);lcd1602_datapins=com4;delay1us(10);lcd1602_e=1;delay1us(10);lcd1602_e=0;#endif/* 函数名 : lcd1602_writedata* 函数功能 : 向lcd写入一个字节的数据* 输入 : dat* 输出 : 无*/ #ifndef lcd1602_4pins void lcd1602_writedata(uchar dat)/写入数据lcd1602_e=0;lcd1602_rs=1;lcd1602_rw=0;lcd1602_datapins=dat;delay1us(10);lcd1602_e=1;delay1us(10);lcd1602_e=0;#elsevoid lcd1602_writedata(uchar dat)/写入数据lcd1602_e=0;lcd1602_rs=1;lcd1602_rw=0;lcd1602_datapins=dat;/由于4位的接线是接到p0口的高四位,所以传送高四位不用改delay1us(10);lcd1602_e=1;delay1us(10);lcd1602_e=0;lcd1602_datapins=dat4;delay1us(10);lcd1602_e=1;delay1us(10);lcd1602_e=0;#endif/* 函数名 : lcd1602_init()* 函数功能 : 初始化lcd屏* 输入 : 无* 输出 : 无*/ #ifndeflcd1602_4pins /lcd中已经定义了 lcd1602_4pins,所以这里使用到的是下面第一个子程序void lcd1602_init() /lcd初始化子程序/是不是也需要初始化命令 ? lcd1602_writecom(0x38); /开显示lcd1602_writecom(0x0c); /开显示不显示光标lcd1602_writecom(0x06); /写一个指针加1lcd1602_writecom(0x01); /清屏lcd1602_writecom(0x80); /设置数据指针起点#elsevoid lcd1602_init() /lcd初始化子程序lcd1602_writecom(0x32); /将8位总线转为4位总线lcd1602_writecom(0x28); /在四位线下的初始化lcd1602_writecom(0x0c); /开显示不显示光标lcd1602_writecom(0x06); /写一个指针加1lcd1602_writecom(0x01); /清屏lcd1602_writecom(0x80); /设置数据指针起点#endiflcd.h函数:#ifndef _lcd_h_#define _lcd_h_/*当使用的是4位数据传输的时候定义*/#define lcd1602_4pins/*包含头文件*/#include#define uint unsigned int #define uchar unsigned char/*pin口定义*/#define lcd

温馨提示

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

评论

0/150

提交评论