单片机简易c语言程序与仿真.docx

上传人:b****7 文档编号:23776745 上传时间:2023-05-20 格式:DOCX 页数:77 大小:635.98KB
下载 相关 举报
单片机简易c语言程序与仿真.docx_第1页
第1页 / 共77页
单片机简易c语言程序与仿真.docx_第2页
第2页 / 共77页
单片机简易c语言程序与仿真.docx_第3页
第3页 / 共77页
单片机简易c语言程序与仿真.docx_第4页
第4页 / 共77页
单片机简易c语言程序与仿真.docx_第5页
第5页 / 共77页
点击查看更多>>
下载资源
资源描述

单片机简易c语言程序与仿真.docx

《单片机简易c语言程序与仿真.docx》由会员分享,可在线阅读,更多相关《单片机简易c语言程序与仿真.docx(77页珍藏版)》请在冰豆网上搜索。

单片机简易c语言程序与仿真.docx

单片机简易c语言程序与仿真

实验一Keil与protues联合仿真实验

一、实验要求

1.在Proteus软件中画好51单片机最小核心电路,包括复位电路和晶振电路

2.继续在Proteus软件中绘制电路,将P1口做输出口,接八只发光二极管

3.在Keil软件中编写程序,实现功能,间隔1S点亮一个发光二极管,顺序从P1.0到P1.7依次点亮。

二、实验目的

1.学习Proteus软件的使用方法

2.学习Keil软件的使用方法

3.学习端口输出的使用方法

4.掌握延时程序的设计

三、实验说明

将P1口做输出口,接八只发光二极管,实现功能,间隔2S点亮一个发光二极管,顺序从P1.0到P1.6依次点亮

四、硬件原理图及程序设计

(一)硬件原理图设计

 

(二)程序流程图设计

21

(三)程序设源代码

#include

sbitLED=P1;定义P1口显示LED

main()

{

unsignedinti;定义时间变量

intj;

while

(1)

{

P1=(1<

for(i=0;i<20000;i++);//延时2S

if(8==j){

j=0;//如果J=8则j=0

}

}

}

五.实验总结

1、实验过程中遇到的问题及解决方法

1).第一次次接触Proteus软件和Keil软件,对软件的功能不熟。

造成话费时间太多,不过加深了对软件的应用。

2).还有的就是对程序还不是很清楚!

3).在Keil软件验证时亮灯间隔时间过短,对延时子程序的了解不够,后经过更改后克服了这一问题。

2、体会

学好单片机的同时也要熟悉这些软件的熟悉应用对学习单片机有很大的帮助。

 

实验二数码管静态显示实验

一、实验要求

1.在Proteus软件中画好51单片机最小核心电路,包括复位电路和晶振电路

2.在电路中增加一个7段数码管(共阳/共阴自选),将P1口作数据输出口与7段数码管数据引脚相连

3.在Keil软件中编写程序,采用静态显示法,实现数码管循环显示数字0~9,显示数字延时间隔1秒钟

二、实验目的

1.巩固Proteus软件和Keil软件的使用方法

2.学习端口输入输出的高级应用

3.掌握7段数码管的连接方式和静态显示法

4.掌握查表程序和延时等子程序的设计

三、实验说明

采用静态显示法,实现数码管循环显示数字0~9,显示数字延时间隔1秒钟,将P2口作数据输出口与7段数码管数据引脚相连,显示数码数值延时一秒数值加一再显示,如果数码管数值>=10,则将数码管数值清零。

四、硬件原理图及程序设计

(一)硬件原理图设计

(二)程序流程图设计

(三)程序设源代码

#include

voiddelay(inti){//延迟子函数

while(i)

i=i-1;

}

manin(){

unsignedcharj;

while

(1){

P1=0xc0;///显示数字1

delay(20000);///延迟2S

P1=0xf9;///显示数字2

delay(20000);//延迟2S

P1=0xa4;///显示数字3

delay(20000);//延迟2S

P1=0xb0;///显示数字4

delay(20000);//延迟2S

P1=0x99;///显示数字5

delay(20000);//延迟2S

P1=0x92;///显示数字6

delay(20000);//延迟2S

P1=0x83;///显示数字7

delay(20000);//延迟2S

P1=0xf8;///显示数字8

delay(20000);//延迟2S

P1=0x80;///显示数字9

delay(20000);//延迟2S

P1=0x98;///显示数字0

delay(20000);//延迟2S

}

}

五.实验总结

1、实验过程中遇到的问题及解决方法

在仿真过程中出现乱码现象!

通过改变检测发现数码管用的

是共阴数码管调试过来后显示正常.

2、体会

进一步熟悉软件的应用和单片机编程知识的加深了解!

 

实验三按键输入与数码管静态显示实验

一、实验要求

方法二:

用查询方式

1.在Proteus软件中画好51单片机最小核心电路,包括复位电路和晶振电路

2.在电路中增加一个7段数码管(共阳/共阴自选),将P2口作数据输出口与7段数码管数据引脚相连

3.在P0.0和P0.1分别连接一个按键,当按键弹起时引脚为高电平,当按键按下时引脚为低电平时

4.在Keil软件中编写程序:

实现数码管循环显示数字0~9,程序一开始数码管显示0,当按下P0.0引脚对应按键时,显示数字加一;当按下P0.1引脚对应按键时,显示数字减一;(不用外部中断方式)

方法二:

用中断方式

1.在P3.2和P3.3分别连接一个按键,当按键弹起时引脚为高电平,当按键按下时引脚为低时平

2.在Keil软件中编写程序:

实现数码管循环显示数字0~9,程序一开始数码管显示0,当按下P3.2引脚对应按键时,显示数字加一;当按下P3.3引脚对应按键时,显示数字减一;(用外部中断方式,下降沿触发)

3.

二、实验目的

1.巩固Proteus软件和Keil软件的使用方法

2.学习端口输入输出的高级应用

3.掌握7段数码管的连接方式和静态显示法

4.掌握按键输入识别与去抖动程序设计

三、实验说明

系统电路实现P2口数码管循环显示数字0~9,程序一开始数码管显示0,当按下P3.0引脚对应按键时,显示数字加一;当按下P3.1引脚对应按键时,显示数字减一。

采用IF语句既当所对应按键被按下时执行数码管加一后减一操作。

四、硬件原理图及程序设计

(一)硬件原理图设计

(二)程序流程图设计

(三)程序设源代码

#include//声明8051寄存器的头文件

sbitP0_0=P0^0;//声明第一位位选接至P3.0

sbitP0_1=P0^1;//声明第一位位选接至P3.1

charTAB[10]={0xC0,0xF9,0xA4,0xB0,0x99,

0x92,0x82,0xF8,0x80,0x98};//0~9数码管显示数据

voiddelay_ms(intx){//1MS延时子程序

inti,j;//声明整数变量i,j

for(i=0;i

for(j=0;j<120;j++);}//计数120次,延迟1ms

}//延迟函数结束

main(){//主函数

inttemp;//定义整型变量

temp=0;//变量符初值0

while

(1){//无限循环

P2=TAB[temp];//将显示变量的值通过查表得到数码管显示数据,然后由P2口送出显示

P0_0=1;//将P3.0作输入用,要先写1

if(P0_0==0){//如果按键被按下

delay_ms(10);//延时10ms去抖动

if(P0_0==0){//确定按键真的被按下

temp++;//将显示变量加一

if(temp>=10)temp=0;//如果temp>=10,则将temp零

while(P0_0==0);//等待按键放开,要不然一直等待

}

}

P0_1=1;//将P3.0作输入用,要先写1

if(P0_1==0){//如果按键被按下

delay_ms(10);//延时10ms去抖动

if(P0_1==0){//确定按键真的被按下

temp--;//将显示变量加一

if(temp<=0)temp=9;//如果temp>=10,则将temp零

while(P0_1==0);//等待按键放开,要不然一直等待

}

}

}

}

五.实验总结

1、实验过程中遇到的问题及解决方法

A.实验中未对P0.0,P0.1口进行定义,出现了很多的问题,后经过仔细检查找到了问题也解决了这一问题。

B.

2、体会:

第一次掌握的去抖动函数及其重要性。

 

实验四数码管动态显示实验

一、实验要求

1.在Proteus软件中画好51单片机最小核心电路,包括复位电路和晶振电路

