文库帮手网 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: