C-51的基础知识
C语言是一种编译型程序设计语言,它兼顾了多种高级语言的特点,并具备汇编语言的功能。目前,使用C语言进行程序设计已经成为软件开发的一个主流。用C语言开发系统可以大大缩短开发周期,明显增强程序的可读性,便于改进、扩充和移植。而针对8051的C语言日趋成熟,成为了专业化的实用高级语言。
一、C-51基础
2、运算符
+ - * / (加减乘除)
> >= < <= (大于大于等于小于小于等于)
== != (测试等于测试不等于)
&& || ! (逻辑与逻辑或逻辑非)
>> << (位右移位左移)
& | (按位与按位或)
^ ~ (按位异或按位取反)
3、语句
if 分支选择语句
switch/case 多分支选择语句
for 循环语句
while 循环语句
do-while 循环语句
与标准C语言基本相同。
4、C-51中数据类型扩充定义
sfr:特殊功能寄存器声明
sfr16:sfr的16位数据声明
sbit:特殊功能位声明
bit:位变量声明
例:sfr SCON = 0X98; sfr16 T1 = 0xFF; sbit CY = PSW^7;
二、单片机集成开发环境
目前单片机开发应用平台常用的有Keil和Wave(伟福)。它们集编辑、编译、仿真于一体,支持汇编和C语言的程序设计,界面友好,易学易用。它们的工作界面如图2-1和图2-2所示。
图2-1 Keil的工作界面
图2-2 Wave的工作界面
实验一单片机控制发光管
一、实验目的
1、熟悉集成开发环境;
2、学习单片机I/O口的控制方法;
3、学习C51语句的编写方法。
二、实验说明
单片机I/O口的使用
对单片机的控制,其实就是对I/O口的控制,无论单片机对外界进行何种控制,或接受外部的何种控制,都是通过I/O口进行的。51单片机总共有P0、P1、P2、P3四个8位双向输入输出端口,每个端口都有锁存器、输出驱动器和输入缓冲器。4个I/O端口都能作输入输出口用,其中P0和P2通常用于对外部存储器的访问。
三、实验步骤
1、通过串口线连接电脑与实验箱;
2、打开集成开发系统,首先建立本实验的项目文件,输入编写的程序,进行编译检查有无语法错误,在没有错误情况下生成.HEX文件;
3、在XLISP软件环境中,把生成的.HEX下载到单片机中,运行程序观察二极管显示情况是否与设计目标一致。如有出入,修改源程序重新生成.HEX文件,再次下载运行直到达到设计要求。
四、参考实例
1、电亮一个发光管。
参考程序1:
#include
void main()
{
P1=0xfe;
}
参考程序2:
#include
sbit D2=P1^2;
void main()
{
D2=0;
}
2、发光管闪烁
参考程序1
#include
{
while(1)
{
a=50000;
d1=0;
while(a--);
a=50000;
d1=1;
while(a--);
d1=0;
}
}
参考程序2
#include
void main()
{
while(1)
{
d1=0;
delay();
d1=1;
delay();
d1=0;
}
}
void delay()
{
int x,y;
for(x=100;x>0;x--)
for(y=600;y>0;y--);
}
五、实验内容
在单片机集成开发环境下编写程序实现下列题目要求:
1、能够熟练建立项目;
2、电亮第一个和最后一个发光管;
3、电亮1、3、5、7发光管;
4、让L0、L2、L4、L6和L1、L3、L
5、L7发光管交替闪烁;
5、设计流水灯程序(提示:左移函数_crol_(a,b),该移位函数在头文件intrins.h中声明)。
六、实验报告要求
1、简述实验目的、原理。
2、列写实验内容4、5的程序在报告上。
3、简述在实验过程中出现的问题及如何解决的。
实验二单片机中断
一、实验目的
1、进一步熟悉集成开发环境;
2、掌握80C51中断的基本工作原理;
3、学习单片机中断的编写方法。
二、实验原理
80C51的中断系统
一、中断的概念
CPU在处理某一事件A时,发生了另一事件B请求CPU迅速去处理(中断发生);
CPU暂时中断当前的工作,转去处理事件B(中断响应和中断服务);
待CPU将事件B处理完毕后,再回到原来事件A被中断的地方继续处理事件A(中断返回),这一过程称为中断。
二、80C51中断系统的结构
80C51的中断系统有5个中断源(8052有6个),2个优先级,可实现二级中断嵌套。
三、中断控制寄存器(TCON)
IT0(TCON.0),外部中断0触发方式控制位。
当IT0=0时,为电平触发方式。
当IT0=1时,为边沿触发方式(下降沿有效)。
IE0(TCON.1),外部中断0中断请求标志位。
IT1(TCON.2),外部中断1触发方式控制位。
IE1(TCON.3),外部中断1中断请求标志位。
TF0(TCON.5),定时/计数器T0溢出中断请求标志位。
TF1(TCON.7),定时/计数器T1溢出中断请求标志位。
SCON的中断标志
RI(SCON.0),串行口接收中断标志位。当允许串行口接收数据时,每接收完一个串行帧,由硬件置位RI。注意,RI必须由软件清除。
TI(SCON.1),串行口发送中断标志位。当CPU将一个发送数据写入串行口发送缓冲器时,就启动了发送过程。每发送完一个串行帧,由硬件置位TI。CPU响应中断时,不能自动清除TI,TI必须由软件清除。
80C51中断的控制
一、中断允许控制
CPU对中断系统所有中断以及某个中断源的开放和屏蔽是由中断允许寄存器IE控制的。
EX0(IE.0),外部中断0允许位;
ET0(IE.1),定时/计数器T0中断允许位;
EX1(IE.2),外部中断1允许位;
ET1(IE.3),定时/计数器T1中断允许位;
ES(IE.4),串行口中断允许位;
EA (IE.7),CPU中断允许(总允许)位。
二、中断优先级控制
80C51单片机有两个中断优先级,即可实现二级中断服务嵌套。每个中断源的中断优先级都是由中断优先级寄存器IP中的相应位的状态来规定的。
PX0(IP.0),外部中断0优先级设定位;
PT0(IP.1),定时/计数器T0优先级设定位;
PX1(IP.2),外部中断1优先级设定位;
PT1(IP.3),定时/计数器T1优先级设定位;
PS (IP.4),串行口优先级设定位;
PT2 (IP.5),定时/计数器T2优先级设定位。
而80C52单片机有四个中断优先级,即可实现四级中断服务嵌套。每个中断源的中断优先级由中断优先级寄存器IP和IPH中的相应位的状态来规定的。
PX0(IPH.0),外部中断0优先级设定位;
PT0(IPH.1),定时/计数器T0优先级设定位;
PX1(IPH.2),外部中断1优先级设定位;
PT1(IPH.3),定时/计数器T1优先级设定位;
PS (IPH.4),串行口优先级设定位;
PT2 (IPH.5),定时/计数器T2优先级设定位。
同一优先级中的中断申请不止一个时,则有中断优先权排队问题。同一优先级的中断优先权排队,由中断系统硬件确定的自然优先级形成,其排列如所示:
三、实验步骤
1、通过串口线连接电脑与实验箱;
2、打开集成开发系统,首先建立本实验的项目文件,输入编写的程序,进行编译检查有无语法错误,在没有错误情况下生成.HEX文件;
3、在XLISP软件环境中,把生成的.HEX下载到单片机中,运行程序观察二极管显示情况是否与设计目标一致。如有出入,修改源程序重新生成.HEX文件,再次下载运行直到达到设计要求。
四、参考实例
/*外部0中断*/
#include
sbit d1=P1^0;
void main()
{
EA=1;//开总中断
EX0=1;//开外部中断0
IT0=0;//中断触发方式(TCON=0x01)
d1=1;
}
/*中断函数*/
void exter0() interrupt 0
{
d1=0;
五、实验内容
1、在单片机集成开发环境下调试例题程序,掌握外部中断基本设计方法。
2、修改例题程序,以外部中断1实现相同功能。
六、实验报告要求
1、简述实验目的、原理。
2、列写实验内容的程序在报告上。
3、简述在实验过程中出现的问题及如何解决的。
实验三数码管动态显示
一、实验目的
1、进一步熟悉集成开发环境;
2、掌握数码管显示的基本原理;
3、学习单片机I/O口的控制方法;
4、学习C51语句的编写方法。
二、实验原理
数码管实际上是由7个发光管组成的8字形构成的,加上小数点就是8个,如图4-1所示。我们分别把它命名为ABCDEFGH。
图4-1 数码管
数码管的接线:
共阳接法:低电平亮,高电平灭
共阴接法:低电平灭,高电平亮
实验箱数码管接法是共阳接法,所以低电平是亮,高电平是灭。实验中用P0.0-P0.7控制数码管的8段,P0口的八位与发光管的对应关系见表4-1所示。
表4-1 P0口与发光管的对应关系
数码管控制的原理图如图4-2所示。原理图中把所有数码管的a-h同名端连在一起,而每一个显示器的公共极COM是各自独立地受IO线控制。CPU向字段输出口送出字形码,所有显示器接收到相同的字形码,由8个PNP的三极管,来控制这8位哪位工作。
图4-2 数码管控制原理图
这里有一个矛盾,所有数码管的8个笔划段a-h同名端连在一起,那么在一个屏幕上如何显示01234567这样不同的数字呢?的确,在这种接法中同一瞬间所有的数码管显示都是相同的,不能显示不同的数字。在单片机里,首先显示一个数,然后关掉,然后显示第二个数,又关掉,那么将看到连续的数字显示,轮流点亮扫描过程中,每个显示器的点亮时间是极为短暂的(约1ms),由于人的视觉暂留现象及发光二极管的余晖效应,尽管实际上各位显示器并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会由闪烁感。
实验中数码管的选择利用P2口的八位进行控制,选中一个数码管给P2口对应位置0,
关闭一个数码管给P2口对应位置1。
三、实验步骤
1、通过串口线连接电脑与实验箱;
2、打开集成开发系统,首先建立本实验的项目文件,输入编写的程序,进行编译检查有无语法错误,在没有错误情况下生成.HEX文件;
3、在XLISP软件环境中,把生成的.HEX下载到单片机中,运行程序观察二极管显示情况是否与设计目标一致。如有出入,修改源程序重新生成.HEX文件,再次下载运行直到达到设计要求。
四、参考实例
1、在第一个数码管上显示数字。
参考程序:
#include
void main()
{
while(1)
{
P2=0xfe;
P0=0x28;
}
}
2、在一个数码管上逐个显示数字0—9。
参考程序:
#include
#define uint unsigned int
#define uchar unsigned char
uchar num;
uchar code table[]={0x28,0x7e,0xa2,0x62,0x74,0x61,0x21,0x7a,0x20,0x60};
void delay(uint z);
void main()
{
while(1)
{
P2=0xfe;
for(num=0;num<10;num++)
{
P0=table[num];
delay(1000);
}
}
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
五、实验内容
在单片机集成开发环境下编写程序实现下列题目要求:
1、在1、3、5、7数码管上显示相同的数字;
2、在8个数码管上动态显示0—7八个数;
3、在数码管显示多位数。(如:251,379等)
六、实验报告要求
1、简述实验目的、原理。
2、列写实验内容的程序在报告上。
3、简述在实验过程中出现的问题及如何解决的。
实验四单片机定时/计数器
一、实验目的
1、进一步熟悉集成开发环境;
2、掌握80C51定时/计数器的基本工作原理;
3、学习80C51定时/计数器的编写方法。
二、实验原理
一、定时/计数器的工作原理
加1计数器输入的计数脉冲有两个来源,一个是由系统的时钟振荡器输出脉冲经12分频后送来;一个是T0或T1引脚输入的外部脉冲源。每来一个脉冲计数器加1,当加到计数器为全1时,再输入一个脉冲就使计数器回零,且计数器的溢出使TCON中TF0或TF1置1,向CPU发出中断请求(定时/计数器中断允许时)。如果定时/计数器工作于定时模式,则表示定时时间已到;如果工作于计数模式,则表示计数值已满。
可见,由溢出时计数器的值减去计数初值才是加1计数器的计数值。
二、定时/计数器的结构
定时/计数器的实质是加1计数器(16位),由高8位和低8位两个寄存器组成。TMOD 是定时/计数器的工作方式寄存器,确定工作方式和功能;TCON是控制寄存器,控制T0、T1的启动和停止及设置溢出标志。
1、工作方式寄存器TMOD
工作方式寄存器TMOD用于设置定时/计数器的工作方式,低四位用于T0,高四位用于T1。其格式如下:
GA TE:门控位。GA TE=0时,只要用软件使TCON中的TR0或TR1为1,就可以启动定时/计数器工作;GA TA=1时,要用软件使TR0或TR1为1,同时外部中断引脚或也为高电平时,才能启动定时/计数器工作。
C/T:定时/计数模式选择位。=0为定时模式;=1为计数模式。
M1M0:工作方式设置位。定时/计数器有四种工作方式,由M1M0进行设置。
2、控制寄存器TCON
TCON的低4位用于控制外部中断,已在前面介绍。TCON的高4位用于控制定时/计数器的启动和中断申请。其格式如下:
TF1(TCON.7):T1溢出中断请求标志位。T1计数溢出时由硬件自动置TF1为1。CPU 响应中断后TF1由硬件自动清0。T1工作时,CPU可随时查询TF1的状态。所以,TF1可用作查询测试的标志。TF1也可以用软件置1或清0,同硬件置1或清0的效果一样。
TR1(TCON.6):T1运行控制位。TR1置1时,T1开始工作;TR1置0时,T1停止工作。TR1由软件置1或清0。所以,用软件可控制定时/计数器的启动与停止。
TF0(TCON.5):T0溢出中断请求标志位,其功能与TF1类同。
TR0(TCON.4):T0运行控制位,其功能与TR1类同。
3、定时/计数器初始化程序应完成如下工作:
对TMOD赋值,以确定T0和T1的工作方式。
计算初值,并将其写入TH0、TL0或TH1、TL1。
中断方式时,则对IE赋值,开放中断。
使TR0或TR1置位,启动定时/计数器定时或计数。
三、实验步骤
1、通过串口线连接电脑与实验箱;
2、打开集成开发系统,首先建立本实验的项目文件,输入编写的程序,进行编译检查有无语法错误,在没有错误情况下生成.HEX文件;
3、在XLISP软件环境中,把生成的.HEX下载到单片机中,运行程序观察二极管显示情况是否与设计目标一致。如有出入,修改源程序重新生成.HEX文件,再次下载运行直到达到设计要求。
四、参考实例
#include
#define uint unsigned int
#define uchar unsigned char
uchar temp,bai,shi,ge,aa;
uchar code table[]={0x28,0x7e,0xa2,0x62,0x74,0x61,0x21,0x7a,0x20,0x60}; void delay(uint z);
void init();
void display(uchar bai,uchar shi,uchar ge);
void main()
{
init();
while(1)
{
if(aa==20)
{
aa=0;
temp++;
if(temp==101)
{
temp=0;
}
bai=temp/100;
shi=temp%100/10;
ge=temp%10;
}
display(bai,shi,ge);
}
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void display(uchar bai,uchar shi,uchar ge) {
P0=table[bai];
P2=0xfe;
delay(1);
P0=table[shi];
P2=0xfd;
delay(1);
P0=table[ge];
P2=0xfb;
delay(1);
}
void init()
{
aa=0;
temp=0;
TMOD=0X01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
aa++;
}
五、实验内容
1、在单片机集成开发环境下调试例题程序,掌握定时/计数的基本设计方法。
2、在例题基础上,增加定时器1,利用定时器1控制流水灯,数码管每加一,流水灯移动一个。
六、实验报告要求
1、简述实验目的、原理。
2、列写实验内容的程序在报告上。
3、简述在实验过程中出现的问题及如何解决的。