logo资料库

51单片机C 语言例题100题.doc

第1页 / 共57页
第2页 / 共57页
第3页 / 共57页
第4页 / 共57页
第5页 / 共57页
第6页 / 共57页
第7页 / 共57页
第8页 / 共57页
资料共57页,剩余部分请下载后查看
文库帮手网 www.365xueyuan.com 本文由 lorinislorinis 贡献 pdf 文档可能在 WAP 端浏览体验不佳。建议您优先选择 TXT,或下载源文件到本机查 看。 《单片机 C 语言程序设计实训 100 例基于 8051 和 PROTEUS 仿真》案例 《单片机 C 语言程序设计实训 100 例—基于 8051+Proteus 仿真》案例 第 01 篇 基础 程序设计 01 闪烁的 LED /* 名称:闪烁的 LED 说明:LED 按设定的时间间隔闪烁 */ #include #define uchar unsigned char #define uint unsigned int sbit LED=P1^0; //延时 void DelayMS(uint x) { uchar i; while(x--) { for(i=0;i<120;i++); } } //主程序 void main() { while(1) { LED=~LED; DelayMS(150); } } 02 /* 从左到右的流水灯 名称:从左到右的流水灯 说明: 接在 P0 口的 8 个 LED 从左到右循环依次点亮, 产 生 走 马 灯 效 果 */ #include #include #define uchar unsigned char #define uint unsigned int 1 上海师范大学信息与机电工程学院—倪继锋 《单片机 C 语言程序设计实训 100 例基于 8051 和 PROTEUS 仿真》案例 //延时 void DelayMS(uint x) { uchar i; while(x--) { for(i=0;i<120;i++); } } //主程序 void main() { P0=0xfe; while(1) { P0=_crol_(P0,1); //P0 的值向左循环移动 DelayMS(150); } } 03 /* 8 只 LED 左右来回点亮 名称:8 只 LED 左右来回点亮 说明:程序利用循环移位函数 _crol_和_cror_形成来回滚动的效果 */ #include #include #define uchar unsigned char #define uint unsigned int //延时 void DelayMS(uint x) { uchar i; while(x--) { for(i=0;i<120;i++); } } //主程序 void main() { uchar i; 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 #define uchar unsigned char #define uint unsigned int uchar 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 { 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, Pattern_P2[]= 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfc,0xf9,0xf3,0xe7,0xcf,0x9f,0x3f,0xff, code }; uchar
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) { uchar i; while(x--) { for(i=0;i<120;i++); } } //主程序 void main() { uchar i; 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 #define uchar unsigned char #define uint unsigned int sbit RED_A=P0^0; //东西向灯 sbit YELLOW_A=P0^1; sbit GREEN_A=P0^2; sbit RED_B=P0^3; // uchar sbit 南 北 向 灯 Flash_Count=0,Operation_Type=1; //闪烁次数,操作类型变量 YELLOW_B=P0^4; GREEN_B=P0^5; sbit 4 上海师范大学信息与机电工程学院—倪继锋 《单片机 C 语言程序设计实训 100 例基于 8051 和 PROTEUS 仿真》案例 //延时 void DelayMS(uint x) { uchar i; 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; break; case 2: //东西向黄灯闪烁,绿灯关闭 DelayMS(300); YELLOW_A=~YELLOW_A;GREEN_A=1; // 闪 烁 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; case 4: // 南 北 向 黄 灯 闪 烁 5 次 DelayMS(300); YELLOW_B=~YELLOW_B;GREEN_B=1; return; Flash_Count=0; Operation_Type=1; } } //主程序 void main() { while(1) Traffic_Light(); } 06 单只数码管循环 显示 0~9 if(++Flash_Count!=10) if(++Flash_Count!=10) return; 5 上海师范大学信息与机电工程学院—倪继锋 《单片机 C 语言程序设计实训 100 例基于 8051 和 PROTEUS 仿真》案例 Edited by Foxit Reader Copyright(C) by Foxit Corporation,2005-2010 For Evaluation Only. /* 名称:单只数码管循环显示 0~9 说明:主程序中的循环语句反复将 0~9 的段码送至 P0 口,使数字 0~9 循环显示 */ #include #include #define uchar unsigned char #define uint unsigned int uchar code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}; // 延 时 void DelayMS(uint x) { uchar t; 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 #include #define uchar unsigned char code #define DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; void uchar // 延 时 unsigned uint int
DelayMS(uint x) { uchar t; 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=0xff; //关闭显 示 wei=_crol_(wei,1); P0=DSY_CODE[i]; // 发 送 位 码 DelayMS(300); } } } 08 /* 8 只数码管动态显示多个不同字符 电路如上图 名称:8 只数码管 动态显示多个不同字符 说明:数码管动态扫描显示 0~7。 // 发 送 数 字 段 码 P2=wei; */ #include #include #define uchar unsigned char #define uint unsigned int uchar code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; // 延 时 void DelayMS(uint x) { uchar t; while(x--) for(t=0;t<120;t++); } // 主 程 序 void main() { uchar i,wei=0x80; while(1) { for(i=0;i<8;i++) { P0=0xff; P0=DSY_CODE[i]; // 发 送 段 码 wei=_crol_(wei,1); 7 上海师范大学信息与机电工程学院—倪继锋 《单片机 C 语言程序设计实训 100 例基于 8051 和 PROTEUS 仿真》案例 P2=wei; DelayMS(2); } } } 09 /* //发送位码 8 只数码管闪烁显示数字串 电路如上图 名称:8 只数码管闪烁显示数字串 说明:数 码管闪烁显示由 0~7 构成的一串数字 本例用动态刷新法显示一串数字,在停止刷新时所有 数字显示消失。 */ #include #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) { uchar t; 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=0xff; P0=DSY_CODE[j]; // 发 送 段 码 P2=DSY_IDX[j]; // 发 送 位 码 DelayMS(2); } } P2=0x00; // 关 闭 所 有 数 码 管 并 延 时 DelayMS(1000); } } 8 上海师范大学信息与机电工程学院—倪继锋 《单片机 C 语言程序设计实训 100 例基于 8051 和 PROTEUS 仿真》案例 10 /* 8 只数码管滚动显示数字串 电路如上图 名称:8 只数码管滚动显示数字串 说明:数 码管向左滚动显示 3 个字符构成的数字串 */ #include #include #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) { uchar t; 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=0xff; P0=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 #include #define uchar unsigned char #define uint unsigned int //延时 void DelayMS(uint x) { uchar i; while(x--) for(i=0;i<120;i++); } // 根 据 P1 口 的 按 键 移 动 LED void Move_LED() { if ((P1&0x10)==0) P0=_cror_(P0,1); //K1 else if((P1&0x20)==0) P0=_crol_(P0,1); //K2 else if((P1&0x40)==0) P2=_cror_(P2,1); //K3 else if((P1&0x80)==0) P2=_crol_(P2,1); //K4 } //主程序 void main() { uchar Recent_Key; //最 近 按 键 P0=0xfe; P2=0xfe; P1=0xff; Recent_Key=0xff; while(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 #define uchar unsigned char #define uint unsigned int sbit 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) { uchar i; while(x--) for(i=0;i<120;i++); } //主程序 void main() { P0=0xff; P1=0xff; while(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 分 组控制 LED 11 上海师范大学信息与机电工程学院—倪继锋 《单片机 C 语言程序设计实训 100 例基于 8051 和 PROTEUS 仿真》案例 /* 名称:K1-K4 分组控制 LED 说明:每次按下 K1 时递增点亮一只 LED,全亮时再次 按下则再次循环开始, K2 按下后点亮上面 4 只 LED,K3 按下后点亮下面 4 只 LED, K4 按下后关闭所有 LED */ #include #define uchar unsigned char #define uint unsigned int // 延 时 void DelayMS(uint x) { uchar i; while(x--) for(i=0;i<120;i++); } // 主 程 序 void main() { uchar k,t,Key_State; P0=0xff; P1=0xff; while(1) { t=P1; if(t!=0xff) { DelayMS(10); if(t!=P1) continue; // 取 得 4 位 按 键 值 , 由 模 式 XXXX1111(X 中 有 一 位 为 0 , 其 他 均 为 1) // 变 为 模 式 0000XXXX(X 中有一位为 1,其他均为 0) Key_State=~t>>4; k=0; //检查 1 所在位置,累加 获取按键号 k while(Key_State!=0) { k++; Key_State>>=1; } //根据按键号 k 进行 4 种处理 switch(k) { case 1: if(P0==0x00) P0=0xff; P0<<=1; DelayMS(200); break; case 2: P0=0xf0;break; 12 上海师范大学信息与机电工程学院—倪继锋 《单片机 C 语言程序设计实训 100 例基于 8051 和 PROTEUS 仿真》案例 case 3: case 4: } } } } 14 /* P0=0x0f;break; P0=0xff; K1-K4 控制数码管移位显示 名称:K1-K4 控制数码管移位显示 说明:按下 K1 时加 1 计数并增加显示位, 按下 K2 时减 1 计数并减少显示位, 按下 K3 时清零。 */ #include #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 延 时 Show_Count_ON_DSY() P0=0xff; void DelayMS(uint { i; while(x--) i; uchar { uchar x) for(i=0;i<120;i++); for(i=0;i<8;i++) {
P0=DSY_CODE[Display_Buffer[i]]; P2=DSY_Index[i]; DelayMS(2 本文由 lhlslflbw 贡献 doc 文档可能在 WAP 端浏览体验不佳。建议您优先选择 TXT,或下载源文件到本机查 看。 《单片机 C 语言程序设计实训 100 例基于 8051 和 PROTEUS 仿真》案例 仿真》 《单片机 C 语言程序设计实训 100 例—基于 8051+Proteus 仿真》案例 基础 程序设计 第 01 篇 基础程序设计 01 闪烁的 LED /* 名称:闪烁的 LED 说明:LED 按设定的时间间隔闪烁 */ #include #define uchar unsigned char #define uint unsigned int sbit LED=P1^0; //延时 void DelayMS(uint x) { uchar i; while(x--) { for(i=0;i<120;i++); } } //主程序 void main() { while(1) { LED=~LED; DelayMS(150); } } 02 从左到右的流水灯 /* 名称:从左到右的流水 灯 说明: 接在 P0 口的 8 个 LED 从左到 右循环依 次点亮, 产生走 马灯效 果 */ #include #include #define uchar unsigned char #define uint unsigned int 1 上海师范大学信息与机电工程学院—倪继锋 《单片机 C 语言程序设计实训 100 例基于 8051 和 PROTEUS 仿真》案例 //延时 void DelayMS(uint x) { uchar i; while(x--) { for(i=0;i<120;i++); } } //主程序 void main() { P0=0xfe; while(1) { P0=_crol_(P0,1); //P0 的值向左循环移动 DelayMS(150); } } 03 /* 8 只 LED 左右来回点亮 名称:8 只 LED 左右来回点亮 说明:程序利用循环移位函数 _crol_和_cror_形成来回滚动的效果 */ #include #include #define uchar unsigned char #define uint unsigned int //延时 void DelayMS(uint x) { uchar i; while(x--) { for(i=0;i<120;i++); } } //主程序 void main() { uchar i; 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 #define uchar unsigned char #define uint unsigned int uchar 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 { 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, code Pattern_P2[]= 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfc,0xf9,0xf3,0xe7,0xcf,0x9f,0x3f,0xff, uchar };
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) { uchar i; while(x--) { for(i=0;i<120;i++); } } //主程序 void main() { uchar i; 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 #define uchar unsigned char #define uint unsigned int sbit RED_A=P0^0; //东西向灯 sbit YELLOW_A=P0^1; sbit GREEN_A=P0^2; sbit RED_B=P0^3; // sbit uchar 南 北 向 灯 Flash_Count=0,Operation_Type=1; //闪烁次数,操作类型变量 YELLOW_B=P0^4; GREEN_B=P0^5; sbit 4 上海师范大学信息与机电工程学院—倪继锋 《单片机 C 语言程序设计实训 100 例基于 8051 和 PROTEUS 仿真》案例 //延时 void DelayMS(uint x) { uchar i; 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; break; case 2: //东西向黄灯闪烁,绿灯关闭 DelayMS(300); YELLOW_A=~YELLOW_A;GREEN_A=1; // 闪 烁 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; case 4: // 南 北 向 黄 灯 闪 烁 5 次 DelayMS(300); YELLOW_B=~YELLOW_B;GREEN_B=1; return; Flash_Count=0; Operation_Type=1; } } //主程序 void main() { while(1) Traffic_Light(); } 06 单只数码管循环 显示 0~9 if(++Flash_Count!=10) if(++Flash_Count!=10) return; 5 上海师范大学信息与机电工程学院—倪继锋 《单片机 C 语言程序设计实训 100 例基于 8051 和 PROTEUS 仿真》案例 /* 名称:单只数码管循环显示 0~9 说明:主程序中的循环语句反复将 0~9 的段码送至 P0 口,使数字 0~9 循环显示 */ #include #include #define uchar unsigned char #define uint unsigned int uchar code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}; // 延 时 void DelayMS(uint x) { uchar t; while(x--) for(t=0;t<120;t++); } // 主 程 序 void main() { uchar i=0; P0=0x00; while(1) { /* for(;i<11;i++){ P0=~DSY_CODE[i]; DelayMS(300);} //注:另一方案 */ P0=~DSY_CODE[i]; i=(i+1)%10; DelayMS(300); } } 07 /* 8 只数码管滚动显示单个数字 名称:8 只数码管滚动显示单个数字 说明:数码管从左到右依次滚动显示 0~7,程序 通过每次仅循环选通一只数码 管 */ #include #include #define uchar unsigned char #define code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; void DelayMS(uint x) { uchar // 延 时 unsigned uint int 6 上海师范大学信息与机电工程学院—倪继锋 《单片机 C 语言程序设计实训 100 例基于 8051 和 PROTEUS 仿真》案例 uchar t; while(x--) for(t=0;t<120;t++); } //主程序 void main() { uchar i,wei=0x80; while(1)
{ for(i=0;i<8;i++) { P2=0xff; //关闭显示 wei=_crol_(wei,1); P0=DSY_CODE[i]; //发送数字段 码 P2=wei; //发送位码 DelayMS(300); } } } 08 /* 8 只数码管动态显示多个不同字符 电路 如上图 名称:8 只数码管动态显示多个不同字符 说明:数码管动态扫描显示 0~7。 */ #include #include #define uchar unsigned char #define uint unsigned int uchar code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; // 延 时 void DelayMS(uint x) { uchar t; while(x--) for(t=0;t<120;t++); } // 主 程 序 void main() { uchar i,wei=0x80; while(1) { for(i=0;i<8;i++) { P2=0xff; 7 上海师范大学信息与机电工程学院—倪继锋 《单片机 C 语言程序设计实训 100 例基于 8051 和 PROTEUS 仿真》案例 P0=DSY_CODE[i]; //发送段码 wei=_crol_(wei,1); P2=wei; //发送位码 DelayMS(2); } } } 09 /* 8 只数码管闪烁显示数字串 电路如上图 名称:8 只数码管闪烁显示数字串 说明:数 码管闪烁显示由 0~7 构成的一串数字 本例用动态刷新法显示一串数字,在停止刷新时所有 数字显示消失。 */ #include #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) { uchar t; 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=0xff; P0=DSY_CODE[j]; // 发 送 段 码 P2=DSY_IDX[j]; // 发 送 位 码 DelayMS(2); } } P2=0x00; // 关 闭 所 有 数 码 管 并 延 时 DelayMS(1000); 8 上海师范大学信息与机电工程学院—倪继锋 《单片机 C 语言程序设计实训 100 例基于 8051 和 PROTEUS 仿真》案例 } } 10 /* 8 只数码管滚动显示数字串 电路如上图 名称:8 只数码管滚动显示数字串 说明:数码管向左滚动显示 3 个字符构成的数字串 */ #include #include #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) { uchar t; 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=0xff; P0=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 移位 9 上海师范大学信息与机电工程学院—倪继锋 《单片机 C 语言程序设计实训 100 例基于 8051 和 PROTEUS 仿真》案例 /* 名称:K1-K4 控制 LED 移位 说明:按下 K1 时,P0 口 LED 上移一位; 按下 K2 时,P0 口 LED 下移一位; 按下 K3 时,P2 口 LED 上移一位; 按下 K4 时,P2 口 LED 下移一位; */ #include #include #define uchar unsigned char #define uint unsigned int //延时 void DelayMS(uint x) { uchar i; while(x--) for(i=0;i<120;i++); } // 根 据 P1 口 的 按 键 移 动 LED void Move_LED() { if ((P1&0x10)==0) P0=_cror_(P0,1); //K1 else if((P1&0x20)==0) P0=_crol_(P0,1); //K3 else if((P1&0x80)==0) P2=_crol_(P2,1); //K4 } // 主 程 序 void main() { uchar Recent_Key; // 最 近 按 键 P0=0xfe; //K2 else if((P1&0x40)==0) P2=_cror_(P2,1);
P2=0xfe; P1=0xff; Recent_Key=0xff; while(1) { if(Recent_Key!=P1) { Recent_Key=P1; // 保 存 最近按键 Move_LED(); DelayMS(10); } } } 10 上海师范大学信息与机电工程学院—倪继锋 《单片机 C 语言程序设计实训 100 例基于 8051 和 PROTEUS 仿真》案例 12 /* K1-K4 按键状态显示 按键状态显示 名称:K1-K4 按键状态显示 说明:K1、K2 按下 时 LED 点亮,松开时熄灭, K3、K4 按下并释放时 LED 点亮,再次按下并释放时熄灭; */ #include #define uchar unsigned char #define uint unsigned int sbit 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) { uchar i; while(x--) for(i=0;i<120;i++); } //主程序 void main() { P0=0xff; P1=0xff; while(1) { LED1=K1; LED2=K2; if(K3==0) { while(K3==0); LED3=~LED3; } if(K4==0) { while(K4==0); LED4=~LED4; } DelayMS(10); } } 11 上海师范大学信息与机电工程学院—倪继锋 《单片机 C 语言程序设计实训 100 例基于 8051 和 PROTEUS 仿真》案例 13 /* K1-K4 分组控制 LED 名称:K1-K4 分组控制 LED 说明:每次按下 K1 时递增点亮 一只 LED,全亮时再次按下则再次循环开始, K2 按下后点亮上面 4 只 LED,K3 按下 后点亮下面 4 只 LED,K4 按下后关闭所有 LED */ #include #define uchar unsigned char #define uint unsigned int // 延 时 void DelayMS(uint x) { uchar i; while(x--) for(i=0;i<120;i++); } // 主 程 序 void main() { uchar k,t,Key_State; P0=0xff; P1=0xff; while(1) { t=P1; if(t!=0xff) { DelayMS(10); if(t!=P1) continue; // 取 得 4 位 按 键 值 , 由 模 式 XXXX1111(X 中 有 一 位 为 0 , 其 他 均 为 1) // 变 为 模 式 0000XXXX(X 中有一位为 1,其他均为 0) Key_State=~t>>4; k=0; //检查 1 所在位置,累加 获取按键号 k while(Key_State!=0) { k++; Key_State>>=1; } //根据按键号 k 进行 4 种处理 switch(k) { case 1: if(P0==0x00) P0=0xff; P0<<=1; DelayMS(200); 12 上海师范大学信息与机电工程学院—倪继锋 《单片机 C 语言程序设计实训 100 例基于 8051 和 PROTEUS 仿真》案例 case 2: case 3: case 4: } } } } 14 /* break; P0=0xf0;break; P0=0x0f;break; P0=0xff; K1-K4 控制数码管移位显示 名称:K1-K4 控制数码管移位显示 说明:按下 K1 时加 1 计数并增加显示位, 按下 K2 时减 1 计数并减少显示位, 按下 K3 时清零。 */ #include #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 } 延 时 Show_Count_ON_DSY() P0=0xff; P0=DSY_CODE[Display_Buffe); } } //主程序 void main() { uchar i,Key_NO,Key_Counts=0; void DelayMS(uint { i; while(x--) i; uchar { uchar x) for(i=0;i<120;i++); for(i=0;i<8;i++) { 13 上海师范大学信息与机电工程学院—倪继锋 《单片机 C 语言程序设计实训 100 例基于 8051 和 PROTEUS 仿真》案例 P0=0xff; P1=0xff; P2=0x00; while(1) { Show_Count_ON_DSY(); P1=0xff; Key_NO=P1; //P1 口 按 键 状 态 分 别 为 K1-0xfe , K2-0xfd,K3-0xfb switch(Key_NO) { case 0xfe: Key_Counts++; if(Key_Counts>8) Key_Counts=8; Display_Buffer[Key_Counts-1]=Key_Counts; break; case 0xfd: if(Key_Counts>0)Display_Buffer[--Key_Counts]=10; break; case 0xfb:
分享到:
收藏