单片机C语言编程模板

合集下载

单片机c语言实例程序300篇

单片机c语言实例程序300篇

单片机c语言实例程序300篇单片机C语言【程序1】题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?1.程序分析:可填在百位、十位、个位的数字都是1、2、3、4。

组成所有的排列后再去掉不满足条件的排列。

2.程序源代码:main(){inti,j,k;printf("\n");for(i=1;i<5;i++)/某以下为三重循环某/for(j=1;j<5;j++)for(k=1;k<5;k++){if(i!=k&&i!=j&&j!=k)/某确保i、j、k三位互不相同某/printf("%d,%d,%d\n",i,j,k);}}==============================================================【程序2】题目:企业发放的奖金根据利润提成。

利润(I)低于或等于10万元时,奖金可提10%;利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数?1.程序分析:请利用数轴来分界,定位。

注意定义时需把奖金定义成长整型。

2.程序源代码:main()单片机C语言{longinti;intbonu1,bonu2,bonu4,bonu6,bonu10,bonu;canf("%ld",&i);bonu1=100000某0.1;bonu2=bonu1+100000某0.75;bonu4=bonu2+200000某0.5;bonu6=bonu4+200000某0.3;bonu10=bonu6+400000某0.15;if(i<=100000)bonu=i某0.1;eleif(i<=200000)bonu=bonu1+(i-100000)某0.075;eleif(i<=400000)bonu=bonu2+(i-200000)某0.05;eleif(i<=600000)bonu=bonu4+(i-400000)某0.03;eleif(i<=1000000)bonu=bonu6+(i-600000)某0.015;elebonu=bonu10+(i-1000000)某0.01;printf("bonu=%d",bonu);}============================================================ ==【程序3】题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?1.程序分析:在10万以内判断,先将该数加上100后再开方,再将该数加上268后再开方,如果开方后的结果满足如下条件,即是结果。

单片机C语言编程精选例

单片机C语言编程精选例

目录实例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显示左移运算结果 ................................... 错误!未指定书签。

单片机c语言代码及应用

单片机c语言代码及应用

单片机c语言代码及应用单片机是一种集成了中央处理器、内存和各种外设接口的微型计算机。

它广泛应用于家用电器、工控设备、汽车电子等各个领域。

C语言是单片机最常用的编程语言,它具有代码简洁、运行效率高的特点。

下面我将为你介绍一些单片机C 语言代码的应用。

首先,我们可以使用C语言编写一个LED闪烁的程序。

这个程序可以通过单片机的GPIO口控制LED的亮灭,实现LED的闪烁效果。

以下是一个简单的LED 闪烁的C语言代码:c#include <reg51.h>void delay(unsigned int count) 延时函数{while (count);}int main(){while (1) {P1 = 0xFF; 点亮LEDdelay(50000);P1 = 0x00; 熄灭LEDdelay(50000);}return 0;}上面的代码中,我们首先定义了一个延时函数`delay`,它通过循环来实现延时。

然后在`main`函数中,通过控制P1口的电平来控制LED的亮灭,并调用延时函数来控制闪烁的时间间隔。

这样就实现了一个简单的LED闪烁程序。

另外一个常见的应用是通过单片机控制液晶显示屏。

液晶显示屏可以用来显示各种信息,比如温度、湿度、时间等。

以下是一个使用单片机控制液晶显示屏显示字符串的程序:c#include <reg51.h>#define LCD_DATA P0 数据口sbit LCD_RS = P1^0; RS口sbit LCD_RW = P1^1; RW口sbit LCD_EN = P1^2; EN口void delay(unsigned int count) 延时函数{while (count);}void lcd_write_command(unsigned char command) 写指令{LCD_RS = 0; 设置为指令模式LCD_RW = 0; 设置为写入模式LCD_DATA = command;LCD_EN = 1;delay(5);LCD_EN = 0;}void lcd_write_data(unsigned char data) 写数据{LCD_RS = 1; 设置为数据模式LCD_RW = 0; 设置为写入模式LCD_DATA = data;LCD_EN = 1;delay(5);LCD_EN = 0;}void lcd_init() LCD初始化{lcd_write_command(0x38); 初始化显示模式lcd_write_command(0x08); 关闭显示lcd_write_command(0x01); 清屏lcd_write_command(0x06); 设置光标移动方向lcd_write_command(0x0C); 显示开启}void lcd_display_string(unsigned char x, unsigned char y, unsigned char *string) 在指定位置显示字符串{unsigned char address;if (y == 0) {address = 0x80 + x;} else {address = 0xC0 + x;}lcd_write_command(address);while (*string) {lcd_write_data(*string++);}}int main(){unsigned char string[] = "Hello, World!";lcd_init(); LCD初始化lcd_display_string(0, 0, string); 在第一行显示字符串while (1);return 0;}上面的代码中,我们首先定义了一些宏和端口变量,用来控制液晶显示屏。

初学单片机万能模板51单片机C语言程序

初学单片机万能模板51单片机C语言程序

#include <reg52.h>#include<intrins.h>#define uint unsigned int#define uchar unsigned charsbit DQ = P1^7;sbit EN = P2^7;sbit RS = P2^5;sbit RW = P2^6;sbit key1 = P1^0;sbit key2 = P1^1;sbit key3 = P1^2;sbit key4 = P1^3;sbit SDA = P2^4;sbit SCLK = P2^3;sbit CE = P2^2;sbit buzzer = P2^1;uchar code a[]={"MON TUE WED THU FRI SAT SUN"};char nian=13,yue=3,ri=20,shi=20,fen,miao,t1,num2,num3,date=3,A1;bit flag;int temp;float f_temp;void week(date);void Write_1302(uchar address,uchar dat) ;bit RST_DS18B20(); void WBIT_DS18B20(bit data_bit);bit RBIT_DS18B20(void);voidWBYTE_DS18B20(uchar data_byte);uchar RBYTE_DS18B20(void);void START_DS18B20(void);uint READ_TEM(void);void Delay_15us(uint temp) //延时函数。

公式:(15*temp+15)us {for(temp;temp>0;temp--){_nop_();_nop_();_nop_();_nop_();}_nop_();_nop_();}void delay(uchar x){uchar y,z;for (y=x;y>0;y--)for(z=110;z>0;z--);}void write_com(uchar com) //1602写指令{RS=0;RW=0;delay(1);P3=com;EN=0;delay(1);EN=1;}void write_date(uchar date) //1602写数据{RS=1;RW=0;delay(1);P3=date;EN=0;delay(1);EN=1;}void init() //初始化{write_com(0x38); //显示模式设置16*2显示,5*7点阵,8位数据接口delay(5);write_com(0x38);delay(5);write_com(0x38);write_com(0x0c); //显示开显示.显示光标,不闪烁00001110write_com(0x06); //写一个字符后地址指针+1write_com(0x01); //清零write_com(0x80);delay(5);miao=miao/10*16+miao%10;fen=fen/10*16+fen%10;shi=shi/10*16+shi%10;ri=ri/10*16+ri%10;yue=yue/10*16+yue%10;nian=nian/10*16+nian%10;}void write_sfm(uchar add,char date) //时分秒显示{char shi,ge;shi=date/16;ge=date%16;write_com(0xc0+add);write_date(0x30+shi);write_date(0x30+ge);}void write_nyr(uchar add,char date) //年月日显示{char shi,ge;shi=date/16;ge=date%16;write_com(0x80+add);write_date(0x30+shi);write_date(0x30+ge);}void Write_1302(uchar address,uchar dat) //1302写数据{uchar i;CE=0;SCLK=0;CE=1;for (i=0;i<8;i++) //循环8次写入地址数据{SCLK=0;_nop_();SDA=address&0x01; //每次传输低字节address>>=1; //右移一位_nop_();}for (i=0;i<8;i++) //循环8次写入数据{SCLK=0;_nop_();SDA=dat&0x01; //每次传输低字节dat>>=1; //右移一位DSCLK=1 SCLK=1;_nop_();}CE=0;_nop_();}uchar Read_1302(uchar address) //1302读数据{uchar i,temp=0x00;CE=0;SDA=1;SCLK=0;CE=1;for (i=0;i<8;i++) //循环8次写入地址数据{SCLK=0;SDA=address&0x01; //每次传输低字节address>>=1; //右移一位}delay(1);if(SDA)temp|=0x80; //每次传输低字节SCLK=0;temp>>=1;for (i=0;i<7;i++) //循环8次读取数据{SCLK=0;if(SDA==1)temp|=0x80; //每次传输低字节SCLK=1;temp>>=1; //右移一位}SCLK=1;CE=0;SDA=0;return temp; //返回}void DS1302_initW() //初始化时间设置(写){Write_1302(0x8e,0x00); //写保护关Write_1302(0x80,miao); //秒Write_1302(0x82,fen); //分Write_1302(0x84,shi); //时Write_1302(0x86,ri); //日Write_1302(0x88,yue); //月Write_1302(0x8a,date); //周Write_1302(0x8c,nian); //年Write_1302(0x8e,0x80); //写保护开}void DS1302_initR() //初始化时间设置(读){miao=Read_1302(0x81); //读秒数据fen=Read_1302(0x83); //读分钟数据shi=Read_1302(0x85); //读小时数据date=Read_1302(0x8b); //读星期数据ri=Read_1302(0x87); //读日数据yue=Read_1302(0x89); //读月数据nian=Read_1302(0x8d); //读年数据}void display() //显示函数{write_com(0x80+0x07);write_date('-');write_com(0x80+0x04);write_date('-');write_com(0xc0+0x02);write_date(':');write_com(0xc0+0x05);write_date(':');write_com(0x80+0x00);write_date(0x30+2);write_date(0x30);DS1302_initR();write_nyr(2,nian); //送液晶显示write_nyr(5,yue);write_nyr(8,ri);write_sfm(0,shi);write_sfm(3,fen);write_sfm(6,miao);week(date);}void week(date) //星期函数{write_com(0x80+12);if(date==1){for(num3=0;num3<3;num3++){write_date(a[num3]);delay(2);}}if(date==2){for(num3=4;num3<7;num3++){write_date(a[num3]);delay(2);}}if(date==3){for(num3=8;num3<11;num3++){write_date(a[num3]);delay(2);}}if(date==4){for(num3=12;num3<15;num3++){write_date(a[num3]);delay(2);}}if(date==5){for(num3=16;num3<19;num3++){write_date(a[num3]);delay(2);}}if(date==6){for(num3=20;num3<23;num3++){write_date(a[num3]);delay(2);}}if(date==7){for(num3=24;num3<27;num3++){write_date(a[num3]);delay(2);}}}bit RST_DS18B20() //DS18B20复位{bit ret=1;DQ=0;Delay_15us(39);DQ=1;Delay_15us(4);ret=DQ;Delay_15us(27);DQ=1;return(ret);}void WBIT_DS18B20(bit data_bit) //写位{DQ=0;Delay_15us(0);DQ=data_bit;Delay_15us(2);DQ=1;}bit RBIT_DS18B20(void) //读位{bit data_bit;DQ=0;_nop_();_nop_();_nop_();DQ=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();data_bit=DQ;Delay_15us(3);DQ=1;return(data_bit);}void WBYTE_DS18B20(uchar data_byte) //写字节{uchar i;for(i=0;i<8;i++){WBIT_DS18B20((bit)(data_byte&0x01));data_byte>>=1;}}uchar RBYTE_DS18B20(void) //读字节{uchar data_byte=0;uchar i,j;for(i=0;i<8;i++){j=RBIT_DS18B20();j=j<<i;data_byte=data_byte|j;}return data_byte;}void START_DS18B20(void) //温度转换函数{DQ=1;_nop_();_nop_();RST_DS18B20(); //初始化WBYTE_DS18B20(0xcc); //跳过ROMWBYTE_DS18B20(0x44); //温度转换}uint READ_TEM(void) //读温度转换函数{uchar a,b,c,d;DQ=1; //防止误操作_nop_();_nop_();TR0=0;RST_DS18B20();WBYTE_DS18B20(0xcc);WBYTE_DS18B20(0xbe);temp=RBYTE_DS18B20();temp=(RBYTE_DS18B20()<<8)|temp;TR0=1;if((temp&0X0800)>=2048) //负数时的检测{temp=~temp+1;f_temp=temp*0.0625;temp=f_temp*10+0.5;a=temp/100;b=temp%100/10;c=temp%10;write_com(0xc0+13); //温度的小数点write_date('.');write_com(0xc0+11); //温度负值时的显示函数write_date(0x30+a);write_com(0xc0+12);write_date(0x30+b);write_com(0xc0+14);write_date(0x30+c);write_com(0xc0+10); //温度的负值write_date('-');}else //正数时{f_temp=temp*0.0625;temp=f_temp*10+0.5;a=temp/1000;b=temp%1000/100;c=temp%100/10;d=temp%10;write_com(0xc0+13); //温度的小数点write_date('.');write_com(0xc0+10);write_date(0x30+a); //温度正值时的显示函数write_com(0xc0+11);write_date(0x30+b);write_com(0xc0+12);write_date(0x30+c);write_com(0xc0+14);write_date(0x30+d);}return temp;}void key() //键盘{uchar fen1,fen2,shi1,shi2,ri1,ri2,yue1,yue2,nian1,nian2,miao1,miao2;if(!key1) //暂停选位{delay(10);if(!key1){while(!key1);num2++;switch(num2){case 1: flag=~flag;Write_1302(0x8e,0x00);write_com(0xc7);write_com(0x0f);break;case 2:write_com(0xc4) ;break;case 3:write_com(0xc1) ;break;case 4:write_com(0x80+0x09);break;case 5:write_com(0x80+0x0c);break;case 6:write_com(0x80+0x06);break;case 7:write_com(0x80+0x03);break;case 8:write_com(0x0c);num2=0;flag=~flag;write_nyr(2,nian);write_nyr(5,yue);write_nyr(8,ri);write_sfm(0,shi);write_sfm(3,fen);write_sfm(6,miao);week(date);DS1302_initW();//将设置的时间日期等写入DS1302中Write_1302(0x8e,0x80); //写保护开break;}}}if(flag==1){if(!key2) //数字加减{delay(10);if(!key2){while(!key2);switch(num2){case 1: DS1302_initW();miao1=miao/16;miao2=miao%16;miao2++;if(miao2==10){miao2=0;miao1++;}if(miao1==6){miao1=0;miao2=0;}miao=miao1*16+miao2;write_sfm(6,miao);write_com(0xc7);break;case 2: fen1=fen/16;fen2=fen%16;fen2++;if(fen2==10){fen2=0;fen1++;}if(fen1==6){fen1=0;fen2=0;}fen=fen1*16+fen2;write_sfm(3,fen);write_com(0xc4);break;case 3: shi1=shi/16;shi2=shi%16;shi2++;if(shi2==10){shi2=0;shi1++;}if((shi1==2)&&(shi2==4)){shi1=0;shi2=0;}shi=shi1*16+shi2;write_sfm(0,shi);write_com(0xc1) ;break;case 4: ri1=ri/16;ri2=ri%16;ri2++;if(ri2==10){ri2=0;ri1++;}if((ri1==3)&&(ri2==2)){ri1=0;ri2=1;}ri=ri1*16+ri2;write_nyr(8,ri);write_com(0x80+0x09);break;case 5: date++;if(date==8)date=1;week(date);write_com(0x80+0x0c);break;case 6: y ue1=yue/16;yue2=yue%16;yue2++;if(yue2==10){yue2=0;yue1++;}if((yue1==1)&&(yue2==3)){yue1=0;yue2=1;}yue=yue1*16+yue2;write_nyr(5,yue);write_com(0x80+0x06);break;case 7: nian1=nian/16;nian2=nian%16;nian2++;if(nian2==10){nian2=0;nian1++;}if((nian1==8)&&(nian2==0)){nian1=0;nian2=0;}nian=nian1*16+nian2;write_nyr(2,nian);write_com(0x80+0x03);break;case 8:Write_1302(0x8e,0x80);//写保护开break;}}}if(!key3){delay(10);if(!key3){while(!key3);switch(num2){case 1: m iao1=miao/16;miao2=miao%16;miao2--;if(miao2==-1){miao2=9;miao1--;}if(miao1==-1)miao1=5;miao=miao1*16+miao2;write_sfm(6,miao);write_com(0xc7) ;break;case 2: f en1=fen/16;fen2=fen%16;fen2--;if(fen2==-1){fen2=9;fen1--;}if(fen1==-1)fen1=5;fen=fen1*16+fen2;write_sfm(3,fen);write_com(0xc4) ;break;case 3: shi1=shi/16;shi2=shi%16;shi2--;if(shi2==-1){shi2=9;shi1--;}if(shi1==-1){shi1=2;shi2=3;}shi=shi1*16+shi2;write_sfm(0,shi);write_com(0xc1) ;break;case 4: ri1=ri/16;ri2=ri%16;ri2--;if(ri2==-1){ri2=9;ri1--;}if(ri1==-1){ri1=3;ri2=1;}ri=ri1*16+ri2;write_nyr(8,ri);write_com(0x80+0x09);break;case 5: date--;if(date==-1||date==0) date=7;week(date);write_com(0x80+0x0c);break;case 6: yue1=yue/16;yue2=yue%16;yue2--;if(yue2==-1){yue2=9;yue1--;}if(yue1==-1){yue1=1;yue2=2;}yue=yue1*16+yue2;write_nyr(5,yue);write_com(0x80+0x06);break;case 7: n ian1=nian/16;nian2=nian%16;nian2--;if(nian2==-1){nian2=9;nian1--;}if(nian1==-1){nian1=7;nian2=9;}nian=nian1*16+nian2;write_nyr(2,nian);write_com(0x80+0x03);break;case 8: Write_1302(0x8e,0x80);//写保护开break;}}}}}void main(){uint temp=0;init();DS1302_initW(); //初始化时间日期DS1302_initR();while(1){display();key();START_DS18B20();temp=READ_TEM();delay(5);while(flag==1)key();}}。

