单片机八个实验程序

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//用导线将P1.0口连接"电子音响驱动控制"模块的"SIN"输入插孔
#include <reg51.h>
sbit P1_0=P1^0;
#define mvar 11059200/12/2//对晶振为11.0592MHz进行12分频后,为机器周期的倒数,再除以2定时时间到P1口反向
//为了通过计数器让P1.0发出一定频率的方波,要求:
//在打开的'串口调试窗'中设置串行口com1,波特率2400,然后在该对话框中的'处理字符串'下方的输入框
//内输入要发送的字符串,比如"123456",然后单击该输入框内右侧的"发送"按钮,即可在数码管上显示出123456
//同时在'串口调试窗'中的'接收窗口'区显示出单片机发过来的234567
{
PCON=0
SCON=0x50;
TMOD=0x20;
TH1=0xFD;
TL1=0xFD;
TR1=1;
do
{
while(RI)
{
RI=0;
i++;
DBYTE[0x40+i]=SBUF;
}
}while(i<10)
while(1);
}
实验六:八位数码管串行通信
//************连线说明**********
}
void Delay();//声明延时函数
main() //_at_ 0x30
{
TMOD=0x01; /*定时器0方式1 */
EA=1; /*开CPU中断*/
ET0=1;/*开T0中断*/
while(1)
{
count=0;
next:temp1=yinfu[count];
if(temp1==0)
{TR0=0;
//注意:在输入框内不要输入双引号或单引号,因为单引号作为ascii码字符也会被发送
//还可以使用作者自己开发的8250.asm生成的8250.exe软件,该软件的使用详见8250.asm
#include <reg51.h>
#include <absacc.h>
#define X273 XBYTE[0x8000]//I/O口简单扩展模块的273CS2插孔接Y0(8000H)
TR1=1;
SBUF=DBYTE[0x30];
do
{
while(TI)
{
TI=0;
i++;
SBUF=DBYTE[0x30+i];
}
}while(i<10)
while(1);
}
//乙机接收数据
#include<reg51.h>
#include<absacc.h>
unsigned char i=0;
main()
0x51,0x61,0x52,0x54,0x54,0x54,0x54,0x00};//怒放的生命*/
uchar high,low,temp1,temp2,temp3,count;
timer0() interrupt 1 using 1/* T0中断服务程序*/
{
TH0=high;
TL0=low;
P1_0=!P1_0;
0xc2,0xa2,0x92,0x82,0x82,0x92,0x82,0x82,
0x88,0x04,0x82,0x91,0xc1,0xc2,0xa2,0x92,
0x82,0x92,0x92,0x91,0xa1,0x62,0x64,0x62,
0x82,0x92,0x92,0x91,0xa1,0x82,0x02,0x62,
/*uchar code yinfu[]=
{0x64,0x62,0x52,0x64,0x84,0x92,0xa1,0x91,
0x82,0x92,0xa8,0x62,0xd2,0xd2,
0xc2,0x92,0xa1,0x91,0x82,0x22,0xa8,0x08,
0x82,0x62,0x62,0x82,0x94,0x52,0x52,0xa2,0xc2,
ET0=1; //允许定时器T0中断
EA=1; //开放CPU中断
while(1);
}
t0_int() interrupt 1 //中断函数
{
P1_0=! P1_0; //P1.0取反
TL0=0xF0; //重新装入计数初值
TH0=0xD8;
}
实验四:三首歌
/**********硬件连线*************/
count=20;
}
}
例题6.5,153页
#include<reg51.h> //包含特殊功能寄存器声明头文件
sbit P1_0=P1^0; //定义特殊功能位P1_0
main() //主函数
{
TMOD=1; //设置定时/计数器0工作于方式1
TL0=0xF0; //装入计数初值
TH0=0xD8;
TR0=1; //启动定时器T0
// (12/fosc)*(65536-X)x2=1/f.因而16位计数初始值X=65536-(11059200/12/2)/f
//因而把(11059200/12/2)预定义
#define uint unsigned int
#define uchar unsigned char
//freq[]为发出dao-xi即1-7(又分低音和高音)频率表
}//while(1)结束
}//main()结束
void Delay()//11.0592Mhz下延时0.250883秒
{
uint i,j;
for(i=0;i<80;i++)//若想加快演唱节奏,可以修改成i<130或i<120
for(j=0;j<200;j++);
}
实验五:多机点对点串行通信,175页
{
SM0=0;
SM1=1; //串口方式1
RI=0;
REN=1; //允许接受
TMOD=0x20; //T1方式2,定时.GAT C/T M1 M0
//PCON=0x80;
TL1=0xF4;//系统晶振为11059200Hz时波特率2400的常数
TH1=0xF4;
//TL1=0xE8;//系统晶振为11059200Hz时波特率1200的常数
//TH1=0xE8;
TR1=1;
EA=1;//开总中断
ES=1;//开串行口中断
while(1)
{
disp();
}
}//main end
void serial_int(void) interrupt 4
//若选择com1口没有反应,再尝试选择com2单选框,然后再单击"打开串行口"按钮
//在数码管区会左移动显示通过串口调试软件dvsio.exe发送的字符
//实验表明dvsio.exe发送时不是ASCII码而是16进制数
//另外,还可以用DVCC厂家提供的COMView.exe工具发送字符.直接双击COMView文件内的COMView.exe
u来自百度文库signed char code zixing[]=
{0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7c,0x39,0x5e,0x79,0x71};//0-F
void delay(unsigned int time);
void disp(void);
//(1)译码器输出插孔Y0接I/O口简单扩展区的273CS插孔;
//(2)I/O口简单扩展区的out0~out7排针接数码管显示区的code排针(从左至右为a,b,c,d,e,f,g,dp)
//(3)P1口排针接数码管区bit排针,P1.0对应bit排针最左边的排针bit0
//(4)用9芯的串行口线连接计算机背面的串行口与实验箱上的RS232通信模块的RS232/RS485插座
high=(65536-mvar/(freq[temp1]))/256;
low=(65536-mvar/(freq[temp1]))%256;
TH0=high;
TL0=low;
TR0=1;
w1:
for(;temp2>0;temp2--)
Delay();
count++;
goto next;
stop:
TR0=0;
//然后单击"打开串行口"按钮,若能打开该串行口,该按钮会变成"关闭串行口"
//(2)单击keilc软件的'start/Stop Debug Session'工具按钮将代码下载到硬件仿真器,然后单击'运行'按钮
//(3)单击dvsio.exe界面右侧的"发送字符"区域的0到F按钮就可以通过串口向单片机发送字符了
0xa2,0x92,0x88,0x62,0x82,0x92,0xa2,
0x92,0x82,0x52,0x32,0x68,0x00};//最炫民族风*/
/*uchar code yinfu[]=
{0x02,0x52,0x62,0x82,0xc2,0xa4,0x92,0xa5,
0xa2,0xa8,0x04,0x82,0x91,0xc1,
sbit P1_0=P1^0;
char count=20;
main()
{
TMOD=1;
TL0=0xB0;
TH0=0x3C;
TR0=1;
ET0=1;
EA=1;
while(1);
}
t0_int() interrupt 1
{
TL0=0xB0;
TH0=0x3C;
count--;
if(count==0)
{
P1_0=! P1_0;
P1=0x04; delay();
P1=0x08; delay();
P1=0x10; delay();
P1=0x20; delay();
P1=0x40; delay();
P1=0x80; delay();
}
}
void delay()
{ int i=0;
while(i<10000) i++;
}
实验二:147页,例题6.1
//(5)CPU系统I/O区的P3.0插孔接RS232通信模块的RXD_232插孔
//(6)CPU系统I/O区的P3.1插孔接RS232通信模块的TXD_232插孔
//**********功能说明**************
//(1)打开DVCC厂家开发的串口调试软件dvsio.exe,选择波特率BP2400及com1单选框
//先运行乙机的接收程序,再运行甲机的发送程序;然后乙机复位,查看仿真上数据变化。
//甲机发送数据
#include<reg51.h>
#include<absacc.h>
unsigned char i=0;
main()
{
PCON=0
SCON=0x40;
TMOD=0x20;
TH1=0xFD;
TL1=0xFD;
0x81,0x64,0xa2,0xc1,0xd2,0xd2,0xd2,0xa2,
0xc4,0xa1,0xc1,0xa1,0xc1,0xd2,0xd2,0xd2,0xa2,
0xc4,0xc2,0x62,0xc2,0x62,0xa2,0xa2,
0x84,0x00};//音符表高4位音阶,低4位代表该音节持续的拍数,猪八戒背媳妇*/
unsigned char rec_val,start=0;
//开辟了25个显示单元最多可以显示按下的25-8=17个键,0x40表示数码管的g段亮
unsigned char data buf[25]={0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0,0,0};
main()
单片机试验程序
实验一:用程序使AT89C51单片机的P1.0~P1.7引脚循环输出高电平,经反相器后控制小灯循环点亮。
#include<reg51.h>
void delay();
void main()
{
while(1)
{
P1=0x00; delay();
P1=0x01; delay();
P1=0x02; delay();
uint code freq[]={65535,262,294,330,349,392,440,494,523,578,659,698,784,880,988};//单位Hz
uchar code yinfu[]=
{0x64,0xa2,0xc1,0xa2,0x62,0x84,0x61,0x81,
0x61,0x81,0xa4,0xa1,0x91,0xa1,
goto stop;}
else
{ temp2=(temp1&0x0f);//原来用temp2=(temp1&&0x0f)是错误的;注意&是按位与,
//而&&是逻辑与
temp1>>=4;}
if(temp1==0)
{
P1_0=1;
TR0=0;
goto w1; }
// temp1--;若将freq[]中的第一个数65535去掉,则需要增加该语句
#include<reg51.h>
unsigned char n=0x01;
main()
{
P1=0xFF;
EA=1;
EX0=1;
IT0=1;
while(1);
}
int_0()interrupt 0
{
P1=~n;
n<<=1;
if(n==0) n=0x01;
}
实验三:154页例题6.6
#include<reg51.h>
相关文档
最新文档