51中断编程c语言,有关51单片机中断的形式和C语言编程格式[精选5篇]

有关51单片机中断的形式和C语言编程格式

void INT0()interrupt 0 using 1 {.... ..... } interrupt 0 指明是外部中断0; interrupt 1 指明是定时器中断0; interrupt 2 指明是外部中断1; interrupt 3 指明是定时器中断1; interrupt 4 指明是串行口中断;

using 0 是第0组寄存器; using 1 是第1组寄存器; using 2 是第2组寄存器; using 3 是第3组寄存器;

例如:

/*-----------------

外部中断程序 -----------------*/ void ISR_Key(void) interrupt 0 using 1 { P1=~P1;

//s3按下触发一次,P1取反一次 }

/*-----------------

串口中断程序 -----------------*/ void UART_SER (void) interrupt 4 //串行中断服务程序 {

unsigned char Temp;

//定义临时变量

if(RI)

//判断是接收中断产生

{

RI=0;

//标志位清零

Temp=SBUF;

//读入缓冲区的值

P1=Temp;

//把值输出到P1口,用于观察

SBUF=Temp;

//把接收到的值再发回电脑端

}

if(TI)

//如果是发送标志位,清零

TI=0; }

有关51单片机中断的形式和C语言编程格式

void INT0()interrupt 0 using 1 {.... ..... } interrupt 0 指明是外部中断0; interrupt 1 指明是定时器中断0; interrupt 2 指明是外部中断1; interrupt 3 指明是定时器中断1; interrupt 4 指明是串行口中断;

using 0 是第0组寄存器; using 1 是第1组寄存器; using 2 是第2组寄存器; using 3 是第3组寄存器;

例如:

/*-----------------

外部中断程序 -----------------*/ void ISR_Key(void) interrupt 0 using 1 { P1=~P1;

//s3按下触发一次,P1取反一次 }

/*-----------------

串口中断程序 -----------------*/ void UART_SER (void) interrupt 4 //串行中断服务程序 {

unsigned char Temp;

//定义临时变量

if(RI)

//判断是接收中断产生

{

RI=0;

//标志位清零

Temp=SBUF;

//读入缓冲区的值

P1=Temp;

//把值输出到P1口,用于观察

SBUF=Temp;

//把接收到的值再发回电脑端

}

if(TI)

//如果是发送标志位,清零

TI=0; }

实 习 报 告

实习地点:201机房

实习时间:2014.12.1——2014.12.6 实习项目:单片机C语言编程实训 指导老师:骆

乐 姓

名:

级:电信3121

一、 实习内容 1.计算字符的ASCII码

编写一个程序,在终端输入一个字符,输出它的ASCII码。 解题思路:通常我们输出一个字符一般用printf("%c",c);的形式,因为输出格式规定的是"%c",因此表示以字符的形式输出,所以我们看到的是相对应的ASCII码的字符形式。

用char定义字符a,a的值为任意值。输出结果a=%d。 源代码:

#include int main() { char c; scanf("%c",&c); printf("Ascii=%d\nDCF14",c); getch(); } 程序截图:

2.嵌套if-else语句的妙用

学校进行成绩分级管理,取消分数制,改为成绩分级评定。具体办

法是:小羽60分为E类;60分至70分(不含70分)为D类;70分至80分(不含)为C类;80分至90分(不含)为B类;90分以上为A类。设计一个程序。对输入的成绩进行等级划分。

解题思路:先把头文件和主函数输入。定义score为整型变量,定义grade为字符型变量。定义score为任意值scanf(“%d”,score)。使用多分支条件语句,判断趁机的等级。

源代码:

#includevoid main () { int score; char grade; scanf("%d",&score); if(score>=90) grade='A'; else if(score>=80) grade='B'; else if(score>=70) grade='C'; else if(score>=60) grade='D'; else grade='E'; printf("score=%d,grade=%c,\nDCF 14",score,grade); getch();

}

程序截图:

3.判断日期

输入一个日期(年月日),输出这是某年的第几天。 源代码:

#include "stdio.h" void main() { int year,month,day; int cday; scanf("%d %d %d",&year,&month,&day); switch(month) { case 1: cday = 0; break; case 2: cday = 31; break; case 3: cday = 31+28; break; case 4:

cday = 31+28+31; break; case 5: cday = 31+28+31+30; break;

case 6: cday = 31+28+31+30+31; break; case 7: cday = 31+28+31+30+31+30; break; case 8: cday = 31+28+31+30+31+30+31; break; case 9: cday = 31+28+31+30+31+30+31+31; break; case 10: cday = 31+28+31+30+31+30+31+31+30; break; case 11: cday = 31+28+31+30+31+30+31+31+30+31; break;

case 12:

cday = 31+28+31+30+31+30+31+31+30+31+30;

break; } cday += day;

if( (year % 4 ==0 && year % 100 !=0 || year % 400 == 0) && month > 2) { cday += 1; } printf("%d,\n DCF 14 ",cday);

getch(); }

程序截图:

4.打印特殊图案

请设计一个程序,实现在屏幕上输出一个下面的图案 解题思路:直接输入编程,但要注意*间的空格。 源代码:

#includevoid main() { printf("

* \n * * * \n* * * * *\n ,DCF 14 \n"); getch(); }

程序截图:

5.求两个数的最大公约数和最小公倍数

编写一个程序计算两个正整数的最大公约数和最小公倍数

源代码:

#include

int main(int argc,int *argv[]) { int num1,num2,temp; int a,b; a > b; printf("please input 2 number:"); scanf("%d,%d",&num1,&num2); if (num1 < num2) { temp = num1; num1 = num2; num2 = temp; } a = num1; b = num2; while (b) { temp = a % b; a = b; b = temp; }

printf("the zuidagongyuehsu:%d,the zuixiaogongbeishu:%d\n",a,num1 * num2 / a); printf("%d\n,dcf 14 \n"); system("pause"); return 0; getch(); }