51单片机汇编语言及C语言经典实例

51单片机汇编语言及C语言经典实例

51单片机汇编语言及C语言经典实例汇编语言是一种用来编写计算机指令的低级语言,它与机器语言十分接近,可以直接控制计算机硬件。

而C语言是一种高级程序设计语言,它具有结构化编程和模块化设计的特点。

本文将介绍51单片机汇编语言和C语言的经典实例,并进行详细解析。

一、LED指示灯的闪烁我们首先来看一个经典的51单片机汇编语言的实例——LED指示灯的闪烁。

我们可以通过控制单片机的IO口来实现LED的闪烁效果。

以下是汇编语言的代码:```assemblyORG 0 ; 程序起始地址MOV P1, #0; 将 P1 置为0,熄灭LEDLJMP $ ; 无限循环```以上代码使用了51单片机的MOV指令和LJMP指令。

MOV指令用来将一个立即数(这里是0)存储到寄存器P1中,控制对应的I/O口输出低电平,从而熄灭LED。

而LJMP指令则是无条件跳转指令,将程序跳转到当前地址处,实现了无限循环的效果。

对应的C语言代码如下:```c#include <reg51.h>void main() {P1 = 0; // 将 P1 置为0,熄灭LEDwhile(1); // 无限循环}```以上代码使用了reg51.h头文件,该头文件提供了对51单片机内部寄存器和外设的访问。

通过将P1赋值为0,控制IO口输出低电平,实现了熄灭LED的效果。

while(1)是一个无限循环,使得程序一直停留在这个循环中。

二、数码管的动态显示接下来我们介绍51单片机汇编语言和C语言实现数码管动态显示的经典实例。

数码管动态显示是通过控制多个IO口的高低电平来控制数码管显示不同的数字。

以下是汇编语言的代码:```assemblyORG 0 ; 程序起始地址MOV A, #0FH ; 设置数码管全亮,A存储数码管控制位MOV P2, A ; 将 A 的值存储到 P2,控制数码管的数码控制位DELAY: ; 延时循环MOV R7, #0FFH ; 设置延时计数值LOOP1: ; 内层循环MOV R6, #0FFH ; 设置延时计数值LOOP2: ; 内部延时循环DJNZ R6, LOOP2 ; 延时计数减1并判断是否为0,不为0则继续循环DJNZ R7, LOOP1 ; 延时计数减1并判断是否为0,不为0则继续循环DJNZ A, DELAY ; A减1并判断是否为0,不为0则继续循环JMP DELAY ; 无限循环,实现动态显示```以上代码中,我们通过MOV指令来将一个立即数(0x0F)存储到寄存器A中,控制数码管显示0-9的数字。

51单片机C语言编程100例

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语言)

简单的单片机程序(C语言)

一、单片机第一个灯闪烁(1)#include<reg52.h>sbit d1=P1^0;unsigned int a;void main(){while(1){a=50000;d1=0;while(a--);a=50000;d1=1;while(a--);}}(2)子函数的调用#include<reg52.h>#define uint unsigned int#define uchar unsigned char sbit D1=P1^0;void delay();void main(){ while(1){D1=0;delay();D1=1;delay();}}void delay(){ uint x,y;for(x=100;x>0;x--)for(y=2000;y>0;y--) ; }void delay(uint z)(含参) {uint x;uchar y;for(x=z;x>0;x--)for(y=20;y>0;y--)}连续闪烁#include<reg52.h>#include <intrins.h>#define uint unsigned int#define uchar unsigned char uchar temp;void delay(uint);void main(){temp=0xfe;P1=temp;while(1){temp=_crol_(temp,1);delay(600);P1=temp;}}void delay(){uint x,y;for(x=100;x>0;x--)for(y=200;y>0;y--) ;}蜂鸣器响起#include<reg52.h>#include <intrins.h>#define uint unsigned int#define uchar unsigned char uchar temp;sbit beep=P2^3;void delay(uint);void main(){temp=0xfe;P1=temp;beep=0;while(1){temp=_crol_(temp,1);delay(600);......流水灯连续亮起每隔一秒#include<reg52.h>#include<intrins.h>#define uint unsigned int#define uchar unsigned charuchar temp;void delay(uint z);void main(){temp=0xfe;P1=temp;while(1){delay(1000);temp=_crol_(temp ,1); //左移一位P1=temp;}}void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);} //延时函数定时器中断流水灯亮、数码管两秒变数#include<reg52.h>#include<intrins.h>#define uint unsigned int#define uchar unsigned charuchar temp,aa,num;sbit dula=P2^6;sbit wela=P2^7;uchar code table[]={ 0x3f , 0x06 , 0x5b , 0x4f , 0x66 , 0x6d , 0x7d , 0x07 , 0x7f , 0x6f , 0x77 , 0x7c , 0x39 , 0x5e , 0x79 , 0x71};void delay(uint z);void main(){num=0;aa=0;TMOD=0x01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;ET0=1;TR0=1;temp=0xfe;P1=temp;dula=1;P0=table[0];dula=0;wela=1;P0=0xc0;wela=0;while(1){delay(1000);temp=_crol_(temp,1);P1=temp;/* if(aa==40){aa=0;num++;if(num==16)num=0;dula=1;P0=table[num];dula=0;} */}}void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void timer0() interrupt 1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;aa++;if(aa==40){aa=0;num++;if(num==16)num=0;dula=1;P0=table[num];dula=0;}}数码管的流水显示#include<reg52.h>#include<intrins.h>#define uint unsigned int#define uchar unsigned charuchar temp,aa,numdu,numwe;sbit dula=P2^6;sbit wela=P2^7;uchar code table[]={ 0x3f , 0x06 , 0x5b , 0x4f , 0x66 , 0x6d , 0x7d , 0x07 , 0x7f , 0x6f , 0x77 , 0x7c , 0x39 , 0x5e , 0x79 , 0x71};uchar code tablewe[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};void delay(uint z);void main(){numdu=0;numwe=0;aa=0;TMOD=0x01;TH0=(65536-50000)/256;TL0=(65536-50000)%256; //50000代表1微秒乘50000=50毫秒EA=1;ET0=1;TR0=1;while(1){//delay(1000);// temp=_crol_(temp,1);// P1=temp;if(aa==20){aa=0;numdu++;if(numdu==7)numdu=1;dula=1;P0=table[numdu];dula=0;wela=1;P0=tablewe[numwe];wela=0;numwe++;if(numwe==6)numwe=0;}}}/*void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);} */void timer0() interrupt 1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;aa++;}两位数的分离写在两个数码管上例子12(应用子函数)#include<reg52.h>#define uint unsigned int#define uchar unsigned charuchar temp,numdu,shi,ge;void display(uchar shi,uchar ge);sbit dula=P2^6;sbit wela=P2^7;uchar code table[]={ 0x3f , 0x06 , 0x5b , 0x4f , 0x66 , 0x6d , 0x7d , 0x07 , 0x7f , 0x6f , 0x77 , 0x7c , 0x39 , 0x5e , 0x79 , 0x71};void delay(uint z);void main(){numdu=0;temp=12;shi=temp/10;ge=temp%10;while(1)display(shi,ge);}}void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void display(uchar shi,uchar ge){dula=1;P0=table[shi];dula=0;wela=1;P0=0xfe;wela=0;delay(5);dula=1;P0=table[ge];dula=0;wela=1;P0=0xfe;wela=0;delay(5);}数码管动态显示从零隔一秒加一次#include<reg52.h>#define uint unsigned int#define uchar unsigned charuchar code table[]={ 0x3f , 0x06 , 0x5b , 0x4f , 0x66 , 0x6d , 0x7d , 0x07 , 0x7f , 0x6f , 0x77 , 0x7c , 0x39 , 0x5e , 0x79 , 0x71};uchar temp,shi,ge,aa;void display(uchar shi,uchar ge);sbit dula=P2^6;sbit wela=P2^7;void init() ;void delay(uint z);void main(){init() ;while(1)if(aa==20)aa=0;temp++;if(temp==100){temp=0;}shi=temp/10;ge=temp%10;display(shi,ge);}}void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void display(uchar shi,uchar ge) {dula=1;P0=table[shi];dula=0;P0=0xff;//xiaoyinwela=1;P0=0xfe;wela=0;delay(5);dula=1;P0=table[ge];dula=0;wela=1;P0=0xfe;wela=0;delay(5);}void init(){wela=0;dula=0;temp=0;TMOD=0x01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;ET0=1;TR0=1;}void timer0() interrupt 1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;aa++;}第四课练习3 #include<reg52.h>#include<intrins.h> //位移声明#define uint unsigned int#define uchar unsigned charuchar temp,t0,t1,bai,shi,ge,flag,flag1;sbit dula=P2^6;sbit wela=P2^7;uchar code table[]={0x3f ,0x06 , 0x5b , 0x4f ,0x66 , 0x6d , 0x7d , 0x07 , 0x7f , 0x6f ,0x77 , 0x7c , 0x39 , 0x5e , 0x79 , 0x71,0x36,0x76,0x38,0x3f,0};void display(uchar aa,uchar bb,ucharcc,uchar bai,uchar shi,uchar ge); uint shu;void init();void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void main(){init();while(1){if(flag1!=1)display(7,6,5,bai,shi,ge);elsedisplay(16,17,18,18,19,20);}}void init(){shu=432;temp=0xfe;P1=temp;//点亮第一个发光二极管TMOD=0x11;TH0=(65536-50000)/256;TL0=(65536-50000)%256;//T0定时器TH1=(65536-50000)/256;TL1=(65536-50000)%256;//T1定时器(500ms里不用)EA=1;//kai zong 中断ET0=1;ET1=1;TR0=1;// 定时器0打开TR1=1;// 定时器1打开}void timer0() interrupt 1 //定时器0的中断的中断函数{TH0=(65536-50000)/256;TL0=(65536-50000)%256;t0++;if(flag!=1){if(t0==10){t0=1;temp=_crol_(temp,1); //位移P1=temp;}}else{if(t0%4==0){P1=~P1;}if(t0==60){TR0=0;P1=0xff;flag1=1;}}}void timer1() interrupt 3{TH1=(65536-50000)/256;TL1=(65536-50000)%256;t1++;if(t1==2){t1=0;shu--;bai=shu/100;shi=shu%100/10;ge=shu%10;if(shu==398){TR0=0;//控制流水灯关闭TH0=(65536-50000)/256;TL0=(65536-50000)%256;TR0=1;flag=1;t0=0;P1=0xff;TR1=0;}}}void display(uchar aa,uchar bb,uchar cc,uchar bai,uchar shi,uchar ge) {dula=1;P0=table[aa];dula=0;P0=0xff;wela=1;P0=0xfe;wela=0;delay(1);dula=1;P0=table[bb];dula=0;wela=1;P0=0xfd;wela=0;delay(1);dula=1;P0=table[cc];dula=0;P0=0xff;wela=1;P0=0xfb;wela=0;delay(1);dula=1;P0=table[bai];dula=0;wela=1;P0=0xf7;wela=0;delay(1);dula=1;P0=table[shi];dula=0;P0=0xff;//xiaoyinwela=1;P0=0xef;wela=0;delay(1);dula=1;P0=table[ge];dula=0;wela=1;P0=0xdf;wela=0;delay(1);}利用定时器0以500MS速度进行流水灯从上至下移动#include<reg52.h>#include<intrins.h> //位移声明#define uint unsigned int#define uchar unsigned charuchar temp,t0;void init() ;void main(){init();while(1){}}void init(){temp=0xfe;P1=temp;//点亮第一个发光二极管TMOD=0x11;TH0=(65536-50000)/256;TL0=(65536-50000)%256;//T0定时器EA=1;//kai zong 中断ET0=1;TR0=1;// 定时器0打开}void timer0() interrupt 1 //定时器0的中断的中断函数{TH0=(65536-50000)/256;TL0=(65536-50000)%256;t0++;if(t0==10){t0=1;temp=_crol_(temp,1); //位移P1=temp;}} /* void init(),void timer0() interrupt 1利用定时器0以500MS速度进行流水灯从上至下移动*/利用动态扫描和定时器1在数码管上显示出从765432开始以1/10秒的速度往下递减直至765398并保持显示此数#include<reg52.h>#include<intrins.h> //位移声明#define uint unsigned int#define uchar unsigned charuchar temp,t0,t1,bai,shi,ge;sbit dula=P2^6;sbit wela=P2^7;uchar code table[]={0x3f ,0x06 , 0x5b , 0x4f ,0x66 , 0x6d , 0x7d , 0x07 , 0x7f , 0x6f ,0x77 , 0x7c , 0x39 , 0x5e , 0x79 , 0x71};void display(uchar aa,uchar bb,ucharcc,uchar bai,uchar shi,uchar ge);uint shu;void init();void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void main(){init();while(1){display(7,6,5,bai,shi,ge);}}void init(){shu=432;temp=0xfe;P1=temp;//点亮第一个发光二极管TMOD=0x11;TH0=(65536-50000)/256;TL0=(65536-50000)%256;//T0定时器TH1=(65536-50000)/256;TL1=(65536-50000)%256;//T1定时器(500ms里不用)EA=1;//kai zong 中断ET0=1;ET1=1;TR0=1;// 定时器0打开TR1=1;// 定时器1打开}void timer1() interrupt 3{TH1=(65536-50000)/256;TL1=(65536-50000)%256;t1++;if(t1==2){t1=0;shu--;bai=shu/100;shi=shu%100/10;ge=shu%10;if(shu==398){TR0=0;//控制流水灯关闭TR1=0;}}}void display(uchar aa,uchar bb,uchar cc,uchar bai,uchar shi,uchar ge) {dula=1;P0=table[aa];dula=0;P0=0xff;wela=1;P0=0xfe;wela=0;delay(1);dula=1;P0=table[bb];dula=0;wela=1;P0=0xfd;wela=0;delay(1);dula=1;P0=table[cc];dula=0;P0=0xff;wela=1;P0=0xfb;wela=0;delay(1);dula=1;P0=table[bai];dula=0;wela=1;P0=0xf7;wela=0;delay(1);dula=1;P0=table[shi];dula=0;P0=0xff;//xiaoyinwela=1;P0=0xef;wela=0;delay(1);dula=1;P0=table[ge];dula=0;wela=1;P0=0xdf;wela=0;delay(1);}第五节/一、用键盘点亮第一个流水灯#include<reg52.h>sbit d1=P1^0;sbit key1=p3^4;void main(){P3=0xff;while(1){if(key1==0)d1=0;elsed1=1;}}或#include<reg52.h>#define uint unsigned int#define uchar unsigned charuchar code table[]={0x3f ,0x06 , 0x5b , 0x4f , 0x66 , 0x6d , 0x7d , 0x07 , 0x7f , 0x6f ,0x77 , 0x7c , 0x39 , 0x5e , 0x79 , 0x71}; sbit d1=P1^0;sbit key1=P3^4;sbit dula=P2 ^6;sbit wela=P2^7;uchar num;void main(){wela=1;P0=0xfe;wela=0;P3=0xff;while(1){if(key1==0){d1=0;num++;if (num==10)num=0;}elsed1=1;dula=1;P0=table[num];dula=0;}} //用键盘点亮第一个流水灯按下16个矩阵键盘依次在数码管上显示0-15 #include<reg52.h>#define uint unsigned int#define uchar unsigned charuchar code table[]={0x3f ,0x06 , 0x5b , 0x4f , 0x66 , 0x6d , 0x7d , 0x07 , 0x7f , 0x6f ,0x77 , 0x7c , 0x39 , 0x5e , 0x79 , 0x71,0}; sbit dula=P2 ^6;sbit wela=P2^7;sbit key1=P3^4;uchar num,temp,num1;void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}uchar keyscan();void main(){num= 17;dula=0;P0=0;dula=1;wela=1;P0=0xc0;wela=0;while(1){num1=keyscan();dula=1;P0=table[num1-1];dula=0;}}uchar keyscan(){P3=0xfe;//1temp=P3;temp=temp&0xf0;while(temp!=0xf0){delay(5);temp=P3;temp=temp&0xf0;while(temp!=0xf0){temp=P3;switch(temp){case 0xee:num=1;break;case 0xde:num=2;break;case 0xbe:num=3;break;case 0x7e:num=4;break;}while(1){temp=P3;temp=temp&0xf0;}}}P3=0xfd; //2temp=P3;temp=temp&0xf0;while(temp!=0xf0){delay(5);temp=P3;temp=temp&0xf0;while(temp!=0xf0){temp=P3;switch(temp){case 0xed:num=5;break;case 0xdd:num=6;break;case 0xbd:num=7;break;case 0x7d:num=8;break;}while(1){temp=P3;temp=temp&0xf0;}}}P3=0xfb; //3temp=P3;temp=temp&0xf0;while(temp!=0xf0){delay(5);temp=P3;temp=temp&0xf0;while(temp!=0xf0){temp=P3;switch(temp){case 0xeb:num=9;break;case 0xdb:num=10;break;case 0xbb:num=11;break;case 0x7b:num=12;break;}while(1){temp=P3;temp=temp&0xf0;}}}P3=0xf7; //4temp=P3;temp=temp&0xf0;while(temp!=0xf0){delay(5);temp=P3;temp=temp&0xf0;while(temp!=0xf0){temp=P3;switch(temp){case 0xe7:num=13;break;case 0xd7:num=14 ;break;case 0xb7:num=15 ;break;case 0x77:num=16;break;}while(1){temp=P3;temp=temp&0xf0;}}}return num;}。

