51单片机学习C语言

typedef unsigned int uint;

uchar bdata FLAG; sbit FLAG1 = FLAG^1; sbit FLAG2 = FLAG^2; sbit P1_1 = P1^1;

uchar data time,Dtime;

#define LAMP P00 /*输出 绿灯P00=1 绿灯亮;P00=0 绿灯灭 */ #define KEY_IN P10 /*输入 单键按下P10=0,不按键P10 = 1 */

uchar B_T50ms=200,B_T100ms=2,B_T200ms=4,B_T500ms=10; uchar B_TT1s=20,B_T30s=60,B_T120s=240;

bit FLAG_ERRON; bit FLAG_SIGN;

uchar JFLAG;

uchar data buffer[8]; uchar data Temper[4];

uchar idata buffer0[150]; //这条语句若用data定义,buffer0的长度就只能小于 uchar code buffer1[16]={0,0,1,1,2,3,3,4,5,5,6,6,7,8,8,9}; void dl_us(uint count); void dl_ms(uint count);

void ext_1(void); // interrupt 2; void Timer_0(void); // interrupt 1; main ()

{ uchar JFLAG,i; P1 = 0xFF; FLAG = P1;

JFLAG = FLAG >> 6; JFLAG = JFLAG & 0x03; switch (JFLAG) {

case 0: time=2;Dtime=20;break; case 1: time=4;Dtime=40;break; case 2: time=6;Dtime=60;break; case 3: time=8;Dtime=80;break; }

for (i=1;i<180;i++) {

buffer0[i]=0;

}

for (i=1;i<150;i++) {

buffer0[i]=i; }

while (1) // 单键没按下P10=1执行下列语句,上电时灯就亮, { if (P10==1) { LAMP=1; } else

{ LAMP=0; dl_ms(500); } } }

void dl_us(uint count) { uint i;

for(i=0;i

void dl_ms(uint count) { uchar i;

while(count--)

{ for(i=0;i<125;i++) { ; } } }

ext_1() interrupt 2 {

EX1=0; // 进中断程序后就关掉外中断1,改为查询方式 ET0=1; }

Timer_0() interrupt 1 { }

附2:KEILC51程序例子2

#pragma DEBUG CODE

#include /* define 8052 registers */ #include /* define I/O functions */ typedef unsigned char uchar; typedef unsigned int uint;

void main(void)

{ucha var1,var2,result1,result2; var1=3;

var2=5;

result1= var1+var2; result2= var1*var2; while(1) }

注:其中reg51.h或reg52.h是头文件,C语言系统自带的。这是关于单片机资源的定义文件。如果选用89C51单片机,则头文件选reg51.h;如果选用89C52单片机,则头文件选reg52.h; 系统带的头文件可能不全时,应由用户自已修改。例如打开reg52.h文件 只有对口地址的定义,而没有口的各位的定义

附3:表5-1 常用转义字符表

转义字符 \\o \\n \\r \\t \\b \\f \\' \\\ \\\\

含义 空字符(NULL) 换行符(LF) 回车符(CR) 水平制表符(HT) 退格符(BS) 换页符(FF) 单引号 双引号 反斜杠 ASCII码(16/10 进制) 00H/0 0AH/10 0DH/13 09H/9 08H/8 0CH/12 27H/39 22H/34 5CH/92 附4:51单片机中断源

中断源 外部中断0 定时器0溢出 外部中断1 定时器1溢出 串行口 矢量单元 0003H 000BH 0013H 001BH 0023H 中断编号 0 1 2 3 4 附5:一个串行口通讯协议例子

;通讯协议

;PC发送的命令

;1、回送出错命令 变址量=4 ;命令格式 起始 DE=01 * * CRC CR

;PC发送码 @ 0 1 * * 0 1 CR ;仪表接收码

ERR: DB 40H,30H,31H,2AH,2AH,30H,31H,0DH ;2、回送正确命令 变址量=4 ;命令格式 起始 DE=01 # # CRC CR ;PC发送码 @ 0 1 # # 0 1 CR ;仪表接收码 RIG: DB 40H,30H,31H,23H,23H,30H,31H,0DH ;3、读0010H内的时间参数(两个字节) 变址量=11 ;命令格式 起始 DE=01 R E 地址=0010H 长度 CRC CR ;PC发送码 @ 0 1 52 45 0010 2 34 CR ;仪表接收码

RE210: DB 40H,30H,31H,35H,32H,34H,35H,30H,30H,31H,30H,32H,33H,34H,0DH ;4、读0012H内的功率参数(两个字节) 变址量=11 ;命令格式 起始 DE=01 R E 地址=0012H 长度 CRC CR ;PC发送码 @ 0 1 52 45 0012 2 36 CR ;仪表接收码

RE212: DB 40H,30H,31H,35H,32H,34H,35H,30H,30H,31H,32H,32H,33H,36H,0DH ;5、读0010H时间参数(两个字节)和功率参数(两个字节) 变址量=11 ;命令格式 起始 DE=01 R E 地址=0010H 长度 CRC CR ;PC发送码 @ 0 1 52 45 0010 4 32 CR ;仪表接收码变址量=

RE410: DB 40H,30H,31H,35H,32H,34H,35H,30H,30H,31H,30H,34H,33H,32H,0DH ;6、往仪表内写时间参数 (两个字节) 假设写34分00秒 变址量=10 ;命令格式 起始 DE=01 W 2 地址=0010 时间 CRC CR

;PC发送码 @ 0 1 57 32 0010 3400 04 CR ;仪表接收码

W210: DB 40H,30H,31H,35H,37H,33H,32H,30H,30H,31H,30H DB 33H,34H,30H,30H,30H,34H,0DH ;7、往仪表内写功率参数 (两个字节 ) 变址量=10

;命令格式 起始 DE=01 W 2 地址=0012 功率 CRC CR

;PC发送码 @ 0 1 57 32 0012 0123 01 CR ;仪表接收码

W212: DB 40H,30H,31H,35H,37H,33H,32H,30H,30H,31H,32H DB 30H,31H,32H,33H,30H,31H,0DH

;8、往仪表内写时间参数(两个字节)和功率参数(两个字节) 变址量=10

;命令格式 起始 DE=01 W 4 地址=0010 时间和功率 CRC CR

;PC发送码 @ 0 1 57 34 0010 0034 0123 02 CR ;仪表接收码;

W410: DB 40H,30H,31H,35H,37H,33H,34H,30H,30H,31H,30H DB 30H,30H,33H,34H,30H,31H,32H,33H,30H,32H,0DH ;9、命令仪表暂停 变址量=6 ;命令格式 起始 DE=01 PS CRC CR ;PC发送码 @ 0 1 50 53 02 CR

联系客服:779662525#qq.com(#替换为@)