单片机实验报告-流水灯-双机通信-交通灯-定时时钟
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{
aa=0xfe;
for(a=8;a>0;a--)
{
P2=aa;
aa=_crol_(aa,1);
delay(500);
}
bb=0xfb;
P2=0xff;//熄灭循环后亮着的
for(b=4;b>0;b--)
{
P3=bb;
bb=_crol_(bb,1);
delay(500);
}//D12保留发亮
flag+=3;//退出小循环,只亮一次,增大按键扫描频率
if(fen_gewei==10)
{
fen_gewei=0;
fen_shiwei++;
if(fen_shiwei==6)
fen_shiwei=0;
}
}
}
}
display(fen_shiwei,fen_gewei,miao_shiwei,miao_gewei);
}
void count_down()//倒计时程序
#ifndef _led_h
#define _led_h
#define uint unsigned int
#define uchar unsigned char
uchar i,j,a,b,c,d;
uchar flag=0;//亮灯判断标志
uchar aa,bb,cc,dd,ss;
sbit H1=P3^6;
2,灯闪烁三次
3,流水灯正转
4,流水灯反转
函数说明:
yanshi():演示程序
dengss():闪烁程序
right():正转程序
left(): 反转程序
scankey():按键扫描
***********************************************************************************/
}
void left()
{
cc=0xdf;
for(c=4;c>0;c--)
{
P3=cc;
cc=_cror_(cc,1);
delay(500);
}
P3=0xff;//熄灭D9
dd=0x7f;
for(d=8;d>0;d--)
{
P2=dd;
dd=_cror_(dd,1);
delay(500);
}//D1保留发亮
flag+=3;//退出小循环,只亮一次,增大按键扫描频率
}
void scankey()
{
H1=0;
if(key1==0)
{
delay(10);
if(key1==0)
{
flag=0;
while(!key1);//等待按键释放
}
}
if(key2==0)
{
delay(10);
if(key2==0)
{
flag=1;
void init_0() //初始化,设置50毫秒定时
{
TMOD=0X01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
}
void timer_0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
工程说明:此工程主要完成以下任务:
1.数码显示
2.按键扫描
3.正常时钟显示
4.倒计时
5.定时中断
主要函数名说明:
void delay(uint);//1ms延时程序
void init_0();//定时中断初始化
void scankey();//按键扫描//是时钟暂停与开始,时间调整,FLAG调整
void dengss(); //灯闪烁
实验一流水灯实验
一、实验目的
1)简单I/O引脚的输出
2)掌握软件延时编程方法
3)简单按键输入捕获判断
二、实验实现的功能
1)开机是点亮12发光二极管,闪烁三下
2)按照顺时针循环依次点亮发光二极管
3)通过按键将发光二极管的显示改为顺逆时针方式
三、系统硬件设计
流水灯原理图
四、系统软件设计
五、实验过程中遇到的问题及解决方法
display(8,8,8,8);//操作前显示数字8888
scankey();
break;
case 1:
clock();
scankey();
break;
case 2:
count_down();
scankey();
break;
}
}
}
#ifndef _dingshi_shuma_
#define _dingshi_shuma_
void init_0();//定时中断初始化
void scankey();//按键扫描
void dengss(); //灯闪烁
void clock();//正常时钟
void count_down();//倒计时时钟
void display(uchar,uchar,uchar,uchar); //数码显示
#define uint unsigned int
#define uchar unsigned char
#define deport1 P1 //定义数码管段选数据入口
#define deport0 P0 //定义按键选选择数据入口
uchar num,FLAG=0,ss;
extern uchar fen_shiwei=0,fen_gewei=0,miao_shiwei=0,miao_gewei=0;
num++;
}
void delay(uint x)
{
uchar i,j;
for (i=110;i>0;i--)
for(j=x;j>0;j--);
}
void dengss()
{
for(ss=3;ss>0;ss--)
{
P2=0;
P3=0xc3;
delay(1000);
P2=0xff;
P3=0xff;
delay(1000);
while(!key2);//等待按键释放
}
}
if(key3==0)
{
delay(10);
if(key3==0)
{
flag=2;
while(!key3);//等待按键释放
}
}
}
实验二定时器或实时时钟实验
一、实验目的
1)数码管动态显示技术
2)定时器的应用
3)按键功能定义
二、实验实现的功能
1)通过按键可以设定定时时间,启动定时器,定时时间到,让12个发光二极管闪烁,完成定时器功能。
解决方案:利用一个按键,显示一次。并加入按键释放,防止误动作。
指导老师签字:
日期:
实验一程序:
/**********************************************************************************
工程说明: 本工程主要完成了一下功能:
1,复位后演示所有功能
数码管显示过程中:
a)函数编写好后调用提示:uncalled segment ,ignored for overplay.
原因:有函数未调用,可是我已经调用所有函数,后来检查一段时间后发现,count_down()被我写成了count_dowm().
b)FLAG标志位应用时,当FLAG=1时应该立即执行正常时钟程序clock(),可是当按键稍微晚些按时会出现:延时一段时间后才执行。
原因:num(uchar)定义于timer_0()中,主程序开始时就启动,并num++,开始
clock()并显示正确时间条件是:num=20,在按键按的晚时,num计数已超过20,必须等到超过定义的类型(uchar)然后重新从零记到20才能正确显示。
c)当FLAG=2时,应该在所有值均为0时进入dengss(),可每次都是直接进入。
void clock();//正常时钟
void count_down();//倒计时时钟
void display(uchar,uchar,uchar,uchar); //数码显示
***********************************************************************************************************************/
}
}
void clock()//正常时钟程序
{
if(num>=20)//1s定时
{
num=0;
miao_gewei++;
if(miao_gewei==10)
{
miao_gewei=0;
miao_shiwei++;
if(miao_shiwei==6)
{
miao_shiwei=0;
fen_gewei++;
2)实时时钟,可以设定当前时间,完成钟表功能(四位数码管分别显示分钟和秒)。
三、系统硬件设计
定时器或实时时钟实验仿真图
四、 系统软件设计
五、实验过程中遇到的问题及解决方法
定时器0调试过程中:
a)建好工程后,操作太快,忘了将保存过的C文件添加到工程里面,提示无效module。
b)初始化函数init_0()声明时后面的‘;’忘记了,调试后出现了很多错误与警告,里面的变量及端口都提示重复定义。
硬件仿真过程中:
a)数码管全暗,按键无反应
原因:电阻没有连接。
指导老师签字:
日期:
实验二程序:
/**********************************************************************************************************************
uchar clock_num[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴极数码显示数组0-9
sbit w1=P0^0;
sbit w2=P0^1;
sbit w3=P0^2;
sbit w4=P0^3;//位选口定义
void delay(uint);//1ms延时程序
void scankey(); //按键扫描
#endif
#include"stc10.h"
#include<intrins.h>
#include<led.h> //包含各种变量定义及函数声明
main()
{
yanshi();
delay(2000); //两秒后进入可控大循环
while(1)
{
scankey();
#include<stc10.h>
#include<dingshi_shuma.h>//包含变量定义和函数声明
void main()
{
P1M1=0x00;
P1M0=0xff;
init_0();//初始化,设置50毫秒
TR0=1; //启动定时器
while(1)
{
switch(FLAG)
{
case 0:
{
if(num>=20)//1s定时
{
num=0;
miao_gewei--;
if(miao_gewei==(0-1))
{
miao_gewei=9;
miao_shiwei--;
if(miao_shiwei==(0-1))
{
miao_shiwei=5;
原因:全局变量和局部变量使用了相同的符号。查过资料后知,当全局变量和局部变量使用了相同的符号时,起作用的是局部变量,全局变量被屏蔽掉。所以当在dengss()中出现fen_shiwei,fen_gewei,miao_shiwei,miao_gewei时直接做0处理,而灯闪烁的条件就是这个。当把display()中的变量名改变后,执行过clock()的数值被保存,在执行count_down()时接着原来的数据变化。
left();
P2=0XFF;
P3=0XFF;
}
vபைடு நூலகம்id dengss()
{
for(ss=3;ss>0;ss--)
{
P2=0;
P3=0xc3;
delay(1000);
P2=0xff;
P3=0xff;
delay(1000);
}
flag+=3;//退出小循环,只亮一次,增大按键扫描频率
}
void right()
if(flag==0)
right();
if(flag==1)
left();
if(flag==2)
dengss();
}
}
void delay(uint x)
{
uint i,j;
for(i=110;i>0;i--)
for(j=x;j>0;j--);
}
void yanshi()
{
dengss();
right();
1)每次循环无论正转还是反转程序,总先是先执行P1口的8位led灯。
原因:在利用KEIL自带的库函数中的_crol_和_cror_时,在正转和反转程序中应该调换顺序的,开始没注意到。改正后显示正常。
2)在开始实验的时候实行的是一直循环的方式,利用按键嵌套。后来发现不理想,每次按键按到三次以上后进入死循环。
sbit key1=P0^5;
sbit key2=P0^6;
sbit key3=P0^7;
void delay(uint);//1ms延时
void yanshi(void);//演示所有亮灯方式
void dengss(void);//闪烁三次
void left(void); //左循环亮灯
void right(void);//右循环亮灯
aa=0xfe;
for(a=8;a>0;a--)
{
P2=aa;
aa=_crol_(aa,1);
delay(500);
}
bb=0xfb;
P2=0xff;//熄灭循环后亮着的
for(b=4;b>0;b--)
{
P3=bb;
bb=_crol_(bb,1);
delay(500);
}//D12保留发亮
flag+=3;//退出小循环,只亮一次,增大按键扫描频率
if(fen_gewei==10)
{
fen_gewei=0;
fen_shiwei++;
if(fen_shiwei==6)
fen_shiwei=0;
}
}
}
}
display(fen_shiwei,fen_gewei,miao_shiwei,miao_gewei);
}
void count_down()//倒计时程序
#ifndef _led_h
#define _led_h
#define uint unsigned int
#define uchar unsigned char
uchar i,j,a,b,c,d;
uchar flag=0;//亮灯判断标志
uchar aa,bb,cc,dd,ss;
sbit H1=P3^6;
2,灯闪烁三次
3,流水灯正转
4,流水灯反转
函数说明:
yanshi():演示程序
dengss():闪烁程序
right():正转程序
left(): 反转程序
scankey():按键扫描
***********************************************************************************/
}
void left()
{
cc=0xdf;
for(c=4;c>0;c--)
{
P3=cc;
cc=_cror_(cc,1);
delay(500);
}
P3=0xff;//熄灭D9
dd=0x7f;
for(d=8;d>0;d--)
{
P2=dd;
dd=_cror_(dd,1);
delay(500);
}//D1保留发亮
flag+=3;//退出小循环,只亮一次,增大按键扫描频率
}
void scankey()
{
H1=0;
if(key1==0)
{
delay(10);
if(key1==0)
{
flag=0;
while(!key1);//等待按键释放
}
}
if(key2==0)
{
delay(10);
if(key2==0)
{
flag=1;
void init_0() //初始化,设置50毫秒定时
{
TMOD=0X01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
}
void timer_0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
工程说明:此工程主要完成以下任务:
1.数码显示
2.按键扫描
3.正常时钟显示
4.倒计时
5.定时中断
主要函数名说明:
void delay(uint);//1ms延时程序
void init_0();//定时中断初始化
void scankey();//按键扫描//是时钟暂停与开始,时间调整,FLAG调整
void dengss(); //灯闪烁
实验一流水灯实验
一、实验目的
1)简单I/O引脚的输出
2)掌握软件延时编程方法
3)简单按键输入捕获判断
二、实验实现的功能
1)开机是点亮12发光二极管,闪烁三下
2)按照顺时针循环依次点亮发光二极管
3)通过按键将发光二极管的显示改为顺逆时针方式
三、系统硬件设计
流水灯原理图
四、系统软件设计
五、实验过程中遇到的问题及解决方法
display(8,8,8,8);//操作前显示数字8888
scankey();
break;
case 1:
clock();
scankey();
break;
case 2:
count_down();
scankey();
break;
}
}
}
#ifndef _dingshi_shuma_
#define _dingshi_shuma_
void init_0();//定时中断初始化
void scankey();//按键扫描
void dengss(); //灯闪烁
void clock();//正常时钟
void count_down();//倒计时时钟
void display(uchar,uchar,uchar,uchar); //数码显示
#define uint unsigned int
#define uchar unsigned char
#define deport1 P1 //定义数码管段选数据入口
#define deport0 P0 //定义按键选选择数据入口
uchar num,FLAG=0,ss;
extern uchar fen_shiwei=0,fen_gewei=0,miao_shiwei=0,miao_gewei=0;
num++;
}
void delay(uint x)
{
uchar i,j;
for (i=110;i>0;i--)
for(j=x;j>0;j--);
}
void dengss()
{
for(ss=3;ss>0;ss--)
{
P2=0;
P3=0xc3;
delay(1000);
P2=0xff;
P3=0xff;
delay(1000);
while(!key2);//等待按键释放
}
}
if(key3==0)
{
delay(10);
if(key3==0)
{
flag=2;
while(!key3);//等待按键释放
}
}
}
实验二定时器或实时时钟实验
一、实验目的
1)数码管动态显示技术
2)定时器的应用
3)按键功能定义
二、实验实现的功能
1)通过按键可以设定定时时间,启动定时器,定时时间到,让12个发光二极管闪烁,完成定时器功能。
解决方案:利用一个按键,显示一次。并加入按键释放,防止误动作。
指导老师签字:
日期:
实验一程序:
/**********************************************************************************
工程说明: 本工程主要完成了一下功能:
1,复位后演示所有功能
数码管显示过程中:
a)函数编写好后调用提示:uncalled segment ,ignored for overplay.
原因:有函数未调用,可是我已经调用所有函数,后来检查一段时间后发现,count_down()被我写成了count_dowm().
b)FLAG标志位应用时,当FLAG=1时应该立即执行正常时钟程序clock(),可是当按键稍微晚些按时会出现:延时一段时间后才执行。
原因:num(uchar)定义于timer_0()中,主程序开始时就启动,并num++,开始
clock()并显示正确时间条件是:num=20,在按键按的晚时,num计数已超过20,必须等到超过定义的类型(uchar)然后重新从零记到20才能正确显示。
c)当FLAG=2时,应该在所有值均为0时进入dengss(),可每次都是直接进入。
void clock();//正常时钟
void count_down();//倒计时时钟
void display(uchar,uchar,uchar,uchar); //数码显示
***********************************************************************************************************************/
}
}
void clock()//正常时钟程序
{
if(num>=20)//1s定时
{
num=0;
miao_gewei++;
if(miao_gewei==10)
{
miao_gewei=0;
miao_shiwei++;
if(miao_shiwei==6)
{
miao_shiwei=0;
fen_gewei++;
2)实时时钟,可以设定当前时间,完成钟表功能(四位数码管分别显示分钟和秒)。
三、系统硬件设计
定时器或实时时钟实验仿真图
四、 系统软件设计
五、实验过程中遇到的问题及解决方法
定时器0调试过程中:
a)建好工程后,操作太快,忘了将保存过的C文件添加到工程里面,提示无效module。
b)初始化函数init_0()声明时后面的‘;’忘记了,调试后出现了很多错误与警告,里面的变量及端口都提示重复定义。
硬件仿真过程中:
a)数码管全暗,按键无反应
原因:电阻没有连接。
指导老师签字:
日期:
实验二程序:
/**********************************************************************************************************************
uchar clock_num[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴极数码显示数组0-9
sbit w1=P0^0;
sbit w2=P0^1;
sbit w3=P0^2;
sbit w4=P0^3;//位选口定义
void delay(uint);//1ms延时程序
void scankey(); //按键扫描
#endif
#include"stc10.h"
#include<intrins.h>
#include<led.h> //包含各种变量定义及函数声明
main()
{
yanshi();
delay(2000); //两秒后进入可控大循环
while(1)
{
scankey();
#include<stc10.h>
#include<dingshi_shuma.h>//包含变量定义和函数声明
void main()
{
P1M1=0x00;
P1M0=0xff;
init_0();//初始化,设置50毫秒
TR0=1; //启动定时器
while(1)
{
switch(FLAG)
{
case 0:
{
if(num>=20)//1s定时
{
num=0;
miao_gewei--;
if(miao_gewei==(0-1))
{
miao_gewei=9;
miao_shiwei--;
if(miao_shiwei==(0-1))
{
miao_shiwei=5;
原因:全局变量和局部变量使用了相同的符号。查过资料后知,当全局变量和局部变量使用了相同的符号时,起作用的是局部变量,全局变量被屏蔽掉。所以当在dengss()中出现fen_shiwei,fen_gewei,miao_shiwei,miao_gewei时直接做0处理,而灯闪烁的条件就是这个。当把display()中的变量名改变后,执行过clock()的数值被保存,在执行count_down()时接着原来的数据变化。
left();
P2=0XFF;
P3=0XFF;
}
vபைடு நூலகம்id dengss()
{
for(ss=3;ss>0;ss--)
{
P2=0;
P3=0xc3;
delay(1000);
P2=0xff;
P3=0xff;
delay(1000);
}
flag+=3;//退出小循环,只亮一次,增大按键扫描频率
}
void right()
if(flag==0)
right();
if(flag==1)
left();
if(flag==2)
dengss();
}
}
void delay(uint x)
{
uint i,j;
for(i=110;i>0;i--)
for(j=x;j>0;j--);
}
void yanshi()
{
dengss();
right();
1)每次循环无论正转还是反转程序,总先是先执行P1口的8位led灯。
原因:在利用KEIL自带的库函数中的_crol_和_cror_时,在正转和反转程序中应该调换顺序的,开始没注意到。改正后显示正常。
2)在开始实验的时候实行的是一直循环的方式,利用按键嵌套。后来发现不理想,每次按键按到三次以上后进入死循环。
sbit key1=P0^5;
sbit key2=P0^6;
sbit key3=P0^7;
void delay(uint);//1ms延时
void yanshi(void);//演示所有亮灯方式
void dengss(void);//闪烁三次
void left(void); //左循环亮灯
void right(void);//右循环亮灯