51单片机C语言程序设计-图文

51单片机C语言程序设计-图文
03 8 只 LED 左右来回点亮
/* 名称:8 只 LED 左右来回点亮 说明:程序利用循环移位函数_crol_和_cror_形成来回滚动的效果
*/ #include<reg51.h> #include<intrins.h> #define uchar unsigned char #define uint unsigned int //延时 void DelayMS(uint x) {
case 2: //东西向黄灯闪烁,绿灯关闭 DelayMS(300); YELLOW_A=~YELLOW_A;GREEN_A=1; if(++Flash_Count!=10) return; //闪烁 5 次 Flash_Count=0; Operation_Type=3; break;
case 3: //东西向红灯,南北向绿灯亮 RED_A=0;YELLOW_A=1;GREEN_A=1; RED_B=1;YELLOW_B=1;GREEN_B=0; DelayMS(2000); Operation_Type=4; break;
3 Ykcsh 呈献
0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff }; //延时 void DelayMS(uint x) {
uchar i; while(x--) {
for(i=0;i<120;i++); } } //主程序 void main() { uchar i; while(1) { //从数组中读取数据送至 P0 和 P2 口显示
uchar i; while(x--) {
for(i=0;i<120;i++); } } //主程序 void main() { uchar i; P2=0x01; while(1) {

单片机初学者c程序参考

单片机初学者c程序参考

1-1// 用位操作点亮第一个发光管.// 适用TX-1C单片机实验板// 晶振为11.0592M/*********************************************************/#include<reg52.h> //52单片机头文件sbit led1=P1^0; //单片机管脚位声明void main() //主函数{led1=0; //将单片机P1.0口清零while(1); //程序停止在这里,在后面会讲到为什么这样写。

}1-2// 用总线操作点亮第一个发光管.// 适用TX-1C单片机实验板// 晶振为11.0592M/*********************************************************/#include<reg52.h> //52单片机头文件void main() //主函数{P1=0xfe; //将单片机P1口的8个口由高到低分别赋值为11111110while(1); //程序停止在这里,在后面会讲到为什么这样写。

}1-3/*******************************************************************/ // 用总线操作点亮第一个发光管.// 适用TX-1C单片机实验板// 晶振为11.0592M/*********************************************************/#include<reg52.h> //52单片机头文件void main() //主函数{P1=0xfe; //将单片机P1口的8个口由高到低分别赋值为11111110while(1); //程序停止在这里,在后面会讲到为什么这样写。

}1-4// 用总线操作点亮最后一个发光管.// 适用TX-1C单片机实验板// 晶振为11.0592M/*********************************************************/#include<reg52.h> //52单片机头文件void main() //主函数{P1=0x7f; //将单片机P1口的8个口由高到低分别赋值为01111111 while(1); //程序停止在这里,在后面会讲到为什么这样写。

51单片机C语言编程100例

51单片机C语言编程100例

51单片机C语言编程100例1. 前言在学习嵌入式系统开发中,单片机是必不可少的一个组成部分。

而在单片机的编程语言中,C语言因其易学易用、灵活性高等特点而备受青睐。

本文将介绍51单片机C语言编程的100个实例,旨在帮助读者更加深入地理解和掌握这一领域的知识。

2. 闪烁LED灯实例1:使用51单片机编程控制一个LED灯的闪烁,实现简单的开关控制。

3. 延时程序实例2:编写一个延时程序,用于控制LED灯的延时亮灭,实现不同频率的闪烁效果。

4. 数码管显示实例3:通过编写程序,使用数码管显示数字0-9,实现简单的计数功能。

5. 矩阵键盘输入实例4:通过编程实现对矩阵键盘的输入检测和处理,实现对不同按键的响应。

6. PWM输出实例5:使用51单片机的PWM输出功能,控制LED灯的亮度调节。

7. 温度传感器读取实例6:通过温度传感器读取模块,实现温度的检测和显示。

8. 模拟信号采集实例7:通过编程实现对模拟信号的采集和处理,实现对外部信号的监测和控制。

9. 串口通信实例8:使用51单片机的串口通信功能,实现单片机与计算机之间的数据传输。

10. 蜂鸣器控制实例9:通过编程控制蜂鸣器的开关,实现不同频率的声音发声。

11. 数字口输入检测实例10:通过编程实现对数字口输入状态的检测和处理,实现对外部信号的监测和控制。

12. 定时器中断实例11:使用51单片机的定时器中断功能,实现定时任务的执行和控制。

13. PWM输出调制实例12:使用数字口和定时器实现PWM波形的调制和输出控制。

14. 蓝牙通信实例13:通过蓝牙模块实现51单片机与手机之间的数据通信,实现简单的远程控制。

15. 温湿度传感器读取实例14:通过温湿度传感器读取模块,实现温湿度的检测和显示。

16. 步进电机控制实例15:通过编程控制步进电机的转动和方向,实现简单的运动控制。

17. 超声波测距实例16:通过超声波测距模块,实现对距离的检测和显示。

18. 电机驱动控制实例17:通过编程和电机驱动模块,实现电机的转动和速度控制。

51单片机C语言编程100例-单片机c语言编程

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语言编程300例

单片机c语言编程300例

单片机C语言编程300例1. 介绍单片机是一种集成电路芯片,具有处理器核心、存储器、输入/输出接口等功能部件。

使用C语言进行单片机编程可以在嵌入式系统中实现各种功能,例如控制设备、采集数据、驱动外设等。

本文档将介绍300个关于单片机C语言编程的例子,涵盖基本的输入/输出操作、循环结构、条件语句、函数调用、中断处理等内容。

2. 基本概念在开始编程之前,我们需要了解一些基本的概念和术语。

2.1 单片机单片机是一种集成电路芯片,由处理器核心、存储器、输入/输出接口等功能部件组成。

常见的单片机包括51系列、AVR系列、STM32系列等。

2.2 C语言C语言是一种通用的高级编程语言,具有代码简洁、易读易写、可移植性强等特点。

在单片机编程中,我们通常使用C 语言来编写程序。

2.3 编译编译是将C语言源代码转换为目标机器指令的过程。

在单片机编程中,我们需要将C语言源代码编译为机器可执行的二进制文件。

2.4 调试调试是指通过调试工具来检查程序的执行过程,以便找出程序中的错误。

3. 基本的输入/输出操作在单片机编程中,我们需要通过输入/输出操作和外部设备进行通信。

以下是一些基本的输入/输出操作的例子:3.1 数字输入/输出3.1.1 通过脚位控制LED灯#include <8051.h>void main() {P0 = 0xFF; // 将P0口设置为输出while (1) {P0 = 0x00; // 打开LED灯delay(); // 延时P0 = 0xFF; // 关闭LED灯delay(); // 延时}}void delay() {int i, j;for (i = 0; i < 500; i++) {for (j = 0; j < 500; j++) {// 延时处理}}}3.1.2 通过按键控制LED灯#include <8051.h>void main() {P0 = 0xFF; // 将P0口设置为输出while (1) {if (P1_0 == 0) { // 检测按键是否按下P0 = 0x00; // 打开LED灯} else {P0 = 0xFF; // 关闭LED灯}}}3.2 模拟输入/输出3.2.1 通过ADC采集模拟信号#include <8051.h>void main() {while (1) {int value = ADC_Read(0); // 采集A0通道的模拟信号P0 = value; // 将模拟信号输出到P0口}}int ADC_Read(unsigned char channel) {// ADC采集处理}3.2.2 通过DAC输出模拟信号#include <8051.h>void main() {while (1) {int value = get_value(); // 获取模拟信号数值DAC_Write(value); // 将模拟信号输出到DAC}}void DAC_Write(unsigned char value) {// DAC输出处理}4. 循环结构循环结构是单片机编程中常用的控制结构之一,可以重复执行一段代码。

51STC单片机C语言通用万能编程模板

51STC单片机C语言通用万能编程模板

51STC单片机C语言通用万能编程模板以下是一份STC单片机C语言通用万能编程模板,供参考:```c
#include <reg52.h> // 引入头文件
//全局变量定义
//...
//函数声明
//...
//主函数
void mai
//初始化操作
//...
while (1)
//主循环
//代码逻辑
//...
}
//延时函数
unsigned int i, j;
for (j = 10; j > 0; j--); // 延时约1ms,根据实际情况调整
}
//其他函数定义
//...
```
该模板包含了一些常用的部分,如头文件引用、全局变量定义、函数
声明和主函数等。

在主函数中,可以进行各种初始化操作,如引脚设置、定时器设置等。

然后通过一个无限循环,进行主要的代码逻辑操作。

在代码逻辑部分,可以根据具体需求编写相应的代码,如读取传感器
数据、控制外设等。

除了主函数外,还可以定义其他的函数来实现一些特定功能,如延时
函数、中断处理函数等。

使用该模板可以大大节省编写代码的时间,同时也方便后续的维护和
修改工作。

需要注意的是,该模板是基于STC单片机的C语言编程,可能会与其
他型号的单片机有些差异,需根据具体情况进行调整。