2.在电路中增加四个7段数码管(共阳/共阴自选),将P2口作数据输出口与7段数码管数据引脚相连,P0.0~P0.3引脚输出选控制信号

3.在Keil软件中编写程序,采用动态显示法,实现数码管分别显示数字1,2,3,4

二、实验目的

5.巩固Proteus软件和Keil软件的使用方法

6.学习端口输入输出的高级应用

7.掌握7段数码管的连接方式和动态显示法

8.掌握查表程序和延时等子程序的设计

三.实验说明

系统电路实现由89C51将数据由P2口送出,由P3.0~P3.3引脚对送入的数据进行位选。

并采用延时的方法实现四个数码管的动态显示1,2,3,4。

采用送一个数据位选一次来进行数据的动态显示。

将P2口作数据输出口与7段数码管数据引脚相连,P0.0~P0.3引脚输出位选控制信号.

四、硬件原理图及程序设计

(一)硬件原理图设计

(二)程序流程图设计

(三)程序设源代码

#include//声明8051寄存器的头文件

sbitP3_0=P3^0;//声明第一位位选接至P3.0

sbitP3_1=P3^1;//声明第一位位选接至P3.1

sbitP3_2=P3^2;//声明第一位位选接至P3.2

sbitP3_3=P3^3;//声明第一位位选接至P3.3

charseg7[10]={0xc0,0xf9,0xa4,0xb0,0x99,//数字0~4

0x92,0x83,0xf8,0x80,0x98};//数字5~9

voiddelay_ms(intx){//延时1ms程序

inti,j;//声明整数变量i,j

for(i=0;i

for(j=0;j<120;j++);}//计数120次,延迟1ms

}//延迟函数结束

main(){//主程序开始

while

(1){//无穷循环

P3_0=1;

P3_1=0;

P3_2=0;

P3_3=0;

P2=seg7[1];//P2口送数据到数码管

delay_ms(100);//延时100毫秒

P3_0=0;

P3_1=1;

P3_2=0;

P3_3=0;

P2=seg7[2];//P2口送数据到数码管

delay_ms(100);//延时100毫秒7

P3_0=0;

P3_1=0;

P3_2=1;

P3_3=0;

P2=seg7[3];//P2口送数据到数码管

delay_ms(100);//延时100毫秒

P3_0=0;

P3_1=0;

P3_2=0;

P3_3=1;

P2=seg7[4];//P2口送数据到数码管

delay_ms(100);//延时100毫秒

}

}

 

五.实验总结

1、实验过程中遇到的问题及解决方法

A.在实验中对位选的理解不够深,导致数据动态显示未能按预定顺序显示,经过更高位选电平,最终克服了这个问题;

B.由于延时时间过短为能看到预期的动态显示效果,经过更改延迟显示时间最后克服了这一问题。

2、体会

在这个实验中由于自己对位选的理解错误而给程序造成了一点的小错误,不过这样也让我对遇到的位选问题更加的印象深刻。

 

五键盘扫描实验

一、实验要求

1.在Proteus软件中画好51单片机最小核心电路,包括复位电路和晶振电路

2.在电路中增加一个7段数码管(共阳/共阴自选),并绘制一个4X4键盘,分别定义键盘值从0到9,A,B,C,D,E,F;

3.在Keil软件中编写程序,对键盘进行扫描,将扫描到的键盘值用数码管进行显示。

二、实验目的

1.学习端口输入输出的高级应用

2.掌握7段数码管的连接方式和显示法

3.掌握4X4键盘的扫描原理和程序

三.实验说明

在89c51的P1口接4x4的键盘,P1.0到P1.4接键盘四行,P1.5P1.8接键盘四列,在P2口接7段数码管并与一限流电阻串联。

所谓4x4键盘是指4列4行所构成的按键阵列,每个按键一次编制为0~9、a~f。

在键盘扫描时先判断是否有按键按下,再判断是哪一列按键按键被按下,最后判断是哪一行按键被按下,根据公式:

所按键数值=行*4+列。

最后数值在P2口由七段数码管查询得出并显示。

四、硬件原理图及程序设计

(一)硬件原理图设计

(二)程序流程图设计

 

(三)程序设源代码

