单片机C语言小程序
单片机c语言程序设计
单片机c语言程序设计
单片机C语言程序设计是指使用C语言编写单片机控制程序,实现各种功能和任务。
具体步骤如下:
1. 确定程序功能:首先明确单片机的控制目标和需求,确定要实现的功能。
2. 编写主函数:使用C语言编写一个主函数,作为程序的入
口点。
在主函数中,可以定义变量、调用函数、编写主要的程序逻辑。
3. 初始化设置:在主函数中,进行单片机的初始化设置,包括引脚初始化、时钟设置、模块初始化等。
4. 编写中断服务函数:根据需要,编写中断服务函数。
在中断服务函数中,处理特定的中断事件,例如定时器中断、外部中断等。
5. 编写任务函数:根据程序的需求,编写各个任务函数。
任务函数可以是循环执行的函数,或者是根据事件触发执行的函数。
6. 实现控制逻辑:在任务函数中编写具体的控制逻辑代码,根据需要使用控制语句(如if、switch)和循环语句(如for、while)。
7. 进行调试和测试:完成编写后,进行程序的调试和测试,通过仿真器或者实际连接到单片机的硬件进行测试。
8. 优化和修改:根据测试结果进行程序的优化和修改,改善程序的性能和功能。
9. 生成可执行文件:将C源文件编译成可执行文件,可以直接下载到单片机中运行。
10. 下载和运行:将生成的可执行文件通过下载器下载到目标单片机中,并进行运行测试。
以上是单片机C程序设计的一般步骤,具体的实现方法和内容会根据不同的单片机型号和功能需求而有所不同。
STC单片机C语言程序设计STC单片机C语言编程入门
STC单片机C语言程序设计STC单片机C语言编程入门STC单片机是一种广泛应用于嵌入式系统和物联网设备中的微控制器。
它具有体积小、功耗低、运算能力强等特点,被广泛应用于各种控制系统中。
本文将介绍STC单片机C语言程序设计的入门知识,以帮助初学者快速上手。
首先,我们需要了解一些基本的概念和术语。
1.单片机:单片机是一种集成电路芯片,其中包含了中央处理器、存储器、输入输出接口等功能模块。
它可以独立完成特定的任务,不需要额外的硬件设备与之配合。
2.C语言:C语言是一种高级编程语言,被广泛应用于嵌入式系统开发中。
它具有简洁、高效的特点,易于理解和学习。
了解了上述基本概念后,接下来我们将介绍一些STC单片机C语言程序设计的入门知识。
2. 程序结构:一个C语言程序通常由多个函数组成,其中一个函数名为main(。
程序从main(函数开始执行,执行完main(函数后程序结束。
3.数据类型:C语言中有多种数据类型,包括整型、浮点型、字符型等。
在使用数据类型时,需要根据需要选择合适的数据类型。
4.变量和常量:在C语言中,可以使用变量和常量来存储数据。
变量是可以改变值的,而常量是固定不变的值。
5. 输入和输出:C语言中使用标准库函数scanf(和printf(来实现输入和输出操作。
通过这两个函数可以从键盘获取输入数据,并将结果输出到屏幕上。
6. 控制语句:在C语言中,可以使用if语句、for循环和while循环等控制语句来控制程序的执行流程。
通过控制语句,可以实现条件判断、循环执行等功能。
7.函数:函数是C语言中的重要概念,它可以将一段代码封装成一个独立的模块,方便重复使用。
在编写程序时,可以自定义函数来实现特定的功能。
8.数组:数组是一种存储相同类型数据的连续内存区域。
在C语言中,可以使用数组来存储一组数据,并对数据进行操作。
9.文件操作:C语言提供了文件操作函数,可以对文件进行读写操作。
通过文件操作,可以实现数据的持久化存储。
自己写的51单片机的红外线遥控接收程序(C语言)
//51单片机做的红外遥控实验(C语言)#include<reg51.h>#define u8 unsigned char#define u16 unsigned int#define ID 0x00 //本遥控器的ID号sbit ir=P3^3;code u8 seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //0-9的段码code u8 s[]={1,0x40,0x48,0x04,0x02,0x05,0x54,0x0A,0x1E,0x0E}; u8 buf[4];bit ir_f=0;u8 nu;void delay(u16 x){while(x--);}void show(u16 x){u8 i=0,k=0;u8 s[4];kk:s[i]=x%10;if((x/10)>=1){x=x/10;i++;goto kk;}k=i+1;for(i=0;i<k;i++){P0=seg[s[i]];P2=~(8>>i);delay(300);P0=0XFF;P2=0XFF;}}void timer0_init(){TH0=0;TL0=0;TMOD|=0x01;TR0=0;}u16 low_test(){u16 t;TR0=1;while((ir==0)&&((TH0&0X80)!=0X80));TR0=0;t=TH0;t<<=8;t|=TL0;TH0=0;TL0=0; //t=(TH*256+TL0);//机器周期数return t;}u16 high_test(){u16 t;TR0=1;while((ir==1)&&((TH0&0X80)!=0X80));TR0=0;t=TH0;t<<=8;t|=TL0;TH0=0;TL0=0;return t;}/*u16 time_test(bit x){}*/u8 receive_8bit(){u8 d,i;u16 t;for(i=0;i<8;i++){t=low_test();t=high_test();d>>=1;if((t>=2750)&&(t<=3100)){d|=0x80;}}return d;}void ir_decode(){u16 t;u8 i;if(ir==0)//有遥控信号{t=low_test();//8295-9000us,倍频的是16590-18000if((t>=14500)&&(t<=18000))//检查引导码低电平时间{t=high_test();if((t>=8000)&&(t<=9000))//检查高电平{for(i=0;i<4;i++){buf[i]=receive_8bit();}if(buf[0]==(~buf[1]))//检查系统码是否正确{if(buf[0]==ID){if(buf[2]==(~buf[3])){//具体按键处理ir_f=1; //遥控有效}}}}}}}/*void key(){if(buf[2]==0x40){P1^=(1<<0);}if(buf[2]==0x48){P1^=(1<<1);}}*/void ir_execuse(){if(ir_f==1){switch(buf[2]){case 0x40:P1^=(1<<0);break;case 0x48:P1^=(1<<1);break;case 0x04:P1^=(1<<2);break;case 0x02:P1^=(1<<3);break;case 0x05:P1^=(1<<4);break;case 0x54:P1^=(1<<5);break;case 0x0A:P1^=(1<<6);break;case 0x1E:P1^=(1<<7);break;}ir_f=0;}}void show_d(){u8 j;for(j=0;j<10;j++){if(s[j]==buf[2]){nu=j;break;}}show(nu);}void isr_init(){EA=1;EX1=1;//外部中断,一直看3.3有没有下降沿。
单片机c语言程序设计实例100例--基于805i+proteus仿真
以下是一个基于8051单片机和Proteus仿真环境的C语言程序设计实例:实例1:点亮LED灯
在这个例子中,我们将使用C语言编写一个简单的程序来控制8051单片机的一个I/O引脚,使其驱动一个LED灯。
c代码:
要使用Proteus进行仿真,你需要按照以下步骤操作:
1. 打开Proteus软件,创建一个新的设计工程。
2. 在元件库中搜索并添加相应的8051单片机型号(如AT89C51)和LED 元件到工作区。
3. 根据实际硬件连接,正确配置单片机的引脚和LED的连接。
4. 右键单击单片机元件,选择“Edit Component”打开编辑窗口。
5. 在“Program File(s)”区域,点击右侧的浏览按钮,选择你的C语言源文件(如上述的main.c)。
6. 点击“OK”关闭编辑窗口,然后点击工具栏上的“Play”按钮开始仿真。
在仿真过程中,你应该能看到LED灯被点亮,这表明你的C语言程序已经在Proteus环境中成功运行。
以上只是一个基础的例子,实际的"单片机C语言程序设计实例100例--基于8051+Proteus仿真"会包含更复杂和多样化的应用场景,包括定时器/计数器
应用、中断处理、串口通信、ADC/DAC转换、液晶显示等等。
每个实例都会详细介绍程序设计思路、代码实现以及如何在Proteus中进行仿真调试。
通过这些实例的学习和实践,你可以逐步掌握8051单片机的C语言编程技巧和Proteus仿真环境的使用方法。
51单片机C语言编程100例-单片机c语言编程
51单片机C语言编程100例-单片机c语言编程51单片机C语言编程100例在嵌入式系统领域,单片机是常用的硬件平台之一。
而C语言作为一种高级编程语言,能够为单片机编程提供更高的效率和便利性。
本文将介绍51单片机C语言编程的100个实例,帮助读者了解并掌握单片机的基本编程技巧和应用方法。
一、LED灯控制1. 实例介绍:通过控制51单片机的IO口输出,实现对LED灯的亮灭控制。
2. 实例代码:```#include <reg51.h>sbit LED = P1^0; // 定义P1口的第0位为LEDvoid main(){while(1){LED = 0; // LED灯亮delay(1000); //延时1秒LED = 1; // LED灯灭delay(1000); //延时1秒}}```二、数码管显示1. 实例介绍:使用数码管显示数字0-9,并实现数码管的动态显示效果。
2. 实例代码:```#include <reg51.h>unsigned char code DispTab[] ={0xC0,0XF9,0XA4,0XB0,0X99,0X92,0X82};sbit WeiDu = P1^2;sbit DUAN = P1^0;void delay(unsigned int t){unsigned int i;while(t--)for(i=0;i<125;i++);}void main(){unsigned int i;while(1){P0 = DispTab[i]; // 显示数字iDUAN = 1; //点亮段码DUAN = 0; //关闭段码P0 = ~(0x01 << i); // 选择数码管的位 WeiDu = 0; // 打开选通位WeiDu = 1; // 关闭选通位delay(100); // 延时100msi++;if(i > 9) i = 0;}}```三、外部中断1. 实例介绍:使用外部中断,当外部输入信号发生变化时,触发中断程序。
c单片机C语言编写的PWM程序
89c51单片机C语言编写的PWM程序PWM, 单片机, C语言, 程序, 编写分享到:新浪微博 QQ空间开心网人人网说明:本程序使用STC89C52RC单片机,22.1184MHz晶振,要使用本程序需要自己修改,我是用来控制直流电机的,外接了L298驱动电路,有问题或意见请回复,谢谢^_^#include "reg52.H"#include "MyType.h"//=============L298端口定义===============sbit ENA = P3^6;?//左轮驱动使能sbit IN1 = P0^3;?//左轮黑线(-)sbit IN2 = P0^4;?//左轮红线(+)sbit IN3 = P0^5;?//右轮红线(-)sbit IN4 = P0^6;?//右轮黑线(+)sbit ENB = P3^7;?//右轮驱动使能//=============PWM================#define PWM_COUST 100?//PWM细分等份uchar MOTO_speed1;??//左边电机转速uchar MOTO_speed2; ??//右边电机转速uchar PWM_abs1;???//左边电机取绝对值后占空比uchar PWM_abs2;???//左边电机取绝对值后占空比?uchar PWM_var1=20;??//左边电机直走速度(不同的电机,此参数不同)uchar PWM_var2=20;??//右边电机直走速度uchar PWMAnd = 0;??//PWM自增变量/****************************************************************** 名称:motor(char speed1,char speed2);功能:同时调节电机的转速参数:speed1:电机1的PWM值;speed2:电机2的PWM值?? speed>0.正转;speed<0.反转(-100~100)调用:extern int abs(int val); 取绝对值返回:/******************************************************************/ void motor(char speed1,char speed2){??//==============左边电机=============?if (speed1>0)??{??IN1 =0;IN2 =1;//正转??}???else if (speed1<0)??{??IN1 =1;IN2 =0;//反转??}?//==============右边电机=============?if (speed2>0)??{??IN3 =1;IN4 =0;//正转??}?else if (speed2<0)??{??IN3 =0;IN4 =1;//反转??}}/******************************************************************名称:motor_PWM();功能:PWM占空比输出参数:无调用:无返回:无/******************************************************************/void motor_PWM (){?uchar PWM_abs1;?uchar PWM_abs2;?PWM_abs1=MOTO_speed1;?PWM_abs2=MOTO_speed2;?if (PWM_abs1>PWMAnd) ENA=1;??? //左边电机占空比输出??else ENA=0;?if (PWM_abs2>PWMAnd) ENB=1;??? //右边电机占空比输出??else ENB=0;?if (PWMAnd>=PWM_COUST) PWMAnd=0;? //PWM计数清零??else PWMAnd+=1;}???/******************************************************************名称:void TIME_Init ();功能:定时器初始化指令:调用:无返回:无/******************************************************************/void TIME_Init ()?{//=========定时器T2初始化 PWM==================?T2CON = 0x00;? ?T2MOD = 0x00;? ?RCAP2H = 0xff;?//定时0.1ms? ?RCAP2L = 0x47;? ?TH2 = 0xff;? ?TL2 = 0x47;?ET2 = 1;??//定时器2中断开?TR2 = 1;??//PWM定时器关,PWM周期为10ms?}/******************************************************************名称:void PWM_Time2 () interrupt 5功能:T2中断,PWM控制参数:调用:motor_PWM();//PWM占空比输出返回:/******************************************************************/?void PWM_Time2 () interrupt 5{? ?TR2 = 0;?TF2 = 0;?ET2 = 0;?//定时器0中断禁止?motor_PWM();//PWM占空比输出?ET2 = 1;?//定时中断0开启?TR2 = 1;}main(){TIME_Init ()?;motor(50,50);//左右电机的转速都是50}。
51单片机c语言教程
51单片机c语言教程在本教程中,我们将学习如何在51单片机上使用C语言进行编程。
无论您是初学者还是有一定经验的开发者,本教程都将对您有所帮助。
首先,我们需要了解一些基本概念。
51单片机是一种基于哈弗微电子公司的MCS-51架构的微控制器。
它采用了Harvard结构,即将程序存储器和数据存储器分开。
它具有各种功能和接口,可以满足不同的应用需求。
在使用C语言进行51单片机编程之前,必须安装相应的开发工具。
这里我们推荐使用Keil C51开发环境。
安装完成后,我们就可以开始编写第一个程序了。
#include <reg51.h>void main(){// 在这里编写您的代码}以上是一个简单的C语言程序模板。
我们使用了reg51.h头文件,该文件包含了与51单片机相关的寄存器定义和常量。
接下来,我们可以开始编写具体的功能代码了。
例如,如果我们想要在LED灯上闪烁一个简单的模式,可以使用以下代码:#include <reg51.h>sbit LED = P1^0;void main(){while(1){LED = 0; // 点亮LEDdelay(1000); // 延时1秒LED = 1; // 熄灭LEDdelay(1000); // 延时1秒}}在这个程序中,我们首先定义了一个LED的控制引脚,然后通过循环实现了闪烁的功能。
在每次循环中,我们先点亮LED,然后通过调用延时函数延时1秒,再将LED熄灭,再次延时1秒。
这样就形成了一个简单的LED闪烁效果。
除了控制IO口外,51单片机还可以实现其他各种功能,如定时器、串口通信等。
这些功能的实现也都可以通过C语言来完成。
希望通过本教程,您可以对51单片机的C语言编程有一个基本的了解。
在以后的学习中,您可以深入研究这些知识,并通过实践来提升自己的能力。
祝您学习愉快!。
STC89c52单片机 计算器C语言程序
STC89c52单片机计算器C语言程序STC89C52单片机计算器C语言程序下面是STC89C52单片机计算器的C语言程序,适用于P2位选P0段选时钟12MHZ。
程序代码如下:includedefine uchar unsigned chardefine uint unsigned intuchar Led[17] = {0x3f。
0x06.0x5b。
0x4f。
0x66.0x6d。
0x7d。
0x07.0x7f。
0x6f。
0x77.0x7c。
0x39.0x5e。
0x79.0x71.0x00};long float Number[]={0,0,0,0};uchar A[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};long int D[] = {0,0,0,0,0,0,0,0};uchar code C[] = {0x0.0xFE。
0xFD。
0xFB。
0xF7.0xEF。
0xDF。
0xBF。
0x7F};uchar k=16;uchar b;long float Out_put;uchar e=0;uchar g=0;uchar L=0;uchar g1=0;uchar g2=0;uchar g3=0;uchar g4=0;char j=-1;uchar m=0;uchar n=0;uchar x=0;程序中包含了头文件和宏定义,以及数码管段选、数码管显示位控制寄存器、数码管显示内容寄存器、数码管位选、按键控制变量等各种变量。
其中,Led数组存储了数码管的段选值,Number数组存储了数字,A数组存储了数码管的位选值,D数组存储了数码管的显示内容,C数组存储了数码管的位选值,k、b、Out_put、e、g、L、g1、g2、g3、g4、j、m、n、x 等变量用于按键控制和运算。
代码中没有明显的格式错误,可以直接使用。
下面是已经修改过的文章:uchar xo = 0./*控制开始计数小数点的变量*/long int result;void Delay(uint o) {uint i。
51单片机C语言程序设计源代码
新概念51单片机C语言教程----入门、提高、开发、拓展全攻略郭天祥编著电子工业出版社例2.2.1编写程序,点亮第一个发光二极管(part2_1.c P27)#include <reg52.h> //52系列单片机头文件sbit led1=P1^0; //声明单片机P1口的第一位void main() //主函数{led1=0; /*点亮第一个发光二极管*/}例2.2.2编写程序,点亮P1口的若干二极管(part2_2.c P39)#include <reg52.h> //52系列单片机头文件void main() //主函数{P1=0xaa;//while(1);}例2.5.1利用for语句延时特性,编写第一个发光二极管以间隔1S亮灭闪动的程序(part2_3.c P42)#include <reg52.h> //52系列单片机头文件#define uint unsigned int //宏定义sbit led1=P1^0; //声明单片机P1口的第一位uint i,j;void main() //主函数{while(1) //大循环{led1=0; /*点亮第一个发光二极管*/for(i=1000;i>0;i--) //延时for(j=110;j>0;j--);led1=1; /*关闭第一个发光二极管*/for(i=1000;i>0;i--) //延时for(j=110;j>0;j--);}}- 2 - 例2.6.1编写程序使第一个发光二极管以间隔500ms亮灭闪动。
(part2_4.c P48)#include <reg52.h> //52系列单片机头文件#define uint unsigned int //宏定义sbit led1=P1^0; //声明单片机P1口的第一位void delay1s(); //声明子函数void main() //主函数{while(1) //大循环{led1=0; /*点亮第一个发光二极管*/delay1s(); //调用延时子函数led1=1; /*关闭第一个发光二极管*/delay1s(); //调用延时子函数}}void delay1s() //子函数体{uint i,j;for(i=500;i>0;i--)for(j=110;j>0;j--);}例2.7.1编写程序使第一个二极管以亮200ms、灭800ms的方式闪动。
51单片机C语言编程100例
51单片机C语言编程100例目录实例3:用单片机控制第一个灯亮 ...................................... 3 实例4:用单片机控制一个灯闪烁:认识单片机的工作频率 ................ 3 实例5:将P1口状态分别送入P0、P2、P3口:认识I/O口的引脚功能...... 4 实例6:使用P3口流水点亮8位LED.................................... 4 实例7:通过对P3口地址的操作流水点亮8位LED........................ 5 实例8:用不同数据类型控制灯闪烁时间 ................................ 6 实例9:用P0口、P1 口分别显示加法和减法运算结果 .. (8)实例10:用P0、P1口显示乘法运算结果 ................................ 8 实例11:用P1、P0口显示除法运算结果 ................................ 9 实例12:用自增运算控制P0口8位LED流水花样 ........................ 9 实例13:用P0口显示逻辑\与\运算结果 (10)实例14:用P0口显示条件运算结果 ................................... 10 实例15:用P0口显示按位\异或\运算结果 ............................. 10 实例16:用P0显示左移运算结果 ..................................... 10 实例17:\万能逻辑电路\实验 ........................................ 11 实例18:用右移运算流水点亮P1口8位LED............................ 11 实例19:用if语句控制P0口8位LED的流水方向 ...................... 12 实例20:用swtich语句的控制P0口8位LED的点亮状态 ................ 12 实例21:用for语句控制蜂鸣器鸣笛次数 .............................. 14 实例22:用while语句控制LED.......................................15 实例23:用do-while语句控制P0口8位LED流水点亮 .................. 16 实例24:用字符型数组控制P0口8位LED流水点亮 ..................... 16 实例25:用P0口显示字符串常量 .................................... 17 实例26:用P0 口显示指针运算结果................................... 18 实例27:用指针数组控制P0口8位LED流水点亮 ....................... 18 实例28:用数组的指针控制P0 口8 位LED流水点亮 .................... 19 实例29:用P0 、P1口显示整型函数返回值 ............................ 20 实例30:用有参函数控制P0口8位LED流水速度 ....................... 21 实例31:用数组作函数参数控制流水花样 .............................. 22 实例32:用指针作函数参数控制P0口8位LED流水点亮 ................. 23 实例33:用函数型指针控制P1口灯花样 ............................... 24 实例34:用指针数组作为函数的参数显示多个字符串 .................... 25 实例35:字符函数ctype.h应用举例 .................................. 26 实例36:内部函数intrins.h应用举例 ................................ 27 实例37:标准函数stdlib.h应用举例 (27)实例38:字符串函数string.h应用举例 ............................... 28 实例39:宏定义应用举例2........................................... 28 实例40:宏定义应用举例 2........................................... 29 实例41:宏定义应用举例3. (29)实例42:用定时器T0查询方式P2口8位控制LED闪烁 .................. 30 实例43:用定时器T1查询方式控制单片机发出1KHz音频 ................ 31 实例44:将计数器T0计数的结果送P1口8位LED显示 (31)实例45:用定时器T0的中断控制1位LED闪烁.........................32实例46:用定时器T0的中断实现长时间定时...........................33实例47:用定时器T1中断控制两个LED以不同周期闪烁.................34实例48:用计数器T1的中断控制蜂鸣器发出1KHz音频..................35实例49:用定时器T0的中断实现\渴望\主题曲的播放...................35实例50-1:输出50个矩形脉冲.......................................38实例50-2:计数器T0统计外部脉冲数 (39)实例51-2:定时器T0的模式2测量正脉冲宽度.........................40实例52:用定时器T0控制输出高低宽度不同的矩形波...................40实例53:用外中断0的中断方式进行数据采集..........................41实例54-1:输出负脉宽为200微秒的方波..............................42实例54-2:测量负脉冲宽度..........................................43实例55:方式0控制流水灯循环点亮..................................44实例56-1:数据发送程序 (45)实例56-2:数据接收程序............................................46实例57-1:数据发送程序............................................47实例57-2:数据接收程序............................................48实例58:单片机向PC发送数据 (49)实例59:单片机接收PC发出的数据...................................50实例60:用LED数码显示数字5.......................................51实例61:用LED数码显示器循环显示数字0~9...........................51实例62:用数码管慢速动态扫描显示数字\........................52实例63:用LED数码显示器伪静态显示数字1234........................53实例64:用数码管显示动态检测结果. (54)实例65:数码秒表设计..............................................56实例66:数码时钟设计..............................................57实例67:用LED数码管显示计数器T0的计数值.........................61实例68:静态显示数字“59”........................................62实例69:无软件消抖的独立式键盘输入实验............................63实例70:软件消抖的独立式键盘输入实验..............................63实例71:CPU控制的独立式键盘扫描实验...............................64实例72:定时器中断控制的独立式键盘扫描实验........................67实例73:独立式键盘控制的4级变速流水灯............................70实例74:独立式键盘的按键功能扩展:\以一当四\......................72实例75:独立式键盘调时的数码时钟实验..............................74实例76:独立式键盘控制步进电机实验.. (78)实例77:矩阵式键盘按键值的数码管显示实验..........................81实例78:矩阵式键盘按键音..........................................84实例79:简易电子琴................................................85实例80:矩阵式键盘实现的电子密码锁................................91实例81:用LCD显示字符'A'.. (95)实例82:用LCD循环右移显示\......................98实例83:用LCD显示适时检测结果...................................102实例84:液晶时钟设计 (106)实例85:将数据\写入AT24C02再读出送P1口显示................112实例86:将按键次数写入AT24C02,再读出并用1602LCD显示............116实例87:对I2C总线上挂接多个AT24C02的读写操作...................124实例88:基于AT24C02的多机通信读取程序.........................129实例88:基于AT24C02的多机通信写入程序..........................133实例90:DS18B20温度检测及其液晶显示..............................144实例91:将数据\写入X5045再读出送P1口显示..................153实例92:将流水灯控制码写入X5045并读出送P1口显示................157实例93:对SPI总线上挂接多个X5045的读写操作.....................161实例94:基于ADC0832的数字电压表.................................165实例95:用DAC0832产生锯齿波电压.................................171实例96:用P1口显示红外遥控器的按键值............................172实例97:用红外遥控器控制继电器...................................174实例98:基于DS1302的日历时钟....................................177实例99:单片机数据发送程序.......................................186实例100:电机转速表设计..........................................187模拟霍尔脉冲......................................................192/某函数的使用和熟悉某///实例3:用单片机控制第一个灯亮#include //包含51单片机寄存器定义的头文件 void main(void) while(1) //无限循环P1=0某fe; //P1=1111 1110B,即P1.0输出低电平 }//实例4:用单片机控制一个灯闪烁:认识单片机的工作频率#include //包含单片机寄存器的头文件 /某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某函数功能:延时一段时间某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某/void delay(void) //两个void意思分别为无需返回值,没有参数传递unsigned int i; //定义无符号整数,最大取值范围65535for(i=0;i<20000;i++) //做20000次空循环;//什么也不做,等待一个机器周期}/某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某函数功能:主函数(C语言规定必须有也只能有1个主函数)某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某/ voidmain(void)while(1) //无限循环P1=0某fe; //P1=1111 1110B, P1.0输出低电平 delay(; //延时一段时间P1=0某ff; //P1=1111 1111B, P1.0输出高电平 delay(; //延时一段时间 } }//实例5:将P1口状态分别送入P0、P2、P3口:认识I/O口的引脚功能#include //包含单片机寄存器的头文件/某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某函数功能:主函数(C语言规定必须有也只能有1个主函数)某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某/void main(void)while(1) //无限循环P1=0某ff; // P1=1111 1111, 熄灭LED P0=P1; // 将 P1口状态送入P0口 P2=P1; // 将 P1口状态送入P2口 P3=P1; // 将 P1口状态送入P3口 } }//实例6:使用P3口流水点亮8位LED#include //包含单片机寄存器的头文件 /某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某函数功能:延时一段时间某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某/void delay(void)unsigned char i,j; for(i=0;i<250;i++)for(j=0;j<250;j++) ; }/某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某函数功能:主函数某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某/ voidmain(void)while(1)P3=0某fe; //第一个灯亮 delay(; //调用延时函数 P3=0某fd; //第二个灯亮 delay(; //调用延时函数 P3=0某fb; //第三个灯亮 delay(; //调用延时函数 P3=0某f7; //第四个灯亮 delay(; //调用延时函数P3=0某ef; //第五个灯亮 delay(; //调用延时函数 P3=0某df; //第六个灯亮 delay(; //调用延时函数 P3=0某bf; //第七个灯亮 delay(; //调用延时函数 P3=0某7f; //第八个灯亮delay(; //调用延时函数 } }//实例7:通过对P3口地址的操作流水点亮8位LED#include //包含单片机寄存器的头文件sfr 某=0某b0; //P3口在存储器中的地址是b0H,通过sfr可定义8051内核单片机//的所有内部8位特殊功能寄存器,对地址某的操作也就是对P1口的操作/某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某。
c语言小程序
#include<stdio.h>#include<string.h>#include<stdlib.h>#include<conio.h>#define MAX 5int score[MAX];int cnt=5;struct wyw{char bh[20];char num[10]; //学号char name[8]; //姓名char sex[4]; //性别int math; //数学成绩int english; //英语成绩int chinese; //语文成绩}wyw1;char menu() //菜单选择函数{char n;puts("\t\t 欢迎使用学生成绩数据处理系统\n ");puts("\t\t***************菜单******************");puts("\t\t\t\t1.输入\n");puts("\t\t\t\t2.修改\n");puts("\t\t\t\t3.删除\n");puts("\t\t\t\t4.插入\n");puts("\t\t\t\t5.处理\n");puts("\t\t\t\t6.查询\n");puts("\t\t\t\t7.退出\n");printf("\t\t***********************************\n");printf("选择您需要输入的数字!(1-7):[]\b\b");while(1){n=getchar();getchar();if(n<'1'||n>'7')printf("输入错误,请您重新输入(1-6):[]\b\b");elsebreak;}return n;}void bubble(){int i,j,temp;for (i=0;i<=MAX-2;i++){for(j=0;j<MAX-i-1;j++)if(score[j]>score[j+1]){temp=score[j];score[j]=score[j+1];score[j+1]=temp;}}}mincl(){int i;printf("\n Input 5 numbers:\n");for (i=0;i<MAX;i++)scanf("%d",&score[i]);bubble();for(i=0;i<MAX;i++){printf(" %d",score[i]);if((i+1)%5==0)printf("\n");}}void bubble1(){int i,j,temp;for (i=0;i<=MAX-2;i++){for(j=0;j<MAX-i-1;j++)if(score[j]<score[j+1]){temp=score[j];score[j]=score[j+1];score[j+1]=temp;}}}maxcl(){int i;printf("Input 5 numbers:\n");for (i=0;i<MAX;i++)scanf("%d",&score[i]);bubble1();for(i=0;i<MAX;i++){printf(" %d",score[i]);if((i+1)%5==0)printf("\n");}}char clmenu() //成绩处理菜单{char ch;puts("\t\t\t 学生成绩数据处理\t\t\n ");puts("\t\t\t\t1.从低到高查询\n");puts("\t\t\t\t2.从高到低查询\n");puts("\t\t\t\t3.退出\n");printf("\t\t***********************************\n");printf("选择你要输入的数字(1-3):[]\b\b");while(1){ch=getchar();getchar();if(ch<'1'||ch>'3')printf("输入错误,请重新选择功能(1-3):[]\b\b");elsebreak;}return ch;}void hadle(){while(1)switch(clmenu()){case '1':mincl();break;case '2':maxcl();break;case '3':return;break;}}\void append() //信息输入函数{struct wyw wyw1;FILE *fp;char ch;if((fp=fopen("inform.txt","w"))==NULL){printf("\ncan not open file!\n");getch();exit(1);}do{printf("编号:");gets(wyw1.bh);printf("姓名:");gets();printf("学号:");gets(wyw1.num);printf("性别:");gets(wyw1.sex);fwrite(&wyw1,sizeof(wyw1),1,fp);printf("是否输入更多的学生信息:(y/n)");ch=getch();getch();}while(ch=='Y'||ch=='y');fclose(fp);}void display() //信息删除函数{struct wyw wyw1;int flag;FILE *fp1;FILE *fp2;char ch[10];char f;do{if((fp1=fopen("inform.txt","rb"))==NULL){printf("\tcan not open the inform file!");getch();exit(1);}if((fp2=fopen("temp.txt","wb"))==NULL){printf("\tcan not creat the inform file!");getch();exit(1);}printf("请输入您要修改的学生编号或学号:");gets(ch);flag=0;while(fread(&wyw1,sizeof(wyw1),1,fp1)==1){if(strcmp(ch,wyw1.num)==0){printf("\n\n请输入信息:\n");printf("编号:");gets(wyw1.bh);printf("姓名:");gets();printf("学号:");gets(wyw1.num);printf("性别:");gets(wyw1.sex);flag=1;break;}else if(strcmp(ch,wyw1.bh)==0){printf("\n\n请输入信息:\n");printf("编号:");gets(wyw1.bh);printf("姓名:");gets();printf("学号:");gets(wyw1.num);printf("性别:");gets(wyw1.sex);flag=1;break;}fwrite(&wyw1,sizeof(wyw1),1,fp2);}fclose(fp1);fclose(fp2);if(flag==1){printf("修改成功!\n");remove("wyw.txt");}elseprintf("你不能打开这个文件额!!\n");printf("Modify any more?(Y/N):[]\b\b");f=getchar();getchar();}while(f=='Y'||f=='y');}void del() //信息修改函数{struct wyw wyw1;int flag;FILE *fp1;FILE *fp2;char ch[10];char f;do{if((fp1=fopen("inform.txt","rb"))==NULL){printf("\tcan not open the inform file!");getch();exit(1);}if((fp2=fopen("temp.txt","wb"))==NULL){printf("\tcan not creat the inform file!");getch();exit(1);}printf("请输入您希望删除的学生信息:");gets(ch);flag=0;while(fread(&wyw1,sizeof(wyw1),1,fp1)==1){if(strcmp(ch,wyw1.num)==0){printf("\n\nPlease input the nem information:\n");printf("编号:");gets(wyw1.bh);printf("姓名:");gets();printf("学号:");gets(wyw1.num);printf("性别:");gets(wyw1.sex);flag=1;break;}fwrite(&wyw1,sizeof(wyw1),1,fp2);}fclose(fp1);fclose(fp2);if(flag==1){printf("删除成功!\n");remove("wyw.txt");}elseprintf("Can not find this record!\n");printf("您希望修改更多的学生信息么?(Y/N):[]\b\b");f=getchar();getchar();}while(f=='Y'||f=='y');}void search() //信息查询函数{struct whj;FILE * fp;int flag=0;char ch[10];if((fp=fopen("inform.txt","rb"))==NULL){printf("\tCan not open the inform file!");gets(ch);exit(1);}if(flag==1){printf("请输入您希望查询的学生信息:");gets(ch);}else{printf("请输入您想查询的学生姓名:");gets(ch);}fclose(fp);}void reads(int dt[]) //信息插入函数{int i;printf("please enter data:\n");for(i=0;i<cnt;i++)scanf("%d",&dt[i]);}void insert(int dt[],int ins, int pos){int i;for(i=cnt-1;i>=pos;i--){dt[i+1]=dt[i];}dt[pos]=ins;cnt++;}void list(int dt[]){int i;for(i=0;i<cnt;i++)printf("%5d",dt[i]);}void charge(){int date[MAX],ins;int pos;reads(date);printf("Orginal data:");list(date);printf("\nPlease input insert data & position:\n");scanf("%d%d",&ins,&pos);insert(date,ins,pos);printf("Data after inserted:\n");list(date);}main(){while(1)switch(menu()){case '1':system("cls");append();break; //信息输入case '2':system("cls");display();break; //信息修改case '3':system("cls");del();break; //信息删除case '4':system("cls");charge();break; //信息插入case '5':system("cls");hadle();break; //成绩查询case '6':system("cls");search();break; //信息查询case '7':exit(1); //退出}return 0;}。
51单片机C语言编程100例单片机c语言编程
51单片机C语言编程100例单片机c语言编程单片机是一种常用于嵌入式系统的微型计算机,可以根据预设的程序来执行指令。
而C语言是一种高级编程语言,具有较强的可读性和可移植性。
在单片机编程中,C语言是常用的编程语言之一。
本文将介绍51单片机C语言编程中的100个实例,帮助读者了解单片机编程的基本概念和技巧。
1. LED灯闪烁这是一个简单的实例,用于让LED灯交替闪烁。
在C语言中,可以使用宏定义和循环语句来实现:```c#include <reg52.h>#define LED P1void delay(unsigned int t) //延时函数{unsigned int i, j;for (i = t; i > 0; i--)for (j = 110; j > 0; j--);}void main(){while (1) //循环执行{LED = 0xFF; //LED灯亮delay(1000); //延时1秒LED = 0x00; //LED灯灭delay(1000); //延时1秒}}```2. 数码管显示这个实例演示了如何使用数码管进行数字显示。
在C语言中,可以通过控制IO口状态来实现:```c#include <reg52.h>#define LED P0unsigned char code digit[] ={ //数码管显示值表0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; void delay(unsigned int t) //延时函数{unsigned int i, j;for (i = t; i > 0; i--)for (j = 110; j > 0; j--);}void main(){unsigned int i;while (1) //循环执行{for(i=0;i<10;i++){LED = digit[i]; //显示数字delay(1000); //延时1秒}}```3. 蜂鸣器发声这个实例展示了如何使用蜂鸣器进行声音发声。
单片机c语言消息队列程序
单片机c语言消息队列程序如何使用单片机C语言编写消息队列程序。
消息队列是一种在多任务环境中实现进程间通信的机制,可以用于在任务之间传递数据和消息。
在单片机开发中,使用消息队列可以实现不同任务之间的数据传输和通信。
本文将介绍如何使用单片机C语言编写消息队列程序。
1. 定义消息队列结构体首先,我们需要定义一个消息队列的结构体,用于存储队列的相关信息,包括队列长度、当前队列大小、队列头和尾指针等。
例如:typedef struct {int queue[QUEUE_SIZE];int head;int tail;int size;} MessageQueue;其中,QUEUE_SIZE为消息队列的最大长度,可以根据需要进行设置。
2. 初始化消息队列在程序初始化时,需要对消息队列进行初始化,包括将队列头和尾指针置为0,队列大小置为0。
例如:void initQueue(MessageQueue* queue) {queue->head = 0;queue->tail = 0;queue->size = 0;}3. 向消息队列中添加消息当有任务需要向消息队列中添加消息时,可以调用该函数。
首先,需要判断队列是否已满,如果已满则无法添加消息。
如果队列未满,则将消息添加到队列尾部,并更新队列尾指针和队列大小。
例如:void enqueue(MessageQueue* queue, int message) {if (queue->size == QUEUE_SIZE) {队列已满,无法添加消息return;}queue->queue[queue->tail] = message;queue->tail = (queue->tail + 1) QUEUE_SIZE; 更新队列尾指针queue->size++;}4. 从消息队列中取出消息当有任务需要从消息队列中取出消息时,可以调用该函数。
51单片机C语言编程100例-单片机c语言编程
51单片机C语言编程100例-单片机c语言编程(共19页)-本页仅作为预览文档封面,使用时请删除本页-目录实例3:用单片机控制第一个灯亮...................... 错误!未定义书签。
实例4:用单片机控制一个灯闪烁:认识单片机的工作频率错误!未定义书签。
实例5:将 P1口状态分别送入P0、P2、P3口:认识I/O口的引脚功能错误!未定义书签。
实例6:使用P3口流水点亮8位LED.................... 错误!未定义书签。
实例7:通过对P3口地址的操作流水点亮8位LED........ 错误!未定义书签。
实例8:用不同数据类型控制灯闪烁时间................ 错误!未定义书签。
实例9:用P0口、P1 口分别显示加法和减法运算结果.... 错误!未定义书签。
实例10:用P0、P1口显示乘法运算结果................ 错误!未定义书签。
实例11:用P1、P0口显示除法运算结果................ 错误!未定义书签。
实例12:用自增运算控制P0口8位LED流水花样........ 错误!未定义书签。
实例13:用P0口显示逻辑"与"运算结果................ 错误!未定义书签。
实例14:用P0口显示条件运算结果.................... 错误!未定义书签。
实例15:用P0口显示按位"异或"运算结果.............. 错误!未定义书签。
实例16:用P0显示左移运算结果...................... 错误!未定义书签。
实例17:"万能逻辑电路"实验......................... 错误!未定义书签。
实例18:用右移运算流水点亮P1口8位LED............. 错误!未定义书签。
实例19:用if语句控制P0口8位LED的流水方向....... 错误!未定义书签。
C语言经典小程序和C语言编写的小游戏,带注释 (自动保存的)
C语言经典小程序和C语言编写的小游戏,带注释1、写一个定时关机的小程序,可以立即关闭计算机,也可以一段时间后关闭计算机。
#include<stdio.h>#include<windows.h>#include<string.h>#include<stdlib.h>int main(){char cmd[20] = "shutdown -s -t ";//远程关机,系统在一定时间之后关机char t[5] = "0";//将输入的时间初始化为0int c;system("title C语言关机程序"); //设置cmd窗口标题system("mode con cols=48 lines=25"); //窗口宽度高度system("color f0"); //可以写成 red 调出颜色组,这里f0是调亮白色system("date /T");//输出系统当前日期system("TIME /T");//输出系统当前时间printf("----------- C语言关机程序 -----------\n");printf("1.实现10分钟内的定时关闭计算机\n");printf("2.立即关闭计算机\n");printf("3.注销计算机\n");printf("0.退出系统\n");printf("-------------------------------------\n");scanf("%d", &c);//对输入的数值进行判断循环switch (c){case 1:printf("您想在多少秒后自动关闭计算机?(0~600)\n");scanf("%s", t);system(strcat(cmd, t)); //将输入的时间连接上已经调用的命令break;case 2:system("shutdown -p");//立即关闭计算机break;case 3:system("shutdown -l");//注销计算机break;case 0:system("pause");break;default:printf("Error!\n");}system("pause");return 0;}2、这是一个简单的猜拳游戏(剪刀、石头、步),让你与电脑对决。
C单片机的C语言程序设计解读
C单片机的C语言程序设计解读C单片机的C语言程序设计是指使用C语言编写单片机程序的过程。
C语言是一种通用编程语言,非常适合用于嵌入式系统开发,特别是单片机。
在单片机中,C语言用于控制和编程微处理器的功能,比如读写IO口、中断处理、定时器控制等。
1. 引入库函数:在C单片机程序设计中,首先需要引入相应的库函数。
库函数是封装了一系列常用功能的函数集合,通过调用库函数可以方便地实现各种功能。
例如,可以引入stdio.h库函数实现标准的输入输出功能,或者引入io.h库函数实现IO口控制功能。
2. 定义宏定义和常量:在C单片机程序中,可以使用宏定义和常量来定义一些固定的数值或者字符串。
宏定义使用#define指令,在程序中定义一个标识符,并将其替换为指定的文本。
常量使用const关键字定义,定义后数值不可更改。
宏定义和常量可以提高程序的可读性和可维护性。
3.变量的声明和定义:变量是C程序的基本组成元素之一,用于存储和表示数据。
在C单片机程序中,可以先声明变量的类型,然后再进行定义。
变量的类型可以是整型、浮点型、字符型等。
变量的作用范围和生命周期取决于其在程序中的声明位置。
4.函数的定义和调用:函数是C程序的另一个基本组成元素,用于封装一段独立的代码块,实现特定的功能。
在C单片机程序中,可以先定义函数的原型,然后再实现函数的具体功能。
函数的调用使用函数名和实参列表,可以将函数的返回值赋给一个变量或者作为一个表达式的值进行使用。
5. 控制语句:控制语句是用于控制程序执行流程的语句。
C单片机程序中常用的控制语句包括条件语句(if-else语句、switch语句)、循环语句(for循环、while循环、do-while循环)和跳转语句(break语句、continue语句、goto语句)。
通过控制语句可以根据不同的条件执行不同的操作,或者循环执行一些代码块,或者跳转到程序的其他位置。
6.中断处理:中断是单片机程序中常用的一种处理方式。
简易密码锁(C语言程序)
29 30 31
PSEN ALE EA
1 2 3 4 5 6 7 8
P1.0/T2 P1.1/T2EX P1.2 P1.3 P1.4 P1.5 P1.6 P1.7
AT89C52
P0.0/AD0 P0.1/AD1 P0.2/AD2 P0.3/AD3 P0.4/AD4 P0.5/AD5 P0.6/AD6 P0.7/AD7
P3.4/T0 P3.5/T1 P3.6/WR P3.7/RD
10 11 12 13 14 15 16 17
P2.0 P2.1 P2.2 P2.3 P2.4 P2.5 P2.6 P2.7
R17
510
R18
10k
D1
P2.2 LED
D4
P2.3 LED
D5
P2.4 LED
} else P0 = table[9];
index++; }break;
case 2: { rece[index]=2; if(rece[index]==mima[index]) { P0 = table[6]; nn ++; }
else P0 = table[9];
index++;
} break;
P0 = table[6]; nn ++; } else P0 = table[9];
index++;
} break;
case 0: break;
}
if (key5==0) {
for(x=200;x>0;x--); if (key5==0)//防抖动 {
9
if(index == 4) { index = 0;//index 清零,密码从第一个开始 if(nn==4)//四个密码均正确 { P0=table[10]; test_cror (); } else P0=table[11]; nn=0;//nn 清零,下次正确再记录 }
c语言单片机定时器计数器程序
C语言单片机定时器计数器程序1. 简介C语言是一种被广泛应用于单片机编程的高级编程语言,它可以方便地操作单片机的各种硬件模块,包括定时器和计数器。
定时器和计数器是单片机中常用的功能模块,它们可以用来实现精确的时间控制和计数功能。
本文将介绍如何使用C语言编程实现单片机的定时器计数器程序。
2. 程序原理在单片机中,定时器和计数器通常是以寄存器的形式存在的。
通过对这些寄存器的操作,可以实现定时器的启动、停止、重载以及计数器的增加、减少等功能。
在C语言中,可以通过对这些寄存器的直接操作来实现对定时器和计数器的控制。
具体而言,可以使用C语言中的位操作和移位操作来对寄存器的各个位进行设置和清零,从而实现对定时器和计数器的控制。
3. 程序设计在编写单片机定时器计数器程序时,首先需要确定定时器的工作模式,包括定时模式和计数模式。
在定时模式下,定时器可以按照设定的时间间隔生成中断,从而实现定时功能;在计数模式下,定时器可以根据外部的脉冲信号进行计数。
根据不同的应用需求,可以选择不同的工作模式,并根据具体情况进行相应的配置。
4. 程序实现在C语言中,可以通过编写相应的函数来实现对定时器和计数器的控制。
需要定义相关的寄存器位置区域和位掩码,以便于程序对这些寄存器进行操作。
编写初始化定时器的函数、启动定时器的函数、停止定时器的函数、重载定时器的函数等。
通过这些函数的调用,可以实现对定时器的各种操作,从而实现定时和计数功能。
5. 示例代码以下是一个简单的单片机定时器计数器程序的示例代码:```c#include <reg52.h>sbit LED = P1^0; // 定义LED连接的引脚void InitTimer() // 初始化定时器{TMOD = 0x01; // 设置定时器0为工作在方式1TH0 = 0x3C; // 设置初值,定时50msTL0 = 0xAF;ET0 = 1; // 允许定时器0中断EA = 1; // 打开总中断void Timer0_ISR() interrupt 1 // 定时器0中断服务函数{LED = !LED; // 翻转LED状态TH0 = 0x3C; // 重新加载初值,定时50msTL0 = 0xAF;}void m本人n(){InitTimer(); // 初始化定时器while(1){}}```以上代码实现了一个简单的定时器中断程序,当定时器计数到50ms 时,会触发定时器中断,并翻转LED的状态。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
单片机C语言小程序#include <at89x51.h>#include <absacc.h>#define V AR XBYTE[0x00] /*V AR为外部位址0000*/#define read 0 /*93c46读取的识别码READ=0*/#define write 2 /*93c46写入的识别码WRITE=2*/#define ewen 4 /*93C46写致能的识别码EWEN=4*/#define ewds 6 /*93C46写除能的识别码EWDS=6*/#define cs INT0 /*93C46 CS接脚=8051 RD P3.2*/#define clk INT1 /*93C46 CLK接脚=8051 WR P3.3*/#define di T0 /*93C46 DI接脚=8051 T1 P3.4*/#define d0 T1 /*93C46 DO接脚=8051 T0 P3.5*/#define LOW 0x49 /*存放测试温度的下限值*/#define HIGH 0x51 /*存放测试温度的上限值*/bit FLAG0=0; /*宣告TIMER0响应旗号*///外接工业专用温度传感器时,目前设置测量温度为0-99度:static const char tab[13]={0x3a,0x53,0x6f,0x8a,0xa3, /*0度,10度,20度,30度,40度*/0xB8,0xC8,0xD5,0xDE,0xE5, /*50度,60度,70度,80度,90度*/0xEA,0xEE}; /*100度,110度*///使用板上AD590温度传感器时,目前设置测量温度为0-99度://static const char tab[13]={0x88,0x8d,0x92,0x97,0x9c, /*0度,10度,20度,30度,40度,*/// 0xa1,0xa6,0xab,0xb0,0xb5, /*50度,60度,70度,80度,90度*/// 0xba,0xc0}; /*100度,110度*/char data1[2];char C,S,k=0;char MEP[7]; /*显示器值存放阵列*///MEP[0]=数码管最低位显示值,温度指示小数点后位//MEP[1]=数码管次低位显示值,温度指示个位数//MEP[2]=数码管高位显示值,温度指示十位数//MEP[3]=数码管最低位显示值,功能显示目前定为1,2,3,4,5//MEP[4]=//MEP[5]=暂放置温度显示值,高4位为温度指示十位数值,低4位为温度指示个位数值//MEP[6]=在温度显示与电压调整副程式中,将测量值C暂存MEP[6]中unsigned char combuf[10];unsigned char ADR46,CH,CL,m,C1,C2; /*ADR46,93C46位址,CH高位元组,CL低*/ int sec,sec1;char ptr=0,ptr1=0x10,psr=0; /*ptr显示器值存放阵MEP[]指标,ptr1显示器扫描指标*/ char count=100,sb=0;void delay (unsigned int value) /*延时副程式*/{while (value!=0) value--; /*10us延时*/}void COMP(); /*宣告比较现在温度与设定温度副程式*/void SET();void disp(); /*宣告设定温度副程式*/void to9346(char c); /*宣告TO93C46副程式*/void SDT46(char c); /*宣告串入副程式*/RDT46(); /*宣告串出副程式*/void clear(void); /*宣告清除按键存放/显示器阵列MEP[]副副程式*/void xch(void); /*宣告按键存放/显示器阵列MEP[]右键滚入副程式*/void sjust(void); /*温度显示慢跳调整副程式*/void temper(); /*宣告温度显示与电压调整副程式*/void UP(); /*宣告温度上升键防抖动副程式*/void UPA(); /*宣告温度设置上升副程式*/void DOWN(); /*宣告温度下降键防抖动副程式*/void DOWNA(); /*宣告温度设置下降副程式*/void FONTION(); /*宣告模式键判断模式副程式*/void buf(); /*宣告从93C46取设定值副程式*/void SA VE(); /*宣告设置存储副程式*///********************************************************main() /*主程式*/{TMOD=0x11; /*TIMER0,TIMER1工作在MODE1*/TH0=(65535-50000)/256; /*设定TIMER0初值,50ms*/TL0=(65536-50000)%256;TH1=(65535-4000)/256; /*设定TIMER1初值,4ms*/TL1=(65536-4000)%256;IE=0x8a; /*TIMER0,TIMER1中断致能*/TR1=1; /*启动TIMER1*/P2_7=1; /*测试用,温度下限指示*/P2_6=1; /*测试用,温度在正常上下限间指示*/P2_5=1; /*测试用,温度上限指示*/buf(); /*从93C46取设定值副程式*/while(1) /*无条件循环*/{P3_1=0;MEP[3]=0xff; /*将模式位置零*/V AR=0x00; /*产生写入信号WR=0,令ADC0804开始转换*/while (P2_0==1); /*侦测ADC0804的接脚INTR=0否?是则转换完成*/S=V AR; /*读取ADC0804资料,存入C*/sjust(); /*温度显示慢跳调整副程式*/temper(); /*呼叫温度显示调整副程式*/MEP[5]=(MEP[2] < <4)|MEP[1];if(P2_4==0) SET(); /*如果模式键P2.4按下,则呼叫SET副程式,否则跳过副程式*/if(MEP[5] <combuf[5]) { P2_7=0; /*如果测试温度小于设定温度下限,等式成立时,则将低温指示打开P2_7=0*/P2_6=P2_5=1; /*关闭指示灯*/}if(MEP[5]> combuf[6]) { P2_5=0; /*如果测试温度大于设定温度上限,等式成立时,则将高温指示打开P2_5=0*/P2_7=P2_6=1; /*关闭指示灯*/}if(combuf[5] <MEP[5])if(MEP[5] <combuf[6]) { P2_6=0; /*如果测试温度介于设定温度上下限之间,则将正常指示打开P2_6=0*/ P2_7=P2_5=1;}} /*跳至while(1),无条件循环*/单片机的C语言轻松入门随着单片机开发技术的不断发展,目前已有越来越多的人从普遍使用汇编语言到逐渐使用高级语言开发,其中主要是以C语言为主,市场上几种常见的单片机均有其C语言开发环境.这里以最为流行的80C51单片机为例来学习单片机的C语言编程技术.本书共分六章,每章一个专题,以一些待完成的任务为中心,围绕该任务介绍C语言的一些知识,每一个任务都是可以独立完成的,每完成一个任务,都能掌握一定的知识,等到所有的任务都完成后,即可以完成C语言的入门工作.第1章C语言概述及其开发环境的建立学习一种编程语言,最重要的是建立一个练习环境,边学边练才能学好.Keil软件是目前最流行开发80C51系列单片机的软件,Keil提供了包括C编译器,宏汇编,连接器,库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境( Vision)将这些部份组合在一起.在学会使用汇编语言后,学习C语言编程是一件比较容易的事,我们将通过一系列的实例介绍C语言编程的方法.图1-1所示电路图使用89S52单片机作为主芯片,这种单片机性属于80C51系列,其内部有8K的FLASH ROM,可以反复擦写,并有ISP功能,支持在线下载,非常适于做实验.89S52的P1引脚上接8个发光二极管,P3.2~P3.4引脚上接4个按钮开关,我们的任务是让接在P1引脚上的发光二极管按要求发光.1.1 简单的C程序介绍例1-1: 让接在P1.0引脚上的LED发光./*************************************************平凡单片机工作室Copyright 2003 pingfan's mcustudioAll rights Reserved作者:周坚dddl.c单灯点亮程序*************************************************/图1-1 接有LED的单片机基本电路P1.0EA/VPPVCCXTAL2XTAL1GNDRST+5V+5V+R1E110K10UCY27P27P1KPZ1D8D189×××#include "reg51.h"sbit P1_0=P1^0;void main(){ P1_1=0;}这个程序的作用是让接在P1.0引脚上的LED点亮.下面来分析一下这个C语言程序包含了哪些信息.1)"文件包含"处理.程序的第一行是一个"文件包含"处理.所谓"文件包含"是指一个文件将另外一个文件的内容全部包含进来,所以这里的程序虽然只有4行,但C编译器在处理的时候却要处理几十或几百行.这里程序中包含REG51.h 文件的目的是为了要使用P1这个符号,即通知C编译器,程序中所写的P1是指80C51单片机的P1端口而不是其它变量.这是如何做到的呢打开reg51.h可以看到这样的一些内容:/*-------------------------------------------------------------------------REG51.HHeader file for generic 80C51 and 80C31 microcontroller.Copyright (c) 1988-2001 Keil Elektronik GmbH and Keil Software, Inc.All rights reserved.--------------------------------------------------------------------------*//* BYTE Register */sfr P0 = 0x80;sfr P1 = 0x90;sfr P2 = 0xA0;sfr P3 = 0xB0;sfr PSW = 0xD0;sfr ACC = 0xE0;sfr B = 0xF0;sfr SP = 0x81;sfr DPL = 0x82;sfr DPH = 0x83;sfr PCON = 0x87;sfr TCON = 0x88;sfr TMOD = 0x89; sfr TL0 = 0x8A; sfr TL1 = 0x8B; sfr TH0 = 0x8C; sfr TH1 = 0x8D; sfr IE = 0xA8;sfr IP = 0xB8;sfr SCON = 0x98; sfr SBUF = 0x99; /* BIT Register */ /* PSW */sbit CY = 0xD7; sbit AC = 0xD6; sbit F0 = 0xD5; sbit RS1 = 0xD4; sbit RS0 = 0xD3; sbit OV = 0xD2; sbit P = 0xD0;/* TCON */sbit TF1 = 0x8F; sbit TR1 = 0x8E; sbit TF0 = 0x8D; sbit TR0 = 0x8C; sbit IE1 = 0x8B; sbit IT1 = 0x8A; sbit IE0 = 0x89; sbit IT0 = 0x88;/* IE */sbit EA = 0xAF; sbit ES = 0xAC; sbit ET1 = 0xAB; sbit EX1 = 0xAA; sbit ET0 = 0xA9; sbit EX0 = 0xA8; /* IP */sbit PS = 0xBC; sbit PT1 = 0xBB; sbit PX1 = 0xBA; sbit PT0 = 0xB9; sbit PX0 = 0xB8; /* P3 */sbit RD = 0xB7; sbit WR = 0xB6; sbit T1 = 0xB5;sbit T0 = 0xB4;sbit INT1 = 0xB3;sbit INT0 = 0xB2;sbit TXD = 0xB1;sbit RXD = 0xB0;/* SCON */sbit SM0 = 0x9F;sbit SM1 = 0x9E;sbit SM2 = 0x9D;sbit REN = 0x9C;sbit TB8 = 0x9B;sbit RB8 = 0x9A;sbit TI = 0x99;sbit RI = 0x98;熟悉80C51内部结构的读者不难看出,这里都是一些符号的定义,即规定符号名与地址的对应关系.注意其中有sfr P1 = 0x90;这样的一行(上文中用黑体表示),即定义P1与地址0x90对应,P1口的地址就是0x90 (0x90是C语言中十六进制数的写法,相当于汇编语言中写90H).从这里还可以看到一个频繁出现的词:sfrsfr并标准C语言的关键字,而是Keil为能直接访问80C51中的SFR而提供了一个新的关键词,其用法是:sfrt 变量名=地址值.2)符号P1_0来表示P1.0引脚.在C语言里,如果直接写P1.0,C编译器并不能识别,而且P1.0也不是一个合法的C语言变量名,所以得给它另起一个名字,这里起的名为P1_0,可是P1_0是不是就是P1.0 呢你这么认为,C编译器可不这么认为,所以必须给它们建立联系,这里使用了Keil C 的关键字sbit来定义,sbit的用法有三种:第一种方法:sbit 位变量名=地址值第二种方法:sbit 位变量名=SFR名称^变量位地址值第三种方法:sbit 位变量名=SFR地址值^变量位地址值如定义PSW中的OV可以用以下三种方法:sbit OV=0xd2 (1)说明:0xd2是OV的位地址值sbit OV=PSW^2 (2)说明:其中PSW必须先用sfr定义好sbit OV=0xD0^2 (3)说明:0xD0就是PSW的地址值因此这里用sfr P1_0=P1^0;就是定义用符号P1_0来表示P1.0引脚,如果你愿意也可以起P10一类的名字,只要下面程序中也随之更改就行了.3)main称为"主函数".每一个C语言程序有且只有一个主函数,函数后面一定有一对大括号"{}",在大括号里面书写其它程序.从上面的分析我们了解了部分C语言的特性,下面再看一个稍复杂一点的例子.例1-2 让接在P1.0引脚上的LED闪烁发光/*************************************************平凡单片机工作室Copyright 2003 pingfan's mcustudioAll rights Reserved作者:周坚ddss.c单灯闪烁程序*************************************************/#include "reg51.h"#define uchar unsigned char#define uint unsigned intsbit P10=P1^0;/*延时程序由Delay参数确定延迟时间*/void mDelay(unsigned int Delay){ unsigned int i;for(;Delay>0;Delay--){ for(i=0;iNew Project…"菜单,出现对话框,要求给将要建立的工程起一个名字,这里起名为exam2,不需要输入扩展名.点击"保存"按钮,出现第二个对话框,如图1-2所示,这个对话框要求选择目标CPU(即你所用芯片的型号),Keil支持的CPU很多,这里选择Atmel公司的89S52芯片.点击AT M E L前面的"+"号,展开该层,点击其中的89S52, 然后再点击"确定"按钮,回到主窗口,此时,在工程窗口的文件页中,出现了"Target 1",前面有"+"号,点击"+"号展开,可以看到下一层的"Source Group1",这时的工程还是一个空的工程,里面什么文件也没有,需要手动把刚才编写好的源程序加入,点击"Source Group1"使其反白显示,然后,点击鼠标右键,出现一个下拉菜单,如图1-3所示,选中其中的"Add file to Group"Source Group1",出现一个对话框,要求寻找源文件.双击exam2.c文件,将文件加入项目,注意,在文件加入项目后,该对话框并不消失,等待继续加入其它文件,但初学时常会误认为操作没有成功而再次双击同一文件,这时会出现如图1-4所示的对话框,提示你所选文件已在列表中,此时应点击"确定",返回前一对话框,然后点击"Close"即可返回主接口,返回后,点击"Source Group 1"前的加号,exam3.c文件已在其中.双击文件名,即打开该源程序.1.3 工程的详细设置工程建立好以后,还要对工程进行进一步的设置,以满足要求.首先点击左边Project窗口的Target 1,然后使用菜单"Project->Option for target 'target1'"即出现对工程设置的对话框,这个对话框共有8个页面,大部份设置项取默认值就行了. Target页图1-2 选择单片机型号图1-3 加入文件如图1-5所示,Xtal后面的数值是晶振频率值,默认值是所选目标CPU的最高可用频率值,该值与最终产生的目标代码无关,仅用于软件模拟调试时显示程序执行时间.正确设置该数值可使显示时间与实际所用时间一致,一般将其设置成与你的硬件所用晶振频率相同,如果没必要了解程序执行的时间,也可以不设.Memory Model用于设置RAM使用情况,有三个选择项:Small: 所有变量都在单片机的内部RAM中;Compact:可以使用一页(256字节)外部扩展RAM;Larget: 可以使用全部外部的扩展RAM.Code Model用于设置ROM空间的使用,同样也有三个选择项:Small:只用低于2K的程序空间;Compact:单个函数的代码量不能超过2K,整个程序可以使用64K程序空间;Larget:可用全部64K空间;这些选择项必须根据所用硬件来决定,由于本例是单片应用,所以均不重新选择,按默认值设置.Operating:选择是否使用操作系统,可以选择Keil提供了两种操作系统:Rtx tiny和Rtx full,也可以不用操作系统(None),这里使用默认项None,即不用操作系统.图1-5 设置目标图1-4 重复加入源程序得到的提示OutPut页如图1-6所示,这里面也有多个选择项,其中Creat Hex file用于生成可执行代码文件,该文件可以用编程器写入单片机芯片,其格式为intelHEX格式,文件的扩展名为.HEX,默认情况下该项未被选中,如果要写片做硬件实验,就必须选中该项.工程设置对话框中的其它各页面与C51编译选项,A51的汇编选项,BL51连接器的连接选项等用法有关,这里均取默认值,不作任何修改.以下仅对一些有关页面中常用的选项作一个简单介绍.Listing页该页用于调整生成的列表文件选项.在汇编或编译完成后将产生(*.lst)的列表文件,在连接完成后也将产生(*.m51)的列表文件,该页用于对列表文件的内容和形式进行细致的调节,其中比较常用的选项是"C Compile Listing"下的"Assamble Code"项,选中该项可以在列表文件中生成C语言源程序所对应的汇编代码,建议会使用汇编语言的C初学者选中该项,在编译完成后多观察相应的List文件,查看C源代码与对应汇编代码,对于提高C语言编程能力大有好处.C51页该页用于对Keil的C51编译器的编译过程进行控制,其中比较常用的是"Code Optimization"组,如图1.7所示,该组中Level是优化等级,C51在对源程序进行编译时,可以对代码多至9级优化,默认使用第8级,一般不必修改,如果在编译中出现一些问题,可以降低优化级别试一试.Emphasis是选择编译优先方式,第一项是代码量优化(最终生成的代码量小);第二项是速度优先(最终生成的代码速度快);第三项是缺省.默认采用速度优先,可根据需要更改.图1-6 设置输出文件Debug页该页用于设置调试器,Keil提供了仿真器和一些硬件调试方法,如果没有相应的硬件调试器,应选择Use Simulator,其余设置一般不必更改,有关该页的详细情况将在程序调试部分再详细介绍.至此,设置完成,下面介绍如何编译,连接程序以获得目标代码,以及如何进行程序的调试工作.1.4 编译,连接下面我们通过一个例子来介绍C程序编译,连接的过程.这个例子使P1口所接LED以流水灯状态显示.将下面的源程序输入,命名为exam3.c,并建立名为exam3的工程文件,将exam3.c文件加入该工程中,设置工程,在Target页将Xtal后的值由24.0改为12.0,以便后面调试时观察延时时间是否正确,本项目中还要用到我们所提供的实验仿真板,为此需在Debug页对Dialog DLL对话框作一个设置,在进行项目设置时点击Debug,打开Debug页,可以看到Dialog DLL对话框后的Parmeter:输入框中已有默认值-pAT52,在其后键入空格后再输入-dledkey,如图1-8所示.例1-3 使P1口所接LED以流水灯状态显示/**************************************************; 平凡单片机工作室; ; Copyright 2003 pingfan's McuStudio; All rights Reserved图1-7C51编译器选项;作者:周坚;lsd.c;流水灯程序**************************************************/#include "reg51.h"#include "intrins.h"#define uchar unsigned char#define uint unsigned int/*延时程序由Delay参数确定延迟时间*/void mDelay(unsigned int Delay){ unsigned int i;for(;Delay>0;Delay--){ for(i=0;iBuild target,对当前工程进行连接,如果当前文件已修改,将先对该文件进行编译,然后再连接以产生目标代码;如果选择Rebuild All target files将会对当前工程中的所有文件重新进行编译然后再连接,确保最终生产的目标代码是最新的,而Translate ….项则仅对当前文件进行编译,不进行连接.以上操作也可以通过工具栏按钮直接进行.图1-9是有关编译,设置的工具栏按钮,从左到右分别是:编译,编译连接,全部重建,停止编译和对工程进行设置.编译过程中的信息将出现在输出窗口中的Build页中,如果源程序中有语法错误,会有错误报告出现,双击该行,可以定位到出错的位置,对源程序修改之后再次编译,最终要得到如图1-10所示的结果,提示获得了名为exam3.hex的文件,该文件即可被编程器读入并写到芯片中,同时还可看到,该程序的代码量(code=63),内部RAM的使用量(data=9),外部RAM的使用量(xdata=0)等一些信息.除此之外,编译,连接还产生了一些其它相关的文件,可被用于Keil的仿真与调试,到了这一步后即进行调试.1.5 程序的调试在对工程成功地进行汇编,连接以后,按Ctrl+F5或者使用菜单Debug->Start/Stop Debug Session即可进入调试状态,Keil内建了一个仿真CPU用来模拟执行程序,该仿真CPU功能强大,可以在没有硬件和仿真机的情况下进行程序的调试.进入调试状态后,Debug菜单项中原来不能用的命令现在已可以使用了,多出一个用于运行和调试的工具条,如图1-11所示,Debug菜单上的大部份命令可以在此找到对应的快捷按钮,从左到右依次是复位,运行,暂停,单步,过程单步,执行完当前子程序,运行到当前行,下一状态,打开跟踪,观察跟踪,反汇编窗口,观察窗口,代码作用范围分析,1#串行窗口,内存窗口,性能分析,工具按钮等命令.点击菜单Peripherals,即会多出一项"键盘LED仿真板(K)",选中该项,即会出现如图1-9 有关编译,连接,项目设置的工具条图1-11 调试工具条图1-10 编译,连接后得到目标代码图1-12所示界面.使用菜单STEP或相应的命令按钮或使用快捷键F11可以单步执行程序,使用菜单STEP OVER或功能键F10可以以过程单步形式执行命令,所谓过程单步,是指把C语言中的一个函数作为一条语句来全速执行.按下F11键,可以看到源程序窗口的左边出现了一个黄色调试箭头,指向源程序的第一行.每按一次F11,即执行该箭头所指程序行,然后箭头指向下一行,当箭头指向"mDelay(1000);"行时,再次按下F11,会发现,箭头指向了延时子程序mDelay的第一行.不断按F11键,即可逐步执行延时子程序.如果mDelay程序有错误,可以通过单步执行来查找错误,但是如果mDelay程序已正确,每次进行程序调试都要反复执行这些程序行,会使得调试效率很低,为此可以在调试时使用F10来替代F11,在main函数中执行到mDelay(1000)时将该行作为一条语句快速执行完毕.Keil软件还提供了一些窗口,用以观察一些系统中重要的寄存器或变量的值,这也是很重要的调试方法.以下通过一个对延时程序的延迟时间的调整来对这些调试方法作一个简单的介绍.这个程序中用到了延时程序mDelay,如果使用汇编语言编程,每段程序的延迟时间可以非常精确地计算出来,而使用C语言编程,就没有办法事先计算了.为此,可以使用观察程序执行时间的方法了来解.进入调试状态后,窗口左侧是寄存器和一些重要的系统变量的窗口,其中有一项是sec,即统计从开始执行到目前为止用去的时间.按F10,以过程单步的形式执行程序,在执行到mDelay(1000)这一行之前停下,查看sec的值(把鼠标停在sec 后的数值上即可看到完整的数值),记下该数值,然后按下F10,执行完mDelay(1000)后再次观察sec值,如图1-13所示,这里前后两次观察到的值分别是:0.00040400和1.01442600, 其差值为1.014022s,如果将该值改为124可获得更接近于1s的数值,而当该值取123时所获得的延时值将小于1s,因此,最佳的取值应该是124.图1-12 51单片机实验仿真板1.6 C语言的一些特点通过上述的几个例子,可以得出一些结论:1,C程序是由函数构成的,一个C源程序至少包括一个函数,一个C源程序有且只有一个名为main()的函数,也可能包含其它函数,因此,函数是C程序的基本单位.主程序通过直接书写语句和调用其它函数来实现有关功能,这些其它函数可以是由C语言本身提供给我们的(如例3中的_crol_(…)函数),这样的函数称之为库函数,也可以是用户自己编写的(如例2,3中用的mDelay(…)函数),这样的函数称之为用户自定义函数.那么库函数和用户自定义函数有什么区别呢简单地说,任何使用Keil C语言的人,都可以直接调用C的库函数而不需要为这个函数写任何代码,只需要包含具有该函数说明的相应的头文件即可;而自定义函数则是完全个性化的,是用户根据自己需要而编写的.Keil C提供了100多个库函数供我们直接使用.2,一个函数由两部份组成:(1)函数的首部,即函数的第一行.包括函数名,函数类型,函数属性,函数参数(形参)名,参数类型.例如:void mDelay (unsigned int DelayTime)一个函数名后面必须跟一对圆括号,即便没有任何参数也是如此.(2)函数体,即函数首部下面的大括号"{}"内的部份.如果一个函数内有多个大括号,则最外层的一对"{}"为函数体的范围.函数体一般包括:声明部份:在这部份中定义所用到的变量,例1.2中unsigned char j.执行部份:由若干个语句组成.在某此情况下也可以没有声明部份,甚至即没有声明部份,也没有执行部份,如:void mDelay(){}这是一个空函数,什么也不干,但它是合法的.在编写程序时,可以利用空函数,比如主程序需要调用一个延时函数,可具体延时多少,怎么个延时法,暂时还不清楚,我们可以主程序的框架结构弄清,先编译通过,把架子搭起来再说,至于里面的细节,可以在以后慢慢地填,这时利用空函数,先写这么一个函数,这样在主程序中就可以调用它了.3,一个C语言程序,总是从main函数开始执行的,而不管物理位置上这个main()放在什么地方.例1.2中就是放在了最后,事实上这往往是最常用的一种方式.图1-13 观察sec确定延时时间4,主程序中的mDelay如果写成mdelay就会编译出错,即C语言区分大小写,这一点往往让初学者非常困惑,尤其是学过一门其它语言的人,有人喜欢,有人不喜欢,但不管怎样,你得遵守这一规定.5,C语言书写的格式自由,可以在一行写多个语句,也可以把一个语句写在多行.没有行号(但可以有标号),书写的缩进没有要求.但是建议读者自己按一定的规范来写,可以给自己带来方便.6,每个语句和资料定义的最后必须有一个分号,分号是C语句的必要组成部份.7,可以用/*…..*/的形式为C程序的任何一部份作注释,在"/*"开始后,一直到"*/"为止的中间的任何内容都被认为是注释,所以在书写特别是修改源程序时特别要注意,有时无意之中删掉一个"*/",结果,从这里开始一直要遇到下一个"*/"中的全部内容都被认为是注释了.原本好好的一个程序,编译已过通过了,稍作修改,一下出现了几十甚至上百个错误,初学C的人往往对此深感头痛,这时就要检查一下,是不是有这样的情况,如果有的话,赶紧把这个"*/"补上.特别地,Keil C也支持C++风格的注释,就是用"//"引导的后面的语句是注释,例:P1_0=!P1_0; //取反P1.0这种风格的注释,只对本行有效,所以不会出现上面的问题,而且书写比较方便,所以在只需要一行注释的时候,我们往往采用这种格式.但要注意,只有Keil C支持这种格式,早期的Franklin C以及PC机上用的TC都不支持这种格式的注释,用上这种注释,编译时通不过,会报告编译错误.第2章分支程序设计第一部分课程学习了如何建立Keil C的编程环境,并了解了一些C语言的基础知识,这一部分将通过一个键控流水灯程序的分析来学习分支程序设计.2.1 程序功能与实现硬件电路描述如下:89S52单片机的P1口接有8个LED,当某一端口输出为"0"时,相应的LED点亮,P3.2,P3.3,P3.4,P3.5分别接有四个按钮K1~K4,按下按钮时,相应引脚被接地.现要求编写可键控的流水灯程序,当K1按下时,开始流动,K2按下时停止流动,全部灯灭,K3使灯由上往下流动,K4使灯由下往上流动.下面首先给出程序,然后再进行分析.例2-1:键控流水灯的程序#include "reg51.h"#include "intrins.h"#define uchar unsigned charvoid mDelay(unsigned int DelayTime){ unsigned int j=0;for(;DelayTime>0;DelayTime--){ for(j=0;j2的结果为真,而3<2的结果为假.C语言一共提供了6种关系运算符:"<"(小于),""(大于),">=(大于等于)","=="(等于)和"!="(不等于).用关系运算符将两个表达式连接起来的式子,称为关系表达式.例:a>b,a+b>b+c,(a=3)>=(b=5)等都是合法的关系表达式.关系表达式的值只有两种可能,即"真"和"假".在C语言中,没有专门的逻辑型变量,如果运算的结果是"真",用数值"1"表示,而运算的结果是"假"则用数值"0"表示.如式子:x1=3>2的结果是x1等于1,原因是3>2的结果是"真",即其结果为1,该结果被"="号赋给了x1,这里须注意,"="不是等于之意(C语言中等于用"=="表示),而是赋值号,即将该号后面的值赋给该号前面的变量,所以最终结果是x1等于1.式子:x2=30;DelayTime--)单片机的C语言轻松入门25{ for(j=0;j<125;j++){;}}}在main函数中用mDelay(1000)的形式调用该函数时,延时时间约为1s.如果将该函数中的unsigned int j改为unsigned char j,其他任何地方都不作更改,重新编译,连接后,可以发现延迟时间变为约0.38s.int和char是C语言中的两种不同的数据类型,可见程序中仅改变数据类型就会得到不同的结果.那么int和char型的数据究竟有什么区别呢3.3.1 整型数据1.整型数据在内存中的存放形式如果定义了一个int型变量i:int i=10; /*定义i为整型变量,并将10赋给该变量*/在Keil C中规定使用二个字节表示int型数据,因此,变量i在内存中的实际占用情况如下:0000,0000,0000,1010也就是整型数据总是用2个字节存放,不足部分用0补齐.事实上,数据是以补码的形式存在的.一个正数的补码和其原码的形式是相同的.如果数值是负的,补码的形式就不一样了.求负数的补码的方法是:将该数的绝对值的二进制形式取反加1.例如,-10,第一步取-10的绝对值10,其二进制编码是1010,由于是整型数占。