同样,在使用时也
需要根据实际需求添加相应的代码。

单片机C语言编程ppt课件

单片机C语言编程ppt课件

01
switch(表达式)
ቤተ መጻሕፍቲ ባይዱ
02
{case 常量1:语句1;break;
03
case 常量2:语句2;break;
04
case 常量n:语句n;break;
05
default:
06
语句n+1;
07
}
多分支结构
4.C的流程控制语句3/3
01
#include <reg52.h> //头文件
02
void main() //主函数
3
生成hex文件
2
1
编辑程序
编译程序
7.Keil C的使用
01
绘制电路的方法
02
放置元件的方法
03
仿真的方法
04
单片机仿真方法。
8.Proteus的初步使用
按键的识别,并控制LED

LED的驱动

7段LED的了解:静态法和动态法

流水灯的设计

9.综合演示
4
2.变量2/2
算术运算符:+ ,- , *, /, %
关系运算符:==,!=,>,<,>=,<=
逻辑运算符:&&,||,!
布尔运算符:&,|,^(xor),~,<<,>>
赋值运算符:=
递增/递减运算符:++,——
3.运算符
循环指令:for(表达式1;表达式2;表达式3)
{循环体;}while(条件表达式)
2
COMPACT 存储模式中所有的函数和程序变量和局部数据段定位在8051 系统的外部数据存储区.外部数据存储区可有最多256 字节(一页), 在本模式中外部数据存储区的短地址用 @R0/R1.

51单片机C语言编程100例

51单片机C语言编程100例

