单片机C语言范例(全面)和Proteus仿真
- 格式:doc
- 大小:1.86 MB
- 文档页数:76
最讨厌收费文档,还收费那么高01 闪烁的LED/* 名称:闪烁的LED说明:LED按设定的时间间隔闪烁*/#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit 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<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int//延时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<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int//延时void DelayMS(uint x>{uchar i。
while(x-->{for(i=0。
51单片机C语言实例(350例)Proteus仿真和代码都有51单片机C语言实例(400例)所有实例程序均经测试过,适合新手学习。
1-IO输出-点亮1个LED灯方法1 10-LED循环左移100-24c02记忆开机次数101-24c02存储上次使用中状态102-DS1302 时钟原理103-DS1302可调时钟104-DS1302时钟串口自动更新时间105-1602液晶显示DS1302时钟106-字库ST7920 12864液晶基础显示107-按键 12864显示108-PCF8591 1路AD数码管显示109-PCF8591 4路AD数码管显示11-LED循环右移110-PCF8591 DA输出模拟111-PCF8591 输出锯齿波112-PCF8591 1602液晶显示113-串口通讯114-串口通讯中断应用115-RS485基本通讯原理116-红外接收原理117-红外解码数码管显示118-红外解码1602液晶显示119-红外发射原理12-查表显示LED灯120-红外收发测试121-双红外发射避障原理测试122-1个18B20 温度传感器数码管显示123-1个18b20温度传感器1602液晶显示124-多个18b20温度传感器1602液晶显示125-超温报警测试126-温度可调上下限1602126-温度可调上下限1602显示127-PS2键盘输入1602液晶显示128-双色点阵1种颜色显示测试129-双色点阵2种颜色显示测试13-双灯左移右移闪烁130-双色点阵显示特定图形131-双色点阵交替图形显示132-双色点阵双色交替动态显示133-热敏电阻测试数码管显示134-光敏电阻测试数码管显示135-自动调光测试136-串转并数字芯片测试137-非门数字芯片测试138-电子琴139-实用99分钟倒计时器14-花样灯140-外部频率测试141-定时做普通时钟可调142-1602液晶显示的密码锁143-实用密码锁144-1602液晶显示的计算器145-秒表146-串口测温电脑显示147-交通灯测试148-点阵模拟电梯上行下行149-点阵流动广告模拟15-PWM调光150-综合测试程序151-12位AD_DS1621与12864液晶152-闪烁灯一153-闪烁灯二154-流水灯A155-51单片机12864大液晶屏proteus仿真156-流水灯B157-数码管显示158-12864LCD显示计算器键盘按键实验159-数码管显示(锁存器)16-共阳数码管静态显示160-数码管动态显示161-数码管滚动显示162-数码管字符显示163-独立按键164-矩阵键盘165-矩阵键盘(LCD)166-用DS1302与12864LCD设计的可调式中文电子日历167-定时器的使用(方式1)168-12864LCD图形滚动演示169-用PG12864LCD设计的指针式电子钟17-1个共阳数码管显示变化数字170-定时器的使用(方式2)171-外部中断的使用172-定时器和外部中断173-开关控制12864LCD串行模式显示174-点阵显示175-液晶1602显示176-12864带字库测试程序177-串行12864显示178-遥控键值解码-12864LCD显示179-液晶12864并行18-单个数码管模拟水流180-液晶12864并行2181-串口发送试验182-串口接收试验183-串口接收(1602)184-蜂鸣器发声185-直流电机调速186-蜂鸣器间断发声187-lcd-12864应用188-继电器控制189-直流电机调速19-按键控制单个数码管显示190-步进电机191-存储AT24C02192-PCF8591T AD实验193-PCF8591T芯片DA实验194-温度采集DS18B20195-EEPROM_24C02196-12864LCD显示24C08保存的开机画面197-红外解码198-12864LCD显示EPROM2764保存的开机画面199-时钟DS1302(LCD)2-IO输出-点亮1个LED灯方法220-单个数码管指示逻辑电平200-宏晶看门狗201-SD卡202-秒表203-普通定时器时钟204-彩屏控制205-彩屏图片显示206-12864+DS1302时钟+18B20温度计207-12864测试程序208-12864串行驱动演示209-12864生产厂程序21-8位数码管显示其中之一210-12864中文显示测试211-LCD12864212-12864M液晶显示(有字库)程序(汇编)213-超声波测距LCD12864显示214-红外遥控键值解码12864液晶显示(汇编语言)215-用DS1302与12864LCD设计的可调式中文电子日历216-中文12864217-中文12864LCD显示红外遥控解码实验218-IO端口输出219-IO端口输入22-8位数码管静态显示其中之二220-流水灯221-数码管显示223-独立按键224-独立按键去抖动225-定时器0226-定时器1227-定时器2228-外部中断0电平触发229-外部中断0边沿触发23-8位数码管动态扫描显示230-外部中断1231-矩阵键盘232-液晶LCM1602233-LCD1602动态显示234-EEPROM24c02235-开机次数记忆236-红外解码LCD1602液晶显示237-红外解码数码管显示238-喇叭239-液晶背光控制24-8位数码管动态扫描原理演示240-与电脑串口通信241-步进电机242-字库LCD12864液晶测试243-液晶数码综合显示244-99秒计时245-99倒计时246-抢答器247-PWM调光248-LED点阵249-直流电机调速250-按键计数器251-秒表252-数码管移动253-花样灯254-红绿灯255-音乐播放256-红外收发演示257-普通定时器时钟258-继电器控制259-ps2键盘LCD1602液晶显示26-9累加260-RTC实时时钟DS1302液晶显示261-单线温度传感器18b20262-串口测温263-带停机步进电机正反转264-步进电机正反转265-AD_DA_PCF8591266-液晶AD_DA_PCF8591267-秒手动记数268-功能感受269-流水登27-99累加270-点亮一个二极管271-用单片机控制一个灯闪烁272-将P1口状态送入P0、P2、P3273-P3口流水灯274-通过对P3口地址的操作流水点亮8位LED 275-用不同数据类型控制灯闪烁时间276-用P0口、P1 口分别显示加法和减法运算结果277-用P0、P1口显示乘法运算结果278-用P1、P0口显示除法运算结果279-用自增运算控制P0口8位LED流水花样28-999累加280-用P0口显示逻辑与运算结果281-用P0口显示条件运算结果282-用P0口显示按位异或运算结果283-用P0显示左移运算结果284-万能逻辑电路实验285-用右移运算流水点亮P1口8位LED286-用if语句控制P0口8位LED的流水方向287-用swtich语句的控制P0口8位LED的点亮状态288-用for语句控制蜂鸣器鸣笛次数289-包含单片机寄存器的头文件29-9999累加290-用do-while语句控制P0口8位LED流水点亮291-用字符型数组控制P0口8位LED流水点亮292-用P0口显示字符串常量293-用P0 口显示指针运算结果294-用指针数组控制P0口8位LED流水点亮295-用数组的指针控制P0 口8 位LED流水点亮296-用P0 、P1口显示整型函数返回值297-用有参函数控制P0口8位LED流水速度298-用数组作函数参数控制流水花样299-用数组作函数参数控制流水花样3-IO输出-点亮多个LED灯方法130-9累减300-用函数型指针控制P1口灯花样301-用指针数组作为函数的参数显示多个字符串302-字符函数ctype.h应用举例303-内部函数intrins.h应用举例304-标准函数stdlib.h应用举例305-字符串函数string.h应用举例306-宏定义应用举例307-文件包应用举例308-条件编译应用举例309-用定时器T0查询方式P2口8位控制LED闪烁31-99累减310-用定时器T1查询方式控制单片机发出1KHz音频311-将计数器T0计数的结果送P1口8位LED显示311-用定时器T0的中断控制1位LED闪烁312-用定时器T0的中断实现长时间定时313-用定时器T1中断控制两个LED以不同周期闪烁314-用计数器T1的中断控制蜂鸣器发出1KHz音频315-用定时器T0的中断实现渴望主题曲的播放316-输出50个矩形脉冲317-输出正脉宽为250微秒的方波318-用定时器T0控制输出高低宽度不同的矩形波319-用外中断0的中断方式进行数据采集32-999累减320-输出负脉宽为200微秒的方波321-方式0控制流水灯循环点亮322-数据发送程序323-数据接收程序324-单片机向PC发送数据325-单片机接收PC发出的数据326-用LED数码显示数字5327-用LED数码显示器循环显示数字0~9328-用数码管慢速动态扫描显示数字1234329-用LED数码显示器伪静态显示数字123433-9999累减330-用数码管显示动态检测结果331-数码秒表设计332-数码时钟设计333-用LED数码管显示计数器T0的计数值334-静态显示数字“59”335-无软件消抖的独立式键盘输入实验336-软件消抖的独立式键盘输入实验337-CPU控制的独立式键盘扫描实验338-定时器中断控制的独立式键盘扫描实验339-独立式键盘控制的4级变速流水灯34-显示小数点340-独立式键盘的按键功能扩展:以一当四341-独立式键盘调时的数码时钟实验342-独立式键盘控制步进电机实验343-矩阵式键盘按键值的数码管显示实验344-矩阵式键盘按键音345-简易电子琴346-矩阵式键盘实现的电子密码锁347-用LCD显示字符'A'348-用LCD循环右移显示Welcome to China 349-将数据0x0f写入AT24C02再读出送P1口显示35-数码管消隐350-液晶时钟设计36-数码管递加递减带消隐37-数码管左移38-数码管右移38-数码管右移139-数码管右移24-IO输出-点亮多个LED灯方法240-数码管循环左移41-数码管循环右移41-数码管循环右移142-数码管循环右移243-数码管闪烁44-数码管局部闪烁45-定时器046-定时器147-定时器248-产生1mS方波49-产生200mS方波5-闪烁1个LED50-产生多路不同频率方波51-1个独立按键控制LED52-1个独立按键控制LED状态转换53-2按键加减操作53-2按键加减操作数码管显示54-多位数按键加减(闪烁)54-多位数按键加减(闪烁)数码管显示55-多位数按键加减(不闪烁)55-多位数按键加减(不闪烁)数码管显示56-定时器扫描数码管(不闪烁)57-按键长按短按效果58-抢答器59-独立按键依次输入数据6-不同频率闪烁1个LED灯60-按键从右至左输入61-8位端口检测8独立按键62-矩阵键盘行列扫描63-矩阵键盘反转扫描64-矩阵键盘中断扫描65-矩阵键盘密码锁66-矩阵键盘简易计算器67-外部中断0电平触发68-外部中断1电平触发69-外部中断0下降沿触发7-不同频率闪烁多个LED灯70-外部中断1下降沿触发71-T0外部计数输入72-T1外部计数输入73-看门狗溢出测试74-按键喂狗75-喇叭发声原理76-警车声音77-救护车声音78-喇叭滴答声79-报警发声8-8位LED左移80-消防车警报81-音乐播放82-步进电机转动原理83-步进电机正反转84-步进电机按键控制85-步进电机转速数码管显示86-双步进电机综合控制86-步进电机调速原理87-双步进电机综合控制87-步进电机综合控制87-步进电机调速原理88-直流电机按键控制89-直流电机调速控制9-8位LED右移90-继电器控制原理91-双继电器模拟洗衣机电机控制92-1602液晶静态显示93-1602液晶动态显示94-1602液晶滚动显示95-1602液晶移动显示96-1602液晶按键输入显示97-2402存储1个数据98-24c02存储多个数据99-24c02存储花样流水灯。
《单片机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){uchar i;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 int//延时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<reg51.h>#include<intrins.h>#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){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,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此后变红灯,东西向变绿灯,如此重复。
《基于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){uchar i;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 int//延时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<reg51.h>#include<intrins.h>#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){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,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff};//延时void DelayMS(uint x){uchar i;while(x--){for(i=0;i<120;i++);}}//主程序{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此后变红灯,东西向变绿灯,如此重复。
《单片机C说话程序设计实训100例—基于8051+Proteus仿真》案例第 01 篇基本程序设计01 闪耀的LED/* 名称:闪耀的LED解释:LED按设定的时光距离闪耀*/#include<reg51.h>#define uchar unsignedchar#define uint unsigned intsbit 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<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int//延时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<reg51.h>#include<intrins.h>#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){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,0 xff,0xff,0xff,0xe7,0xdb,0xbd,0x7e,0xbd,0xdb,0xe7,0xff,0xe7,0xc3,0x81,0x00,0x81,0 xc3,0xe7,0xff,0xaa,0x55,0x18,0xff,0xf0,0x0f,0x00,0xff,0xf8,0xf1,0xe3,0xc7,0x8f,0 x1f,0x3f,0x7f,0x7f,0x3f,0x1f,0x8f,0xc7,0xe3,0xf1,0xf8,0xff,0x00,0x00,0xff,0xff,0 x0f,0xf0,0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff,0xff,0xff,0xff,0xff,0 xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xbf,0xdf,0xef,0xf7,0 xfb,0xfd,0xfe,0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0 x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xc0,0xe0,0xf0,0 xf8,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,0 x9f,0x3f,0xff,0xe7,0xdb,0xbd,0x7e,0xbd,0xdb,0xe7,0xff,0xe7,0xc3,0x81,0x00,0x81,0 xc3,0xe7,0xff,0xaa,0x55,0x18,0xff,0xf0,0x0f,0x00,0xff,0xf8,0xf1,0xe3,0xc7,0x8f,0 x1f,0x3f,0x7f,0x7f,0x3f,0x1f,0x8f,0xc7,0xe3,0xf1,0xf8,0xff,0x00,0x00,0xff,0xff,0 x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfd,0xfb,0xf7,0xef,0 xdf,0xbf,0x7f,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0 xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfc,0xf8,0xf0,0xe0,0 xc0,0x80,0x00,0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff,0xff,0xff,0xff,0xff,0 xff,0xff,0xff,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<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; //闪耀次数,操纵类型变量//延时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;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;case 4: //南北向黄灯闪耀5次DelayMS(300);YELLOW_B=~YELLOW_B;GREEN_B=1;if(++Flash_Count!=10) return;Flash_Count=0;Operation_Type=1;}}//主程序void main(){while(1) Traffic_Light();}06 单只数码管轮回显示0~9/* 名称:单只数码管轮回显示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){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<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){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<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){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;P0=DSY_CODE[i]; //发送段码wei=_crol_(wei,1);P2=wei; //发送位码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){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);}}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){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上移一位;按下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){uchar i;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_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 按键状况显示/* 名称:K1-K4 按键状况显示解释:K1.K2按下时LED点亮,松开时熄灭,K3.K4按下并释放时LED点亮,再次按下并释放时熄灭; */#include<reg51.h>#define ucharunsigned char#define uintunsigned 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){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/* 名称:K1-K4 分组掌握LED解释:每次按下K1时递增点亮一只LED,全亮时再次按下则再次轮回开端,K2按下后点亮上面4只LED,K3按下后点亮下面4只LED,K4按下后封闭所有LED*/#include<reg51.h>#define ucharunsigned char#define uintunsigned 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地点地位,累加获取按键号kwhile(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;case 3: P0=0x0f;break;case 4: P0=0xff;}}}}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){uchar i;while(x--)for(i=0;i<120;i++);}void Show_Count_ON_DSY(){uchar i;for(i=0;i<8;i++){P0=0xff;P0=DSY_CODE[Display_Buffer[i]];P2=DSY_Index[i];DelayMS(2);}}//主程序void main(){uchar i,Key_NO,Key_Counts=0;P0=0xff;P1=0xff;P2=0x00;while(1){Show_Count_ON_DSY();P1=0xff;Key_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_Counts;break;case 0xfd: if(Key_Counts>0)Display_Buffer[--Key_Counts]=10;break;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){uchar i;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=0xff;P0=DSY_CODE[Num_Buffer[i]];P2=j;DelayMS(1);}}//主程序void main(){uchar i;P0=0xff;P1=0xff;P2=0x00;Key_Code=0xff;while(1){Show_Counts_ON_DSY();P1=0xff;Key_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++;break;case 0xfd: if(Key_Counts>0) Key_Counts--;break;case 0xfb: Key_Counts=0;}Key_Code=0xff;}}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){uchar i;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=0xfe; //行扫描码初值for(k=0;k<4;k++) //对4行分离进行扫描{P1=sCode;if((P1&0xf0)!=0xf0){kCode=~P1;for(i=0;i<16;i++) //查表得到按键序号并返回if(kCode==KeyCodeTable[i])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(); //扫描键盘获取按键序号KeyNoif(KeyNo!=-1){P2_LED=0xff;P3_LED=0xff;for(i=0;i<=KeyNo;i++) //键值越大,点亮的LED越多{if(i<8)P3_LED>>=1;elseP2_LED>>=1;}P3=P3_LED; //点亮条形LEDP2=P2_LED;}}}17 数码管显示4X4矩阵键盘按键号/* 名称:数码管显示4X4矩阵键盘按键号解释:按下随意率性键时,数码管都邑显示其键的序号,扫描程序起首断定按键产生在哪一列,然后依据所产生的行附加不合的值,从而得到按键的序号.*/#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){uchar i;while(x--) for(i=0;i<120;i++);}//矩阵键盘扫描void Keys_Scan(){uchar Tmp;P1=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;break;case 2: KeyNo=1;break;case 4: KeyNo=2;break;case 8: KeyNo=3;break;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;break;case 2: KeyNo+=4;break;case 4: KeyNo+=8;break;case 8: KeyNo+=12;}}//蜂鸣器void Beep(){uchar i;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;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){uchar t;while(ms--)for(t=0;t<120;t++);}//主程序void main(){P1=0xff;RELAY=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 char#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){uchar t;while(ms--)for(t=0;t<120;t++);}//主程序void main(){uchar i,m,Num;P0=0xff;P2=0xff;while(1){m=0xfe;Num=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;//发声函数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){uchar t;while(x--) for(t=0;t<120;t++); }//按周期t发音void Play(uchar t){uchar i;for(i=0;i<100;i++){BEEP=~BEEP;DelayMS(t);}BEEP=0;}void main(){P1=0xff;BEEP=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){uchar t;while(x--) for(t=0;t<120;t++);}//播放函数void PlayMusic(){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个数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{Count++; //计数值递增}。
创作编号:GB8878185555334563BT9125XW创作者:凤呜大王*《单片机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){uchar i;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 int//延时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);创作编号:GB8878185555334563BT9125XW创作者:凤呜大王*}}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){uchar i;while(x--){for(i=0;i<120;i++);}}//主程序void main(){uchar i;P2=0x01;while(1){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,创作编号:GB8878185555334563BT9125XW创作者:凤呜大王*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,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此后变红灯,东西向变绿灯,如此重复。
《基于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){uchar i;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 intvoid 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<reg51.h>#include<intrins.h>#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){{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 unsignedchar#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, 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此后变红灯,东西向变绿灯,如此重复。
单片机实验:说明,以下是我整理了一些在学习单片机的过程中所做的一些典型的实验,所有程序均用C 语言编写,为了方便,在仿真时电路能省的都被省掉了(比如省去晶振用了外部时钟)。
程序不一定很优化,也不一定完全没有错误,仅供大家参考。
希望大家一块学习!!!!第一:I/O操作篇实验一.闪烁的灯图:程序:#include "AT89X51.H"void delay02s();void main(void){while(1){P1_0=0; //P1.0=0 led点亮delay02s(); //延时0.2sP1_0=1; //P1.0=1 led熄灭delay02s(); //延时0.2s}}void delay02s(void) //延时0.2s的函数{unsigned char i,j,k;for(j=20;j>0;j--)for(i=20;i=0;i--)for(k=248;k=0;k--);}实验二:模拟开关程序:#include "AT89X51.H"void main(){while(1){if (P1_7==0) P1_0 = 0;//key按下P1_7=0,led点亮else if ( P1_7==1) P1_0 = 1;//key弹起P1_7=1,led熄灭}}实验三: 多路开关程序:#include "AT89X51.H"void main(){while(1){P1_0 = P1_7;P1_1 = P1_6;P1_2 = P1_5;P1_3 = P1_4;}}实验四:跑马灯(一)图:程序://单一灯的左移右移//八个发光二极管L1-L8分别接在单片机的P1.0-P1.7接口上//输出“0”时,发光二极管亮,开始时P1.0→P1.1→P1.2→P1.3→┅→P1.7→P1.6→┅→P1.0亮,重复循环。
#include "AT89X51.H"void delay02s();void main(){unsigned int a;while (1){P1=0xfe;delay02s();for(a=7;a>0;a--)//右移{P1=(P1<<1)+1;delay02s();}for(a=6;a>0;a--)//左移{P1=(P1>>1)+0x80;delay02s();}}}void delay02s(){unsigned int i,j,k;for(i=0;i<20;i++)for(j=0;j<20;j++)for(k=0;k<248;k++);}实验五:跑马灯(二、查表方式) 图:程序:#include "AT89X51.H"void delay02s();void main(){unsigned char table[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f, //第一次,右移一行0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f, //第二次,右移一行0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe, //第一次,左移一行0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe, //第二次,左移一行0x00,0xff,0x00,0xff}; //闪烁两次unsigned char a;while(1){ for (a=0;a<35;a++){P1=table[a];delay02s();}}}void delay02s(){unsigned char i,j,k;for(i=20;i>0;i--)for(j=20;j>0;j--)for(k=248;k>0;k--);}实验六:led计数程序:#include <AT89X51.H>void delay02s();void main(){unsigned char code table[]={0x40,0xf9,0x24,0x30,0x19,0x12,0x03,0xf8,0x00,0x18}; unsigned char disp;while(1){for(disp=0;disp<10;disp++){P0=table[disp];delay02s();}}}void delay02s(){ unsigned char i,j,k;for(i=20;i>0;i--)for(j=20;j>0;j--)for(k=248;k>0;k--);}实验七:二进制计数程序://用四个发光二极管模拟计数点击开关次数. #include "AT89X51.H"void delay10ms();void main(){P0=0xff;while(1){/*//////////////////////////////////////////////if(P0_7==1) //按键按下{delay10ms();if(P0_7==0) //按键弹起,此时灯亮.P0=P0-1;}//////////////////////////////////////////////*///////////////////////////////////////////////if(P0_7==0) //按键弹起{delay10ms();if(P0_7==1) //按键按下,此时灯亮.P0=P0-1;}//////////////////////////////////////////////}}void delay10ms(){ unsigned char i,j;for(i=20;i>0;i--)for(j=248;j>0;j--);}验八:一键多用程序:#include "AT89X51.H"void delay10ms();void delay02s();void main(){unsigned char id=0;while(1){ if(P1_7==0) //按键弹起{delay10ms();if(P1_7==0){id++;if(id==4) id=0;while(P1_7==0);}}switch(id){ case 0:P0_0=~P0_0;delay02s();break;case 1:P0_1=~P0_1;delay02s();break;case 2:P0_2=~P0_2;delay02s();break;case 3:P0_3=~P0_3;delay02s();break;}}}void delay10ms() {unsigned char i,k;for(i=20;i>0;i--)for(k=248;k>0;k--);}void delay02s() {unsigned char j;for(j=20;j>0;j--)delay10ms();}实验九:00~99计数程序://00~99计数器#include "AT89X51.H"void delay1s();void main(){unsigned char code table[]={0xf9,0x24,0x30,0x19,0x12,0x03,0xf8,0x00,0x18,0x40}; unsigned int high=9;unsigned int light=9;P0=table[light];P2=table[high];delay1s();while(1){for(light=0;light<10;light++){if(light==9) high++;if(high==10) high=0;P0=table[light];P2=table[high];delay1s();}}}void delay1s(){unsigned char i,j,k;for(i=82;i>0;i--)for(j=20;j>0;j--)for(k=248;k>0;k--);}实验十:可预置数加减计数器程序://K1(P3_7)加计数.K2(P3_6)头减计数. #include "AT89X51.H"void delay02s();void delay10ms();void main(){P0=P2;while(1){if(P3_6==0){delay10ms();if(P3_6==0){P0++;delay02s();}}if(P3_7==0){delay10ms();if(P3_7==0){P0--;delay02s();}}}}void delay02s() {unsigned char j;for(j=20;j>0;j--) delay10ms();}void delay10ms() {unsigned char i,k; for(i=20;i>0;i--)for(k=248;k>0;k--); }实验十一:图:共阴LED程序://开关按下时显示"12345",开关弹起时显示"HELLO".#include <AT89X51.H>void delay01ms();void main(void){unsigned char code table1[]={0xf9,0x24,0x30,0x19,0x12,0xff,0xff,0xff}; unsigned char code table2[]={0x09,0x06,0xc7,0xc7,0x40,0xff,0xff,0xff}; unsigned char i;while(1){P2=0xfe;if(P1_0==0){delay01ms();if(P1_0==0)for(i=0;i<8;i++){P0=table1[i];P2=(P2<<1)+1;}}else if(P1_0==1){delay01ms();if(P1_0==1)for(i=0;i<8;i++){P0=table2[i];P2=(P2<<1)+1;}}}}void delay01ms() {unsigned char a,b;for(a=4;a>0;a--)for(b=248;b>0;b--);}实验十二、4*4键盘图:程序:#include "AT89X51.H"void delay10ms();void main(){unsigned char key;unsigned char table[]={0x40,0xf9,0x24,0x30,0x19,0x12,0x03,0xf8,0x00,0x18,0x08,0x00,0x46,0x40,0x06,0x0e, 0xff}; while(1){P0=0xff;P3=0xff;P3_4=0;key=P3&0x0f;if(key!=0x0f){delay10ms();key=P3&0x0f;if(key!=0x0f){switch(key){case 0x0e: key=0;break;case 0x0d: key=1;break;case 0x0b: key=2;break;case 0x07: key=3;break;}}P0=table[key];key=key&0x0f;while(key!=0x0f){key=P3;key=key&0x0f;}}P3=0xff;P3_5=0;key=P3&0x0f;if(key!=0x0f){delay10ms();key=P3&0x0f;if(key!=0x0f){switch(key){case 0x0e: key=4;break;case 0x0b: key=6;break;case 0x07: key=7;break;}}P0=table[key];key=key&0x0f;while(key!=0x0f){key=P3;key=key&0x0f;}}P3=0xff;P3_6=0;key=P3&0x0f;if(key!=0x0f){delay10ms();key=P3&0x0f;if(key!=0x0f){switch(key){case 0x0e: key=8;break;case 0x0d: key=9;break;case 0x0b: key=10;break;case 0x07: key=11;break;}}P0=table[key];key=key&0x0f;while(key!=0x0f){key=P3;key=key&0x0f;}}P3=0xff;P3_7=0;key=P3&0x0f;if(key!=0x0f){delay10ms();key=P3&0x0f;if(key!=0x0f){switch(key)case 0x0d: key=13;break;case 0x0b: key=14;break;case 0x07: key=15;break;}}P0=table[key];key=key&0x0f;while(key!=0x0f){key=P3;key=key&0x0f;}}}}void delay10ms(){unsigned int i,k;for(i=20;i>0;i--)for(k=20;k>0;k--);}实验十三lcd原理图:程序:#include "AT89X52.H"#define lcd_rs P3_2#define lcd_rw P3_1#define lcd_en P3_0#define lcd_data P1void writecmd(int a) //写控制字{int i;for(i=2000;i>0;i--);lcd_rs=0;lcd_rw=0;lcd_en=1;lcd_data=a;lcd_en=0;}void writedata(char lcddata) //显示字符{int i;for(i=2000;i>0;i--);lcd_rs=1;lcd_rw=0;lcd_en=1;lcd_data=lcddata;lcd_en=0;}void writestring(char addr,char *str) //显示字符串{writecmd(addr);do{ writedata(*str);str++;}while(*str!='\0');}//=====lcd初始化================================void lcdinit(){writecmd(0x38);//8位,两行,5X7字型(控制字"001 d1 d2 d3 x x" , 其中d1:数据长度选择(8位或4位),d2:单双列选择,d3:5X10或5X7字型选择)writecmd(0x08); //关闭显示屏writecmd(0x01); //清除显示屏writecmd(0x0c); //开启显示屏,游标,与闪烁(控制字"00001 d1 d2 d3",其中d1:屏幕开/关, d2:光标开/关, d3:闪烁开/关)writecmd(0x06); //地址递增(AC+1)}//==============================================void main(){char disp1[]={" QQ:393725829 "};char disp2[]={" "};lcdinit();while(1){writestring(0x80,disp1);writestring(0xc0,disp2);}}。
以下是一个基于8051单片机和Proteus仿真环境的C语言程序设计实例:实例1:点亮LED灯
在这个例子中,我们将使用C语言编写一个简单的程序来控制8051单片机的一个I/O引脚,使其驱动一个LED灯。
c代码:
要使用Proteus进行仿真,你需要按照以下步骤操作:
1. 打开Proteus软件,创建一个新的设计工程。
2. 在元件库中搜索并添加相应的8051单片机型号(如AT89C51)和LED 元件到工作区。
3. 根据实际硬件连接,正确配置单片机的引脚和LED的连接。
4. 右键单击单片机元件,选择“Edit Component”打开编辑窗口。
5. 在“Program File(s)”区域,点击右侧的浏览按钮,选择你的C语言源文件(如上述的main.c)。
6. 点击“OK”关闭编辑窗口,然后点击工具栏上的“Play”按钮开始仿真。
在仿真过程中,你应该能看到LED灯被点亮,这表明你的C语言程序已经在Proteus环境中成功运行。
以上只是一个基础的例子,实际的"单片机C语言程序设计实例100例--基于8051+Proteus仿真"会包含更复杂和多样化的应用场景,包括定时器/计数器
应用、中断处理、串口通信、ADC/DAC转换、液晶显示等等。
每个实例都会详细介绍程序设计思路、代码实现以及如何在Proteus中进行仿真调试。
通过这些实例的学习和实践,你可以逐步掌握8051单片机的C语言编程技巧和Proteus仿真环境的使用方法。
单片机C语言程序设计实训100例--基于8051+PROTEUS仿真1单片机C语言程序设计实训100例—基于8051+Proteus仿真》案例目录第一篇基础程序设计 (1)01 闪烁的LED (1)02 从左到右的流水灯 (1)03 8只LED左右来回点亮 (2)04 花样流水灯 (3)05 LED模拟交通灯 (4)06 单只数码管循环显示0~9 (5)07 8只数码管滚动显示单个数字 (6)08 8只数码管动态显示多个不同字符 (7)09 8只数码管闪烁显示数字串 (8)10 8只数码管滚动显示数字串 (9)11 K1-K4 控制LED移位 (10)12 K1-K4 按键状态显示 (11)13 K1-K4 分组控制LED (12)14 K1-K4 控制数码管移位显示 (13)15 K1-K4 控制数码管加减演示 (14)16 4X4矩阵键盘控制条形LED显示 (16)17 数码管显示4X4矩阵键盘按键号 (17)18 开关控制LED (19)19 继电器控制照明设备 (20)20 数码管显示拨码开关编码 (21)21 开关控制报警器 (22)22 按键发音 (22)23 播放音乐 (23)24 INT0中断计数 (24)25 外部INT0中断控制LED (26)26 INT0及INT1中断计数 (26)27 定时器控制单只LED (28)28 TIMER0控制流水灯 (29)29 定时器控制4个LED滚动闪烁 (30)30 T0控制LED实现二进制计数 (31)31 TIMER0与TIMER1控制条形LED (31)。
01 闪烁的LED/* 名称:闪烁的LED说明:LED按设定的时间间隔闪烁*/#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit 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<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int//延时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<reg51.h>#include<intrins.h>#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){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,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<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; //闪烁次数,操作类型变量//延时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;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;case 4://南北向黄灯闪烁5次DelayMS(300);YELLOW_B=~YELLOW_B;GREEN_B=1;if(++Flash_Count!=10) return;Flash_Count=0;Operation_Type=1;}}//主程序void main(){while(1) Traffic_Light();}06 单只数码管循环显示0~9/* 名称:单只数码管循环显示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){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<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){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。