有关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.多想多练,做一些实际的项目,你可以根据你现有的开发板硬件条件,做出一些你感觉比较有意思的项目,实际动手做过项目和看过别人的项目还是有差别的。自已做过项目以后在工作或求职中就没有那么被动,也会有信心一点。
祝个位学习单片机的朋友早日提高!以上是个人见解有不同意见请提出来供广大单片机爱好参考。
创易电子搜集,全部资料来源于互联网开源资料,如有侵权,请及时与楼主联系立刻纠正。