目录实例3:用单片机控制第一个灯亮 (5)实例4:用单片机控制一个灯闪烁:认识单片机的工作频率 (6)实例5:将 P1口状态分别送入P0、P2、P3口:认识I/O口的引脚功能 (7)实例6:使用P3口流水点亮8位LED (8)实例7:通过对P3口地址的操作流水点亮8位LED (10)实例8:用不同数据类型控制灯闪烁时间 (12)实例9:用P0口、P1 口分别显示加法和减法运算结果 (14)实例10:用P0、P1口显示乘法运算结果 (15)实例11:用P1、P0口显示除法运算结果 (16)实例12:用自增运算控制P0口8位LED流水花样 (16)实例13:用P0口显示逻辑"与"运算结果 (18)实例14:用P0口显示条件运算结果 (18)实例15:用P0口显示按位"异或"运算结果 (19)实例16:用P0显示左移运算结果 (19)实例17:"万能逻辑电路"实验 (20)实例18:用右移运算流水点亮P1口8位LED (20)实例19:用if语句控制P0口8位LED的流水方向 (22)实例20:用swtich语句的控制P0口8位LED的点亮状态 (23)实例21:用for语句控制蜂鸣器鸣笛次数 (25)实例22:用while语句控制LED (27)实例23:用do-while语句控制P0口8位LED流水点亮 (29)实例24:用字符型数组控制P0口8位LED流水点亮 (31)实例25:用P0口显示字符串常量 (32)实例26:用P0 口显示指针运算结果 (34)实例27:用指针数组控制P0口8位LED流水点亮 (34)实例28:用数组的指针控制P0 口8 位LED流水点亮 (36)实例29:用P0 、P1口显示整型函数返回值 (38)实例30:用有参函数控制P0口8位LED流水速度 (39)实例31:用数组作函数参数控制流水花样 (41)实例32:用指针作函数参数控制P0口8位LED流水点亮 (42)实例33:用函数型指针控制P1口灯花样 (45)实例34:用指针数组作为函数的参数显示多个字符串 (47)实例35:字符函数ctype.h应用举例 (49)实例36:内部函数intrins.h应用举例 (50)实例37:标准函数stdlib.h应用举例 (51)实例38:字符串函数string.h应用举例 (52)实例39:宏定义应用举例2 (53)实例40:宏定义应用举例2 (54)实例41:宏定义应用举例3 (55)实例42:用定时器T0查询方式P2口8位控制LED闪烁 (56)实例43:用定时器T1查询方式控制单片机发出1KHz音频 (57)实例44:将计数器T0计数的结果送P1口8位LED显示 (58)实例45:用定时器T0的中断控制1位LED闪烁 (60)实例46:用定时器T0的中断实现长时间定时 (61)实例47:用定时器T1中断控制两个LED以不同周期闪烁 (63)实例48:用计数器T1的中断控制蜂鸣器发出1KHz音频 (65)实例49:用定时器T0的中断实现"渴望"主题曲的播放 (66)实例50-1:输出50个矩形脉冲 (72)实例50-2:计数器T0统计外部脉冲数 (73)实例51-2:定时器T0的模式2测量正脉冲宽度 (74)实例52:用定时器T0控制输出高低宽度不同的矩形波 (76)实例53:用外中断0的中断方式进行数据采集 (78)实例54-1:输出负脉宽为200微秒的方波 (79)实例54-2:测量负脉冲宽度 (80)实例55:方式0控制流水灯循环点亮 (82)实例56-1:数据发送程序 (84)实例56-2:数据接收程序 (86)实例57-1:数据发送程序 (88)实例57-2:数据接收程序 (90)实例58:单片机向PC发送数据 (92)实例59:单片机接收PC发出的数据 (94)实例60:用LED数码显示数字5 (96)实例61:用LED数码显示器循环显示数字0~9 (96)实例62:用数码管慢速动态扫描显示数字"1234" (98)实例63:用LED数码显示器伪静态显示数字1234 (99)实例64:用数码管显示动态检测结果 (101)实例65:数码秒表设计 (105)实例66:数码时钟设计 (108)实例67:用LED数码管显示计数器T0的计数值 (115)实例68:静态显示数字“59” (118)实例69:无软件消抖的独立式键盘输入实验 (118)实例70:软件消抖的独立式键盘输入实验 (119)实例71:CPU控制的独立式键盘扫描实验 (121)实例72:定时器中断控制的独立式键盘扫描实验 (127)实例73:独立式键盘控制的4级变速流水灯 (134)实例74:独立式键盘的按键功能扩展:"以一当四" (138)实例75:独立式键盘调时的数码时钟实验 (141)实例76:独立式键盘控制步进电机实验 (149)实例77:矩阵式键盘按键值的数码管显示实验 (154)实例78:矩阵式键盘按键音 (160)实例79:简易电子琴 (164)实例80:矩阵式键盘实现的电子密码锁 (176)实例81:用LCD显示字符'A' (182)实例82:用LCD循环右移显示"Welcome to China" (189)实例83:用LCD显示适时检测结果 (196)实例84:液晶时钟设计 (204)实例85:将数据"0x0f"写入AT24C02再读出送P1口显示 (216)实例86:将按键次数写入AT24C02,再读出并用1602LCD显示 (224)实例87:对I2C总线上挂接多个AT24C02的读写操作 (239)实例88:基于AT24C02的多机通信读取程序 (250)实例88:基于AT24C02的多机通信写入程序 (258)实例90:DS18B20温度检测及其液晶显示 (280)实例91:将数据"0xaa"写入X5045再读出送P1口显示 (298)实例92:将流水灯控制码写入X5045并读出送P1口显示 (305)实例93:对SPI总线上挂接多个X5045的读写操作 (313)实例94:基于ADC0832的数字电压表 (321)实例95:用DAC0832产生锯齿波电压 (333)实例96:用P1口显示红外遥控器的按键值 (334)实例97:用红外遥控器控制继电器 (339)实例98:基于DS1302的日历时钟 (344)实例99:单片机数据发送程序 (362)实例100:电机转速表设计 (365)模拟霍尔脉冲 (375)/*函数的使用和熟悉*///实例3:用单片机控制第一个灯亮#include<reg51.h> //包含51单片机寄存器定义的头文件void main(void){while(1) //无限循环P1=0xfe; //P1=1111 1110B,即P1.0输出低电平}//实例4:用单片机控制一个灯闪烁:认识单片机的工作频率#include<reg51.h> //包含单片机寄存器的头文件/****************************************函数功能:延时一段时间*****************************************/void delay(void) //两个void意思分别为无需返回值,没有参数传递{unsigned int i; //定义无符号整数,最大取值范围65535for(i=0;i<20000;i++) //做20000次空循环; //什么也不做,等待一个机器周期}/*******************************************************函数功能:主函数(C语言规定必须有也只能有1个主函数)********************************************************/void main(void){while(1) //无限循环{P1=0xfe; //P1=1111 1110B, P1.0输出低电平delay(); //延时一段时间P1=0xff; //P1=1111 1111B, P1.0输出高电平delay(); //延时一段时间}}//实例5:将 P1口状态分别送入P0、P2、P3口:认识I/O口的引脚功能#include<reg51.h> //包含单片机寄存器的头文件/*******************************************************函数功能:主函数(C语言规定必须有也只能有1个主函数)********************************************************/void main(void){while(1) //无限循环{P1=0xff; // P1=1111 1111, 熄灭LEDP0=P1; // 将 P1口状态送入P0口P2=P1; // 将 P1口状态送入P2口P3=P1; // 将 P1口状态送入P3口}}//实例6:使用P3口流水点亮8位LED #include<reg51.h> //包含单片机寄存器的头文件/****************************************函数功能:延时一段时间*****************************************/void delay(void){unsigned char i,j;for(i=0;i<250;i++)for(j=0;j<250;j++);}/******************************************************* 函数功能:主函数********************************************************/ void main(void)while(1){P3=0xfe; //第一个灯亮delay(); //调用延时函数P3=0xfd; //第二个灯亮delay(); //调用延时函数P3=0xfb; //第三个灯亮delay(); //调用延时函数P3=0xf7; //第四个灯亮delay(); //调用延时函数P3=0xef; //第五个灯亮delay(); //调用延时函数P3=0xdf; //第六个灯亮delay(); //调用延时函数P3=0xbf; //第七个灯亮delay(); //调用延时函数P3=0x7f; //第八个灯亮delay(); //调用延时函数 }}//实例7:通过对P3口地址的操作流水点亮8位LED#include<reg51.h> //包含单片机寄存器的头文件sfr x=0xb0; //P3口在存储器中的地址是b0H,通过sfr可定义8051内核单片机//的所有内部8位特殊功能寄存器,对地址x的操作也就是对P1口的操作/****************************************函数功能:延时一段时间*****************************************/void delay(void){unsigned char i,j;for(i=0;i<250;i++)for(j=0;j<250;j++); //利用循环等待若干机器周期,从而延时一段时间 }/*****************************************函数功能:主函数******************************************/void main(void){while(1){x=0xfe; //第一个灯亮delay(); //调用延时函数x=0xfd; //第二个灯亮delay(); //调用延时函数x=0xfb; //第三个灯亮delay(); //调用延时函数x=0xf7; //第四个灯亮delay(); //调用延时函数x=0xef; //第五个灯亮delay(); //调用延时函数x=0xdf; //第六个灯亮delay(); //调用延时函数x=0xbf; //第七个灯亮delay(); //调用延时函数x=0x7f; //第八个灯亮delay(); //调用延时函数}}//实例8:用不同数据类型控制灯闪烁时间#include<reg51.h> //包含单片机寄存器的头文件/******************************************************函数功能:用整形数据延时一段时间******************************************************/void int_delay(void) //延时一段较长的时间{unsigned int m; //定义无符号整形变量,双字节数据,值域为0~65535 for(m=0;m<36000;m++); //空操作}/******************************************************函数功能:用字符型数据延时一段时间******************************************************/void char_delay(void) //延时一段较短的时间{unsigned char i,j; //定义无符号字符型变量,单字节数据,值域0~255for(i=0;i<200;i++)for(j=0;j<180;j++); //空操作}/****************************************************** 函数功能:主函数******************************************************/ void main(void){unsigned char i;while(1){for(i=0;i<3;i++){P1=0xfe; //P1.0口的灯点亮int_delay(); //延时一段较长的时间P1=0xff; //熄灭int_delay(); //延时一段较长的时间}for(i=0;i<3;i++){P1=0xef; //P1.4口的灯点亮char_delay(); //延时一段较长的时间P1=0xff; //熄灭char_delay(); //延时一段较长的时间}}}//实例9:用P0口、P1口分别显示加法和减法运算结果#include<reg51.h>void main(void){unsigned char m,n;m=43; //即十进制数2x16+11=43n=60; //即十进制数3x16+12=60P1=m+n; //P1=103=0110 0111,结果P1.3、P1.4、P1.7 口的灯被点亮 P0=n-m; //P0=17=0001 0001,结果P0.0、P0.4的灯被熄灭}//实例10:用P0、P1口显示乘法运算结果#include<reg51.h> //包含单片机寄存器的头文件void main(void){unsigned char m,n;unsigned int s;m=64;n=71;s=m*n; //s=64*71=4544,需要16位二进制数表示,高8位送P1口,低8位送P0口//由于4544=17*256+192=H3*16*16*16+H2*16*16+H1*16+H0 //两边同除以256,可得17+192/256=H3*16+H2+(H1*16+H0)/256//因此,高8位16进制数H3*16+H2必然等于17,即4544除以256的商//低8位16进制数H1*16+H0必然等于192,即4544除以256的余数P1=s/256; //高8位送P1口,P1=17=11H=0001 0001B, P1.0和P1.4口灭,其余亮P0=s%256; //低8位送P0口 , P3=192=c0H=1100 0000B,P3.1,P3.6,P3.7口灭,其余亮}//实例11:用P1、P0口显示除法运算结果#include<reg51.h> //包含单片机寄存器的头文件void main(void){P1=36/5; //求整数P0=((36%5)*10)/5; //求小数while(1); //无限循环防止程序“跑飞”}//实例12:用自增运算控制P0口8位LED流水花样#include<reg51.h> //包含单片机寄存器的头文件/******************************************************函数功能:延时一段时间******************************************************/ void delay(void){unsigned int i;for(i=0;i<20000;i++);}/************************************************************************************************************/ void main(void){unsigned char i;for(i=0;i<255;i++) //注意i的值不能超过255{P0=i; //将i的值送P0口delay(); //调用延时函数}}//实例13:用P0口显示逻辑"与"运算结果#include<reg51.h> //包含单片机寄存器的头文件void main(void){P0=(4>0)&&(9>0xab);//将逻辑运算结果送P0口while(1); //设置无限循环,防止程序“跑飞”}//实例14:用P0口显示条件运算结果#include<reg51.h> //包含单片机寄存器的头文件void main(void){P0=(8>4)?8:4;//将条件运算结果送P0口,P0=8=0000 1000B while(1); //设置无限循环,防止程序“跑飞”}//实例15:用P0口显示按位"异或"运算结果#include<reg51.h> //包含单片机寄存器的头文件void main(void){P0=0xa2^0x3c;//将条件运算结果送P0口,P0=8=0000 1000Bwhile(1); //设置无限循环,防止程序“跑飞”}//实例16:用P0显示左移运算结果#include<reg51.h> //包含单片机寄存器的头文件void main(void){P0=0x3b<<2; //将左移运算结果送P0口,P0=1110 1100B=0xec while(1); //无限循环,防止程序“跑飞”}//实例17:"万能逻辑电路"实验#include<reg51.h> //包含单片机寄存器的头文件sbit F=P1^4; //将F位定义为 P1.4sbit X=P1^5; //将X位定义为 P1.5sbit Y=P1^6; //将Y位定义为 P1.6sbit Z=P1^7; //将Z位定义为 P1.7void main(void){while(1){F=((~X)&Y)|Z; //将逻辑运算结果赋给F;}}//实例18:用右移运算流水点亮P1口8位LED #include<reg51.h> //包含单片机寄存器的头文件/*****************************函数功能:延时一段时间*****************************/void delay(void)unsigned int n;for(n=0;n<30000;n++);}/*****************************函数功能:主函数*****************************/void main(void){unsigned char i;while(1){P1=0xff;delay();for(i=0;i<8;i++)//设置循环次数为8{P1=P1>>1; //每次循环P1的各二进位右移1位,高位补0 delay(); //调用延时函数}}//实例19:用if语句控制P0口8位LED的流水方向#include<reg51.h> //包含单片机寄存器的头文件sbit S1=P1^4; //将S1位定义为P1.4sbit S2=P1^5; //将S2位定义为P1.5/*****************************函数功能:主函数*****************************/void main(void){while(1){if(S1==0) //如果按键S1按下P0=0x0f; //P0口高四位LED点亮if(S2==0) //如果按键S2按下P0=0xf0; //P0口低四位LED点亮}}//实例20:用swtich语句的控制P0口8位LED的点亮状态#include<reg51.h> //包含单片机寄存器的头文件sbit S1=P1^4; //将S1位定义为P1.4/*****************************函数功能:延时一段时间*****************************/void delay(void){unsigned int n;for(n=0;n<10000;n++);}/*****************************函数功能:主函数*****************************/void main(void){unsigned char i;i=0; //将i初始化为0while(1){if(S1==0) //如果S1键按下{delay(); //延时一段时间if(S1==0) //如果再次检测到S1键按下i++; //i自增1if(i==9) //如果i=9,重新将其置为1i=1;}switch(i) //使用多分支选择语句{case 1: P0=0xfe; //第一个LED亮break;case 2: P0=0xfd; //第二个LED亮break;case 3:P0=0xfb; //第三个LED亮break;case 4:P0=0xf7; //第四个LED亮break;case 5:P0=0xef; //第五个LED亮break;case 6:P0=0xdf; //第六个LED亮break;case 7:P0=0xbf; //第七个LED亮break;case 8:P0=0x7f; //第八个LED亮break;default: //缺省值,关闭所有LEDP0=0xff;}}}//实例21:用for语句控制蜂鸣器鸣笛次数#include<reg51.h> //包含单片机寄存器的头文件sbit sound=P3^7; //将sound位定义为P3.7/****************************************函数功能:延时形成1600Hz音频****************************************/void delay1600(void){unsigned char n;for(n=0;n<100;n++);}/**************************************** 函数功能:延时形成800Hz音频****************************************/ void delay800(void){unsigned char n;for(n=0;n<200;n++);}/**************************************** 函数功能:主函数****************************************/ void main(void){unsigned int i;while(1){for(i=0;i<830;i++){sound=0; //P3.7输出低电平delay1600();sound=1; //P3.7输出高电平delay1600();}for(i=0;i<200;i++){sound=0; //P3.7输出低电平delay800();sound=1; //P3.7输出高电平delay800();}}}//实例22:用while语句控制LED#include<reg51.h> //包含单片机寄存器的头文件/****************************************函数功能:延时约60ms (3*100*200=60000μs)****************************************/void delay60ms(void){unsigned char m,n;for(m=0;m<100;m++)for(n=0;n<200;n++);}/****************************************函数功能:主函数****************************************/void main(void){unsigned char i;while(1) //无限循环{i=0; //将i初始化为0while(i<0xff) //当i小于0xff(255)时执行循环体{P0=i; //将i送P0口显示delay60ms(); //延时i++; //i自增1}}}//实例23:用do-while语句控制P0口8位LED流水点亮#include<reg51.h> //包含单片机寄存器的头文件/****************************************函数功能:延时约60ms (3*100*200=60000μs)****************************************/void delay60ms(void){unsigned char m,n;for(m=0;m<100;m++)for(n=0;n<200;n++);}/****************************************函数功能:主函数****************************************/void main(void){do{P0=0xfe; //第一个LED亮delay60ms();P0=0xfd; //第二个LED亮delay60ms();P0=0xfb; //第三个LED亮delay60ms();P0=0xf7; //第四个LED亮delay60ms();P0=0xef; //第五个LED亮delay60ms();P0=0xdf; //第六个LED亮delay60ms();delay60ms();P0=0xbf; //第七个LED亮delay60ms();P0=0x7f; //第八个LED亮delay60ms();}while(1); //无限循环,使8位LED循环流水点亮}//实例24:用字符型数组控制P0口8位LED流水点亮#include<reg51.h> //包含单片机寄存器的头文件/****************************************函数功能:延时约60ms (3*100*200=60000μs)****************************************/void delay60ms(void){unsigned char m,n;for(m=0;m<100;m++)for(n=0;n<200;n++);}/****************************************函数功能:主函数****************************************/void main(void){unsigned char i;unsigned char code Tab[ ]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //定义无符号字符型数组while(1){for(i=0;i<8;i++){P0=Tab[i];//依次引用数组元素,并将其送P0口显示 delay60ms();//调用延时函数}}}//实例25:用P0口显示字符串常量#include<reg51.h> //包含单片机寄存器的头文件/*************************************************函数功能:延时约150ms (3*200*250=150 000μs=150ms*************************************************/ void delay150ms(void){unsigned char m,n;for(m=0;m<200;m++)for(n=0;n<250;n++);}/*************************************************函数功能:主函数*************************************************/void main(void){unsigned char str[]={"Now,Temperature is :"}; //将字符串赋给字符型全部元素赋值unsigned char i;while(1){i=0; //将i初始化为0,从第一个元素开始显示while(str[i]!='\0') //只要没有显示到结束标志'\0'{P0=str[i]; //将第i个字符送到P0口显示delay150ms(); //调用150ms延时函数i++; //指向下一个待显字符}}}//实例26:用P0 口显示指针运算结果#include<reg51.h>void main(void){unsigned char *p1,*p2; //定义无符号字符型指针变量p1,p2unsigned char i,j; //定义无符号字符型数据i=25; //给i赋初值25j=15;p1=&i; //使指针变量指向i ,对指针初始化p2=&j; //使指针变量指向j ,对指针初始化P0=*p1+*p2; //*p1+*p2相当于i+j,所以P0=25+15=40=0x28//则P0=0010 1000B,结果P0.3、P0.5引脚LED熄灭,其余点亮 while(1); //无限循环,防止程序“跑飞”}//实例27:用指针数组控制P0口8位LED流水点亮#include<reg51.h>/*************************************************函数功能:延时约150ms (3*200*250=150 000μs=150ms*************************************************/void delay150ms(void){unsigned char m,n;for(m=0;m<200;m++)for(n=0;n<250;n++);}/*************************************************函数功能:主函数*************************************************/void main(void){unsigned char code Tab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; unsigned char*p[ ]={&Tab[0],&Tab[1],&Tab[2],&Tab[3],&Tab[4],&Tab[5],&Tab[6],&Tab[7]};unsigned char i; //定义无符号字符型数据while(1){for(i=0;i<8;i++){P0=*p[i];delay150ms();}}}//实例28:用数组的指针控制P0 口8 位LED流水点亮#include<reg51.h>/*************************************************函数功能:延时约150ms (3*200*250=150 000μs=150ms*************************************************/void delay150ms(void){unsigned char m,n;for(m=0;m<200;m++)for(n=0;n<250;n++);}/*************************************************函数功能:主函数*************************************************/void main(void){unsigned char i;unsigned char Tab[ ]={0xFF,0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE,0xFE,0xFC,0xFB,0xF0,0xE0,0xC0,0x80,0x00,0xE7,0xDB,0xBD,0x7E,0x3C,0x18,0x00,0x81,0xC3,0xE7,0x7E,0xBD,0xDB,0xE7,0xBD,0xDB};//流水灯控制码unsigned char *p; //定义无符号字符型指针p=Tab; //将数组首地址存入指针pwhile(1){for(i=0;i<32;i++) //共32个流水灯控制码{P0=*(p+i); //*(p+i)的值等于a[i]delay150ms(); //调用150ms延时函数}}}//实例29:用P0 、P1口显示整型函数返回值#include<reg51.h>/*************************************************函数功能:计算两个无符号整数的和*************************************************/ unsigned int sum(int a,int b){unsigned int s;s=a+b;return (s);}/*************************************************函数功能:主函数*************************************************/void main(void){unsigned z;z=sum(2008,2009);P1=z/256; //取得z的高8位P0=z%256; //取得z的低8位while(1);}//实例30:用有参函数控制P0口8位LED流水速度#include<reg51.h>/*************************************************函数功能:延时一段时间*************************************************/void delay(unsigned char x){unsigned char m,n;for(m=0;m<x;m++)for(n=0;n<200;n++);}/*************************************************函数功能:主函数*************************************************/void main(void){unsigned char i;unsigned char codeTab[ ]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};//流水灯控制码while(1){//快速流水点亮LEDfor(i=0;i<8;i++) //共8个流水灯控制码{P0=Tab[i];delay(100); //延时约60ms, (3*100*200=60 000μs) }//慢速流水点亮LEDfor(i=0;i<8;i++) //共8个流水灯控制码{P0=Tab[i];delay(250); //延时约150ms, (3*250*200=150 000μs) }}}//实例31:用数组作函数参数控制流水花样#include<reg51.h>/*************************************************函数功能:延时约150ms*************************************************/void delay(void){unsigned char m,n;for(m=0;m<200;m++)for(n=0;n<250;n++);}/*************************************************函数功能:流水点亮P0口8位LED*************************************************/void led_flow(unsigned char a[8]){unsigned char i;for(i=0;i<8;i++){P0=a[i];delay();}}/*************************************************函数功能:主函数*************************************************/void main(void){unsigned char codeTab[ ]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};//流水灯控制码led_flow(Tab);}//实例32:用指针作函数参数控制P0口8位LED流水点亮#include<reg51.h>/*************************************************函数功能:延时约150ms*************************************************/void delay(void){unsigned char m,n;for(m=0;m<200;m++)for(n=0;n<250;n++);}/*************************************************函数功能:流水点亮P0口8位LED*************************************************/void led_flow(unsigned char *p) //形参为无符号字符型指针{unsigned char i;while(1){i=0; //将i置为0,指向数组第一个元素while(*(p+i)!='\0') //只要没有指向数组的结束标志{P0=*(p+i);// 取的指针所指变量(数组元素)的值,送P0口 delay(); //调用延时函数i++; //指向下一个数组元素}}}/*************************************************函数功能:主函数*************************************************/void main(void){unsigned char code Tab[ ]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F, 0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE,0xFF,0xFE,0xFC,0xFB,0xF0,0xE0,0xC0,0x80,0x00,0xE7,0xDB,0xBD,0x7E,0xFF,0xFF,0x3C,0x18,0x0,0x81,0xC3,0xE7,0xFF, 0xFF,0x7E};//流水灯控制码unsigned char *pointer;pointer=Tab;led_flow(pointer);}//实例33:用函数型指针控制P1口灯花样#include<reg51.h> //包含51单片机寄存器定义的头文件unsigned char code Tab[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F}; //流水灯控制码,该数组被定义为全局变量/**************************************************************函数功能:延时约150ms**************************************************************/void delay(void){unsigned char m,n;for(m=0;m<200;m++)for(n=0;n<250;n++);}/**************************************************************函数功能:流水灯左移**************************************************************/ void led_flow(void){unsigned char i;for(i=0;i<8;i++) //8位控制码{P0=Tab[i];delay();}}/************************************************************** 函数功能:主函数**************************************************************/ void main(void){void (*p)(void); //定义函数型指针,所指函数无参数,无返回值p=led_flow; //将函数的入口地址赋给函数型指针pwhile(1)(*p)(); //通过函数的指针p调用函数led_flow()}//实例34:用指针数组作为函数的参数显示多个字符串#include<reg51.h> //包含51单片机寄存器定义的头文件unsigned char code str1[ ]="Temperature is tested by DS18B20";//C语言中,字符串是作为字符数组来处理的unsigned char code str2[ ]="Now temperature is:"; //所以,字符串的名字就是字符串的首地址unsigned char code str3[ ]="The Systerm is designed by Zhang San"; unsigned char code str4[ ]="The date is 2008-9-30";unsigned char *p[ ]={str1,str2,str3,str4}; //定义p[4]为指向4个字符串的字符型指针数组/**************************************************************函数功能:延时约150ms**************************************************************/void delay(void){unsigned char m,n;for(m=0;m<200;m++)for(n=0;n<250;n++);}/**************************************************************函数功能:流水点亮P0口8位LED**************************************************************/void led_display(unsigned char *x[ ]) //形参必须为指针数组{unsigned char i,j;for(i=0;i<4;i++) //有4个字符串要显示{j=0; //指向待显字符串的第0号元素while(*(x[i]+j)!='\0') //只要第i个字符串的第j号元素不是结束标志{P0=*(x[i]+j); //取得该元素值送到P0口显示delay(); //调用延时函数j++; //指向下一个元素}}}/**************************************************************函数功能:主函数**************************************************************/void main(void)unsigned char i;while(1){for(i=0;i<4;i++)led_display(p); //将指针数组名作实际参数传递}}//实例35:字符函数ctype.h应用举例#include<reg51.h> //包含51单片机寄存器定义的头文件#include<ctype.h>void main(void){while(1){P3=isalpha('_')?0xf0:0x0f;//条件运算,若'_'是英文字母,P3=0xf0}}//实例36:内部函数intrins.h应用举例#include<reg51.h> //包含51单片机寄存器定义的头文件#include<intrins.h> //包含函数isalpha()声明的头文件/*************************************************函数功能:延时约150ms*************************************************/void delay(void){unsigned char m,n;for(m=0;m<200;m++)for(n=0;n<250;n++);}/*************************************************函数功能:主函数*************************************************/void main(void){P3=0xfe; //P3=1111 1110Bwhile(1)。

STC单片机C语言通用万能编程模板

STC单片机C语言通用万能编程模板

