大神们,proteus中的数码管运行8只数码管滚动显示单个数字,程序肯定没错,图示照着指导书连的,哪里连错了。。

[单片机c语言编程]单片机C语言程序设计实训100例――基于8051+Proteus仿真_单片机c语言编程-牛bb文章网
[单片机c语言编程]单片机C语言程序设计实训100例――基于8051+Proteus仿真_单片机c语言编程
本书简介本书基于Keil μVision程序设计平台和Proteus硬件仿真平台,精心编写了100余个8051单片机C语言程序设计案例。全书基础设计类案例贯穿8051单片机最基本的端口编程、定时/计数器应用、中断和串口通信;硬件应用类案例涵盖常用外部存储器扩展、接口扩展、译码、编码、驱动、光机、机电、A/D与D/A转换等内容;综合设计类案例涉及大量消费类电子产品、仪器仪表及智能控制设备的相关技术。本书可作为大专院校学生学习实践单片机c语言程序设计的教材或参考书,也可作为电子工程技术人员或单片机技术爱好者的参考资料。目录第1章 8051单片机C语言程序设计概述1.1 8051单片机引脚1.2 数据与程序内存1.3 特殊功能寄存器1.4 外部中断、定时/计数器及串口应用1.5 有符号与无符号数应用、数位分解、位操作 1.6 变量、存储类型与存储模式1.7 数组、字符串与指针1.8 流程控制1.9 可重入函数和中断函数1.10 C语言在单片机系统开发中的优势第2章 Proteus操作基础2.1 Proteus操作界面简介2.2 仿真电路原理图设计2.3 元件选择2.4 调试仿真2.5 Proteus与 V3的联合调试第3章 基础程序设计3.1 闪烁的LED3.2 从左到右的流水灯3.3 左右来回循环的流水灯3.4 花样流水灯3.5 LED模拟交通灯3.6 单只数码管循环显示0~93.7 8只数码管滚动显示单个数字3.8 8只数码管显示多个不同字符3.9 数码管闪烁显示3.10 8只数码管滚动显示数字串3.11 K1~K4控制LED移位3.12 K1~K4按键状态显示3.13 K1~K4分组控制LED3.14 K1~K4控制数码管移位显示3.15 K1~K4控制数码管加减演示3.16 4×4键盘矩阵控制条形LED显示 3.17 数码管显示4×4键盘矩阵按键3.18 开关控制LED3.19 继电器控制照明设备3.20 数码管显示拨码开关编码3.21 开关控制报警器3.22 按键发音3.23 播放音乐3.24 INT0中断计数3.25 INT0中断控制LED3.26 INT0及INT1中断计数3.27 TIMER0控制单只LED闪烁3.28 TIMER0控制流水灯3.29 TIMER0控制4只LED滚动闪烁3.30 T0控制LED实现二进制计数3.31 TIMER0与TIMER1控制条形LED3.32 10s的秒表3.33 用计数器中断实现100以内的按键计数 3.34 10 000s以内的计时程序3.35 定时器控制数码管动态显示3.36 8×8 LED点阵屏显示数字3.37 按键控制8×8 LED点阵屏显示图形 3.38 用定时器设计的门铃3.39 演奏音阶3.40 按键控制定时器选播多段音乐 3.41 定时器控制交通指示灯3.42 报警器与旋转灯3.43 串行数据转换为并行数据3.44 并行数据转换为串行数据3.45 甲机通过串口控制乙机LED闪烁 3.46 单片机之间双向通信3.47 单片机向主机发送字符串3.48 单片机与PC串口通信仿真第4章 硬件应用4.1 74LS138译码器应用4.2 74HC154译码器应用4.3 74HC595串入并出芯片应用4.4 用74LS148扩展中断4.5 I2C-24C04与蜂鸣器4.6 I2C-24C04与数码管4.7 用6264扩展内存4.8 用8255实现接口扩展……第5章 综合设计参考文献下载后 点击此处查看更多内容更多的资料尽在QQ群欢迎您的加入《单片机C语言程序设计实训100例---基于8051和PROTEUS仿真》案例注明电子爱好者,共同学习《单片机C语言程序设计实训100例―基于8051+Proteus仿真》案例第 01 篇 基础程序设计01 闪烁的LED/* 名称:闪烁的LED说明:LED按设定的时间间隔闪烁*/#include&reg51.h&#define uchar unsigned char#define uint unsigned intsbit LED=P1^0;//延时void DelayMS(uint x){while(x--){for(i=0;i&120;i++);}}//主程序void main(){while(1){LED=~LED;DelayMS(150);}}02 从左到右的流水灯/* 名称:从左到右的流水灯说明:接在P0口的8个LED从左到右循环依次点亮,产生走马灯效果*/#include&reg51.h&#include&intrins.h&#define uchar unsigned char#define uint unsigned int1上海师范大学信息与机电工程学院―倪继锋《单片机C语言程序设计实训100例---基于8051和PROTEUS仿真》案例//延时void DelayMS(uint x){while(x--){for(i=0;i&120;i++);}}//主程序void main(){P0=0while(1){P0=_crol_(P0,1); //P0的值向左循环移动DelayMS(150);}}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){while(x--){for(i=0;i&120;i++);}}//主程序void main(){P2=0x01;while(1){2上海师范大学信息与机电工程学院―倪继锋《单片机C语言程序设计实训100例---基于8051和PROTEUS仿真》案例for(i=0;i&7;i++){P2=_crol_(P2,1); //P2的值向左循环移动DelayMS(150);}for(i=0;i&7;i++){P2=_cror_(P2,1); //P2的值向右循环移动DelayMS(150);}}}04 花样流水灯/* 名称:花样流水灯说明:16只LED分两组按预设的多种花样变换显示*/#include&reg51.h&#define uchar unsigned char#define uint unsigned intuchar code Pattern_P0[]={0xfc,0xf9,0xf3,0xe7,0xcf,0x9f,0x3f,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe7,0xdb,0xbd,0x7e,0xbd,0xdb,0xe7,0xff,0xe7,0xc3,0x81,0x00,0x81,0xc3,0xe7,0xff, 0xaa,0x55,0x18,0xff,0xf0,0x0f,0x00,0xff,0xf8,0xf1,0xe3,0xc7,0x8f,0x1f,0x3f,0x7f, 0x7f,0x3f,0x1f,0x8f,0xc7,0xe3,0xf1,0xf8,0xff,0x00,0x00,0xff,0xff,0x0f,0xf0,0xff, 0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe, 0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff};uchar code Pattern_P2[]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfc,0xf9,0xf3,0xe7,0xcf,0x9f,0x3f,0xff,0xe7,0xdb,0xbd,0x7e,0xbd,0xdb,0xe7,0xff,0xe7,0xc3,0x81,0x00,0x81,0xc3,0xe7,0xff, 0xaa,0x55,0x18,0xff,0xf0,0x0f,0x00,0xff,0xf8,0xf1,0xe3,0xc7,0x8f,0x1f,0x3f,0x7f, 0x7f,0x3f,0x1f,0x8f,0xc7,0xe3,0xf1,0xf8,0xff,0x00,0x00,0xff,0xff,0x0f,0xf0,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f, 0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00, 0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,3上海师范大学信息与机电工程学院―倪继锋《单片机C语言程序设计实训100例---基于8051和PROTEUS仿真》案例0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff};//延时void DelayMS(uint x){while(x--){for(i=0;i&120;i++);}}//主程序void main(){while(1){ //从数组中读取数据送至P0和P2口显示for(i=0;i&136;i++){P0=Pattern_P0[i];P2=Pattern_P2[i];DelayMS(100);}}}05 LED模拟交通灯/* 名称:LED模拟交通灯说明:东西向绿灯亮若干秒,黄灯闪烁5次后红灯亮, 红灯亮后,南北向由红灯变为绿灯,若干秒后南北向黄灯闪烁5此后变红灯,东西向变绿灯,如此重复。*/#include&reg51.h&#define uchar unsigned char#define uint unsigned intsbit RED_A=P0^0; //东西向灯sbit YELLOW_A=P0^1;sbit GREEN_A=P0^2;sbit RED_B=P0^3; //南北向灯sbit YELLOW_B=P0^4;sbit GREEN_B=P0^5;uchar Flash_Count=0,Operation_Type=1; //闪烁次数,操作类型变量4上海师范大学信息与机电工程学院―倪继锋《单片机C语言程序设计实训100例---基于8051和PROTEUS仿真》案例//延时void DelayMS(uint x){while(x--) for(i=0;i&120;i++);}//交通灯切换void Traffic_Light(){switch(Operation_Type){case 1: //东西向绿灯与南北向红灯亮RED_A=1;YELLOW_A=1;GREEN_A=0; RED_B=0;YELLOW_B=1;GREEN_B=1; DelayMS(2000);Operation_Type=2;case 2: //东西向黄灯闪烁,绿灯关闭DelayMS(300);YELLOW_A=~YELLOW_A;GREEN_A=1; if(++Flash_Count!=10) //闪烁5次 Flash_Count=0;Operation_Type=3;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;case 4: //南北向黄灯闪烁5次DelayMS(300);YELLOW_B=~YELLOW_B;GREEN_B=1; if(++Flash_Count!=10)Flash_Count=0;Operation_Type=1;}}//主程序void main(){while(1) Traffic_Light();}06 单只数码管循环显示0~9上海师范大学信息与机电工程学院―倪继锋 5《单片机C语言程序设计实训100例---基于8051和PROTEUS仿真》案例/* 名称:单只数码管循环显示0~9说明:主程序中的循环语句反复将0~9的段码送至P0口,使数字0~9循环显示 */#include&reg51.h&#include&intrins.h&#define uchar unsigned char#define uint unsigned intuchar code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}; //延时void DelayMS(uint x){while(x--) for(t=0;t&120;t++);}//主程序void main(){uchar i=0;P0=0x00;while(1){P0=~DSY_CODE[i];i=(i+1)%10;DelayMS(300);}}07 8只数码管滚动显示单个数字/* 名称:8只数码管滚动显示单个数字说明:数码管从左到右依次滚动显示0~7,程序通过每次仅循环选通一只数码管*/#include&reg51.h&#include&intrins.h&#define uchar unsigned char#define uint unsigned intuchar code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //延时void DelayMS(uint x){while(x--) for(t=0;t&120;t++);6上海师范大学信息与机电工程学院―倪继锋《单片机C语言程序设计实训100例---基于8051和PROTEUS仿真》案例}//主程序void main(){uchar i,wei=0x80;while(1){for(i=0;i&8;i++){P2=0 //关闭显示wei=_crol_(wei,1);P0=DSY_CODE[i]; //发送数字段码P2= //发送位码DelayMS(300);}}}08 8只数码管动态显示多个不同字符电路如上图/* 名称:8只数码管动态显示多个不同字符说明:数码管动态扫描显示0~7。*/#include&reg51.h&#include&intrins.h&#define uchar unsigned char#define uint unsigned intuchar code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //延时void DelayMS(uint x){while(x--) for(t=0;t&120;t++);}//主程序void main(){uchar i,wei=0x80;while(1){for(i=0;i&8;i++){P0=0P0=DSY_CODE[i]; //发送段码wei=_crol_(wei,1);上海师范大学信息与机电工程学院―倪继锋 7《单片机C语言程序设计实训100例---基于8051和PROTEUS仿真》案例P2= //发送位码DelayMS(2);}}}09 8只数码管闪烁显示数字串电路如上图/* 名称:8只数码管闪烁显示数字串说明:数码管闪烁显示由0~7构成的一串数字本例用动态刷新法显示一串数字,在停止刷新时所有数字显示消失。 */#include&reg51.h&#define uchar unsigned char#define uint unsigned int//段码表uchar code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //位码表uchar code DSY_IDX[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//延时void DelayMS(uint x){while(x--) for(t=0;t&120;t++);}//主程序void main(){uchar i,j;while(1){for(i=0;i&30;i++){for(j=0;j&8;j++){P0=0P0=DSY_CODE[j]; //发送段码P2=DSY_IDX[j]; //发送位码DelayMS(2);}}P2=0x00; //关闭所有数码管并延时DelayMS(1000);}}上海师范大学信息与机电工程学院―倪继锋 8《单片机C语言程序设计实训100例---基于8051和PROTEUS仿真》案例10 8只数码管滚动显示数字串电路如上图/* 名称:8只数码管滚动显示数字串说明:数码管向左滚动显示3个字符构成的数字串*/#include&reg51.h&#include&intrins.h&#define uchar unsigned char#define uint unsigned int//段码表uchar code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}; //下面数组看作环形队列,显示从某个数开始的8个数(10表示黑屏)uchar Num[]={10,10,10,10,10,10,10,10,2,9,8};//延时void DelayMS(uint x){while(x--) for(t=0;t&120;t++);}//主程序void main(){uchar i,j,k=0,m=0x80;while(1){ //刷新若干次,保持一段时间的稳定显示for(i=0;i&15;i++){for(j=0;j&8;j++){ //发送段码,采用环形取法,从第k个开始取第j个P0=0P0=DSY_CODE[Num[(k+j)%11]];m=_crol_(m,1);P2=m; //发送位码DelayMS(2);}}k=(k+1)%11; //环形队列首支针k递增,Num下标范围0~10,故对11取余 }}11 K1-K4 控制LED移位/* 名称:K1-K4 控制LED移位说明:按下K1时,P0口LED上移一位;上海师范大学信息与机电工程学院―倪继锋 9《单片机C语言程序设计实训100例---基于8051和PROTEUS仿真》案例按下K2时,P0口LED下移一位;按下K3时,P2口LED上移一位;按下K4时,P2口LED下移一位;*/#include&reg51.h&#include&intrins.h&#define uchar unsigned char#define uint unsigned int//延时void DelayMS(uint x){while(x--)for(i=0;i&120;i++);}//根据P1口的按键移动LEDvoid Move_LED(){if ((P1&0x10)==0) P0=_cror_(P0,1); //K1else if((P1&0x20)==0) P0=_crol_(P0,1); //K2else if((P1&0x40)==0) P2=_cror_(P2,1); //K3else if((P1&0x80)==0) P2=_crol_(P2,1); //K4}//主程序void main(){uchar Recent_K //最近按键P0=0P2=0P1=0Recent_Key=0while(1){if(Recent_Key!=P1){Recent_Key=P1; //保存最近按键Move_LED();DelayMS(10);}}}12 K1-K4 按键状态显示10上海师范大学信息与机电工程学院―倪继锋《单片机C语言程序设计实训100例---基于8051和PROTEUS仿真》案例/* 名称:K1-K4 按键状态显示说明:K1、K2按下时LED点亮,松开时熄灭,K3、K4按下并释放时LED点亮,再次按下并释放时熄灭;*/#include&reg51.h&#define uchar unsigned char#define uint unsigned intsbit LED1=P0^0;sbit LED2=P0^1;sbit LED3=P0^2;sbit LED4=P0^3;sbit K1=P1^0;sbit K2=P1^1;sbit K3=P1^2;sbit K4=P1^3;//延时void DelayMS(uint x){while(x--) for(i=0;i&120;i++);}//主程序void main(){P0=0P1=0while(1){LED1=K1;LED2=K2;if(K3==0){while(K3==0);LED3=~LED3;}if(K4==0){while(K4==0);LED4=~LED4;}DelayMS(10);}}13 K1-K4 分组控制LED11上海师范大学信息与机电工程学院―倪继锋《单片机C语言程序设计实训100例---基于8051和PROTEUS仿真》案例/* 名称:K1-K4 分组控制LED说明:每次按下K1时递增点亮一只LED,全亮时再次按下则再次循环开始,K2按下后点亮上面4只LED,K3按下后点亮下面4只LED,K4按下后关闭所有LED */ #include&reg51.h&#define uchar unsigned char#define uint unsigned int//延时void DelayMS(uint x){while(x--) for(i=0;i&120;i++);}//主程序void main(){uchar k,t,Key_SP0=0P1=0while(1){t=P1;if(t!=0xff){DelayMS(10);if(t!=P1)//取得4位按键值,由模式XXXX1111(X中有一位为0,其他均为1)//变为模式0000XXXX(X中有一位为1,其他均为0)Key_State=~t&&4;k=0;//检查1所在位置,累加获取按键号kwhile(Key_State!=0){k++;Key_State&&=1;}//根据按键号k进行4种处理switch(k){case 1: if(P0==0x00) P0=0P0&&=1;DelayMS(200);case 2: P0=0xf0;12上海师范大学信息与机电工程学院―倪继锋《单片机C语言程序设计实训100例---基于8051和PROTEUS仿真》案例case 3: P0=0x0f;case 4: P0=0}}}}14 K1-K4 控制数码管移位显示/* 名称:K1-K4 控制数码管移位显示说明:按下K1时加1计数并增加显示位,按下K2时减1计数并减少显示位,按下K3时清零。*/#include&reg51.h&#define uchar unsigned char#define uint unsigned int//段码uchar code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}; //位码uchar code DSY_Index[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};//待显示到各数码管的数字缓冲(开始仅在0位显示0,其他黑屏)uchar Display_Buffer[]={0,10,10,10,10,10,10,10};//延时void DelayMS(uint x) {while(x--) for(i=0;i&120;i++);}void Show_Count_ON_DSY(){for(i=0;i&8;i++){P0=0P0=DSY_CODE[Display_Buffer[i]];P2=DSY_Index[i];DelayMS(2);}}//主程序void main(){uchar i,Key_NO,Key_Counts=0;13上海师范大学信息与机电工程学院―倪继锋《单片机C语言程序设计实训100例---基于8051和PROTEUS仿真》案例P0=0P1=0P2=0x00;while(1){Show_Count_ON_DSY();P1=0Key_NO=P1;//P1口按键状态分别为K1-0xfe,K2-0xfd,K3-0xfbswitch(Key_NO){case 0xfe: Key_Counts++;if(Key_Counts&8) Key_Counts=8;Display_Buffer[Key_Counts-1]=Key_Ccase 0xfd: if(Key_Counts&0)Display_Buffer[--Key_Counts]=10;case 0xfb: Display_Buffer[0]=0;for(i=1;i&8;i++) Display_Buffer[i]=10;Key_Counts=0;}//若键未释放则仅刷新显示,不进行键扫描while(P1!=0xff) Show_Count_ON_DSY();}}15 K1-K4 控制数码管加减演示/* 名称:K1-K4 控制数码管加减演示说明:按下K1后加1计数,按下K2后减1计数,按下K3后清零。*/#include&reg51.h&#include&intrins.h&#define uchar unsigned char#define uint unsigned int//段码uchar code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}; //待显示的3位缓冲uchar Num_Buffer[]={0,0,0};//按键代码,按键计数uchar Key_Code,Key_Counts=0;//延时void DelayMS(uint x){14上海师范大学信息与机电工程学院―倪继锋《单片机C语言程序设计实训100例---基于8051和PROTEUS仿真》案例while(x--) for(i=0;i&120;i++);}//显示函数void Show_Counts_ON_DSY(){uchar i,j=0x01;Num_Buffer[2]=Key_Counts/100;Num_Buffer[1]=Key_Counts/10%10;Num_Buffer[0]=Key_Counts%10;for(i=0;i&3;i++){j=_cror_(j,1);P0=0P0=DSY_CODE[Num_Buffer[i]];P2=j;DelayMS(1);}}//主程序void main(){P0=0P1=0P2=0x00;Key_Code=0while(1){Show_Counts_ON_DSY();P1=0Key_Code=P1;//有键按下时,数码管刷新显示30次,该行代码同时起到延时作用 if(Key_Code!=0xff)for(i=0;i&30;i++) Show_Counts_ON_DSY();switch(Key_Code){case 0xfe: if(Key_Counts&255) Key_Counts++;case 0xfd: if(Key_Counts&0) Key_Counts--;case 0xfb: Key_Counts=0;}Key_Code=0}上海师范大学信息与机电工程学院―倪继锋 15《单片机C语言程序设计实训100例---基于8051和PROTEUS仿真》案例}16 4X4矩阵键盘控制条形LED显示/* 名称:4X4矩阵键盘控制条形LED显示说明:运行本例时,按下的按键值越大点亮的LED越多。*/#include&reg51.h&#include&intrins.h&#define uchar unsigned char#define uint unsigned int//矩阵键盘按键特征码表uchar code KeyCodeTable[]={0x11,0x12,0x14,0x18,0x21,0x22,0x24,0x28,0x41,0x42,0x44,0x48,0x81,0x82,0x84,0x88};//延时void DelayMS(uint x){while(x--) for(i=0;i&120;i++);}//键盘扫描uchar Keys_Scan(){uchar sCode,kCode,i,k;//低4位置0,放入4行P1=0xf0;//若高4位出现0,则有键按下if((P1&0xf0)!=0xf0){DelayMS(2);if((P1&0xf0)!=0xf0){sCode=0 //行扫描码初值for(k=0;k&4;k++) //对4行分别进行扫描{P1=sCif((P1&0xf0)!=0xf0){kCode=~P1;for(i=0;i&16;i++) //查表得到按键序号并返回 if(kCode==KeyCodeTable[i])16上海师范大学信息与机电工程学院―倪继锋《单片机C语言程序设计实训100例---基于8051和PROTEUS仿真》案例return(i);}elsesCode=_crol_(sCode,1);}}}return(-1);}//主程序void main(){uchar i,P2_LED,P3_LED;uchar KeyNo=-1; //按键序号,-1表示无按键while(1){KeyNo=Keys_Scan(); //扫描键盘获取按键序号KeyNo if(KeyNo!=-1){P2_LED=0P3_LED=0for(i=0;i&=KeyNo;i++) //键值越大,点亮的LED越多 {if(i&8)P3_LED&&=1;elseP2_LED&&=1;}P3=P3_LED; //点亮条形LEDP2=P2_LED;}}}17 数码管显示4X4矩阵键盘按键号/* 名称:数码管显示4X4矩阵键盘按键号说明:按下任意键时,数码管都会显示其键的序号,扫描程序首先判断按键发生在哪一列,然后根据所发生的行附加不同的值,从而得到按键的序号。*/17上海师范大学信息与机电工程学院―倪继锋《单片机C语言程序设计实训100例---基于8051和PROTEUS仿真》案例#include&reg51.h&#define uchar unsigned char#define uint unsigned int//段码uchar code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x00};sbit BEEP=P3^7;//上次按键和当前按键的序号,该矩阵中序号范围0~15,16表示无按键uchar Pre_KeyNo=16,KeyNo=16;//延时void DelayMS(uint x){while(x--) for(i=0;i&120;i++);}//矩阵键盘扫描void Keys_Scan(){uchar TP1=0x0f; //高4位置0,放入4行DelayMS(1);Tmp=P1^0x0f;//按键后0f变成0000XXXX,X中一个为0,3个仍为1,通过异或把3个1变为0,唯一的0变为1switch(Tmp) //判断按键发生于0~3列的哪一列{case 1: KeyNo=0;case 2: KeyNo=1;case 4: KeyNo=2;case 8: KeyNo=3;default:KeyNo=16; //无键按下}P1=0xf0; //低4位置0,放入4列DelayMS(1);Tmp=P1&&4^0x0f;//按键后f0变成XXXX0000,X中有1个为0,三个仍为1;高4位转移到低4位并异或得到改变的值switch(Tmp) //对0~3行分别附加起始值0,4,8,12{case 1: KeyNo+=0;case 2: KeyNo+=4;case 4: KeyNo+=8;case 8: KeyNo+=12;}}//蜂鸣器void Beep()18上海师范大学信息与机电工程学院―倪继锋《单片机C语言程序设计实训100例---基于8051和PROTEUS仿真》案例{for(i=0;i&100;i++){DelayMS(1);BEEP=~BEEP;}BEEP=0;}//主程序void main(){P0=0x00;BEEP=0;while(1){P1=0xf0;if(P1!=0xf0) Keys_Scan(); //获取键序号if(Pre_KeyNo!=KeyNo){P0=~DSY_CODE[KeyNo];Beep();Pre_KeyNo=KeyNo;}DelayMS(100);}}18 开关控制LED/* 名称:开关控制LED说明:开关S1和S2分别控制LED1和LED2。*/#include&reg51.h&sbit S1=P1^0;sbit S2=P1^1;sbit LED1=P0^0;sbit LED2=P0^1;//主程序void main(){while(1){LED1=S1;19上海师范大学信息与机电工程学院―倪继锋《单片机C语言程序设计实训100例---基于8051和PROTEUS仿真》案例LED2=S2;}}19 继电器控制照明设备/* 名称:继电器控制照明设备说明:按下K1灯点亮,再次按下时灯熄灭*/#include&reg51.h&#define uchar unsigned char#define uint unsigned intsbit K1=P1^0;sbit RELAY=P2^4;//延时void DelayMS(uint ms){while(ms--)for(t=0;t&120;t++);}//主程序void main(){P1=0RELAY=1;while(1){if(K1==0){while(K1==0);RELAY=~RELAY;DelayMS(20);}}}20 数码管显示拨码开关编码/* 名称:数码管显示拨码开关编码说明:系统显示拨码开关所设置的编码000~255*/#include&reg51.h&#include&intrins.h&#define uchar unsigned char20上海师范大学信息与机电工程学院―倪继锋《单片机C语言程序设计实训100例---基于8051和PROTEUS仿真》案例#define uint unsigned int//各数字的数码管段码(共阴)uchar code DSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//显示缓冲uchar DSY_Buffer[3]={0,0,0};//延时void DelayMS(uint ms){while(ms--)for(t=0;t&120;t++);}//主程序void main(){uchar i,m,NP0=0P2=0while(1){m=0Num=P1; //读取拨码开关的值DSY_Buffer[0]=Num/100;DSY_Buffer[1]=Num/10%10;DSY_Buffer[2]=Num%10;for(i=0;i&3;i++) //刷新显示在数码管上{m=_crol_(m,1);P2=m;P0=DSY_CODE[DSY_Buffer[i]];DelayMS(10);}}}21 开关控制报警器/* 名称:开关控制报警器说明:用K1开关控制报警器,程序控制P1.0输出两种不同频率的声音,模拟很逼真的报警效果*/#include&reg51.h&#define uchar unsigned char#define uint unsigned intsbit SPK=P1^0;sbit K1=P1^7;//发声函数上海师范大学信息与机电工程学院―倪继锋 21《单片机C语言程序设计实训100例---基于8051和PROTEUS仿真》案例void Alarm(uchar t){uchar i,j;for(i=0;i&200;i++){SPK=~SPK;for(j=0;j&t;j++); //由参数t行成不同的频率}} void main(){SPK=0;while(1){if(K1==1){Alarm(90);Alarm(120);}}}22 按键发音/* 名称:按键发音说明:按下不同的按键会是SOUNDER发出不同频率的声音。本例使用延时函数实现不同频率的声音输出,以后也可使用定时器*/#include&reg51.h&#define uchar unsigned char#define uint unsigned intsbit BEEP=P3^7;sbit K1=P1^4;sbit K2=P1^5;sbit K3=P1^6;sbit K4=P1^7;//延时void DelayMS(uint x){while(x--) for(t=0;t&120;t++);}//按周期t发音void Play(uchar t){22上海师范大学信息与机电工程学院―倪继锋《单片机C语言程序设计实训100例---基于8051和PROTEUS仿真》案例for(i=0;i&100;i++){BEEP=~BEEP;DelayMS(t);}BEEP=0;}void main(){P1=0BEEP=0;while(1){if(K1==0) Play(1);if(K2==0) Play(2);if(K3==0) Play(3);if(K4==0) Play(4);}}23 播放音乐/* 名称:播放音乐说明:程序运行时播放生日快乐歌, 未使用定时器中断,所有频率完全用延时实现 */#include&reg51.h&#define uchar unsigned char#define uint unsigned intsbit BEEP=P3^7;//生日快乐歌的音符频率表,不同频率由不同的延时来决定uchar code SONG_TONE[]={212,212,190,212,159,169,212,212,190,212,142,159,212,212,106,126,159,169,190,119,119,126,159,142,159,0}; //生日快乐歌节拍表,节拍决定每个音符的演奏长短uchar code SONG_LONG[]={9,3,12,12,12,24,9,3,12,12,12,24,9,3,12,12,12,12,12,9,3,12,12,12,24,0};//延时void DelayMS(uint x){while(x--) for(t=0;t&120;t++);}//播放函数void PlayMusic(){上海师范大学信息与机电工程学院―倪继锋 23《单片机C语言程序设计实训100例---基于8051和PROTEUS仿真》案例uint i=0,j,k;while(SONG_LONG[i]!=0||SONG_TONE[i]!=0){ //播放各个音符,SONG_LONG为拍子长度for(j=0;j&SONG_LONG[i]*20;j++){BEEP=~BEEP;//SONG_TONE延时表决定了每个音符的频率for(k=0;k&SONG_TONE[i]/3;k++);}DelayMS(10);i++;}}void main(){BEEP=0;while(1){PlayMusic(); //播放生日快乐DelayMS(500); //播放完后暂停一段时间}}24 INT0中断计数/* 名称:INT0中断计数说明:每次按下计数键时触发INT0中断,中断程序累加计数,计数值显示在3只数码管上,按下清零键时数码管清零*/#include&reg51.h&#define uchar unsigned char#define uint unsigned int//0~9的段码uchar code DSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00}; //计数值分解后各个待显示的数位uchar DSY_Buffer[]={0,0,0};uchar Count=0;sbit Clear_Key=P3^6;//数码管上显示计数值void Show_Count_ON_DSY(){DSY_Buffer[2]=Count/100; //获取3个数24上海师范大学信息与机电工程学院―倪继锋《单片机C语言程序设计实训100例---基于8051和PROTEUS仿真》案例DSY_Buffer[1]=Count%100/10;DSY_Buffer[0]=Count%10;if(DSY_Buffer[2]==0) //高位为0时不显示{DSY_Buffer[2]=0x0a;if(DSY_Buffer[1]==0) //高位为0,若第二位为0同样不显示 DSY_Buffer[1]=0x0a;}P0=DSY_CODE[DSY_Buffer[0]];P1=DSY_CODE[DSY_Buffer[1]];P2=DSY_CODE[DSY_Buffer[2]];}//主程序void main(){P0=0x00;P1=0x00;P2=0x00;IE=0x81; //允许INT0中断IT0=1; //下降沿触发while(1){if(Clear_Key==0) Count=0; //清0Show_Count_ON_DSY();}}//INT0中断函数void EX_INT0() interrupt 0{Count++; //计数值递增}25 外部INT0中断控制LED/* 名称:外部INT0中断控制LED说明:每次按键都会触发INT0中断,中断发生时将LED状态取反,产生LED状态由按键控制的效果*/#include&reg51.h&#define uchar unsigned char#define uint unsigned intsbit LED=P0^0;//主程序void main()25上海师范大学信息与机电工程学院―倪继锋《单片机C语言程序设计实训100例---基于8051和PROTEUS仿真》案例{LED=1;EA=1;EX0=1;IT0=1;while(1);}//INT0中断函数void EX_INT0() interrupt 0{LED=~LED; //控制LED亮灭}26 INT0及INT1中断计数/* 名称:INT0及INT1中断计数说明:每次按下第1个计数键时,第1组计数值累加并显示在右边3只数码管上, 每次按下第2个计数键时,第2组计数值累加并显示在左边3只数码管上,后两个按键分别清零。*/#include&reg51.h&#define uchar unsigned char#define uint unsigned intsbit K3=P3^4; //2个清零键sbit K4=P3^5;//数码管段码与位码uchar code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}; uchar code DSY_Scan_Bits[]={0x20,0x10,0x08,0x04,0x02,0x01};//2组计数的显示缓冲,前3位一组,后3位一组uchar data Buffer_Counts[]={0,0,0,0,0,0};uint Count_A,Count_B=0;//延时void DelayMS(uint x){while(x--) for(t=0;t&120;t++);}//数据显示void Show_Counts(){Buffer_Counts[2]=Count_A/100;Buffer_Counts[1]=Count_A%100/10;Buffer_Counts[0]=Count_A%10;26上海师范大学信息与机电工程学院―倪继锋《单片机C语言程序设计实训100例---基于8051和PROTEUS仿真》案例if( Buffer_Counts[2]==0){Buffer_Counts[2]=0x0a;if( Buffer_Counts[1]==0)Buffer_Counts[1]=0x0a;}Buffer_Counts[5]=Count_B/100;Buffer_Counts[4]=Count_B%100/10;Buffer_Counts[3]=Count_B%10;if( Buffer_Counts[5]==0){Buffer_Counts[5]=0x0a;if( Buffer_Counts[4]==0)Buffer_Counts[4]=0x0a;}for(i=0;i&6;i++){P2=DSY_Scan_Bits[i];P1=DSY_CODE[Buffer_Counts[i]];DelayMS(1);}}//主程序void main(){IE=0x85;PX0=1; //中断优先IT0=1;IT1=1;while(1){if(K3==0) Count_A=0;if(K4==0) Count_B=0;Show_Counts();}}//INT0中断函数void EX_INT0() interrupt 0{Count_A++;}//INT1中断函数void EX_INT1() interrupt 2{Count_B++;上海师范大学信息与机电工程学院―倪继锋 27《单片机C语言程序设计实训100例---基于8051和PROTEUS仿真》案例}27 定时器控制单只LED/* 名称:定时器控制单只LED说明:LED在定时器的中断例程控制下不断闪烁。*/#include&reg51.h&#define uchar unsigned char#define uint unsigned intsbit LED=P0^0;uchar T_Count=0;//主程序void main(){TMOD=0x00; //定时器0工作方式0TH0=()/32; //5ms定时TL0=()%32;IE=0x82; //允许T0中断TR0=1;while(1);}//T0中断函数void LED_Flash() interrupt 1{TH0=()/32; //恢复初值TL0=()%32;if(++T_Count==100) //0.5s开关一次LED{LED=~LED;T_Count=0;}}28 TIMER0控制流水灯/* 名称:TIMER0控制流水灯说明:定时器控制P0、P2口的LED滚动显示,本例未使用中断函数。*/#include&reg51.h&#include&intrins.h&#define uchar unsigned char#define uint unsigned int28上海师范大学信息与机电工程学院―倪继锋《单片机C语言程序设计实训100例---基于8051和PROTEUS仿真》案例//主程序void main(){uchar T_Count=0;P0=0P2=0TMOD=0x01; //定时器0工作方式1TH0=()/256; //40ms定时TL0=()%256;TR0=1; //启动定时器while(1){if(TF0==1){TF0=0;TH0=()/256; //恢复初值TL0=()%256;if(++T_Count==5){P0=_crol_(P0,1);P2=_crol_(P2,1);T_Count=0;}}}}29 定时器控制4个LED滚动闪烁/* 名称:定时器控制4个LED滚动闪烁 说明:4只LED在定时器控制下滚动闪烁。*/#include&reg51.h&#define uchar unsigned char#define uint unsigned intsbit B1=P0^0;sbit G1=P0^1;sbit R1=P0^2;sbit Y1=P0^3;uint i,j,k;//主程序void main(){i=j=k=0;P0=029上海师范大学信息与机电工程学院―倪继锋《单片机C语言程序设计实训100例---基于8051和PROTEUS仿真》案例TMOD=0x02; //定时器0工作方式2TH0=256-200; //200us定时TL0=256-200;IE=0x82;TR0=1; //启动定时器while(1);}//T0中断函数void LED_Flash_and_Scroll() interrupt 1{if(++k&35) //定时中断若干次后执行闪烁k=0;switch(i){case 0: B1=~B1;case 1: G1=~G1;case 2: R1=~R1;case 3: Y1=~Y1;default:i=0;}if(++j&300) //每次闪烁持续一段时间j=0;P0=0 //关闭显示i++; //切换到下一个LED}30 T0控制LED实现二进制计数/* 名称:T0控制LED实现二进制计数说明:本例对按键的计数没有使用查询法,没有使用外部中断函数,没有使用定时或计数中断函数。而是启用了计数器,连接在T0引脚的按键每次按下时,会使计数寄存器的值递增,其值通过LED以二进制形式显示*/#include&reg51.h&//主程序void main(){TMOD=0x05; //定时器0为计数器,工作方式1,最大计数值65535 TH0=0; //初值为0TL0=0;TR0=1; //启动定时器while(1)30上海师范大学信息与机电工程学院―倪继锋《单片机C语言程序设计实训100例---基于8051和PROTEUS仿真》案例{P1=TH0;P2=TL0;}}31 TIMER0与TIMER1控制条形LED/* 名称:TIMER0与TIMER1控制条形LED说明:定时器T0定时控制上一组条形LED,滚动速度较快 定时器T1定时控制下一组条形LED,滚动速度较慢*/#include&reg51.h&#include&intrins.h&#define uchar unsigned char#define uint unsigned intuchar tc0=0,tc1=0;//主程序void main(){P0=0P2=0TMOD=0x11; //定时器0、定时器1均工作于方式1TH0=()/256; //定时器0:15msTL0=()%256;TH1=()/256; //定时器1:50msTL1=()%256;IE=0x8a;TR0=1; //启动定时器TR1=1;while(1);}//T0中断函数void Time0() interrupt 1{TH0=()/256; //恢复定时器0初值 TL0=()%256;if(++tc0==10) //150ms转换状态{tc0=0;P0=_crol_(P0,1);}}//T1中断函数31上海师范大学信息与机电工程学院―倪继锋《单片机C语言程序设计实训100例---基于8051和PROTEUS仿真》案例void Time1() interrupt 3{TH0=()/256; //恢复定时器1初值TL0=()%256;if(++tc1==10) //500ms转换状态{tc1=0;P2=_crol_(P2,1);}}32 10s的秒表/* 名称:10s的秒表说明:首次按键计时开始,再次按键暂停,第三次按键清零。*/#include&reg51.h&#define uchar unsigned char#define uint unsigned intsbit K1=P3^7;uchari,Second_Counts,Key_Flag_Ibit Key_SucharDSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //延时void DelayMS(uint ms){while(ms--) for(t=0;t&120;t++);}//处理按键事件void Key_Event_Handle(){if(Key_State==0){Key_Flag_Idx=(Key_Flag_Idx+1)%3;switch(Key_Flag_Idx){case 1: EA=1;ET0=1;TR0=1;case 2: EA=0;ET0=0;TR0=0;case 0: P0=0x3f;P2=0x3f;i=0;Second_Counts=0; }32上海师范大学信息与机电工程学院―倪继锋《单片机C语言程序设计实训100例---基于8051和PROTEUS仿真》案例}}//主程序void main(){P0=0x3f; //显示00P2=0x3f;i=0;Second_Counts=0;Key_Flag_Idx=0; //按键次数(取值0,1,2,3)Key_State=1; //按键状态TMOD=0x01; //定时器0方式1TH0=()/256; //定时器0:15msTL0=()%256;while(1){if(Key_State!=K1){DelayMS(10);Key_State=K1;Key_Event_Handle();}}}//T0中断函数void DSY_Refresh() interrupt 1{TH0=()/256; //恢复定时器0初值TL0=()%256;if(++i==2) //50ms*2=0.1s转换状态{i=0;Second_Counts++;P0=DSY_CODE[Second_Counts/10];P2=DSY_CODE[Second_Counts%10];if(Second_Counts==100) Second_Counts=0; //满100(10s)后显示00 }}33 用计数器中断实现100以内的按键计数/* 名称:用计数器中断实现100以内的按键计数说明:本例用T0计数器中断实现按键技术,由于计数寄存器初值为1,因此 P3.4引脚的每次负跳变都会触发T0中断,实现计数值累加。 计数器的清零用外部中断0控制。上海师范大学信息与机电工程学院―倪继锋 33《单片机C语言程序设计实训100例---基于8051和PROTEUS仿真》案例*/#include&reg51.h&#define uchar unsigned char#define uint unsigned int//段码uchar codeDSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};uchar Count=0;//主程序void main(){P0=0x00;P2=0x00;TMOD=0x06; //计数器T0方式2TH0=TL0=256-1; //计数值为1ET0=1; //允许T0中断EX0=1; //允许INT0中断EA=1; //允许CPU中断IP=0x02; //设置优先级,T0高于INT0IT0=1; //INT0中断触发方式为下降沿触发TR0=1; //启动T0while(1){P0=DSY_CODE[Count/10];P2=DSY_CODE[Count%10];}}//T0计数器中断函数void Key_Counter() interrupt 1{Count=(Count+1)%100; //因为只有两位数码管,计数控制在100以内(00~99) }//INT0中断函数void Clear_Counter() interrupt 0{Count=0;}34上海师范大学信息与机电工程学院―倪继锋《单片机C语言程序设计实训100例---基于8051和PROTEUS仿真》案例34 100 000s以内的计时程序/* 名称:100 000s以内的计时程序说明:在6只数码管上完成0~99 999.9s。*/#include&reg51.h&#include&intrins.h&#define uchar unsigned char#define uint unsigned int//段码uchar code DSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//6只数码管上显示的数字uchar Digits_of_6DSY[]={0,0,0,0,0,0};uchar Csbit Dot=P0^7;//延时void DelayMS(uint ms){while(ms--) for(t=0;t&120;t++);}//主程序void main(){uchar i,j;P0=0x00;P3=0Count=0;TMOD=0x01; //计数器T0方式1TH0=()/256; //50ms定时TL0=()%256;IE=0x82;TR0=1; //启动T0while(1){j=0x7f;//显示Digits_of_6DSY[5]~Digits_of_6DSY[0]的内容//前面高位,后面低位,循环中i!=-1亦可写成i!=0xfffor(i=5;i!=-1;i--){j=_crol_(j,1);35上海师范大学信息与机电工程学院―倪继锋《单片机C语言程序设计实训100例---基于8051和PROTEUS仿真》案例P3=j;P0=DSY_CODE[Digits_of_6DSY[i]];if(i==1) Dot=1; //加小数点DelayMS(2);}}}//T0中断函数void Timer0() interrupt 1{TH0=()/256; //恢复初值TL0=()%256;if(++Count!=2)Count=0;Digits_of_6DSY[0]++; //0.1s位累加for(i=0;i&=5;i++) //进位处理{if(Digits_of_6DSY[i]==10){Digits_of_6DSY[i]=0;if(i!=5) Digits_of_6DSY[i+1]++; //如果0~4位则分别向高一位进位 } //若某低位没有进位,怎循环提前结束} }35 定时器控制数码管动态显示/* 名称:定时器控制数码管动态显示说明:8个数码管上分两组动态显示年月日与时分秒,本例的位显示延时用定时器实现。*/#include&reg51.h&#include&intrins.h&#define uchar unsigned char#define uint unsigned int//段码,最后一位是“-”的段码uchar codeDSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf}; //待显示的数据:09-12-25与23-59-58(分两组显示)uchar code Table_of_Digits[][8]={{0,9,10,1,2,10,2,5},{2,3,10,5,9,10,5,8}};uchar i,j=0;36上海师范大学信息与机电工程学院―倪继锋《单片机C语言程序设计实训100例---基于8051和PROTEUS仿真》案例uint t=0;//主程序void main(){P3=0x80; //位码初值TMOD=0x00; //计数器T0方式0TH0=()/32; //4ms定时TL0=()%32;IE=0x82;TR0=1; //启动T0while(1);}//T0中断函数控制数码管刷新显示void DSY_Show() interrupt 1{TH0=()/32; //恢复初值TL0=()%32;P0=0 //输出位码和段码P0=DSY_CODE[Table_of_Digits[i][j]];P3=_crol_(P3,1);j=(j+1)%8; //数组第i行的下一字节索引if(++t!=350) //保持刷新一段时间t=0;i=(i+1)%2; //数组行i=0时显示年月日,i=1时显示时分秒}36 8X8LED点阵显示数字/* 名称:8X8LED点阵显示数字说明:8X8LED点阵屏循环显示数字0~9,刷新过程由定时器中断完成。*/#include&reg51.h&#include&intrins.h&#define uchar unsigned char#define uint unsigned intuchar code Table_of_Digits[]={0x00,0x3e,0x41,0x41,0x41,0x3e,0x00,0x00, //00x00,0x00,0x00,0x21,0x7f,0x01,0x00,0x00, //10x00,0x27,0x45,0x45,0x45,0x39,0x00,0x00, //20x00,0x22,0x49,0x49,0x49,0x36,0x00,0x00, //30x00,0x0c,0x14,0x24,0x7f,0x04,0x00,0x00, //437上海师范大学信息与机电工程学院―倪继锋《单片机C语言程序设计实训100例---基于8051和PROTEUS仿真》案例0x00,0x72,0x51,0x51,0x51,0x4e,0x00,0x00, //5 0x00,0x3e,0x49,0x49,0x49,0x26,0x00,0x00, //6 0x00,0x40,0x40,0x40,0x4f,0x70,0x00,0x00, //7 0x00,0x36,0x49,0x49,0x49,0x36,0x00,0x00, //8 0x00,0x32,0x49,0x49,0x49,0x3e,0x00,0x00 //9 };uchar i=0,t=0,Num_I//主程序void main(){P3=0x80;Num_Index=0; //从0开始显示TMOD=0x00; //T0方式0TH0=()/32; //2ms定时TL0=()%32;IE=0x82;TR0=1; //启动T0while(1);}//T0中断函数void LED_Screen_Display() interrupt 1{TH0=()/32; //恢复初值TL0=()%32;P0=0 //输出位码和段码P0=~Table_of_Digits[Num_Index*8+i];P3=_crol_(P3,1);if(++i==8) i=0; //每屏一个数字由8个字节构成 if(++t==250) //每个数字刷新显示一段时间 {t=0;if(++Num_Index==10) Num_Index=0; //显示下一个数字 }}37 按键控制8X8LED点阵屏显示图形/* 名称:按键控制8X8LED点阵屏显示图形说明:每次按下K1时,会使8X8LED点阵屏循环显示不同图形。本例同时使用外部中断和定时中断。*/#include&reg51.h&38上海师范大学信息与机电工程学院―倪继锋《单片机C语言程序设计实训100例---基于8051和PROTEUS仿真》案例#include&intrins.h&#define uchar unsigned char#define uint unsigned int//待显示图形编码uchar code M[][8]={{0x00,0x7e,0x7e,0x7e,0x7e,0x7e,0x7e,0x00}, //图1{0x00,0x38,0x44,0x54,0x44,0x38,0x00,0x00}, //图2{0x00,0x20,0x30,0x38,0x3c,0x3e,0x00,0x00} //图3};uchar i,j;//主程序void main(){P0=0P1=0TMOD=0x01; //T0方式1TH0=()/256; //2ms定时TL0=()%256;IT0=1; //下降沿触发IE=0x83; //允许定时器0、外部0中断i=0 //i的初值设为0xff,加1后将从0开始 while(1);}//T0中断控制点阵屏显示void Show_Dot_Matrix() interrupt 1{TH0=()/256; //恢复初值TL0=()%256;P0=0 //输出位码和段码P0=~M[i][j];P1=_crol_(P1,1);j=(j+1)%8;}//INT0中断(定时器由键盘中断启动)void Key_Down() interrupt 0{P0=0P1=0x80;j=0;i=(i+1)%3; //i在0,1,2中取值,因为只要3个图形 TR0=1;}38 用定时器设计的门铃上海师范大学信息与机电工程学院―倪继锋 39《单片机C语言程序设计实训100例---基于8051和PROTEUS仿真》案例/* 名称:用定时器设计的门铃说明:按下按键时蜂鸣器发出叮咚的门铃声。*/#include&reg51.h&#define uchar unsigned char#define uint unsigned intsbit Key=P1^7;sbit DoorBell=P3^0;uint p=0;//主程序void main(){DoorBell=0;TMOD=0x00; //T0方式0TH0=(; //700us定时TL0=(;IE=0x82;while(1){if(Key==0) //按下按键启动定时器{TR0=1;while(Key==0);}}}//T0中断控制点阵屏显示void Timer0() interrupt 1{DoorBell=~DoorBp++;if(p&400) //若需要拖长声音,可以调整400和800 {TH0=(; //700us定时TL0=(;}else if(p&800){TH0=()/32; //1ms定时TL0=()%32;}else{TR0=0;40上海师范大学信息与机电工程学院―倪继锋《单片机C语言程序设计实训100例---基于8051和PROTEUS仿真》案例p=0;}}39 演奏音阶/* 名称:演奏音阶说明:本例使用定时器演奏一段音阶,播放由K1控制。*/#include&reg51.h&#define uchar unsigned char#define uint unsigned intsbit K1=P1^0;sbit SPK=P3^4;uint i=0; //音符索引//14个音符放在方式2下的定时寄存器(TH0,TL0)uchar code HI_LIST[]={0,226,229,232,233,236,238,240,241,242,244,245,246,247,248}; uchar code LO_LIST[]={0,4,13,10,20,3,8,6,2,23,5,26,1,4,3};//定时器0中断函数void T0_INT() interrupt 1{TL0=LO_LIST[i];TH0=HI_LIST[i];SPK=~SPK;}//延时void DelayMS(uint ms){while(ms--) for(t=0;t&120;t++);}//主程序void main(){TMOD=0x00; //T0方式0IE=0x82;SPK=0;while(1){while(K1==1); //未按键等待while(K1==0); //等待释放for(i=1;i&15;i++){41上海师范大学信息与机电工程学院―倪继锋《单片机C语言程序设计实训100例---基于8051和PROTEUS仿真》案例TR0=1; //播放一个音符DelayMS(500); //播放延时TR0=0;DelayMS(50);}}}40 按键控制定时器选播多段音乐/* 名称:按键控制定时器选播多段音乐说明:本例内置3段音乐,K1可启动停止音乐播放,K2用于选择音乐段。*/#include&reg51.h&#include&intrins.h&#define uchar unsigned char#define uint unsigned intsbit K1=P1^0; //播放和停止键sbit SPK=P3^7; //蜂鸣器uchar Song_Index=0,Tone_Index=0; //当前音乐段索引,音符索引//数码管段码表uchar code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //标准音符频率对应的延时表uchar code HI_LIST[]={0,226,229,232,233,236,238,240,241,242,244,245,246,247,248}; uchar code LO_LIST[]={0,4,13,10,20,3,8,6,2,23,5,26,1,4,3};//三段音乐的音符uchar code Song[][50]={{1,2,3,1,1,2,3,1,3,4,5,3,4,5,5,6,5,3,5,6,5,3,5,3,2,1,2,1,-1},{3,3,3,4,5,5,5,5,6,5,3,5,3,2,1,5,6,53,3,2,1,1,-1},{3,2,1,3,2,1,1,2,3,1,1,2,3,1,3,4,5,3,4,5,5,6,5,3,5,3,2,1,3,2,1,1,-1}};//三段音乐的节拍uchar code Len[][50]={{1,1,1,1,1,1,1,1,1,1,2,1,1,2,1,1,1,1,1,1,1,1,1,1,1,2,1,2,-1},{1,1,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,2,2,-1},{1,1,2,1,1,2,1,1,1,1,1,1,1,1,1,1,2,1,1,2,1,1,1,1,1,1,1,2,1,1,2,2,-1}};//外部中断0void EX0_INT() interrupt 0{TR0=0; //播放结束或者播放中途切换歌曲时停止播放Song_Index=(Song_Index+1)%3; //跳到下一首的开头42上海师范大学信息与机电工程学院―倪继锋《单片机C语言程序设计实训100例---基于8051和PROTEUS仿真》案例Tone_Index=0;P2=DSY_CODE[Song_Index]; //数码管显示当前音乐段号}//定时器0中断函数void T0_INT() interrupt 1{TL0=LO_LIST[Song[Song_Index][Tone_Index]];TH0=HI_LIST[Song[Song_Index][Tone_Index]];SPK=~SPK;}//延时void DelayMS(uint ms){while(ms--) for(t=0;t&120;t++);}//主程序void main(){P2=0xc0;SPK=0;TMOD=0x00; //T0方式0IE=0x83;IT0=1;IP=0x02;while(1){while(K1==1); //未按键等待while(K1==0); //等待释放TR0=1; //开始播放Tone_Index=0; //从第0个音符开始//播放过程中按下K1可提前停止播放(K1=0)。//若切换音乐段会触发外部中断,导致TR0=0,播放也会停止while(Song[Song_Index][Tone_Index]!=-1&&K1==1&&TR0==1) {DelayMS(300*Len[Song_Index][Tone_Index]); //播放延时(节拍) Tone_Index++; //当前音乐段的下一音符索引}TR0=0; //停止播放while(K1==0); //若提前停止播放,按键未释放时等待}}41 定时器控制交通指示灯上海师范大学信息与机电工程学院―倪继锋 43《单片机C语言程序设计实训100例---基于8051和PROTEUS仿真》案例/* 名称:定时器控制交通指示灯说明:东西向绿灯亮5s后,黄灯闪烁,闪烁5次亮红灯,红灯亮后,南北向由红灯变成绿灯,5s后南北向黄灯闪烁, 闪烁5次后亮红灯,东西向绿灯亮,如此往复。*/#include&reg51.h&#define uchar unsigned char#define uint unsigned intsbit RED_A=P0^0; //东西向指示灯sbit YELLOW_A=P0^1;sbit GREEN_A=P0^2;sbit RED_B=P0^3; //南北向指示灯sbit YELLOW_B=P0^4;sbit GREEN_B=P0^5;//延时倍数,闪烁次数,操作类型变量uchar Time_Count=0,Flash_Count=0,Operation_Type=1;//定时器0中断函数void T0_INT() interrupt 1{TL0=-;TH0=-;switch(Operation_Type){case 1: //东西向绿灯与南北向红灯亮5sRED_A=0;YELLOW_A=0;GREEN_A=1; RED_B=1;YELLOW_B=0;GREEN_B=0;if(++Time_Count!=100) //5s(100*50ms)切换 Time_Count=0;Operation_Type=2;case 2: //东西向黄灯开始闪烁,绿灯关闭if(++Time_Count!=8)Time_Count=0;YELLOW_A=~YELLOW_A;GREEN_A=0; if(++Flash_Count!=10) //闪烁Flash_Count=0;Operation_Type=3;case 3: //东西向红灯与南北向绿灯亮5sRED_A=1;YELLOW_A=0;GREEN_A=0; RED_B=0;YELLOW_B=0;GREEN_B=1;if(++Time_Count!=100) //5s(100*50ms)切换 Time_Count=0;Operation_Type=4;44上海师范大学信息与机电工程学院―倪继锋《单片机C语言程序设计实训100例---基于8051和PROTEUS仿真》案例case 4: //南北向黄灯开始闪烁,绿灯关闭if(++Time_Count!=8)Time_Count=0;YELLOW_B=~YELLOW_B;GREEN_A=0;if(++Flash_Count!=10) //闪烁Flash_Count=0;Operation_Type=1;}}//主程序void main(){TMOD=0x01; //T0方式1IE=0x82;TR0=1;while(1);}42 报警与旋转灯/* 名称:报警与旋转灯说明:定时器控制报警灯旋转显示,并发出仿真警报声。*/#include&reg51.h&#include&intrins.h&#define uchar unsigned char#define uint unsigned intsbit SPK=P3^7;uchar FRQ=0x00;//延时void DelayMS(uint ms){while(ms--) for(i=0;i&120;i++);}//INT0中断函数void EX0_INT() interrupt 0{TR0=~TR0; //开启或停止两定时器,分别控制报警器的声音和LED旋转 TR1=~TR1;if(P2==0x00)45上海师范大学信息与机电工程学院―倪继锋《单片机C语言程序设计实训100例---基于8051和PROTEUS仿真》案例P2=0xe0; //开3个旋转灯elseP2=0x00; //关闭所有LED}//定时器0中断void T0_INT() interrupt 1{TH0=0TL0=FRQ;SPK=~SPK;}//定时器1中断void T1_INT() interrupt 3{TH1=-;TL1=-;P2=_crol_(P2,1);}//主程序void main(){P2=0x00;SPK=0x00;TMOD=0x11; //T0、T1方式1TH0=0x00;TL0=0IT0=1;IE=0x8b; //开启0,1,3号中断IP=0x01; //INT0设为最高优先TR0=0;TR1=0; //定时器启停由INT0控制,初始关闭while(1){FRQ++;DelayMS(1);}}43 串行数据转换为并行数据/* 名称:串行数据转换为并行数据说明:串行数据由RXD发送给串并转换芯片74164,TXD则用于输出移位时钟脉冲,74164将串行输入的1字节转换为并行数据,并将转换的数据通过8只LED显示出来。本例串口工作模式0,即移位寄存器I/O模式。*/46上海师范大学信息与机电工程学院―倪继锋《单片机C语言程序设计实训100例---基于8051和PROTEUS仿真》案例#include&reg51.h&#include&intrins.h&#define uchar unsigned char#define uint unsigned intsbit SPK=P3^7;uchar FRQ=0x00;//延时void DelayMS(uint ms){while(ms--) for(i=0;i&120;i++);}//主程序void main(){uchar c=0x80;SCON=0x00; //串口模式0,即移位寄存器输入/输出方式 TI=1;while(1){c=_crol_(c,1);SBUF=c;while(TI==0); //等待发送结束TI=0; //TI软件置位DelayMS(400);}}44 并行数据转换为串行数据/* 名称:并行数据转换为串行数据说明:切换连接到并串转换芯片74LS165的拨码开关,该芯片将并行数据以串行方式发送到8051的RXD引脚,移位脉冲由TXD提供,显示在P0口。*/#include&reg51.h&#include&intrins.h&#include&stdio.h&#define uchar unsigned char#define uint unsigned intsbit SPL=P2^5; //shift/load//延时void DelayMS(uint ms){47上海师范大学信息与机电工程学院―倪继锋《单片机C语言程序设计实训100例---基于8051和PROTEUS仿真》案例while(ms--) for(i=0;i&120;i++);}//主程序void main(){SCON=0x10; //串口模式0,允许串口接收while(1){SPL=0; //置数(load),读入并行输入口的8位数据SPL=1; //移位(shift),并口输入被封锁,串行转换开始 while(RI==0); //未接收1字节时等待RI=0; //RI软件置位P0=SBUF; //接收到的数据显示在P0口,显示拨码开关的值DelayMS(20);}}45 甲机通过串口控制乙机LED/* 名称:甲机发送控制命令字符说明:甲单片机负责向外发送控制命令字符“A”、“B”、“C”,或者停止发送,乙机根据所接收到的字符完成LED1闪烁、LED2闪烁、双闪烁、或停止闪烁。*/#include&reg51.h&#define uchar unsigned char#define uint unsigned intsbit LED1=P0^0;sbit LED2=P0^3;sbit K1=P1^0;//延时void DelayMS(uint ms){while(ms--) for(i=0;i&120;i++);}//向串口发送字符void Putc_to_SerialPort(uchar c){SBUF=c;while(TI==0);TI=0;48上海师范大学信息与机电工程学院―倪继锋《单片机C语言程序设计实训100例---基于8051和PROTEUS仿真》案例}//主程序void main(){uchar Operation_No=0;SCON=0x40; //串口模式1TMOD=0x20; //T1工作模式2PCON=0x00; //波特率不倍增TH1=0TL1=0TI=0;TR1=1;while(1){if(K1==0) //按下K1时选择操作代码0,1,2,3{while(K1==0);Operation_No=(Operation_No+1)%4;}switch(Operation_No) //根据操作代码发送A/B/C或停止发送{case 0: LED1=LED2=1;case 1: Putc_to_SerialPort('A');LED1=~LED1;LED2=1;case 2: Putc_to_SerialPort('B');LED2=~LED2;LED1=1;case 3: Putc_to_SerialPort('C');LED1=~LED1;LED2=LED1;}DelayMS(100);}}/* 名称:乙机程序接收甲机发送字符并完成相应动作说明:乙机接收到甲机发送的信号后,根据相应信号控制LED完成不同闪烁动作。*/#include&reg51.h&#define uchar unsigned char#define uint unsigned intsbit LED1=P0^0;sbit LED2=P0^3;上海师范大学信息与机电工程学院―倪继锋 49《单片机C语言程序设计实训100例---基于8051和PROTEUS仿真》案例//延时void DelayMS(uint ms){while(ms--) for(i=0;i&120;i++);}//主程序void main(){SCON=0x50; //串口模式1,允许接收TMOD=0x20; //T1工作模式2PCON=0x00; //波特率不倍增TH1=0 //波特率9600TL1=0RI=0;TR1=1;LED1=LED2=1;while(1){if(RI) //如收到则LED闪烁{RI=0;switch(SBUF) //根据所收到的不同命令字符完成不同动作 {case 'A': LED1=~LED1;LED2=1; //LED1闪烁 case 'B': LED2=~LED2;LED1=1; //LED2闪烁 case 'C': LED1=~LED1;LED2=LED1; //双闪烁 }}else LED1=LED2=1; //关闭LED DelayMS(100);}}46 单片机之间双向通信/* 名称:甲机串口程序说明:甲机向乙机发送控制命令字符,甲机同时接收乙机发送的数字,并显示在数码管上。*/#include&reg51.h&#define uchar unsigned char#define uint unsigned intsbit LED1=P1^0;50上海师范大学信息与机电工程学院―倪继锋《单片机C语言程序设计实训100例---基于8051和PROTEUS仿真》案例sbit LED2=P1^3;sbit K1=P1^7;uchar Operation_No=0; //操作代码//数码管代码uchar code DSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //延时void DelayMS(uint ms){while(ms--) for(i=0;i&120;i++);}//向串口发送字符void Putc_to_SerialPort(uchar c){SBUF=c;while(TI==0);TI=0;}//主程序void main(){LED1=LED2=1;P0=0x00;SCON=0x50; //串口模式1,允许接收TMOD=0x20; //T1工作模式2PCON=0x00; //波特率不倍增TH1=0TL1=0TI=RI=0;TR1=1;IE=0x90; //允许串口中断while(1){DelayMS(100);if(K1==0) //按下K1时选择操作代码0,1,2,3{while(K1==0);Operation_No=(Operation_No+1)%4;switch(Operation_No) //根据操作代码发送A/B/C或停止发送 {case 0: Putc_to_SerialPort('X');LED1=LED2=1;case 1: Putc_to_SerialPort('A');上海师范大学信息与机电工程学院―倪继锋 51《单片机C语言程序设计实训100例---基于8051和PROTEUS仿真》案例LED1=~LED1;LED2=1;case 2: Putc_to_SerialPort('B');LED2=~LED2;LED1=1;case 3: Putc_to_SerialPort('C');LED1=~LED1;LED2=LED1;}}}}//甲机串口接收中断函数void Serial_INT() interrupt 4{if(RI){RI=0;if(SBUF&=0&&SBUF&=9) P0=DSY_CODE[SBUF];else P0=0x00;}}/* 名称:乙机程序接收甲机发送字符并完成相应动作说明:乙机接收到甲机发送的信号后,根据相应信号控制LED完成不同闪烁动作。*/#include&reg51.h&#define uchar unsigned char#define uint unsigned intsbit LED1=P1^0;sbit LED2=P1^3;sbit K2=P1^7;uchar NumX=-1;//延时void DelayMS(uint ms){while(ms--) for(i=0;i&120;i++);}//主程序void main(){LED1=LED2=1;SCON=0x50; //串口模式1,允许接收TMOD=0x20; //T1工作模式2上海师范大学信息与机电工程学院―倪继锋 52《单片机C语言程序设计实训100例---基于8051和PROTEUS仿真》案例TH1=0 //波特率9600TL1=0PCON=0x00; //波特率不倍增RI=TI=0;TR1=1;IE=0x90;while(1){DelayMS(100);if(K2==0){while(K2==0);NumX=++NumX%11; //产生0~10范围内的数字,其中10表示关闭 SBUF=NumX;while(TI==0);TI=0;}}}void Serial_INT() interrupt 4{if(RI) //如收到则LED则动作{RI=0;switch(SBUF) //根据所收到的不同命令字符完成不同动作{case 'X': LED1=LED2=1; //全灭case 'A': LED1=0;LED2=1; //LED1亮case 'B': LED2=0;LED1=1; //LED2亮case 'C': LED1=LED2=0; //全亮}}}47 单片机向主机发送字符串/* 名称:单片机向主机发送字符串说明:单片机按一定的时间间隔向主机发送字符串,发送内容在虚拟终端显示。*/#include&reg51.h&#define uchar unsigned char#define uint unsigned int//延时void DelayMS(uint ms)53上海师范大学信息与机电工程学院―倪继锋《单片机C语言程序设计实训100例---基于8051和PROTEUS仿真》案例{while(ms--) for(i=0;i&120;i++);}//向串口发送字符void Putc_to_SerialPort(uchar c){SBUF=c;while(TI==0);TI=0;}//向串口发送字符串void Puts_to_SerialPort(uchar *s){while(*s!='\0'){Putc_to_SerialPort(*s);s++;DelayMS(5);}}//主程序void main(){uchar c=0;SCON=0x40; //串口模式1TMOD=0x20; //T1工作模式2TH1=0 //波特率9600TL1=0PCON=0x00; //波特率不倍增TI=0;TR1=1;DelayMS(200);//向主机发送数据Puts_to_SerialPort("Receiving From 8051...\r\n");Puts_to_SerialPort("-------------------------------\r\n"); DelayMS(50);while(1){Putc_to_SerialPort(c+'A');DelayMS(100);Putc_to_SerialPort(' ');DelayMS(100);if(c==25) //每输出一遍后加横线{上海师范大学信息与机电工程学院―倪继锋 54《单片机C语言程序设计实训100例---基于8051和PROTEUS仿真》案例Puts_to_SerialPort("\r\n-------------------------------\r\n");DelayMS(100);}c=(c+1)%26;if(c%10==0) //每输出10个字符后换行{Puts_to_SerialPort("\r\n");DelayMS(100);}}}48 单片机与PC通信/* 名称:单片机与PC通信说明:单片机可接收PC发送的数字字符,按下单片机的K1键后,单片机可向PC发送字符串。在Proteus环境下完成本实验时,需要安装VirtualSerial Port Driver和串口调试助手。本例缓冲100个数字字符,缓冲满后新数字从前面开始存放(环形缓冲)。*/#include&reg51.h&#define uchar unsigned char#define uint unsigned intuchar Receive_Buffer[101]; //接收缓冲uchar Buf_Index=0; //缓冲空间索引//数码管编码uchar code DSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00}; //延时void DelayMS(uint ms){while(ms--) for(i=0;i&120;i++);}//主程序void main(){P0=0x00;Receive_Buffer[0]=-1;SCON=0x50; //串口模式1,允许接收55上海师范大学信息与机电工程学院―倪继锋《单片机C语言程序设计实训100例---基于8051和PROTEUS仿真》案例TMOD=0x20; //T1工作模式2TH1=0 //波特率9600TL1=0PCON=0x00; //波特率不倍增EA=1;EX0=1;IT0=1;ES=1;IP=0x01;TR1=1;while(1){for(i=0;i&100;i++){ //收到-1为一次显示结束if(Receive_Buffer[i]==-1)P0=DSY_CODE[Receive_Buffer[i]];DelayMS(200);}DelayMS(200);}}//串口接收中断函数void Serial_INT() interrupt 4{if(RI==0)ES=0; //关闭串口中断RI=0; //清接收中断标志c=SBUF;if(c&='0'&&c&='9'){ //缓存新接收的每个字符,并在其后放-1为结束标志 Receive_Buffer[Buf_Index]=c-'0';Receive_Buffer[Buf_Index+1]=-1;Buf_Index=(Buf_Index+1)%100;}ES=1;}void EX_INT0() interrupt 0 //外部中断0{uchar *s="这是由8051发送的字符串!\r\n";uchar i=0;while(s[i]!='\0'){SBUF=s[i];while(TI==0);TI=0;i++;}上海师范大学信息与机电工程学院―倪继锋 56《单片机C语言程序设计实训100例---基于8051和PROTEUS仿真》案例}第02篇 硬件应用19 用ADC0808控制PWM输出/* 名称:用ADC0808控制PWM输出说明:使用数模转换芯片ADC0808,通过调节可变电阻RV1来调节脉冲宽度, 运行程序时,通过虚拟示波器观察占空比的变化。*/#include&reg51.h&#define uchar unsigned char#define uint unsigned intsbit CLK=P2^4; //时钟信号sbit ST=P2^5; //启动信号sbit EOC=P2^6; //转换结束信号sbit OE=P2^7; //输出使能sbit PWM=P3^0; //PWM输出//延时void DelayMS(uint ms){while(ms--) for(i=0;i&40;i++);}//主程序void main(){uchar VTMOD=0x02; //T1工作模式2TH0=0x14;TL0=0x00;IE=0x82;TR0=1;while(1){ST=0;ST=1;ST=0; //启动A/D转换while(!EOC); //等待转换完成OE=1;Val=P1; //读转换值OE=0;if(Val==0) //PWM输出(占空比为0%){PWM=0;DelayMS(0xff);57上海师范大学信息与机电工程学院―倪继锋《单片机C语言程序设计实训100例---基于8051和PROTEUS仿真》案例}if(Val==0xff) //PWM输出(占空比为100%){PWM=1;DelayMS(0xff);}PWM=1; //PWM输出(占空比为0%~100%) DelayMS(Val);PWM=0;DelayMS(0xff-Val);}}//T0定时器中断给ADC0808提供时钟信号void Timer0_INT() interrupt 1{CLK=~CLK;}20 ADC0809数模转换与显示/* 名称:ADC0809数模转换与显示说明:ADC0809采样通道3输入的模拟量,转换后的结果显示在数码管上。*/#include&reg51.h&#define uchar unsigned char#define uint unsigned int//各数字的数码管段码(共阴)uchar code DSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; sbit CLK=P1^3; //时钟信号sbit ST=P1^2; //启动信号sbit EOC=P1^1; //转换结束信号sbit OE=P1^0; //输出使能//延时void DelayMS(uint ms){while(ms--) for(i=0;i&120;i++);}//显示转换结果void Display_Result(uchar d){P2=0xf7; //第4个数码管显示个位数P0=DSY_CODE[d%10];58上海师范大学信息与机电工程学院―倪继锋《单片机C语言程序设计实训100例---基于8051和PROTEUS仿真》案例DelayMS(5);P2=0 //第3个数码管显示十位数P0=DSY_CODE[d%100/10];DelayMS(5);P2=0 //第2个数码管显示百位数P0=DSY_CODE[d/100];DelayMS(5);}//主程序void main(){TMOD=0x02; //T1工作模式2TH0=0x14;TL0=0x00;IE=0x82;TR0=1;P1=0x3f; //选择ADC0809的通道3(0111)(P1.4~P1.6) while(1){ST=0;ST=1;ST=0; //启动A/D转换while(EOC==0); //等待转换完成OE=1;Display_Result(P3);OE=0;}}//T0定时器中断给ADC0808提供时钟信号void Timer0_INT() interrupt 1{CLK=~CLK;}上海师范大学信息与机电工程学院―倪继锋 59 分享: >
“单片机c语言编程”相关文章

我要回帖

更多关于 proteus中数码管 的文章

 

随机推荐