#include//声明8051寄存器的头文件

#defineSCANPORTP1//定义键盘扫描联接口PX.7-PX.4接列1到4,PX.3-PX.0接行1到4,

charTAB[16]={0xC0,0xF9,0xA4,0xB0,0x99,//共阳极0~4数码管显示数据

0x92,0x82,0xF8,0x80,0x98,//共阳极4~9数码管显示数据

0xA0,0x83,0xa7,0xa1,0x84,0x8e};//共阳极a~f数码管显示数据

voiddelay_ms(intx){//1MS延时子程序

inti,j;//声明整数变量i,j

for(i=0;i

for(j=0;j<120;j++);}//计数120次,延迟1ms

}//延时子程序结束

unsignedcharLineScanCode[4]={0x7F,0xBF,0xDF,0xEF};//列扫描数据PX.7-PX.4接列1到3

unsignedcharKeyScan()

{unsignedcharTemp=0;

unsignedcharKeyValue=0,Row=4,Line=0;

for(Line=0;Line<4;Line++)

{SCANPORT=LineScanCode[Line];//输出列扫描值,且将要读输入的低4位引脚写1

Temp=SCANPORT&0x0F;//读入4个行的值

if(Temp!

=0x0F)//如果有一行不为1,说明在这次列扫描中有按键按下

{switch(Temp)//判断是哪一行被按下

{case0x0E:

Row=3;break;//000011103

case0x0D:

Row=2;break;//000011012

case0x0B:

Row=1;break;//000010111

case0x07:

Row=0;break;//000001110

default:

break;

}

break;

}

}//扫描结束

SCANPORT=0x0F;//将要读输入的低4位引脚写1

KeyValue=Row*4+Line;

returnKeyValue;

}

voidmain()

{unsignedcharkey;

while

(1)

{key=KeyScan();

if(key<16)//有键按下

P2=TAB[key];

}

}

 

五.实验总结

1、实验过程中遇到的问题及解决方法

A.由于初始对键盘扫描程序未能充分理解,在判断是哪行按键被按下时判断失误,导致按键顺序未按一定规律。

B.由于C语言基础知识不是很好,出现了一下细节性的问题。

C.刚开始时对按键如何执行扫描程序的不清楚,导致了出现很多问题。

2、体会

刚接触键盘时觉得很神奇,后来经过老师的讲解,觉得我们专业也是可以制作很多好东西的,例如密码锁等。

在一遇到问题时要仔细分析,从中找出问题才会有所收获,自己找出问题,并通过动脑筋查阅相关资料后得出正确的结果是一件很有成就感的事情。

 

实验六外部中断实验一

一、实验要求

1.在Proteus软件中画好51单片机最小核心电路,包括复位电路和晶振电路

2.P1口上拉接8个LED;

3.在Keil软件中编写程序,对LED显示进行控制,显示方式有两种:

(1)0、7亮,1、6亮,2、5亮,3、4亮,0、7亮循环;

(2))3、4亮,2、5亮,1、6亮,0、7亮,3、4亮循环。

4.在P3.2连接一个按键,当按键弹起时引脚为高电平,当按键按下时引脚为低时平

5.编写程序:

系统对LED显示进行控制,一开始显示方式为

(1),当按下P3.2连接的按键时,系统在

(1)和

(2)之间切换显示方式

二、实验目的

1.学习端口输入输出的高级应用

2.掌握LED查表显示法

3.掌握外部中断的工作原理

4.掌握外部中断程序设计

三.实验说明

P1口外接一个排灯,并下拉220欧姆电阻,在P3.2连接一个按键,当按键弹起时引脚为高电平,当按键按下时引脚为低时平。

用中断的方式实现排灯在方式

(1):

0、7亮,1、6亮,2、5亮,3、4亮和方式

(2):

3、4亮,2、5亮,1、6亮,0、7亮之间切换,当P3.2连接一个按键被按下则发生中断,则flag反向一次,排灯则切换方式

(1)到方式

(2),若按键被按下,则从方式

(2)切换到方式

(1),如此循环。

四、硬件原理图及程序设计

(一)硬件原理图设计

(二)程序流程图设计

(三)程序设源代码

#include//声明8051寄存器的头文件