、STC单片机C语言通用万能编程模板————————————————————————————————作者:————————————————————————————————日期:2《8051单片机C语言编程模板》1.函数头文件 (4)2.毫秒级CPU延时函数 (6)3.定时/计数器初始化函数 (7)4.定时/计数器1中断处理函数 (8)5.定时/计数器0中断处理函数 (9)6.PWM初始化函数 (10)7.PWM0占空比设置函数 (12)8.UART串口初始化函数 (12)9.UART串口接收中断处理函数 (13)10.UART串口发送函数 (14)11.UART串口发送字符串函数 (16)12.外部中断INT初始化函数 (17)13.外部中断INT1中断处理程序 (18)14.外部中断INT0中断处理程序 (18)15.普通I/O口模拟PWM生成程序 (19)16.LCD驱动 (19)17.DS18B20温度传感器驱动 (22)18.LCM2402(1602也适用)驱动程序 (25)19.主函数 (28)20. 8个独立式键盘驱动程序 (30)21. 16个阵列式键盘驱动程序 (32)31.函数头文件/******************************************************************************程序名:编写人:编写时间:20 年月日硬件支持:接口说明:修改日志:NO.1-/******************************************************************************说明:/*****************************************************************************/#include <REG51.h REG52.h STC11Fxx.H STC12C2052AD.H STC12C5A60S2.H>//通用89C51头文件(只留下实际使用的单片机所对应的头文件)#include <assert.h> //设定插入点#include <ctype.h> //字符处理#include <errno.h> //定义错误码#include <float.h> //浮点数处理#include <fstream.h> //文件输入/输出#include <iomanip.h> //参数化输入/输出#include <iostream.h> //数据流输入/输出#include <limits.h> //定义各种数据类型最值常量#include <locale.h> //定义本地化函数#include <math.h> //定义数学函数#include <stdio.h> //定义输入/输出函数#include <stdlib.h> //定义杂项函数及内存分配函数#include <string.h> //字符串处理#include <strstrea.h> //基于数组的输入/输出4#include <time.h> //定义关于时间的函数#include <wchar.h> //宽字符处理及输入/输出#include <wctype.h> //宽字符分类#include <intrins.h> //51基本运算(包括_nop_空函数)sfr [自定义名] = [SFR地址] ; //按字节定义SFR中的存储器名。

单片机C语言代码手册 含100多个经典C程序

单片机C语言代码手册 含100多个经典C程序

