单片机
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include <REGX51.H>
#define uchar unsigned char
#define uint unsigned int
//code uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
{ while(key1==0)
while(key2!=0||key3!=0)
{ aa=_cror_(aa,1); //将aa循环右移1位后再赋给aa
delay(100);
LED=aa; //更新灯的状态
}
}
}
}
}
实验二定时器和中断应用程序设计与调试
一.实验目的
掌握单片机的定时器、中断功能系统的应用
//共阴段码,a对应最低位
code uchar table[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,0xee,0x3e,0x9c,0x7a,0x9e,0x8e};
//共阴段码,a对应最高位
uchar ds[]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}; //要显示的4个数字
TI=0;
}
}
main()
{ display();
//静态显示初始值1 2 3 4,不需在while(1)里面不断刷新,同学们可以和动态显示的程序对比一下。
//静态显示模式下,要改变显示的数值时才需重新调用display函数
while(1)
{
}
}
2.和实验2的定时器综合,完成只显示分种和秒钟的电子时钟程序
void delay_100ms()
{ uchar i,j;
for(i=0;i<100Biblioteka Baidui++)
for(j=0;j<250;j++);
}
void display()
{ uchar i;
for(i=0;i<4;i++)
{ SBUF=table[ds[i]]; //同步串口(串口默认工作方式),发送段码
#define uint unsigned int
#definekey1 P2_0 //如果用上课用的proteus电路图仿真,此处P2_0改为P3_4
#define key2 P2_1
#define key3 P2_2
#define LED P0//如果用上课用的proteus电路图仿真,此处P0改为P1
实验一开发软件使用
一.实验目的
学习KEIL的使用方法,用Keil开发工具编译C源码、汇编源程序。掌握单片机的编程及调试。
二.实验内容和要求
编写C语言程序,用Keil将程序编译并生成HEX文件调试程序。通过并口通信线连接PC与实验箱,用Easy 51Pro把程序下载到AT89S51观察实验箱LED的变化
while(TI==0); //等待发送完成
TI=0;
}
}
main()
{ IT1=1; //1下降沿触发中断,0低电平触发中断
EX1=1; //外部中断使能
EA=1;//中断总开关使能
ch0=0; //启动A/D
while(1)
{
}
}
void INT1_isr() interrupt 2
{ uchar i,tmp=100,display_buf;
光敏电阻特性:光敏电阻的阻值与亮度成反比,电气特性等效于一个可变电阻。如实验电路图所示R13光敏电阻和电阻R16(4k7)串联,光敏电阻的阻值随环境亮度而变化,加在光敏电阻的电压也随之变化。变化的电压分别加到0809的IN-0端和监视电路。单片机通过74LS373和与非门,访问0809,对IN-0端电压进行AD转换,并将数据处理后通过数码管显示出来。数码管的显示数值满足以下公式:显示数值=(IN-0/ REF+)×256。
//共阴段码,a对应最高位
uchar ds[]={9,10,11,12}; //要显示的4个数字
void display()
{ uchar i;
for(i=0;i<4;i++)
{ SBUF=table[ds[i]]; //同步串口(串口默认工作方式),发送段码
while(TI==0); //等待发送完成
TH0=(65536-6.58)/256;
TL0=(65536-6.58)%256;
TR0=1;
ET0=1;
EA=1;
while(1)
{
}
}
void INT_T0() interrupt 1
{
TH0=(65536-6.58)/256;
TL0=(65536-6.58)%256;
P0_5=!P0_5;
}
//共阴段码,a对应最高位
uchar ds[]={0,0,0,0}; //要显示的4个数字
uchar xdata ch0 _at_ 0x07ff9; //ADC0809的通道0(IN0)的地址
//此地址也可以是其他16位地址,但必须是第15位、第2-0位都为0
//第2-0位代表的是ADC0809的通道号,例如如果要对第5通道IN5进行AD转换,将第2-0位设为101
2.为何从数码管观察到,在亮度没有变化的情况下,随着ADC0809的REF+的变化,AD转化结果发生
变化。
实验代码:
#include <REGX51.H>
#define uchar unsigned char
#define uint unsigned int
code uchar table[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,0xee,0x3e,0x9c,0x7a,0x9e,0x8e};
{
TH0=(65536-250)/256;
TL0=(65536-250)%256;
P0_5=!P0_5;
}
思考题2:输出频率为38K的方波.
#include <REGX51.H>
#define uchar unsigned char
uchar num;
main()
{
P0=0xff;
TMOD=0x01;
三.实验主要仪器设备和材料:
1.AMC51单片机综合开发系统一台
2.IBM-PC微机一台
思考题
1.修改程序使得数码管显示16进制数?
2.和实验2的定时器综合,完成只显示分种和秒钟的电子时钟程序。
四.实验代码:
1.修改程序使得数码管显示16进制数
#include <REGX51.H>
#define uchar unsigned char
TH0=0x3c;
TL0=0xb0;
TR0=1;
ET0=1;
EA=1;
while(1)
{
}
}
void INT_T0() interrupt 1
{
TH0=0x3c;
TL0=0xb0;
cnt++;
if(cnt>=10)
{
cnt=0;
sec++;
if(sec>=60)
{
sec=0;
min++;
if(min>=60)
void delay(int x)
{ int i,j;
for(i=0;i<x;i++)
for(j=0;j<250;j++);
}
main()
{ uchar aa=0xfe;
P2=0xff;
LED=aa;
while(1)
{
if(key1==0)
{ delay(10);//延时再次检测,键盘去抖
if(key1==0)
uchar min,sec,cnt;
void display()
{ SBUF=table[ds[min/10]];
SBUF=table[ds[min%10]]|0x01;
SBUF=table[ds[sec/10]];
SBUF=table[ds[sec%10]];
}
main()
{
P0=0xff;
TMOD=0x01;
#define uchar unsigned char
uchar num;
main()
{
P0=0xff;
TMOD=0x01;
TH0=(65536-250)/256;
TL0=(65536-250)%256;
TR0=1;
ET0=1;
EA=1;
while(1)
{
}
}
void INT_T0() interrupt 1
实验结果无法输出38K的方波,频率太大,超出单片机的运算速度
实验三串行IO扩展和LED数码管显示实验
一.实验目的
掌握单片机的ISP串行IO扩展和LED数码管显示的原理和应用。
二.实验内容和要求:
AT89S51的UART由P30(RXD)和P31(TXD)组成,当UART以方式0工作的时候就是以SPI的方式工作。用SPI的方式来扩展低速的IO,可以节省P口。参照下面的电路图,采用共阴的数码管,将阴极连接并串联4个二极管,由于二极管的管压降为0.7v和LED的管压降为1.7v得:0.7 x4 + 1.7v = 4.5v(约为5v),当74LS164输出高电平为5v、5ma时,可驱动数码管;当输出低电平时数码管(等效于二极管)反向截止,没有电流通过。
#define uint unsigned int
//code uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//共阴段码,a对应最低位
code uchar table[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,0xee,0x3e,0x9c,0x7a,0x9e,0x8e};
display_buf=ch0; //读取AD转换结果
for(i=1;i<4;i++) //分别取出display_buf的百、十、个位
{ds[i]=display_buf/tmp;
display_buf%=tmp;
tmp/=10;
}
display();
delay_100ms();
2.如果要同时输出多个频率不同的方波(f1=38k, f2=1k),应怎样修改程序?
四.实验代码
思考题1:输出一个周期为1秒的方波
#include <REGX51.H>
#define uchar unsigned char
uchar num;
main()
{
P0=0xff;
TMOD=0x01;
TH0=0x3C;
TL0=0xB0;
TR0=1;
ET0=1;
EA=1;
while(1)
{
}
}
void INT_T0() interrupt 1
{
TH0=0x3C;
TL0=0xB0;
num++;
if(num==5)
{ num=0;
P0_5=!P0_5;
}
}
思考题2:输出频率为1K的方波
#include <REGX51.H>
二.实验内容和要求
编写程序,用AT89S51的内部定时器/计数器T0的方式1产生周期为0.2秒的TTL脉冲(TCH和TCL溢出的时候,产生一个中断),从P05输出。计算如下:
振荡器的频率f=6M=6,000,000;方式1计数器的长度为L=16,2的16次方即65,536
定时时间(溢出时间)t=0.1s
min=0;
}
display();
}
}
实验四A/D转换-亮度测量实验
一.实验目的:
熟悉0809的工作原理,掌握A/D转换程序的设计方法以及与51连接的接口电路设计方法。学习传感器件的应用。
二.实验内容和要求:
按照硬件连接图和程序流程图,编写A/D转换程序,通过调节ADC0809的REF+观察REF与转换值之间的关系,了解光敏电阻的电气特性。
三.实验主要仪器设备和材料
1.微机一台2.单片机实验装置一台
实验要求
理解上述程序后,自编一段程序,实现下述功能:
(1)SW-0按下,启动流水灯效果;
(2)SW-1和SW-2同时按下,停止流水灯效果,
四.实验代码:
#include <REGX51.H>
#include <intrins.h>
#define uchar unsigned char
三.实验主要仪器设备和材料:
1.AMC51单片机综合开发系统一台2.微机一台
四.实验方法、步骤及结果测试
1.开启AMC51实验装置,检查跳线,一般无需改动。
2.运行KEIL具体操作步骤参照实验一。
3.参考以下电路图和流程图编写程序。
思考题
1.在0809的IN-1端已接入热敏电阻,要测量温度的变化应将原程序如何修改?
定时常数TC=65,536 - 6,000,000 x 0.1 / 12 =65,536 – 50,000=15,536,将15,536转换成16进制为3CB0,
TH0=3CH(高八位),TL0=B0H(低八位)。
三.实验主要仪器设备和材料:
1.AMC51单片机综合开发系统一台
2.微机一台
思考题
1.如果要输出一个周期为1秒的方波,应怎样修改程序?
#define uchar unsigned char
#define uint unsigned int
//code uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
{ while(key1==0)
while(key2!=0||key3!=0)
{ aa=_cror_(aa,1); //将aa循环右移1位后再赋给aa
delay(100);
LED=aa; //更新灯的状态
}
}
}
}
}
实验二定时器和中断应用程序设计与调试
一.实验目的
掌握单片机的定时器、中断功能系统的应用
//共阴段码,a对应最低位
code uchar table[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,0xee,0x3e,0x9c,0x7a,0x9e,0x8e};
//共阴段码,a对应最高位
uchar ds[]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}; //要显示的4个数字
TI=0;
}
}
main()
{ display();
//静态显示初始值1 2 3 4,不需在while(1)里面不断刷新,同学们可以和动态显示的程序对比一下。
//静态显示模式下,要改变显示的数值时才需重新调用display函数
while(1)
{
}
}
2.和实验2的定时器综合,完成只显示分种和秒钟的电子时钟程序
void delay_100ms()
{ uchar i,j;
for(i=0;i<100Biblioteka Baidui++)
for(j=0;j<250;j++);
}
void display()
{ uchar i;
for(i=0;i<4;i++)
{ SBUF=table[ds[i]]; //同步串口(串口默认工作方式),发送段码
#define uint unsigned int
#definekey1 P2_0 //如果用上课用的proteus电路图仿真,此处P2_0改为P3_4
#define key2 P2_1
#define key3 P2_2
#define LED P0//如果用上课用的proteus电路图仿真,此处P0改为P1
实验一开发软件使用
一.实验目的
学习KEIL的使用方法,用Keil开发工具编译C源码、汇编源程序。掌握单片机的编程及调试。
二.实验内容和要求
编写C语言程序,用Keil将程序编译并生成HEX文件调试程序。通过并口通信线连接PC与实验箱,用Easy 51Pro把程序下载到AT89S51观察实验箱LED的变化
while(TI==0); //等待发送完成
TI=0;
}
}
main()
{ IT1=1; //1下降沿触发中断,0低电平触发中断
EX1=1; //外部中断使能
EA=1;//中断总开关使能
ch0=0; //启动A/D
while(1)
{
}
}
void INT1_isr() interrupt 2
{ uchar i,tmp=100,display_buf;
光敏电阻特性:光敏电阻的阻值与亮度成反比,电气特性等效于一个可变电阻。如实验电路图所示R13光敏电阻和电阻R16(4k7)串联,光敏电阻的阻值随环境亮度而变化,加在光敏电阻的电压也随之变化。变化的电压分别加到0809的IN-0端和监视电路。单片机通过74LS373和与非门,访问0809,对IN-0端电压进行AD转换,并将数据处理后通过数码管显示出来。数码管的显示数值满足以下公式:显示数值=(IN-0/ REF+)×256。
//共阴段码,a对应最高位
uchar ds[]={9,10,11,12}; //要显示的4个数字
void display()
{ uchar i;
for(i=0;i<4;i++)
{ SBUF=table[ds[i]]; //同步串口(串口默认工作方式),发送段码
while(TI==0); //等待发送完成
TH0=(65536-6.58)/256;
TL0=(65536-6.58)%256;
TR0=1;
ET0=1;
EA=1;
while(1)
{
}
}
void INT_T0() interrupt 1
{
TH0=(65536-6.58)/256;
TL0=(65536-6.58)%256;
P0_5=!P0_5;
}
//共阴段码,a对应最高位
uchar ds[]={0,0,0,0}; //要显示的4个数字
uchar xdata ch0 _at_ 0x07ff9; //ADC0809的通道0(IN0)的地址
//此地址也可以是其他16位地址,但必须是第15位、第2-0位都为0
//第2-0位代表的是ADC0809的通道号,例如如果要对第5通道IN5进行AD转换,将第2-0位设为101
2.为何从数码管观察到,在亮度没有变化的情况下,随着ADC0809的REF+的变化,AD转化结果发生
变化。
实验代码:
#include <REGX51.H>
#define uchar unsigned char
#define uint unsigned int
code uchar table[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,0xee,0x3e,0x9c,0x7a,0x9e,0x8e};
{
TH0=(65536-250)/256;
TL0=(65536-250)%256;
P0_5=!P0_5;
}
思考题2:输出频率为38K的方波.
#include <REGX51.H>
#define uchar unsigned char
uchar num;
main()
{
P0=0xff;
TMOD=0x01;
三.实验主要仪器设备和材料:
1.AMC51单片机综合开发系统一台
2.IBM-PC微机一台
思考题
1.修改程序使得数码管显示16进制数?
2.和实验2的定时器综合,完成只显示分种和秒钟的电子时钟程序。
四.实验代码:
1.修改程序使得数码管显示16进制数
#include <REGX51.H>
#define uchar unsigned char
TH0=0x3c;
TL0=0xb0;
TR0=1;
ET0=1;
EA=1;
while(1)
{
}
}
void INT_T0() interrupt 1
{
TH0=0x3c;
TL0=0xb0;
cnt++;
if(cnt>=10)
{
cnt=0;
sec++;
if(sec>=60)
{
sec=0;
min++;
if(min>=60)
void delay(int x)
{ int i,j;
for(i=0;i<x;i++)
for(j=0;j<250;j++);
}
main()
{ uchar aa=0xfe;
P2=0xff;
LED=aa;
while(1)
{
if(key1==0)
{ delay(10);//延时再次检测,键盘去抖
if(key1==0)
uchar min,sec,cnt;
void display()
{ SBUF=table[ds[min/10]];
SBUF=table[ds[min%10]]|0x01;
SBUF=table[ds[sec/10]];
SBUF=table[ds[sec%10]];
}
main()
{
P0=0xff;
TMOD=0x01;
#define uchar unsigned char
uchar num;
main()
{
P0=0xff;
TMOD=0x01;
TH0=(65536-250)/256;
TL0=(65536-250)%256;
TR0=1;
ET0=1;
EA=1;
while(1)
{
}
}
void INT_T0() interrupt 1
实验结果无法输出38K的方波,频率太大,超出单片机的运算速度
实验三串行IO扩展和LED数码管显示实验
一.实验目的
掌握单片机的ISP串行IO扩展和LED数码管显示的原理和应用。
二.实验内容和要求:
AT89S51的UART由P30(RXD)和P31(TXD)组成,当UART以方式0工作的时候就是以SPI的方式工作。用SPI的方式来扩展低速的IO,可以节省P口。参照下面的电路图,采用共阴的数码管,将阴极连接并串联4个二极管,由于二极管的管压降为0.7v和LED的管压降为1.7v得:0.7 x4 + 1.7v = 4.5v(约为5v),当74LS164输出高电平为5v、5ma时,可驱动数码管;当输出低电平时数码管(等效于二极管)反向截止,没有电流通过。
#define uint unsigned int
//code uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//共阴段码,a对应最低位
code uchar table[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,0xee,0x3e,0x9c,0x7a,0x9e,0x8e};
display_buf=ch0; //读取AD转换结果
for(i=1;i<4;i++) //分别取出display_buf的百、十、个位
{ds[i]=display_buf/tmp;
display_buf%=tmp;
tmp/=10;
}
display();
delay_100ms();
2.如果要同时输出多个频率不同的方波(f1=38k, f2=1k),应怎样修改程序?
四.实验代码
思考题1:输出一个周期为1秒的方波
#include <REGX51.H>
#define uchar unsigned char
uchar num;
main()
{
P0=0xff;
TMOD=0x01;
TH0=0x3C;
TL0=0xB0;
TR0=1;
ET0=1;
EA=1;
while(1)
{
}
}
void INT_T0() interrupt 1
{
TH0=0x3C;
TL0=0xB0;
num++;
if(num==5)
{ num=0;
P0_5=!P0_5;
}
}
思考题2:输出频率为1K的方波
#include <REGX51.H>
二.实验内容和要求
编写程序,用AT89S51的内部定时器/计数器T0的方式1产生周期为0.2秒的TTL脉冲(TCH和TCL溢出的时候,产生一个中断),从P05输出。计算如下:
振荡器的频率f=6M=6,000,000;方式1计数器的长度为L=16,2的16次方即65,536
定时时间(溢出时间)t=0.1s
min=0;
}
display();
}
}
实验四A/D转换-亮度测量实验
一.实验目的:
熟悉0809的工作原理,掌握A/D转换程序的设计方法以及与51连接的接口电路设计方法。学习传感器件的应用。
二.实验内容和要求:
按照硬件连接图和程序流程图,编写A/D转换程序,通过调节ADC0809的REF+观察REF与转换值之间的关系,了解光敏电阻的电气特性。
三.实验主要仪器设备和材料
1.微机一台2.单片机实验装置一台
实验要求
理解上述程序后,自编一段程序,实现下述功能:
(1)SW-0按下,启动流水灯效果;
(2)SW-1和SW-2同时按下,停止流水灯效果,
四.实验代码:
#include <REGX51.H>
#include <intrins.h>
#define uchar unsigned char
三.实验主要仪器设备和材料:
1.AMC51单片机综合开发系统一台2.微机一台
四.实验方法、步骤及结果测试
1.开启AMC51实验装置,检查跳线,一般无需改动。
2.运行KEIL具体操作步骤参照实验一。
3.参考以下电路图和流程图编写程序。
思考题
1.在0809的IN-1端已接入热敏电阻,要测量温度的变化应将原程序如何修改?
定时常数TC=65,536 - 6,000,000 x 0.1 / 12 =65,536 – 50,000=15,536,将15,536转换成16进制为3CB0,
TH0=3CH(高八位),TL0=B0H(低八位)。
三.实验主要仪器设备和材料:
1.AMC51单片机综合开发系统一台
2.微机一台
思考题
1.如果要输出一个周期为1秒的方波,应怎样修改程序?