程序截图:

6.猴子吃桃问题

有一只猴子第一天摘下若干个桃子,当即吃掉了一半,又多吃了一个;第二天又将剩下的桃子吃了一半,有多吃了一个;按照这样的吃法每天都吃前一天剩下的桃子的一半又一个。到了第10天,就只剩一个桃子。问题:这只猴子第一天摘了多少个桃子。 源代码:

#include

void main() { int day,x1,x2; day=9; x2=1; while(day>0) { x1=(x2+1)*2; x2=x1; day--; } printf("total=%d\n dcf 14",x1); getch(); }

程序截图:

7.谁在说谎

3个嫌疑犯在法官面前各执一词,甲说:已在说谎;已说:甲在说谎;丙说:甲已两人都在说谎。法官为了难,甲乙丙三人到底谁在说谎,睡说的是真话呢?

源代码:

#include

int main(int argc, char *argv[]) {

int a,b,c;

for(a=0; a<2; a++)

for(b=0; b<2; b++)

for(c=0; c<2; c++)

if((a&&!b || !a&&b) && (b&&!c || b&&c) && (c &&a+b == 0 || !c&&a+b != 0))

printf("j told a %s\n",a?"truth":"lie");

printf("y told a %s\n",b?"truth":"lie");

printf("b told a %s\n",c?"truth":"lie");

printf("%d\n dcf 14\n" );

getch(); }

程序截图:

预处理命令 #include 子函数 void delay(void) { 函数体... } 主函数 void main(void) { 函数体... whlie(1) { 函数体... } }

2、c语言是由函数构成的,一个c语言程序可以包含多个函数,但是有且只能有一个主函数(函数名为main),主函数没有返回值和参数(void main(void))。c语言程序的执行总是从主函数main开始执行的,在主函数中,对各种子函数进行调用。

3、C语言中的函数必须遵循先声明后调用的方式。具体实现有两种方法:

  在主函数之前先声明一个函数,然后在主函数之后定义该函数的具体内容 在主函数之前直接定义函数。

4、文件包含处理

#include 这是一个预处理命令,在所有51单片机的C语言程序里都可以看到这个语句。这个预处理命令实现的功能是:把reg51.h这个文件里面的全部内容复制并包含到这个C语言程序中。所以这里的预处理命令虽然只是简单的一行,但C编译器在处理的时候却可能要处理几十乃至上百行的代码。头文件reg51.h文件里定义了各种端口、寄存器的符号,这样包含了该文件后,我们就可以直接使用P0这样的符号了(我们可以试着不包含这个文件,则编译的时候,会提示我们P0这些符号未被定义)。

该文件可以在kei c51的安装目录下的Keil\C51\INC文件夹里可以找到,用记事本或写字板可以打开该文件)。

5、在上一个实例中,在程序文件中,我们使用的程序结构并不是标准的程序结构。标准的程序结构应该如下:

预处理命令 #include

子函数声明 void delay(void);

主函数 void main(void) { 函数体... whlie(1) { 函数体... } }

子函数 void delay(void); { 函数体... }

很多朋友都在学习单片机或是想学单片机,但在看了一些资料后,要么感到不知道学的什么,要么找不到下一步的学习方法,这都很正常,因为单片机的学习是一项综全性知识的结果。那么怎样学习单片机,怎么样学好单片机是我们关心的,通过我本人的学习过程,我总结了几条,是单片机学习都要具备的几个条件:

1.首先要明确一点,你是爱好单片机编程的,通过写出各种各样的程序,你可以从中得到快乐和成就感,这一点非常重要,如果你是因为学好单片机可以走上更好的工作岗位得到更好的报酬,那也可以,必竞有个动力所以可以驱使你好好的学。

2.要具备能吃苦的精神,学习单片机初期是十分枯燥无味的(在你能写出自已的程序前这一段时间),你会被状态控制字、中断地址、中断优先级等等问题所困惑,可能有些问题要好多天,查了很多资料,想的头疼后你才能彻底想明白。没有吃苦的精神是不行的。所以这一点也很重要。

3.要具备一些数字电路和模拟电路知识,这些虽然看起来和单片机关系不大,实际上哪个单片机没有外围电路,没有这些知识你学会单片机编程后,能力也会被大大的限制。

4.虽然现在工作中用单片机编程都用的C语言编程,因为C语言有代码编写程序速度快,逻辑比较清晰,可维护性强。但是汇编语言对初学者来说也十分重要,这有助于你了解单片机内部运行机制,对单片机的执行过程更加了解。听朋友这么说过,当一个工程师做单片机程序从汇编转到C时,他的水平就提高了,但当他从C又转回汇编时那么他就成精了。

5.要边学边练习,光看书还是不行的,要把你在学习过程中的编程思路在单片机上跑起来,你才会更能找到编写单片机程序的感觉。如果不把自已的编程思路在单片机上运行起来,那么后面你就不知道自已的想法是对是错,感觉无法继续下去。如果经济条件允许一块开发板还是必须的,理论和动手相经结合,你的单片机水平会提高的很快。

6.多想多练,做一些实际的项目,你可以根据你现有的开发板硬件条件,做出一些你感觉比较有意思的项目,实际动手做过项目和看过别人的项目还是有差别的。自已做过项目以后在工作或求职中就没有那么被动,也会有信心一点。

祝个位学习单片机的朋友早日提高!以上是个人见解有不同意见请提出来供广大单片机爱好参考。

创易电子搜集,全部资料来源于互联网开源资料,如有侵权,请及时与楼主联系立刻纠正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值