单片机C语言代码手册1.LED灯点亮一个LED#include<reg51.h>void main(){while(1){P0=0x01;P2=0x7d;}}流水灯闪烁#include<reg52.h>sbit LED=P0^0;void delay(unsigned int i){unsigned int j;for(i;i>0;i--)for(j=110;j>0;j--);}void main(){LED=0;delay(60);LED=1;delay(10);}流水灯_左移#include<reg52.h>#include<intrins.h>unsigned char aa;void delay(unsigned int xms){unsigned int i,j;for(i=xms;i>0;i--)for(j=110;j>0;j--);}void main(){aa=0xfe;while(1){P0=aa;delay(1000);aa=_crol_(aa,1);}}跑马灯#include<reg51.h>#include <intrins.h>void delayms(unsigned char ms){unsigned char i;while(ms--){for(i = 0; i < 120; i++);}}void main(){unsigned char LED;LED = 0xfe; //11111110P2 = LED;while(1){delayms(250);LED = _crol_(LED,1); //循环右移1位,点亮下一个LED P2 = LED;}}用循环移位指令实现LED流水灯效果#include <reg51.h>#include <intrins.h>void delayms(unsigned char i) //延时子程序{unsigned char j;while(i--){for(j=0;j<120;j++);}}void main(){unsigned char LED;LED = 0xfe; //0xfe = 1111 1110while(1){P2 = LED;delayms(250);LED = LED << 1; / /循环右移1位,点亮下一个LED "<<"为左移位if(LED == 0x00 ){LED = 0xfe; // 0xfe = 1111 1110}}}左右跑马灯#include <reg52.h>void delay(unsigned int i){unsigned char j;for(i; i > 0; i--)for(j = 255; j > 0; j--);}char LED;void main(){unsigned char i;while (1){LED = 0xfe;for (i = 0 ;i < 8 ; i++){P2 = LED;delay(500);LED = LED << 1; //左移LED = LED | 0x01; //移位后,后面的位为高电平if(LED == 0x7f)break; //提前退出FOR 循环}for (i = 0 ;i < 8 ; i++){P2 = LED;delay(500);LED = LED >> 1; // 右移LED = LED | 0x80; // 移位后,后面的位为高电平}}}LED作二进制加法#include <reg52.h>void delay(unsigned int i){unsigned char j;for(i; i > 0; i--)for(j = 255; j > 0; j--);}void main(){unsigned char Num = 0xff;while (1){P2 = Num;delay(1000);Num--;}}LED闪烁-定时器#include<reg52.h>#include<intrins.h>unsigned char num,aa=0xfe;void main(){TMOD=0x01;TH0=(65536-45872)/256;TL0=(65536-45872)%256;EA=1;ET0=1;TR0=1;while(1){if(num==1){num=0;P2=aa;aa=_crol_(aa,1);}}}void T0_time()interrupt 1{TH0=(65536-45872)/256;TL0=(65536-45872)%256;num++;}2.数码管0-9显示#include<reg51.h>void delay2ms(unsigned int delaytime){unsigned int cnt;for(cnt=0;cnt<delaytime*50;cnt++);}unsigned char num[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};void main(){int cnt=0;while(1){P0=0x02;P2=num[cnt];if(++cnt>9)cnt=0;delay2ms(2500);}}95显示#include<reg51.h>void delay2ms(unsigned int delaytime){unsigned int cnt;for(cnt=0;cnt<delaytime*50;cnt++);}unsigned char s[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};main(){unsigned char num=95;unsigned char cnt=0;while(1){switch(++cnt%2){case 0:P0=0x02;P2=s[num%10];break;case 1:P0=0x04;P2=s[num/10];break;}delay2ms(1);}}138片选实现动态显示#include <reg51.h>#include <intrins.h>sbit LS138A = P2^2; //定义LS138译码器的输入A脚由P2.2控制sbit LS138B = P2^3; //定义LS138译码器的输入B脚由P2.3控制sbit LS138C = P2^4; //定义LS138译码器的输入C脚由P2.4控制void delay(unsigned int i); //函数声名char cnt;unsigned char code Disp_Tab[] = //共阴数码管0-9{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};void main(){unsigned int i,j=1 ;unsigned int led[10];cnt=0;while(1) //进入循环状态{if(++cnt>=50){cnt=0; //延时计数每扫描一次加一次++j; //每隔50个扫描周期加一次}led[0]=Disp_Tab[j%10000/1000]|0x80;led[1]=Disp_Tab[j%1000/100]|0x80;led[2]=Disp_Tab[j%100/10]|0x80;led[3]=Disp_Tab[j%10]|0x80;led[4]=Disp_Tab[j%10000/1000]; //千位led[5]=Disp_Tab[j%1000/100]; //百位带小数点led[6]=Disp_Tab[j%100/10]; //十位led[7]=Disp_Tab[j%10]; //个位for( i=0; i<9; i++) //实现8位动态扫描循环{P0 = led[i]; //将字模送到P0口显示switch(i) //使用switch 语句控制位选{case 0:LS138A=0; LS138B=0; LS138C=0; break;case 1:LS138A=1; LS138B=0; LS138C=0; break;case 2:LS138A=0; LS138B=1; LS138C=0; break;case 3:LS138A=1; LS138B=1; LS138C=0; break;case 4:LS138A=0; LS138B=0; LS138C=1; break;case 5:LS138A=1; LS138B=0; LS138C=1; break;case 6:LS138A=0; LS138B=1; LS138C=1; break;case 7:LS138A=1; LS138B=1; LS138C=1; break;}delay(150);}}}void delay(unsigned int i){char j;for(i; i > 0; i--)for(j = 200; j > 0; j--);}单片机直接片选实现动态显示#include <reg51.h>#include <intrins.h>void delay(unsigned int i); //函数声名char DelayCNT; //定义变量unsigned char code Disp_Tab[] = //共阴数码管0-9{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40 };//段码控制unsigned char code dispbit[8]= //共阴数码管1-8个{0xfe,0xfd,0xfb,0xf7,0xef,0xdF,0xbF,0x7F}; //位选控制查表法void main(){unsigned int i,LedNumV al=1 ; //变量定义unsigned int LedOut[10]; //变量定义DelayCNT=0;while(1){if(++DelayCNT>=20) //控制数字变化速度{DelayCNT=0; //20个扫描周期清零一次++LedNumV al; //每隔20个扫描周期加一次}LedOut[0]=Disp_Tab[LedNumV al%10000/1000];LedOut[1]=Disp_Tab[LedNumV al%1000/100]|0x80;LedOut[2]=Disp_Tab[LedNumV al%100/10];LedOut[3]=Disp_Tab[LedNumV al%10];LedOut[4]=Disp_Tab[LedNumV al%10000/1000]; //千位LedOut[5]=Disp_Tab[LedNumV al%1000/100]|0x80; //百位小数LedOut[6]=Disp_Tab[LedNumV al%100/10]; //十位LedOut[7]=Disp_Tab[LedNumV al%10]; //个位for( i=0; i<9; i++){P0 = LedOut[i];P1 = dispbit[i]; //使用查表法进行位选switch(i) //使用switch 语句控制位选{case 0:P1 = 0x7F; break;case 1:P1 = 0xbF; break;case 2:P1 = 0xdF; break;case 3:P1 = 0xeF; break;case 4:P1 = 0xf7; break;case 5:P1 = 0xfb; break;case 6:P1 = 0xfd; break;case 7:P1 = 0xfe; break;}delay(150); //扫描间隔时太长会数码管会有闪烁感}}}void delay(unsigned int i){char j;for(i; i > 0; i--)for(j = 200; j > 0; j--);}动态-静态LED#include <reg51.h>#include <intrins.h>sbit LED8_1=P1^1; //J14接在P1.1上void delay(unsigned int i); //函数声名char DelayCNT;char LED;void main(){LED = 0x01;DelayCNT=0;while(1){if(++DelayCNT>=10) //点亮动静LED灯速度控制{DelayCNT=0;LED = LED << 1; //左移if(LED==0) LED = 1; //移位后,后面的位为高电平}P0 =LED;LED8_1=0;delay(1000); //调用延时程序}}void delay(unsigned int i){char j;for(i; i > 0; i--)for(j = 200; j > 0; j--);}数码管_138动态显示#include<reg52.h>#define uint unsigned int#define uchar unsigned charsbit LS138A=P2^2;sbit LS138B=P2^3;sbit LS138C=P2^4;uchar code led[8];void delay(uint xms){uint i,j;for(i=xms;i>0;i--)for(j=110;j>0;j--);}uchar code table[]={0x3f,0x06,0x5B,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};void main(){while(1) //进入循环状态{uint cnt,j;LS138A=1;LS138B=1;LS138C=1;if(++cnt>=50){cnt=0; //延时计数每扫描一次加一次++j; //每隔50个扫描周期加一次}led[0]=table[j%10000/1000];led[1]=table[j%1000/100];led[2]=table[j%100/10];led[3]=table[j%10];led[4]=table[j%10000/1000]; //千位led[5]=table[j%1000/100]; //百位带小数点led[6]=table[j%100/10]; //十位led[7]=table[j%10]; //个位}}数码管_依次显示0-F#include<reg52.h>unsigned char code table[]= //共阳数码管{~0x3F,~0x06,~0x5B,~0x4F,~0x66,~0x6D,~0x7D,~0x07,~0x7F,~0x6F, ~0x77,~0x7C,~0x39,~0x5E,~0x79,~0x71}; void delay(unsigned int xms){unsigned int i,j;for(i=xms;i>0;i--)for(j=110;j>0;j--);}void main(){unsigned char cnt;while(1)for(cnt=0;cnt<16;cnt++){P0= table[cnt];delay(100);}}数码管_直选动态显示#include<reg52.h>unsigned char code dispiaybit[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};unsigned char code table[]={0x06,0x5B,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; void delay(unsigned int xms){unsigned int i,j;for(i=xms;i>0;i--)for(j=110;j>0;j--);}void main(){unsigned char m;while(1){for(m=0;m<8;m++){P0=table[m];P1=dispiaybit[m];delay(1);}}}数码管秒表#include<reg52.h>void delay(int xms){unsigned int cnt;for(cnt=0;cnt<xms*50;cnt++);}unsigned char s[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; void main(){unsigned char num=0;unsigned char cnt=0;unsigned char hour=0;while(1){switch(++cnt%2){case 0:P0=0x02;P2=s[num%10];break;case 1:P0=0x04;P2=s[num/10];break;}delay(4);if(cnt>=250){num++;cnt=0;}}}一位静态显示#include <reg51.h>#include <intrins.h>#define NOP() _nop_() //定义空指令void delay(unsigned int i); //函数声名unsigned char code LED7Code[] = //共阳极{~0x3F,~0x06,~0x5B,~0x4F,~0x66,~0x6D,~0x7D,~0x07,~0x7F,~0x6F, ~0x77,~0x7C,~0x39,~0x5E,~0x79,~0x71};void main(){unsigned int LedNumV al=1 ,C ; //定义变量while(1){if (++C>= 300){LedNumV al++ ; //每隔300个扫描周期加一次C =0; //每隔300个扫描清零} //将字模送到P0口显示P0 = LED7Code[LedNumV al%10]&0x7f;//LED7 0x7f为小数点共阴和共阳此处不一样;delay(150); //调用延时程序}}void delay(unsigned int i){char j;for(i; i > 0; i--)for(j = 200; j > 0; j--);}3.蜂鸣器嘀嘀#include <reg52.h>sbit buzz = P3^4;main(){TMOD = 0x01;TH0 = -(1000/256);TL0 =- (1000%256);EA = 1;ET0 = 1;TR0 = 1;for(;;){} }void T0_irq(void) interrupt 1 using 1{TH0 = -(300/256);TL0 =- (300%256);buzz = ~buzz;}PZ_蜂鸣器#include<reg52.h>sbit beep=P1^5;void delay(unsigned int xms){unsigned int i,j;for(i=xms;i>0;i--)for(j=110;j>0;j--);}void main(){beep=1;delay(1);beep=0;delay(1);}八月桂花本例采用89C52, 晶振为11.0592MHZ关于如何编制音乐代码, 其实十分简单,各位可以看以下代码.频率常数即音乐术语中的音调,而节拍常数即音乐术语中的多少拍; #include <REG52.H>#include <INTRINS.H>sbit Beep = P1^5 ;unsigned char n=0; //n为节拍常数变量unsigned char code music_tab[] = //格式为: 频率常数, 节拍常数,频率常数, 节拍常数, {0x18, 0x30, 0x1C , 0x10,0x20, 0x40, 0x1C , 0x10,0x18, 0x10, 0x20 , 0x10,0x1C, 0x10, 0x18 , 0x40,0x1C, 0x20, 0x20 , 0x20,0x1C, 0x20, 0x18 , 0x20,0x20, 0x80, 0xFF , 0x20,0x30, 0x1C, 0x10 , 0x18,0x20, 0x15, 0x20 , 0x1C,0x20, 0x20, 0x20 , 0x26,0x40, 0x20, 0x20 , 0x2B,0x20, 0x26, 0x20 , 0x20,0x20, 0x30, 0x80 , 0xFF,0x20, 0x20, 0x1C , 0x10,0x18, 0x10, 0x20 , 0x20,0x26, 0x20, 0x2B , 0x20,0x30, 0x20, 0x2B , 0x40,0x20, 0x20, 0x1C , 0x10,0x18, 0x10, 0x20 , 0x20,0x26, 0x20, 0x2B , 0x20,0x30, 0x20, 0x2B , 0x40,0x20, 0x30, 0x1C , 0x10,0x18, 0x20, 0x15 , 0x20,0x1C, 0x20, 0x20 , 0x20,0x26, 0x40, 0x20 , 0x20,0x2B, 0x20, 0x26 , 0x20,0x20, 0x20, 0x30 , 0x80,0x20, 0x30, 0x1C , 0x10,0x20, 0x10, 0x1C , 0x10,0x20, 0x20, 0x26 , 0x20,0x2B, 0x20, 0x30 , 0x20,0x2B, 0x40, 0x20 , 0x15,0x1F, 0x05, 0x20 , 0x10,0x1C, 0x10, 0x20 , 0x20,0x26, 0x20, 0x2B , 0x20,0x30, 0x20, 0x2B , 0x40,0x20, 0x30, 0x1C , 0x10,0x18, 0x20, 0x15 , 0x20,0x1C, 0x20, 0x20 , 0x20,0x26, 0x40, 0x20 , 0x20,0x2B, 0x20, 0x26 , 0x20,0x20, 0x20, 0x30 , 0x30,0x20, 0x30, 0x1C , 0x10,0x18, 0x40, 0x1C , 0x20,0x20, 0x20, 0x26 , 0x40,0x13, 0x60, 0x18 , 0x20,0x15, 0x40, 0x13 , 0x40,0x18, 0x80, 0x00};void int0() interrupt 1 //采用中断0 控制节拍{ TH0=0xd8;TL0=0xef;n--;}void delay (unsigned char m) //控制频率延时{unsigned i=3*m;while(--i);}void delayms(unsigned char a) //豪秒延时子程序{while(--a); //采用while(--a) 不要采用while(a--);各位可编译一下看看汇编结果就知道了!}void main(){ unsigned char p,m; //m为频率常数变量unsigned char i=0;TMOD&=0x0f;TMOD|=0x01;TH0=0xd8;TL0=0xef;IE=0x82;play:while(1){a: p=music_tab[i];if(p==0x00){ i=0, delayms(1000); goto play;} //如果碰到结束符,延时1秒,回到开始再来一遍else if(p==0xff){ i=i+1;delayms(100),TR0=0; goto a;} //若碰到休止符,延时100ms,继续取下一音符else{m=music_tab[i++], n=music_tab[i++];} //取频率常数和节拍常数TR0=1; //开定时器1while(n!=0)Beep=~Beep,delay(m); //等待节拍完成,通过P1口输出音频(可多声道哦!)TR0=0; //关定时器1}}5.继电器按键控制继电器#include <reg51.h>sbit RELAY = P1^4; //定义继电器对应单片机管脚sbit K1 = P2^7; //定义按钮对应单片机管脚void main(){if (!K1)RELAY = 0; //按钮按下开启继电器else RELAY = 1; //按钮松开关闭继电器}4.按键模拟开关#include <reg52.H>sbit K1=P3^0;sbit L1=P2^0;void delay(unsigned int i){unsigned int j;for(i;i>0;i--)for(j=110;j>0;j--);}void main(){while(1){if(K1==0){delay(100);if(K1==0){L1=~L1;while(!K1);}}}}按键键状态显示#include <reg51.h>#include <intrins.h>sbit BEEP = P1^5;sbit RELAY= P1^4;sbit K1 = P0^0;sbit K2 = P0^1;sbit K3 = P0^2;sbit K4 = P0^3;sbit K5 = P0^4;sbit K6 = P0^5;void beep();main(){while(1){P2 = 0xff;if(K1==0)P2 = 0xfe;if(K2 == 0)P2 = 0xfd;if(!K3)P2 = 0xfb;if(!K4)P2 = 0xf7;if(!K5 )beep(); //喇叭发声RELAY = 1;if (!K6 )RELAY = 0; //通过了反相器}}void beep(){unsigned char i , j;for (i=0;i<100;i++){BEEP=!BEEP; //BEEP取反for (j = 0 ; j<250 ; j++) //需要产生方波_nop_();}BEEP=1; //关闭蜂鸣器}按键移位#include <reg51.h>#include <intrins.h>void delayms(unsigned char ms);void proc_key(unsigned char key_v);void delayms(unsigned char ms){unsigned char i;while(ms--){for(i = 0; i < 120; i++);}}sbit K1 = P0^0; //对应按钮K1sbit K2 = P0^1; //对应按钮K2void main(){unsigned char key_s,key_v;key_v = 0x03;P2 = 0xfe;while(1){key_s = scan_key();if(key_s != key_v){delayms(10);key_s = scan_key();if(key_s != key_v){key_v = key_s;proc_key(key_v);}}}}unsigned char scan_key(){unsigned char key_s;key_s = 0x00;key_s |= K2;key_s <<= 1;key_s |= K1;return key_s;}void proc_key(unsigned char key_v){if((key_v & 0x01) == 0){P2 = _cror_(P2,1);}else if((key_v & 0x02) == 0){P2 = _crol_(P2, 1);}}6.定时器/中断蜂铃器_timer1#include < reg51.h >#include <intrins.h>sbit Beep = P1^5;unsigned int USE_C ;void main(){TMOD=0x10; //定时/计数器1工作于方式1TH0=0x4C;TL0=0x00; //50ms定时常数EA=1; //开总中断ET1=1; //允许定时/计数器1 中断TR1=1; //启动定时/计数器1 中断while(1);}void Time1(void) interrupt 3{TH1=0x4c; //50ms定时TL1=0x00;if (++USE_C == 20) //每隔1秒发声{ Beep = ~Beep;USE_C = 0;}}中断0计数_1位数码管显示#include < reg51.h >#include <intrins.h>unsigned int LedNumV al;// 此表为LED 的字模/ 0 1 2 3 4 5 6 7 8 9 A b c d E - L P U Hidden _ (20)unsigned char code Disp_Tab[] ={ 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83, 0xC6,0xA1,0x86,0xbf,0xc7,0x8c,0xc1, 0xff, 0xf7 };void main(void){// IT0=0; //低电平触发IT0=1; //下降沿触发EA=1;EX0=1;while(1){P0=Disp_Tab[LedNumV al%10];}}INT0中断函数void counter(void) interrupt 0{EX0=0;LedNumV al++; //中断计数EX0=1;}中断0计数_4位数码管显示试验4位数码管上显示外部中断计数#include < reg51.h >#include <intrins.h>sbit LS138A=P2^2;sbit LS138B=P2^3;sbit LS138C=P2^4;unsigned int LedNumV al = 0 ,LedOut[8];// 此表为LED 的字模// 0 1 2 3 4 5 6 7 8 9 A b c d E - L P U Hidden _ (20)unsigned char code Disp_Tab[] ={ ~0xC0,~0xF9,~0xA4,~0xB0,~0x99,~0x92,~0x82,~0xF8,~0x80,~0x9 0,~0x88,~0x83,~0xC6,~0xA1,~0x86,~0xbf,~0xc7,~0x8c,~0xc1, ~0xff, ~0xf7 };void delay(unsigned int i){char j;for(i; i > 0; i--)for(j = 200; j > 0; j--);}display(){ unsigned char i;LedOut[0]=Disp_Tab[LedNumV al%10000/1000];LedOut[1]=Disp_Tab[LedNumV al%1000/100]&0x7f;LedOut[2]=Disp_Tab[LedNumV al%100/10];LedOut[3]=Disp_Tab[LedNumV al%10];for( i=0; i<8; i++){ P0 = LedOut[i];switch(i){case 0:LS138A=0; LS138B=0; LS138C=0; break;case 1:LS138A=1; LS138B=0; LS138C=0; break;case 2:LS138A=0; LS138B=1; LS138C=0; break;case 3:LS138A=1; LS138B=1; LS138C=0; break;case 4:LS138A=0; LS138B=0; LS138C=1; break;case 5:LS138A=1; LS138B=0; LS138C=1; break;case 6:LS138A=0; LS138B=1; LS138C=1; break;case 7:LS138A=1; LS138B=1; LS138C=1; break;}delay(150);}}void main(void){P0=0xff;P1=0xff;P2=0xff;// IT0=0; //低电平触发IT0=1; //下降沿触发EA=1;EX0=1;while(1){display();}}INT0中断函数void counter(void) interrupt 0{EX0=0;LedNumV al++; //中断计数EX0=1;}INT0+INT1#include < reg51.h >#include <intrins.h>sbit LS138A=P2^2;sbit LS138B=P2^3;sbit LS138C=P2^4;unsigned int LedNumV al_1,LedNumV al_2,LedOut[8]; unsigned char code Disp_Tab[] =/ /共阴数码管0-9{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; void delay(unsigned int i){char j;for(i; i > 0; i--)for(j = 200; j > 0; j--);}void main(void){ unsigned char i;P0=0xff;P1=0xff;P2=0xff;// IT0=0; //低电平触发IT0=1; //下降沿触发EX0=1;// IT1=0; //低电平触发IT1=1; //下降沿触发EX1=1;EA=1;while(1){LedOut[0]=Disp_Tab[LedNumV al_1%10000/1000];LedOut[1]=Disp_Tab[LedNumV al_1%1000/100]|0x80;//0x7f小数点LedOut[2]=Disp_Tab[LedNumV al_1%100/10];LedOut[3]=Disp_Tab[LedNumV al_1%10];LedOut[4]=Disp_Tab[LedNumV al_2%10000/1000];LedOut[5]=Disp_Tab[LedNumV al_2%1000/100];LedOut[6]=Disp_Tab[LedNumV al_2%100/10];LedOut[7]=Disp_Tab[LedNumV al_2%10];for( i=0; i<8; i++){ P0 = LedOut[i];switch(i){case 0:LS138A=0; LS138B=0; LS138C=0; break;case 1:LS138A=1; LS138B=0; LS138C=0; break;case 2:LS138A=0; LS138B=1; LS138C=0; break;case 3:LS138A=1; LS138B=1; LS138C=0; break;case 4:LS138A=0; LS138B=0; LS138C=1; break;case 5:LS138A=1; LS138B=0; LS138C=1; break;case 6:LS138A=0; LS138B=1; LS138C=1; break;case 7:LS138A=1; LS138B=1; LS138C=1; break;}delay(150);}}}INT0中断函数void counter0(void) interrupt 0{EX0=0;delay(100);LedNumV al_1++;EX0=1;}INT1中断函数void counter1(void) interrupt 2{EX1=0;delay(100);LedNumV al_2++;EX1=1;}T0_数码管#include<reg51.h>char num;unsigned char Led [10] ={0x3f,0x06,0x5B,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};void main(){TMOD=0x01;EA=1;ET0=1;TR0=1;TH0=(65536-45872)/256;TL0=(65536-45872)%256;while(1);}void T0_time() interrupt 1{TH0=(65536-45872)/256;TL0=(65536-45872)%256;num++;if(num==200){num=0;P0 = 0x1e;P2 = Led[1];}}TIMEER0试验数码管上显示定时器中断计数#include < reg51.h >#include <intrins.h>sbit LS138A=P2^2; //定义138管脚sbit LS138B=P2^3;sbit LS138C=P2^4;unsigned int LedNumV al,LedOut[8];// 此表为LED 的字模// 0 1 2 3 4 5 6 7 8 9 A b c d E - L P U Hidden _ (20)unsigned char code Disp_Tab[] ={ ~0xC0,~0xF9,~0xA4,~0xB0,~0x99,~0x92,~0x82,~0xF8,~0x80,~0x9 0,~0x88,~0x83,~0xC6,~0xA1,~0x86,~0xbf,~0xc7,~0x8c,~0xc1, ~0xff, ~0xf7 };系统初始化void system_Ini(){TMOD|= 0x11;TH1=0x1C; //12.000MTL1=0x18;IE = 0x8A;TR1 = 1;}void delay(unsigned int i){char j;for(i; i > 0; i--)for(j = 200; j > 0; j--);}void main(){system_Ini() ;while(1){ unsigned char i;LedOut[0]=Disp_Tab[LedNumV al%10000/1000];LedOut[1]=Disp_Tab[LedNumV al%1000/100]&0x7f;LedOut[2]=Disp_Tab[LedNumVal%100/10];LedOut[3]=Disp_Tab[LedNumV al%10];for( i=0; i<8; i++){P0 = LedOut[i];switch(i){case 0:LS138A=0; LS138B=0; LS138C=0; break;case 1:LS138A=1; LS138B=0; LS138C=0; break;case 2:LS138A=0; LS138B=1; LS138C=0; break;case 3:LS138A=1; LS138B=1; LS138C=0; break;case 4:LS138A=0; LS138B=0; LS138C=1; break;case 5:LS138A=1; LS138B=0; LS138C=1; break;case 6:LS138A=0; LS138B=1; LS138C=1; break;case 7:LS138A=1; LS138B=1; LS138C=1; break;}delay(150);}}}[ t1 (1ms)中断] 中断void T1zd(void) interrupt 3 //3定时器1的中断号{TH1 = 0x1c; //12.000TL1 = 0x18;LedNumV al++;}定时器#include"reg51.h"bit SecFlag = 0;code unsigned char LedSeg[10] = //数组{0x3f,0x06,0x5B,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};unsigned char Sec = 0,Min = 0;void Time0() interrupt 1 //中断1 //硬件延时{static unsigned int IntCnt,Counter = 0;TH0= 0xf8; //中断返回TL0 = 0xcd;if(++IntCnt > 500) //计数500次{IntCnt = 0;SecFlag = 1;}switch(++Counter%5){case 1:P0 = 0x02; // 0000 0010P2 = LedSeg[Sec % 10];break;case 2:P0 = 0x04; // 0000 0100P2 = LedSeg[Sec / 10];break;case 3:P0 = 0x08; // 0000 1000P2 = LedSeg[Min % 10];break;case 4:P0 = 0x10; // 0001 0000P2 = LedSeg[Min / 10];break;}}void InitTime() //中断定时初始化{TMOD = 0x01; // GATE C/T M1 M0 GA TE C/T M1 M0//设置为定时器0的工作方式1// 0 0 0 0 0 0 0 1 TH0 = 0xf8; //装载初值TL0 = 0xcd;TCON = 0x10; // TF1 TR1 TF0 TR0 0000//控制启停// 0 0 0 1IE = 0x82; // EA 00 ES ET1 EX1 ET0 EX0//中断允许控制E:enable// 1 00 0 0 0 1 0}void main(){unsigned int Counter = 0;bit StopFlag = 0; //0: Time Run 1:Time StopInitTime(); //初始化单片机内部的定时器,以中断方式工作在16位模式while(1){if(StopFlag == 0) //走时{ if(SecFlag) //计时程序{SecFlag = 0;if(++Sec > 59){Sec = 0;if(++Min > 59){Min = 0;}}}}}}定时器_按键#include"reg51.h"bit SecFlag = 0;sbit TIMESTOP_K = P1^0;void Delay2ms(unsigned int DelayTime) //软件延时{unsigned int Count;for(Count = 0;Count < DelayTime*50;Count++);}code unsigned char LedSeg[10] = //数组{0x3f,0x06,0x5B,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; unsigned char Sec = 0,Min = 0;void Time0() interrupt 1 //中断1 //硬件延时{static unsigned int IntCnt,Counter = 0;TH0 = 0xf8;TL0 = 0xcd;if(++IntCnt > 500) //计数500次{IntCnt = 0;SecFlag = 1;}switch(++Counter%5){case 1:P0 = 0x02; // 0000 0010P2 = LedSeg[Sec % 10];break;case 2:P0 = 0x04; // 0000 0100P2 = LedSeg[Sec / 10];break;case 3:P0 = 0x08; // 0000 1000P2 = LedSeg[Min % 10];break;case 4:P0 = 0x10; // 0001 0000P2 = LedSeg[Min / 10];break;}}void InitTime() //硬件延时{TMOD = 0x01; // GATE C/T M1 M0 GA TE C/T M1 M0//设置为定时器0的工作方式1// 0 0 0 0 0 0 0 1 TH0 = 0xf8; //装载初值TL0 = 0xcd;TCON = 0x10; // TF1 TR1 TF0 TR0 0000//控制启停// 0 0 0 1IE = 0x82; // EA 00 ES ET1 EX1 ET0 EX0E:enable //中断允许控制// 1 00 0 0 0 1 0 }void main(){unsigned int Counter = 0;bit StopFlag = 0; //0: Time Run 1:Time StopInitTime(); //初始化单片机内部的定时器,以中断方式工作在16位模式while(1){if(StopFlag == 0) //走时{ if(SecFlag) // 计时程序{SecFlag = 0;if(++Sec > 59){Sec = 0;if(++Min > 59){Min = 0;}}}}//按键工作,让走时停止,StopFlag = 1if(TIMESTOP_K == 0){Delay2ms(5);while(TIMESTOP_K == 0);StopFlag = ~ StopFlag;}}}7.LED点阵显示数字LED点阵实验(流动显示1 2 3 4 5 6 7 8 9)#include<reg51.h>unsigned char code tab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};unsigned char code digittab[18][8]={{0x00,0x00,0x3e,0x41,0x41,0x41,0x3e,0x00}, //0{0x00,0x00,0x00,0x00,0x21,0x7f,0x01,0x00}, //1{0x00,0x00,0x27,0x45,0x45,0x45,0x39,0x00}, //2{0x00,0x00,0x22,0x49,0x49,0x49,0x36,0x00}, //3{0x00,0x00,0x0c,0x14,0x24,0x7f,0x04,0x00}, //4{0x00,0x00,0x72,0x51,0x51,0x51,0x4e,0x00}, //5{0x00,0x00,0x3e,0x49,0x49,0x49,0x26,0x00}, //6{0x00,0x00,0x40,0x40,0x40,0x4f,0x70,0x00}, //7{0x00,0x00,0x36,0x49,0x49,0x49,0x36,0x00}, //8{0x00,0x00,0x32,0x49,0x49,0x49,0x3e,0x00}, //9{0x00,0x00,0x7F,0x48,0x48,0x30,0x00,0x00}, //P{0x00,0x00,0x7F,0x48,0x4C,0x73,0x00,0x00}, //R{0x00,0x00,0x7F,0x49,0x49,0x49,0x00,0x00}, //E{0x00,0x00,0x3E,0x41,0x41,0x62,0x00,0x00}, //C{0x00,0x00,0x7F,0x08,0x08,0x7F,0x00,0x00}, //H{0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00}, //I{0x00,0x7F,0x10,0x08,0x04,0x7F,0x00,0x00}, //N{0x7C,0x48,0x48,0xFF,0x48,0x48,0x7C,0x00} //中};unsigned int timecount;unsigned char cnta;unsigned char cntb;void main(void){TMOD=0x01;TH0=(65536-3000)/256;TL0=(65536-3000)%256;TR0=1; //开启定时0ET0=1;EA=1; //开启中断cntb=0;while(1){ ;}}void t0(void) interrupt 1 using 0{TH0=(65536-3000)/256; //定时器高位装载数据TL0=(65536-3000)%256; //定时器低位装载数据if(cntb<18) //红色{P1=0xFF;P2=tab[cnta];P0=digittab[cntb][cnta];}else //绿色{P2=0xFF;P1=tab[cnta];P0=digittab[cntb-18][cnta];}if(++cnta>=8) cnta=0;if(++timecount>=333){timecount=0;if(++cntb>=36)cntb=0;}}滚动LED点阵实验(左右上下流动显示)#include <REG51.H>unsigned char code taba[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};unsigned char code tabb[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};void delay1(void){unsigned char i,j,k;for(k=10;k>0;k--)for(i=20;i>0;i--)for(j=248;j>0;j--);}void main(void){unsigned char i,j;while(1){for(j=0;j<3;j++) //from left to right 3 time{for(i=0;i<8;i++){P2=taba[i];P0=0xff;delay1();}}for(j=0;j<3;j++) //from right to left 3 time{for(i=0;i<8;i++){P2=taba[7-i];P0=0xff;delay1();}}for(j=0;j<3;j++) //from top to bottom 3 time{for(i=0;i<8;i++){P2=0x00;P0=tabb[7-i];delay1();}}for(j=0;j<3;j++) //from bottom to top 3 time{for(i=0;i<8;i++){P2=0x00;P0=tabb[i];delay1();}}}}8.1602液晶静态显示#include<reg52.h>#define uchar unsigned char#define uint unsigned intuchar code table1[]="LIJUNLIN1988"; //12 uchar code table2[]="TEL 134********"; //15 sbit E=P2^7;sbit RS=P2^6;sbit R=P2^5;uchar num;void delay(uint x){uint y;for(x;x>0;x--)for(y=110;y>0;y--);}void write_com(uchar com) //写指令{RS=0;P0=com;delay(5);E=1;delay(5);E=0;}void write_data(uchar date) //写数据{RS=1;P0=date;delay(5);E=1;delay(5);E=0;}void init() //初始化{E=0;write_com(0x38);write_com(0x0e);write_com(0x06);write_com(0x01);write_com(0x80);}void main(){R=0;init();for(num=0;num<12;num++){write_data(table1[num]);delay(20);}write_com(0x80+0x40);for(num=0;num<15;num++){write_data(table2[num]);delay(20);}while(1);}动态显示#include<reg52.h>#define uchar unsigned char#define uint unsigned intuchar code table1[]="LIJUNLIN"; //8 uchar code table2[]="134********"; //11 sbit E=P2^7;sbit RS=P2^6;sbit R=P2^5;uchar num;void delay(uint x){uint y;for(x;x>0;x--)for(y=110;y>0;y--);}void write_com(uchar com) //写指令{RS=0;P0=com;delay(5);E=1;delay(5);E=0;}void write_data(uchar date) //写数据{RS=1;P0=date;delay(5);E=1;delay(5);E=0;}void init() //初始化{E=0;write_com(0x38);write_com(0x0e);write_com(0x06);write_com(0x01);write_com(0x80+0x10);}void main(){R=0;init();for(num=0;num<8;num++){write_data(table1[num]);delay(20);}write_com(0x80+0x53);for(num=0;num<11;num++){write_data(table2[num]);delay(20);}for(num=0;num<16;num++){write_com(0x18);delay(20);}while(1);}滚动显示1、从左到右逐字显示,闪动二次,清屏。