chari,flag=1;//定义变量并赋初值

charLED[4]={0x7e,0xbd,0xdb,0xe7};//定义LED显示方式07,16,25,34亮灯

voiddelay_ms(intx){//延时1ms子程序

inta,b;//定义整型变量

for(a=0;a

for(b=0;b<120;b++);}}//计数120次,延迟1ms

main(){//主程序

EA=1;//开中断主开关

EX0=1;//开外部中断0开关

IT0=1;//设定为下降沿出发方式

while

(1){

P2=LED[i];//P2口显示

delay_ms(500);//延迟0.5秒

if(flag)//判断flag,如果等于1执行下面

{

i++;//数值i加1

if(i>3)i=0;}//如果i大于3则另它等于0

else{i--;//如果flag等于0,则执行下面

if(i<0)

i=3;}//如果i小于0则另它等于3

}}

voidmy_int(void)interrupt0using1//中断子程序

{flag=!

flag;}//flag等于flag的反

 

五.实验总结

1、实验过程中遇到的问题及解决方法

A.实验中遇到当按键被按下后排灯却没有在方式

(1)和方式

(2)之间切换的问题,经过检查发现是对if语句理解不够,造成错误,经过多次调试后解决了该问题

B.由于初次接触中断,对中断的各开关未能很好的设定开关。

 

实验七外部中断实验二

一、实验要求

1.在数码管动态显示实验中的电路图基础上,绘制两个按钮K1和K2,一端分别与单片机P3.2和P3.3引脚,当按键弹起时引脚为高电平,当按键按下时引脚为低时平

2.在Keil软件中编写程序,采用动态显示法,主程序让实现数码管分别显示数字1,2,3,4,当K1按下时数字顺序向右移一位显示,当K2按下时数字顺序向左移一位显示

二、实验目的

1.掌握7段数码管的连接方式和动态显示法

2.巩固中断的知识,学会外部中断的使用

3.掌握查表程序、中断服务子程序和延时等子程序的设计

三.实验说明

a.对程序的用查表法显示1234.当要移位时用中断对j++,就是每按下按键就加一,而另外一个中断j--。

b.查表时我们的表数据是1,2,3,4,1,2,3,4这样就可以实现移位,这种方法比较简单。

 

四、硬件原理图及程序设计

(一)硬件原理图设计

 

(二)程序流程图设计

(三)程序设源代码

#include

sbitP3_2=P3^2;

sbitP3_3=P3^3;

//1MS延时子程序

voiddelay_ms(intx){//延时子程序(x)ms

inti,j;

for(i=0;i

for(j=0;j<120;j++);}

}

charTAB[8]={0XF9,0Xa4,0Xb0,0X99,0XF9,0Xa4,0Xb0,0X99};

voiddelay_ms(inti);

charj=0,a=0,b=0,c=0;

main(){

EA=1;

EX0=1;

IT0=1;

EX1=1;

IT1=1;

a=j+1;

b=j+2;

c=j+3;

while

(1)

{

a=j+1;

b=j+2;

c=j+3;

P2=TAB[j];//P2口显示数据1

P0=0X01;//P0口选择显示第一个数码管

delay_ms(5);//延时0.005s

P0=0X00;

P2=TAB[a];//P2口显示数据2

P0=0X02;//P0口选择显示第一个数码管

delay_ms(5);//延时0.005s

P0=0X00;

P2=TAB[b];//P2口显示数据3

P0=0X04;//P0口选择显示第一个数码管

delay_ms(5);//延时0.005s

P0=0X00;

P2=TAB[c];//P2口显示数据4

P0=0X08;//P0口选择显示第一个数码管

delay_ms(5);//延时0.005s

P0=0X00;

if(j>3)j=0;

if(j<0)j=3;

}

}

voidzd0()interrupt0using1

{j++;}

voidzd1()interrupt2using1

{j--;}

 

五.实验总结

a.这个试验中出现了错误,是写程序不够严格,以至于不能实现功能。

所以以后写程序要规范,避免不要的书写错误。

b.还有就是在做isis、的时候,找元件不够熟悉,找个元件要很久,还有就是对电路不够了解,电路总是出错,所以要巩固电路的基础知识。

 

实验八

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 英语

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1