资源描述:
《单片机C语言编程与.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、单片机C语言编程与&或
2、头文件常见问题一、常见问题1、头文件reg51.h和reg52.h其实是一样的,大家两个都可以用。2、main()前面的void可加可不加,反正都是无返回值函数。3、不是每一个程序都要用到死循环while(1),例如点亮一颗LED小灯就不用,只要执行一次就一直是高电平了不用循环。4、位操作和字节操作都能用来控制I/O口输出电平,位操作需要实现声明sbit,而字节操作则不用。5、延时程序有两种a:循环延时;b:定时器精确延时6、如果定义的变量没有置初值,那么默认初值就是零。7、定义数组时(如:number[]
3、={1,2,3,4,5,6,};)则结束时要加分号,每个元素之间用逗号隔开,[]内可加可不加元素个数。8、当程序比较复杂时,可将程序模块化,在主函数前定义,主函数内引用,但要注意全局变量和局部变量的区别。9、有的数组前面加code意思为将该数组写入FLASH中,数组内容不变,若不加code则写入ram中。10、能不能不进行位操作,直接用P0^0赋值?不可以,因为P0^0中有异或符号,所以必须进行位操作之后才可以正常赋值。11、转串芯片PL2303为国产芯片,在线仿真时波特率最高为14400,太高会造成程序下载失败。12、STC89
4、C52程序存储空间是8KFLASH,当下载Hex文件时,有的同学可能注意到文件超过了8K,认为存储空间不够,这种说法是错误的,看程序所占空间大小应该在keil软件下,code后面的字节数。二、头文件1、头文件如果keil软件库中没有的话,需要自己编写,并且要添加到所在工程中,或者直接复制一份到keil软件C51——>;INC文件夹下,这样就可以直接引用头文件。三、变量将函数模块化时经常用到静态变量。四、与&,或
5、有时在程序中也会看到这样的程序语言,a&=b;这样的语句相当于:a=a&b同理,a
6、=b;这样的
7、语句相当于:a=a
8、b五、中断程序实例:秒表#include;typedefunsignedcharuint8;typedefunsignedintuint16;typedefunsignedlonguint32;codeuint8number[]={0xc0,0xf9,0xa4,0xb0,//code为写入flash中0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xa7,0xa1,0x86,0x8e};uint8a[6];//前无code,为写入ramuint16counter=0;sbitE
9、NLED=P1^4;sbitADDR0=P1^0;sbitADDR1=P1^1;sbitADDR2=P1^2;sbitADDR3=P1^3;voidtimer1_init()//定时器函数{TMOD
10、=0x10;//选择定时器模式TMOD&=0xdf;TH1=0xFC;//定时间初始值TL1=0x67;TR1=1;//开始计时}voidint_init()//中断函数{ET1=1;//选择中断1EA=1;//开启中断功能}voidrefresh_led()//刷新函数{staticuint8j=0;//静态变量,第一次定义有效,整
11、个函数均保留switch(j){case0:ADDR0=0;ADDR1=0;ADDR2=0;j++;P0=number[a[0]];break;case1:ADDR0=1;ADDR1=0;ADDR2=0;j++;P0=number[a[1]];break;case2:ADDR0=0;ADDR1=1;ADDR2=0;j++;P0=number[a[2]];break;case3:ADDR0=1;ADDR1=1;ADDR2=0;j++;P0=number[a[3]];break;case4:ADDR0=0;ADDR1=0;ADDR2=
12、1;j++;P0=number[a[4]];break;case5:ADDR0=1;ADDR1=0;ADDR2=1;j=0;P0=number[a[5]];break;default:break;}}main()//主函数{ENLED=0;ADDR3=1;//设置三八译码器的状态timer1_init();//定时器函数int_init();//中断开启while(1);//死循环,保证程序处在运行状态}voidinterrupt_timer1()interrupt3//中断函数,每次定时溢出时就会触发中断{staticuint3
13、2sec=0;TH1=0xFC;TL1=0x67;counter++;if(counter==1000){sec++;counter=0;a[0]=sec%10;a[1]=sec/10%10;a[2]=sec/100%10;a[3]=sec/100