51单片机C语言编程100例-单片机c语言编程

51单片机C语言编程100例-单片机c语言编程

目录实例3:用单片机控制第一个灯亮 (3)实例4:用单片机控制一个灯闪烁:认识单片机的工作频率 (3)实例5:将 P1口状态分别送入P0、P2、P3口:认识I/O口的引脚功能 (4)实例6:使用P3口流水点亮8位LED (4)实例7:通过对P3口地址的操作流水点亮8位LED (5)实例8:用不同数据类型控制灯闪烁时间 (7)实例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口显示按位"异或"运算结果 (11)实例16:用P0显示左移运算结果 (11)实例17:"万能逻辑电路”实验 (11)实例18:用右移运算流水点亮P1口8位LED (11)实例19:用if语句控制P0口8位LED的流水方向 (12)实例20:用swtich语句的控制P0口8位LED的点亮状态 (13)实例21:用for语句控制蜂鸣器鸣笛次数 (14)实例22:用while语句控制LED (15)实例23:用do—while语句控制P0口8位LED流水点亮 (16)实例24:用字符型数组控制P0口8位LED流水点亮 (17)实例25:用P0口显示字符串常量 (18)实例26:用P0 口显示指针运算结果 (19)实例27:用指针数组控制P0口8位LED流水点亮 (19)实例28:用数组的指针控制P0 口8 位LED流水点亮 (20)实例29:用P0 、P1口显示整型函数返回值 (21)实例30:用有参函数控制P0口8位LED流水速度 (22)实例31:用数组作函数参数控制流水花样 (23)实例32:用指针作函数参数控制P0口8位LED流水点亮 (24)实例33:用函数型指针控制P1口灯花样 (25)实例34:用指针数组作为函数的参数显示多个字符串 (26)实例35:字符函数ctype。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

单片机C语言编程模板(基础模板)[程序开始处的程序说明]/*********************************************************************** **********************程序名:编写人:编写时间:年月日硬件支持:接口说明:/*********************************************************************** **********************说明:/*********************************************************************** **********************/[单片机SFR定义的头文件]#include &lt;REG51.h&gt; //通用89C51头文件#include &lt;REG52.h&gt; //通用89C52头文件#include &lt;STC11Fxx.H&gt; //STC11Fxx或STC11Lxx系列单片机头文件#include &lt;STC12C2052AD.H&gt; //STC12Cx052或STC12Cx052AD系列单片机头文件#include &lt;STC12C5A60S2.H&gt; //STC12C5A60S2系列单片机头文件[更多库函数头定义]#include &lt;assert.h&gt; //设定插入点#include &lt;ctype.h&gt; //字符处理#include &lt;errno.h&gt; //定义错误码#include &lt;float.h&gt; //浮点数处理#include &lt;fstream.h&gt; //文件输入/输出#include &lt;iomanip.h&gt; //参数化输入/输出#include &lt;iostream.h&gt; //数据流输入/输出#include &lt;limits.h&gt; //定义各种数据类型最值常量#include &lt;locale.h&gt; //定义本地化函数#include &lt;math.h&gt; //定义数学函数#include &lt;stdio.h&gt; //定义输入/输出函数#include &lt;stdlib.h&gt; //定义杂项函数及内存分配函数#include &lt;string.h&gt; //字符串处理#include &lt;strstrea.h&gt; //基于数组的输入/输出#include &lt;time.h&gt; //定义关于时间的函数#include &lt;wchar.h&gt; //宽字符处理及输入/输出#include &lt;wctype.h&gt; //宽字符分类#include &lt;intrins.h&gt; //51基本运算(包括_nop_空函数)[常用定义声明]sfr [自定义名] = [SFR地址] ; //按字节定义SFR中的存储器名。

例:sfr P1 = 0x90;sbit [自定义名] = [系统位名] ; //按位定义SFR中的存储器名。

例:sbit Add_Key = P3 ^ 1;bit [自定义名] ; //定义一个位(位的值只能是0或1)例:bit LED;#define [代替名] [原名] //用代替名代替原名。

例:#define LED P1 / #define TA 0x25 unsigned char [自定义名] ; //定义一个0~255的整数变量。

例:unsigned char a; unsigned int [自定义名] ; //定义一个0~65535的整数变量。

例:unsigned int a;[定义常量和变量的存放位置的关键字]data 字节寻址片内RAM,片内RAM的128字节(例:data unsigned char a;)bdata 可位寻址片内RAM,16字节,从0x20到0x2F(例:bdata unsigned char a;)idata 所有片内RAM,256字节,从0x00到0xFF(例:idata unsigned char a;)pdata 片外RAM,256字节,从0x00到0xFF(例:pdata unsigned char a;)xdata 片外RAM,64K字节,从0x00到0xFFFF(例:xdata unsigned char a;)code ROM存储器,64K字节,从0x00到0xFFFF(例:code unsigned char a;)[选择、循环语句]if(1){//为真时语句}else{//否则时语句}--------------------------while(1){//为真时内容}--------------------------do{//先执行内容}while(1);--------------------------switch (a){case 0x01://为真时语句break;case 0x02://为真时语句break;default://冗余语句break;}--------------------------for(;;){//循环语句}--------------------------[主函数模板]/*********************************************************************** **********************函数名:主函数调用:无参数:无返回值:无结果:程序开始处,无限循环备注:/*********************************************************************** ***********************/void main (void){//初始程序while(1){//无限循环程序}}/*********************************************************************** ***********************/[中断处理函数模板]/*********************************************************************** **********************函数名:中断处理函数调用:无参数:无返回值:无结果:备注:/*********************************************************************** ***********************/void name (void) interrupt 1 using 1{//处理内容}/*********************************************************************** ***********************/[中断入口说明]interrupt 0 外部中断0(ROM入口地址:0x03)interrupt 1 定时/计数器中断0(ROM入口地址:0x0B)interrupt 2 外部中断1(ROM入口地址:0x13)interrupt 3 定时/计数器中断1(ROM入口地址:0x1B)interrupt 4 UART串口中断(ROM入口地址:0x23)(更多的中断依单片机型号而定,ROM中断入口均相差8个字节)using 0 使用寄存器组0using 1 使用寄存器组1using 2 使用寄存器组2using 3 使用寄存器组3[普通函数框架]/*********************************************************************** **********************函数名:调用:参数:无返回值:无结果:备注:/*********************************************************************** ***********************/void name (void){//函数内容}/*********************************************************************** ***********************//*********************************************************************** **********************函数名:调用:参数:0~65535 / 0~255返回值:0~65535 / 0~255结果:备注:/**********************************************************************************************/unsigned int name (unsigned char a,unsigned int b){//函数内容return a; //返回值}/*********************************************************************** ***********************/。

相关文档
最新文档