一、从1自加到9999
#include
#define uchar unsigned char
#define uint unsigned int
uchar i=0;
uchar Data[]={8,8,8,8,0,0,0,0};
//===========================函数声明================================ void delay(uint Time);
void display(uchar Data[]);
//============================主函数================================= void main()//主函数
{
//---------------------------系统初始化--------------------------
unsigned long int count=0;
uint t=0;
while(1)//死循环
{
for(t=0;t<10;t++)
{
display(Data);
}
//-------------计数自加1--------------
Data[7]++;
if(Data[7]>9)
{
Data[7]=0;
Data[6]++;
if(Data[6]>9)
{
Data[6]=0;
Data[5]++;
if(Data[5]>9)
{
Data[5]=0;
Data[4]++;
if(Data[4]>9)
{
Data[4]=0;
}
}
}
}
}
}
void display(uchar Data[])
{
uchar code seg[]={
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,
0xa1,0x86,0x8e,0xbf,0xff};
uchar code Bit[]={
0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
uchar i=0;//记录显在哪位上。
uchar Time=0; //延时计数。
uchar light=255;
for(i=0;i<8;i++)//有8位数码管
{
//---------段选------------
P2=0xf9;//选择段选开关。
P0=seg[Data[i]];//送段选码。
WR=0; //开
WR=1; //关
//---------位选------------
P2=0xf8;
P0=Bit[i];
WR=0;
WR=1;
//延时
Time=light;
while(Time--);
light=light/2;
//---------消影------------
P2=0xf8;
P0=0xff;
WR=0;
WR=1;
}
}
二、时分秒计时并能进行按键更改
/*=============================程序说明=============================== 项目名称:
作者:
创建日期:
修改说明:
程序说明:
(1)CPU 型号:
(2)时钟频率:
(3)实现功能:
(4)程序概述:
===================================================================*/ //==========================头文件加载=============================== #include
//===========================端口声明================================ sbit Key1=P3^2;//声明按键1(Key1)接在单片机的P3.2端口。
sbit Key2=P3^3;//声明按键2(Key2)接在单片机的P3.3端口。
sbit Key3=P3^4;//声明按键3(Key3)接在单片机的P3.4端口。
sbit Key4=P3^5;//声明按键4(Key4)接在单片机的P3.5端口。
//=========================全局常量声明==============================
//=========================全局变量声明============================== unsigned char sec=0;//秒计数。(0~59)
unsigned char min=0;//分计数。(0~59)
unsigned char hour=0;//小时计数。(0~23)
unsigned char Data[]={0,0,16,0,0,16,0,0};
//数码管显示数组。
//===========================函数声明================================ void delay(unsigned int Time);//延时函数
void display(unsigned char Data[]);//数码管动态显示函数。
void TestKey(void);//按键测试函数。
//============================主函数================================= void main()//主函数
{
unsigned char t=0;
//---------------------------系统初始化--------------------------
sec=0; //从0秒开始。
min=0; //从0分开始。
hour=0;//从0时开始。
while(1)//死循环
{
//------------------拆分时、分秒到Data数组中-----------------
Data[0]=hour/10;//拆分“时”的十位到第1个数码管上显示
Data[1]=hour%10;//拆分“时”的个位到第2个数码管上显示
Data[3]=min/10; //拆分“分”的十位到第4个数码管上显示
Data[4]=min%10; //拆分“分”的个位到第5个数码管上显示
Data[6]=sec/10; //拆分“秒”的十位到第7个数码管上显示
Data[7]=sec%10; //拆分“秒”的个位到第8个数码管上显示
//------------------------显示Data数组-----------------------
for(t=0;t<20;t++)
display(Data);//数码管显示。
//--------------------------按键判断-------------------------
TestKey();
//--------------------------计时自加-------------------------
sec++;//秒加1计时。
if(sec>59)//如果秒到了60
{
sec=0;//秒位清0
min++;//分位加1计时
if(min>59)//如果分到60。
{
min=0;//分位清0。
hour++;//时位加1计时。
if(hour>23)//如果时到24。
hour=0;//则从0时开始
}
}
}
}
//==========================功能子函数=============================== /*-------------------------------------------------------------------
函数名称:延时函数
功能:进行软件延时
输入:Time(延时的时间,单位US)
输出:无
说明:
-------------------------------------------------------------------*/
void delay(unsigned int Time)
{
while(Time--);
}
/*-------------------------------------------------------------------
函数名称:数码管动态显示函数
功能:在数码管上显示8位数据(0~F)。
输入:Data[]//8位数码管要显示的数据。
输出:无
说明:该函数只与Data[]数组有关。
-------------------------------------------------------------------*/
void display(unsigned char Data[])
{
unsigned char code seg[]={
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6, 0xa1,0x86,0x8e,0xbf,0xff};
unsigned char code Bit[]={
0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
unsigned char i=0;//记录显在哪位上。
unsigned char Time=0; //延时计数。
for(i=0;i<8;i++)//有8位数码管
{
//---------段选------------
P2=0xf9;//选择段选开关。
P0=seg[Data[i]];//送段选码。
WR=0; //开
WR=1; //关
//---------位选------------
P2=0xf8;
P0=Bit[i];
WR=0;
WR=1;
//---------扫频延时------------
Time=50;
while(Time--);
//---------消影------------
P2=0xf8;
P0=0xff;
WR=0;
WR=1;
}
}
/*-----------------------------------------------------------------
函数名称:按键测试函数
功能:
输入:无
输出:无
说明:
-------------------------------------------------------------------*/
void TestKey(void)
{
//---------------------按键1,每按下,时位加1--------------------
if(Key1==0)
{
//delay(1000);//10ms
display(Data);
display(Data);
if(Key1==0)
display(Data);
{
//-----------hour变量加一------------
hour++;
//----------过界判断-----------------
if(hour>23) hour=0;
//----------松手检测-----------------
while(Key1==0)
{
display(Data);
}
}
}
//---------------------按键2,每按下,时位减1-------------------- if(Key2==0)
{
//delay(1000);//10ms
display(Data);
display(Data);
if(Key2==0)
display(Data);
{
//-----------cout变量减一------------
hour--;
//----------过界判断-----------------
if(hour==-1) hour=23;
//----------松手检测-----------------
while(Key2==0)
{
display(Data);
}
}
}
//---------------------按键3,每按下,分位加1-------------------- if(Key3==0)
{
//delay(1000);//10ms
display(Data);
display(Data);
if(Key3==0)
display(Data);
{
//-----------cout变量减一------------
min++;
//----------过界判断-----------------
if(min>59) min=0;
//----------松手检测-----------------
while(Key3==0)
{
display(Data);
}
}
}
//---------------------按键4,每按下,分位减1--------------------
if(Key4==0)
{
//delay(1000);//10ms
display(Data);
display(Data);
if(Key4==0)
display(Data);
{
//-----------cout变量减一------------
min--;
//----------过界判断-----------------
if(min==-1) min=59;
//----------松手检测-----------------
while(Key4==0)
{
display(Data);
}
}
}
}
三、流水灯程序
//==========================头文件加载=============================== #include
//===========================端口声明================================ #define LED P1
//=========================全局常量声明==============================
#define PI 3.14
//=========================全局变量声明============================== unsigned char i=0;
//===========================函数声明================================ void delay(unsigned int Time);
//============================主函数================================= void main()//主函数
{
//---------------------------系统初始化--------------------------
while(1)//死循环
{
LED=0xF7;
delay(50000);
LED=0xFB;
delay(50000);
LED=0xFD;
delay(50000);
LED=0xFE;
delay(50000);
LED=0xF7;
delay(50000);
}
}
//==========================功能子函数
void delay(unsigned int Time)
{
while(Time--);
}
四、数码管显示年月日
//==========================头文件加载=============================== #include
//===========================端口声明================================ //=========================全局常量声明==============================
unsigned char code seg[]={
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; unsigned char code Bit[]={
0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
//=========================全局变量声明============================== unsigned char i=0;
unsigned char Data[]={2,9,8,8,0,3,1,9};
//===========================函数声明================================ void delay(unsigned int Time);
//============================主函数================================= void main()//主函数
{
//---------------------------系统初始化--------------------------
while(1)//死循环
{
//1
for(i=0;i<8;i++)
{
//---------段选------------
P2=0xf9;
P0=seg[Data[i]];
WR=0;
WR=1;
//---------位选------------
P2=0xf8;
P0=Bit[i];
WR=0;
WR=1;
//---------延时------------
delay(80);
//---------消影------------
P2=0xf8;
P0=0xff;
WR=0;
WR=1;
}
}
}
void delay(unsigned int Time)
{
while(Time--);
}
五、4乘4矩阵键盘
/*=============================程序说明===============================
项目名称:
作者:
创建日期:
修改说明:
程序说明:
(1)CPU 型号:
(2)时钟频率:
(3)实现功能:
(4)程序概述:
===================================================================*/
//==========================头文件加载===============================
#include
//===========================端口声明================================
#define keyIO P1
//声明4×4的矩阵键盘接在单片机的P1端口。
//=========================全局常量声明==============================
//=========================全局变量声明============================== unsigned char Data[]={17,17,17,17,17,17,0,0};//键码是唯一的,键值是可变的,人为约定的//数码管显示数组。
unsigned char keycodeA=0xff;
//===========================函数声明================================
void display(unsigned char Data[]);
unsigned char keyscan(void);
void keydo(unsigned char keycode);
//============================主函数=================================
void main()//主函数
{
//---------------------------系统初始化--------------------------
keydo(keycodeA);
while(1)//死循环
{
keycodeA=keyscan();
if(keycodeA!=0xff)
{
keydo(keycodeA);
}
display(Data);
}
}
//==========================功能子函数=============================== /*-------------------------------------------------------------------
函数名称:
功能:
输入:
输出:
说明:
-------------------------------------------------------------------*/
unsigned char keyscan(void)
{
unsigned char keycode=0xff;
//默认没有按键按下。
keyIO=0xf7;
if((keyIO&0xf0)!=0xf0)
{
display(Data);
display(Data);//去抖延时
if((keyIO&0xf0)!=0xf0)
{
keycode=keyIO;
while((keyIO&0xf0)!=0xf0)
{
display(Data);
}
}
}
keyIO=0xfb;
if((keyIO&0xf0)!=0xf0)
{
display(Data);
display(Data);//去抖延时
if((keyIO&0xf0)!=0xf0)
{
keycode=keyIO;
while((keyIO&0xf0)!=0xf0)
{
display(Data);
}
}
}
return keycode;
}
void keydo(unsigned char keycode) {
Data[0]=keycode>>4;
Data[1]=keycode&0x0f;
switch(keycode)
{
case 0x77: //S1
Data[6]=0;
Data[7]=1;
break;
case 0xb7:
Data[6]=0;
Data[7]=2;
break;
case 0xd7:
Data[6]=0;
Data[7]=3;
break;
case 0xe7:
Data[6]=0;
Data[7]=4;
break;
case 0x7b:
Data[6]=0;
Data[7]=5;
break;
case 0xbb:
Data[6]=0;
Data[7]=6;
break;
case 0xdb:
Data[6]=0;
Data[7]=7;
break;
case 0xeb:
Data[6]=0;
Data[7]=8;
break;
default:
break;
}
}
/*-------------------------------------------------------------------
函数名称:数码管动态显示函数
功能:在数码管上显示8位数据(0~F)。
输入:Data[]//8位数码管要显示的数据。
输出:无
说明:该函数只与Data[]数组有关。
-------------------------------------------------------------------*/
void display(unsigned char Data[])
{
unsigned char code seg[]={
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6, 0xa1,0x86,0x8e,0xbf,0xff};
unsigned char code Bit[]={
0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
unsigned char i=0;//记录显在哪位上。
unsigned char Time=0; //延时计数。
for(i=0;i<8;i++)//有8位数码管
{
//---------段选------------
P2=0xf9;//选择段选开关。
P0=seg[Data[i]];//送段选码。
WR=0; //开
WR=1; //关
//---------位选------------
P2=0xf8;
P0=Bit[i];
WR=0;
WR=1;
//---------扫频延时------------
Time=50;
while(Time--);
//---------消影------------
P2=0xf8;
P0=0xff;
WR=0;
WR=1;
}
}
六、温度传感器测温度
/*=============================程序说明=============================== 项目名称:
作者:
创建日期:
修改说明:
程序说明:
(1)CPU 型号:
(2)时钟频率:
(3)实现功能:
(4)程序概述:
===================================================================*/ //==========================头文件加载=============================== #include
//===========================端口声明================================ sbit DS18b20_DQ=P2^7;//声明DS18B20的数据引脚接在单片机的P2.7端口。
//=========================全局常量声明==============================
//=========================全局变量声明============================== unsigned char Data[]={17,17,17,17,17,17,0,0};
//数码管显示数组。
//===========================函数声明================================ void delay(unsigned char Time);
#define delay_520us() delay(80)
#define delay_60us() delay(8)
#define delay_15us() delay(1)
unsigned char DS18B20_reset(void);
void DS18B20_write_byte(unsigned char Data);
unsigned char DS18B20_read_byte();
void display(unsigned char Data[]);
//============================主函数================================= void main()//主函数
{
unsigned char tempL,tempH;
unsigned int tempDot;
//---------------------------系统初始化--------------------------
while(1)//死循环
{
while(DS18B20_reset());
DS18B20_write_byte(0xcc);
DS18B20_write_byte(0x44);
while(DS18B20_reset());
DS18B20_write_byte(0xcc);
DS18B20_write_byte(0xBE);
tempL=DS18B20_read_byte();
tempH=DS18B20_read_byte();
tempH=(tempH<<4)|(tempL>>4);//整数部分
tempDot=(tempL&0x0f)*625;//小数部分,整数化
Data[1]=tempH/100;
Data[2]=(tempH/10)%10;
Data[3]=tempH%10;
Data[4]=tempDot/1000;
Data[5]=(tempDot/100)%10;
Data[6]=(tempDot/10)%10;
Data[7]=tempDot%10;
display(Data);
}
}
//==========================功能子函数===============================
void delay(unsigned char Time)
{
while(Time--);
}
unsigned char DS18B20_reset(void)
{
unsigned char Error=1;//默认复位不成功。
//---------主机发送复位信号------
DS18b20_DQ=1;
DS18b20_DQ=0;
delay_520us();
DS18b20_DQ=1;
delay_60us();
//---------接收DS18B20的应答信号-----
while(DS18b20_DQ==0)
Error=0;
while(DS18b20_DQ==0)
Error=0;
DS18b20_DQ=1;
return Error;
}
void DS18B20_write_byte(unsigned char Data) {
unsigned char i=0;
for(i=0;i<8;i++)
{
DS18b20_DQ=1;
DS18b20_DQ=0;
DS18b20_DQ=Data&0x01;
Data=Data>>1;
delay_60us();
DS18b20_DQ=1;
}
}
unsigned char DS18B20_read_byte()
{
unsigned char i,Data;
for(i=0;i<8;i++)
{
Data=Data>>1;
DS18b20_DQ=1;
DS18b20_DQ=0;
DS18b20_DQ=1;
delay_15us();
if(DS18b20_DQ==1) Data=Data|0x80;
delay_60us();
DS18b20_DQ=1;
}
return Data;
}
/*-------------------------------------------------------------------
函数名称:数码管动态显示函数
功能:在数码管上显示8位数据(0~F)。
输入:Data[]//8位数码管要显示的数据。
输出:无
说明:该函数只与Data[]数组有关。
-------------------------------------------------------------------*/
void display(unsigned char Data[])
{
unsigned char code seg[]={
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6, 0xa1,0x86,0x8e,0xbf,0xff};
unsigned char code Bit[]={
0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
unsigned char i=0;//记录显在哪位上。
unsigned char Time=0; //延时计数。
for(i=0;i<8;i++)//有8位数码管
{
//---------段选------------
P2=0xf9;//选择段选开关。
P0=seg[Data[i]];//送段选码。
if(i==3) P0=P0&0x7f;
WR=0; //开
WR=1; //关
//---------位选------------
P2=0xf8;
P0=Bit[i];
WR=0;
WR=1;
//---------扫频延时------------
Time=50;
while(Time--);
//---------消影------------
P2=0xf8;
P0=0xff;
WR=0;
WR=1;
}
}
详细的单片机开发流程 一、项目评估: 出初步技术开发方案,据此出预算,包括可能的开发成本、样机成本、开发耗时、样机制造耗时、利润空间等,然后根据开发项目的性质和细节评估风险,以决定项目是否落实资金上马。 二、项目实施: 1、设计电原理图: 在做这一步时要考虑单片机的资源分配和将来的软件框架、制定好各种通讯协议, 尽量避免出现当板子做好后, 即使把软件优化到极限仍不能满足项目要求的情况, 还要计算各元件的参数、各芯片间的时序配合, 有时候还需要考虑外壳结构、元件供货、生产成本等因素, 还可能需要做必要的试验以验证一些具体的实 现方法。设计中每一步骤出现的失误都会在下一步骤引起连锁反应, 所以对一些没有把握的技术难点应尽量去核实。 2、设计印刷电路板(PCB 图: 完成电原理图设计后, 根据技术方案的需要设计 PCB 图, 这一步需要考虑机械结构、装配过程、外壳尺寸细节、所有要用到的元器件的精确三维尺寸、不同制 版厂的加工精度、散热、电磁兼容性等等, 为最终完成这一步常常需要几十次回 头修改电原理图。 3、把 PCB 图发往制版厂做板: 将加工要求尽可能详细的写下来与 PCB 图文件一起发电邮给工厂,并保持沟通,及时解决加工中出现的一些相关问题。 4、定购开发系统和元件:
要考虑到开发过程中的可能的损耗, 供货厂商的最小订货量、商业信誉、价格、服务等, 具体工作包括整理购货清单、联系各供货厂商、比较技术参数、下定单、跑银行汇款、传真汇款底单、催货等等。 5、装配样机: PCB板拿到后开始样机装配,设计中的错漏会在装配过程开始显现,尽量去补救。 6、样机调试: 样机初步装好就可以开始调试, 当然需要有软件才能调, 有人说单片机的软件不是编出来而是调出来的, 所以这个过程需要用到电烙铁、刻刀、不同参数的元件、各种调试和仿真软件、样机的模拟工作环境等。常常会因为设计阶段的疏忽而不得不对样机动手术, 等整个调试终于完成之后, 往往样机的板子已经面目全非。 7、整理数据: 到了这一步, 项目开发的大部分工作都已经完成了, 这时候需要将样机研发过程中得到的重要数据记录保存下来,比如更新电原理图里的元件参数、 PCB 元件库里的三维模型, 还要记录暴露出来的设计上的失误、分析失误的原因、采用的补救方案等等。 8、 V1.1 如果项目进入生产阶段或确有需要, 可以根据修正后的技术方案按以上各个步骤重做一台完善的 V1.1版样机。 9、编写设备文档 包括编写产品说明书、拍摄外观图片等, 如果设备需要和电脑通讯, 还得写好与电脑的接口标准和通讯协议说明。
一个单片机小程序编写 单片机在家用电器和工业系统中应用广泛,下面给大家介绍一个单片机小程序的编写。 1、设计任务: 如果开关合上,L1亮,开关打开,L1熄灭,如图1所示。监视开关K1(接在P3.0端口上),用发光二极管L1(接在单片机P1.0端口上)显示开关状态。 2、电路原理图: 图1 3、系统板上硬件连线:如图1所示,图中VCC = +5V。 4、程序设计内容: (1)开关状态的检测过程: 开关状态是从单片机的P3.0端口输入信号,当拨开开关K1拨上去(开关断开),即输入高电平;当拨动开关K1拨下去(开关闭合),即输入低电平。可以采用JB BIT,REL 指令来完成对开关状态的检测即可。 (2)输出控制: 如图1所示,当P1.0端口输出高电平,即P1.0=1时,根据发光二极管的单向导电性可知,这时发光二极管L1熄灭;当P1.0端口输出低电平,即P1.0=0时,发光二极管L1亮。我们可以使用SETB P1.0指令使P1.0端口输出高电平,使用CLR P1.0指令使P1.0端口输出低电平。 5、程序框图:如图2所示。
图2 6、汇编源程序的编写: ORG 00H START: JB P3.0,D1 CLR P1.0 SJMP START D1: SETB P1.0 SJMP START END 7、用“keil软件编”写好汇编程序,然后转换成HEX文件并保存。 8、用“增强型A51编程器”把刚才写好的HEX文件烧写入单片机中。 9、把已写入程序的单片机,装入图1的电路,然后通电。当拨动开关K1拨下去(开关闭合),发光二极管L1亮;拨开开关K1拨上去(开关断开),发光二极管L1灭。说明刚才编写的程序达到了我们的设计要求。
单片机原理实验教案 参考程序
广东松山职业技术学院《MCS-51单片机原理》实验指导书 宁玉珊黄晓林 使用Proteus辅助设计与仿真
实训项目1 Proteus辅助设计与仿真的使用 一、实训目的 学习并熟练掌握PROTEUS辅助设计与仿真软件的使用。通过使用Proteus的ISIS组件绘制AT89C51功能接口原理图,并对原理图编写程序和调试程序,观察在仿真条件下的实现功能的效果。 二、实训内容 在PROTEUS仿真环境下实现一个发光二极管(LED)闪烁。要求LED亮0.5s灭1s,并绘制原理图和编写实现程序,同时用虚拟的示波器观察硬件和软件实现的效果。 三、实训器材 安装有Proteus7软件的计算机 1 台。 四、实训步骤 1)在硬盘建立文件夹用来保存新建项目的所有文件。如在D盘建立PROJECT文件夹。 2)选择‘开始→程序→Proteus7 professional→ISIS professional(或者双击桌面图标ISIS)’,进入Proteus仿真环境,如图P1_1和P1_2所示。 图P1-1
图P1-2 3)选择菜单【File/New Design】创建一个新的设计项目,如图P1_3所示。 图P1-3 4)此时系统会弹出模板选择窗口,选择‘DEFAULT’点击【OK】即可,如图P1_4所示。
图P1_4 5)点击界面左侧工具栏中的图标,接着点击元件池上方的按钮,将要用到的元器件从系统库调到当前设计文件库中。在弹出的Pick Devices对话框左上角的‘Keywords’文本框中键盘输入元件名(或元件的其它关键词)搜索到需要的元器件。双击‘Results’栏下的目标元件,该元件即调出到当前设计文件库的元件列表中,如图P1_5所示。本实训中所要用到的元件如表PS1_1所示。 图P1_5 元件名称搜索关键词元件序 数值备注 号 电阻器Resistor R1 10k 电阻器Resistor R2 1k 电解电容器MINELECT1U63V C1 4.7μ 陶瓷电容器CERAMIC22P C2、C3 22p 晶振CRYSTAL X1 12MHz 单片机AT89C51 U1
编程题 1,清零程序 将片外数据存储器中5000h~500ffh单元全部清零 ORG OOOOH MOV DPTR, #5000H MOV R0,#00H CLR A LOOP: MOVX @DPTR,A INC DPTR DJNZ RO,LOOP HERE: SJMP HERH 2.试着编写程序,查找在内部 RAM的20h~40h单元中出现00h这一数据的次数将查到的结果存入41h单元 ORG 0000H MOV R0,#20H MOV R1,#21H MOV 41H,#00H LOOP: CJNE @RO,#00H,NEXT INC 41H NEXT: INC R0 DJNZ RI,LOOP HERE: SJMP HERE 3查找在内部RAM的30h~50单元中是否有0AAH这一数据,若有则将51H单元置为01H;若未找到;则将51H单元置为00H. ORG 0000H MOV R0,#30H MOV R1,#21H LOOP: CJNE @R0,0AAH,NEXT MOV 51H,#01H SJMP HERE NEXT: INC R0 DJNZ R1,LOOP MOV 51H,#00H HERE: SJMP HERE 4编写程序功能为把1000H开始的外部RAM单元中的数据送到内部RAM50H开始的单元中,数据的个数存放在了内部RAM60H单元。 ORG 0000H MOV DPTR #1000H MOV R0,#50H MOV R1,60H LOOP: MOVX A,@DPTR MOV 50H,A INC DPTR INC R0
DJNZ RI,LOOP HERE: SJMP HERE 5.编写请将ROM3000H单元内容送R7. ORG 0000H MOV DPTR, #3000H CLR A MOVC A ,@A+DPTR MOV R7,A END 6.片外RAM2000H单元内容送到片外RAM1000H的单元中。 ORG 0000H MOV DPTR,#2000H MOVX A,@DPTR MOV DPTR,,#1000H\ MOVX @DPTR,A 7.锯齿形波: ORG 2000H START: MOV R0,#0FEH MOV A,#00H LOOP: MOVX @R0,A INC A SJMP LOOP 8三角形波 ORG 2000H START MOV R0,#0FEH MOV A,#00H UP: MOVX @R0,A INC A JNZ UP DOWN: DEC A MOVX @DPTR,A JNZ DOWN SJMP UP
实验一系统认识及基本程序设计实验 四、实验内容 1. 将BCD 码整数0~255 存入片内RAM 的20H、21H、22H 中,然后转换为二进制整数00H~FFH,保存到寄存器R4 中。修改20H、21H、22H 单元的内容,如:00H,05H,08H;观察实验结果。 参考程序: ;============================================================== ; 文件名称: Asm2-1.asm ; 功能描述: BCD整数转换为二进制整数(8位, 范围从00H--FFH) ;============================================================== ORG 0000H LJMP MAIN ORG 0100H MAIN: MOV R0, #20H ;BCD存放高位地址 MOV R7, #03H ;BCD码0--255, 最多3位 CLR A MOV R4, A LP1: MOV A, R4 MOV B, #0AH MUL AB ;乘10 ADD A, @R0 ;加下一位的值 INC R0 ;指向下一单元 MOV R4, A ;结果存入R4 DJNZ R7, LP1 ;转换未结束则继续 SJMP MAIN ;设置断点, 观察实验结果R4中的内容 END 2. 将16 位二进制整数存入R3R4 寄存器中,转换为十进制整数,以组合BCD 形式存储在RAM 的20H、21H、22H 单元中。 参考程序: ;============================================================= ; 文件名称: Asm2-2.asm ; 功能描述: 二进制整数(16位)转换为十进制整数(组合BCD) ;============================================================= ; 0--FFFFH(R3R4)==>0--65535 ORG 0000H LJMP MAIN ORG 0100H MAIN: MOV R0, #22H ;转换结果低位地址 MOV A, R0 PUSH ACC ;ACC表示累加器A的直接地址 MOV R7, #03H
333。(x为0x2~+x39的整数)用查表方式编写y=x1 + #include
单片机程序设计方法总结 程序设计是单片机开发最重要的工作程序设计就是利用单片机的指令系统根据应用系统即目标产品的要求编写单片机的应用程序其实我们前面已经开始这样做过了这一课我们不是讲如何来设计具体的程序而是教您设计单片机程序的基本方法不过在讲解之前还是有必要先了解一下单片机的程序设计语言这里的语言与我们通常理解的语言是有区别的它指的是为开发单片机而设计的程序语言如果 您没有学过程序设计可能不太明白我给大家简单解释一下您知道微软的VB VC 吗VB VC 就是为 某些工程应用而设计的计算机程序语言通俗地讲它是一种设计工具只不过这种工具是用来设计计 算机程序的要想设计单片机的程序当然也要有这样一种工具说设计语言更确切些单片机的设计 语言基本上有三类: 1 .完全面向机器的机器语言 机器语言就是能被单片机直接识别和执行的语言计算机能识别什么以前我们讲过--是数字0 或1 所以机器语言就是用一连串的0 或1 来表示的数字比如MOV A 40H 用机器语言来表示就是 11100101 0100000 很显然用机器语言来编写单片机的程序不太方便也不好记忆我们必须想办法 用更好的语言来编写单片机的程序于是就有了专门为单片机开发而设计的语言 2. 汇编语言 汇编语言也叫符号化语言它使用助记符来代替二进制的0 和1 比如刚才的MOV A40H 就是汇编语言 指令显然用汇编语言写成的程序比机器语言好学也好记所以单片机的指令普遍采用汇编指令来编写 用汇编语言写成的程序我们就叫它源程序或源代码可是计算机不能识别和执行用汇编语言写成的程 序啊怎么办当然有办法我们可以通过翻译把源代码译成机器语言这个过程就叫做汇编,汇编工作现在 都是由计算机借助汇编程序自动完成的不过在很早以前它是靠手工来做的. 值得注意的是:汇编语言也是面向机器的,它仍是一种低级语言每一类计算机都有它自己的汇 编语言比如51 系列有它的汇编语言;PIC 系列也有它的汇编语言微机也有它自己的汇编语言它 们的指令系统是各不相同的也就是说不同的单片机有不同的指令系统它们之间是不通用的,这就
单片机C语言编程实例 前言 INTEL公司的MCS-51单片机是目前在我国应用得最广泛的单片机之一.随着 单片机应用技术的不断发展,许多公司纷纷以51单片机为内核,开发出与其兼容的 多种芯片,从而扩充和扩展了其品种和应用领域。 C语言已成为当前举世公认的高效简洁而又贴近硬件的编程语言之—。将C语言向单片机上的移植,始于20世纪80年代的中后期。经过十几年的努力,C语言终于成为专业化单片机上的实用高级语言。用C语言编写的8051单片机的软件,可以大大缩短开发周期,且明显地增加软件的可读性,便于改进和扩充,从而研制出规模更大、性能更完善的系统。因此,不管是对于新进入这一领域的开发者来说,还是对于有多年单片机开发经验的人来说,学习单片机的C语言编程技术都是十分必要的。. C语言是具有结构化.模块化编译的通用计算机语言,是国际上应用最广.最多的计算语言之一。C51是在通用C语言的基础上开发出的专门用于51系列单片机编程的C语言.与汇编语言相比,C51在功能上.结构上以及可读性.可移植性.可维护性等方面都有非常明显的优势。目前 最先进、功能最强大、国内用户最多的C51编译器是Keil Soft ware公司推出的KeilC51。第 一章单片机C语言入门 1.1建立您的第一个C项目 使用C语言肯定要使用到C编译器,以便把写好的C程序编译为机器码, 这样单片机才能执行编写好的程序。KEIL uVISION2是众多单片机应用开发软 件中优秀的软件之一,它支持众多不同公司的MCS51架构的芯片,它集编辑, 编译,仿真等于一体,同时还支持PLM、汇编和C语言的程序设计,它的界面 和常用的微软VC++的界面相似,界面友好,易学易用,在调试程序,软件仿真 方面也有很强大的功能。因此很多开发51应用的工程师或普通的单片机爱好者,都对它十分喜欢。 以上简单介绍了KEIL51软件,要使用KEIL51软件,必需先要安装它。KEIL51是一个商业的软件,对于我们这些普通爱好者可以到KEIL中国代理周 立功公司的网站上下载一份能编译2K的DEMO版软件,基本可以满足一般的个
/*******************************************************/ #include"reg52.h" #include"stdio.h" #include "string.h" #include "intrins.h" #include"CH375INC.H" /*******************************************************/ #define uchar unsigned char #define uint unsigned int /*******************************************************/ sbit CH375_INT=P3^3; sbit CH375_A0=P3^4; sbit CH375_RD=P3^5; sbit CH375_WR=P3^6; sbit CH375_CS=P3^7; /*******************************************************/ uchar xdata my_buf[512]; /*******************************************************/ void uart_init() { TMOD=0X20; TH1=TL1=0XFD; TR1=1; REN=1; SM0=0;SM1=1; EA=1; ES=1; } /*******************************************************/ void uart_send_pc(uchar *s) //串口监视//void uart_send_pc(uchar a[20]) { //{ uchar len=strlen(s); // uchar i; uchar i; // for(i=0;i<20;i++) for(i=0;i 单片机实验程序 实验二8155并行I/O口扩展和动态扫描程序编制 1.实验目的 (1)掌握8155并行I/O芯片扩展和使用方法 (2)掌握数码管动态扫描汇编语言的编制方法 2.预习要点 (1)8155芯片基础知识 (2)51单片机的总线时序、地址译码的原理 (3)数码管动态扫描显示方法 3.实验设备 计算机、单片机实验箱。 4.实验内容 基本要求: 通过实验板的上的8155(U16)显示电路(在电路板上已经固定连接字形和字位控制线的8155部分),并通过跳线确定8155的地址,在8个LED数码管上依次动态显示数字1~8。 扩展要求: 假定30H~33H的存储单元内容为4个字节16进制数,请依序将他们显示在8个LED数码管上 根据程序要求做如下程序流程图: 主程序流程图: 显示子程序流程框图: 基本要求编程如下: ORG 0000H AJMP MAIN ORG 0050H MAIN: MOV SP,#60H ;压栈 MOV DPTR, #4100H MOV A,#0FH ;方式控制字0FH送A MOVX @DPTR, A ;8155初始化 MOV 70H,#01H ;设置显示缓冲区 MOV 71H,#02H MOV 72H,#03H MOV 73H,#04H MOV 74H,#05H MOV 75H,#06H MOV 76H,#07H MOV 77H,#08H LOOP: ACALL DISPLAY ;循环调用显示子程序AJMP LOOP DISPLAY: MOV R0,#70H ;显示缓冲区首地址送R0 MOV R3,#0FEH ;字位控制初值送R3 3 3 3 用查表方式编写y=x1 +x2 +x3 。(x 为0~9 的整数) #include 前言 由于单片机具有高可靠性、超小型、低价格、容易产品化等特点,在仪器仪表智能化、实时工业控制、实时数据采集、智能终端、通信设备、导航系统、家用电器等控制应用领域,具有十分广泛的用途。目前在国内单片机应用中,MCS-51系列单片机仍然是一种主流单片机。为配合《单片机应用技术》课程的教学,使学生尽快了解、掌握89C51单片机的使用,特编写了这本上机指导书(基础篇)。 《单片机》是一门实践性很强的课程,提高教学质量的一个重要环节是上机实习和训练,无论是学习汇编语言程序设计,还是学习接口电路和外设与计算机的连接,或者软硬兼施地研制单片机应用系统,不通过加强动手是不能获得预期效果的。本实验指导书提供了9个实验的指导性材料,实验还有一些思考题,可以根据课时的安排和教学要求进行取舍。为了达到某些实验的目的,书中提供的参考程序与实际应用中的程序会有些差别,所以不一定是最优的。 由于时间紧迫,加上编者学识有限,如有不妥之处,欢迎读者批评指正。 编者 实验须知 1. 实验前必须阅读教科书的有关部分和本实验指导书,了解实验目的、内容、步骤,做好实验前的准备工作,编写好实验中要求自编或修改的程序;完成实验前要求完成的准备工作后方可以上机实验,否则不得上机操作。 2. 各种电源的电压和极性不能接错,严禁带电接线和接插元器件。通电前须经过指导教师检查认可后方能通电。 3. 不准随意拨弄各种与实验无关的旋钮和开关,凡与本次实验无关的任何设备都禁止动用和摸弄,注意安全。 4. 严禁用手触摸实验系统印制电路板和元器件的引脚,防止静电击穿芯片。 5. 实验中若损坏仪器或元器件,应及时向指导教师报告,听候处理。 6. 在实验室内保持安静和卫生,不得随意走动和喧哗,集中精力完成实验。 7. 实验完成后,关掉电源,及时整理实验台桌面,保持环境整洁。 8. 按规定认真完成实验报告,对实验中出现的现象进行分析,在规定的时间内交上实验报告。 9. 凡实验或实验报告未能按规定完成的学生,不能参加本课程的考试或考查。 #include 单片机C语言小程序 #include 实验一键盘输入实验 参考程序: ;4*4矩阵键盘读取程序,利用P0口,列线左起P0.0-P0.3 ;行线上起P0.4-P0.7,行线默认接高电平, ;P3.7作为键盘被读取的提示灯 ; 0 1 2 3 ; 4 5 6 7 ; 8 9 A B ; C D E F ;不考虑有两个或以上按键同时按下的情况, ;每次扫描到一个有按下则结束本次扫描 SETB P3.7 ;确认关闭键盘响应指示灯 MAIN: MOV R0,#0EFH ;用于给键盘行列线确定的电平 MOV R1,#0H ;循环次数,R1=0对应第一行,=1为第二行,以此类推SMAIN: MOV P0,R0 ;改变行线的状态,列线全处于高电平 NOP NOP MOV A,P0 JB ACC.0,L1 ;判断某行的第一列是否按下,按下则P0.0为低电平 MOV R2,#0H ; 将某行的列码保存至R2,显示程序会根据此值和R1的值计算具体为何按键按下 ACALL DISP SJMP MAIN ; 每次扫描到一个有按下则结束本次所有扫描 L1: JB ACC.1,L2 ;判断某行的第二列是否按下,按下则P0.1为低电平MOV R2,#01H ACALL DISP SJMP MAIN L2: JB ACC.2,L3 ;判断某行的第三列是否按下,按下则P0.2为低电平MOV R2,#02H ACALL DISP SJMP MAIN L3: JB ACC.3,SKIP ;判断某行的第四列是否按下,按下则P0.3为低电平MOV R2,#03H ACALL DISP SJMP MAIN ; SKIP: INC R1 ;R1加1,共计4行, MOV A,R0 RL A ;左移R0内的值,以并扫描下一行 MOV R0,A CJNE R1,#04H,SMAIN ;若四行扫描完毕,则跳转至程序最初,相关参数为初始值NO: MOV P2,#0FFH ;程序能执行到此说明四行扫描完毕并且一个按键都没按下,关闭数码管和指示灯 SETB P3.7 SJMP MAIN DISP: CLR P3.7 ;点亮键盘响应指示灯 MOV A,R1 RL A RL A ;R1对应行,具体的按键计算为R1*2+R2 ADD A,R2 ADD A,#3H ;下列指令与表格见有3字节的距离 MOVC A,@A+PC MOV P2,A ;十六进制的高位用数码管L1显示 RET ;共阳数码管0-F的显示码 DIS: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H DB 80H,90H,88H,83H,0C6H,0A1H,86H,8EH DELAY: m ov r7,#255;延时 del1: mov r6,#255; del2: djnz r6,del2 djnz r7,del1 ret END 一 #include 单片机C语言编程基础 时间:2011-05-01 22:47:26来源:作者: 单片机的外部结构: 1、DIP40双列直插; 2、P0,P1,P2,P3四个8位准双向I/O引脚;(作为I/O输入时,要先输出高电平) 3、电源VCC(PIN40)和地线GND(PIN20); 4、高电平复位RESET(PIN9);(10uF电容接VCC与RESET,即可实现上电复位) 5、内置振荡电路,外部只要接晶体至X1(PIN18)和X0(PIN19);(频率为主频的12倍) 6、程序配置EA(PIN31)接高电平VCC;(运行单片机内部ROM中的程序) 7、P3支持第二功能:RXD、TXD、INT0、INT1、T0、T1 单片机内部I/O部件:(所为学习单片机,实际上就是编程控制以下I/O部件,完成指定任务) 1、四个8位通用I/O端口,对应引脚P0、P1、P2和P3; 2、两个16位定时计数器;(TMOD,TCON,TL0,TH0,TL1,TH1) 3、一个串行通信接口;(SCON,SBUF) 4、一个中断控制器;(IE,IP) 针对AT89C52单片机,头文件AT89x52.h给出了SFR特殊功能寄存器所有端口的定义。教科书的160页给出了针对MCS51系列单片机的C语言扩展变量类型。 单片机C语言编程基础 1、十六进制表示字节0x5a:二进制为01011010B;0x6E为01101110。 2、如果将一个16位二进数赋给一个8位的字节变量,则自动截断为低8位,而丢掉高8位。 3、++var表示对变量var先增一;var—表示对变量后减一。 4、x |= 0x0f;表示为x = x | 0x0f; 5、TMOD = ( TMOD & 0xf0 ) | 0x05;表示给变量TMOD的低四位赋值0x5,而不改变TMOD的高四位。 6、While( 1 ); 表示无限执行该语句,即死循环。语句后的分号表示空循环体,也就是{;} 在某引脚输出高电平的编程方法:(比如P1.3(PIN4)引脚) #include //该头文档中有单片机内部资源的符号化定义,其中包含P1.3 void main( void ) //void 表示没有输入参数,也没有函数返值,这入单片机运行的复位入口 { P1_3 = 1; //给P1_3赋值1,引脚P1.3就能输出高电平VCC While( 1 ); //死循环,相当LOOP: goto LOOP; } 注意:P0的每个引脚要输出高电平时,必须外接上拉电阻(如4K7)至VCC电源。 在某引脚输出低电平的编程方法:(比如P2.7引脚) #include //该头文档中有单片机内部资源的符号化定义,其中包含P2.7 void main( void ) //void 表示没有输入参数,也没有函数返值,这入单片机运行的复位入口 { P2_7 = 0; //给P2_7赋值0,引脚P2.7就能输出低电平GND While( 1 ); //死循环,相当LOOP: goto LOOP; } 在某引脚输出方波编程方法:(比如P3.1引脚) #include //该头文档中有单片机内部资源的符号化定义,其中包含P3.1 void main( void ) //void 表示没有输入参数,也没有函数返值,这入单片机运行的复位入口 { #include"stc12c5a60s2.h" #define uchar unsigned char; void initiate(void); void check_zero(void); void time0_on(void); void send_char(void); uchar shu,t,n=1,i=0; uchar code value[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07, 0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f}; //************************************************************** void main() { initiate(); for(;;) check_zero(); } //**************************************************************** void initiate(void) { TMOD=0X21; //定时器T1溢出提供波特率,定时器T0定时。 TL1=0XFD; //fosc=11.0592mHz,波特率9600bps对应初值 TH1=0XFD; PCON=0X00; //波特率不加倍。 SCON=0X50; //串口工作方式一,允许接受。 ET1=0; EA=1; TR1=1; } //***************************************************************** void check_zero(void) { if(RI==1) { if(SBUF==0) { RI=0; SCON=0X40; 教你如何用C++写单片机程序 关键词:C++ 面向对象单片机 从大一就开始学习单片机,学51,A VR编程都使用C语言的风格,即面向过程,只要能画出程序流程图,程序基本就born了。我热衷于编程,尤其是C++,当时想有没有一天,C++的类和对象也能出现在单片机中? 历经世事沧桑,事到如今,我终于有机会,和大家一起学习使用真正面向对象的C++来控制单片机。目前单片机编译器大部分只支持C语言,C++还不够普及,但我们有理由相信,有着更先进的面向对象的理念,有更加平易近人的类和继承,C++必将取代C,成为单片机程序的主流。试看将来环球单片机,必是C++的世界! 下面大家跟着我来一起学习怎么用C++给单片机编程序!本文要求大家玩过A VR单片机,有过C语言编程经验,而且要对VC6.0开发环境有一定了解。 必备软件:VC6.0(用于编辑源程序),WinA VR(用于生成Makefile,支持A VR系列单片机),Proteus(用于仿真调试)。 首先,你的电脑上要装有VC6.0,进入后选菜单【file】---【new】新建工程,如图1选择Makefile工程,输入工程名称,路径,点确定。 图1_新建工程 一路OK建好工程,界面如图2。这个工程是专门写makefile脚本的,你如果学A VR单片机使用avr-gcc那应该对makefile有一定了解,如果想多了解一点详见https://www.doczj.com/doc/d614434536.html,/view/974566.html?wtp=tt(呵呵,百度百科)。 你还需要安装WINA VR,这是个免费软件,网上很多资源,这个软件很容易安装,一路Next 就可以啦!为了使用方便,我的WINAVR安装到了C盘根目录下的WINA VR文件夹。安装好后,可以直接用它来编辑源代码,今天我就不讲它的使用方法了,只讲怎么生成makefile。自我感觉用熟悉的VC6.0环境编写程序心情很愉快,大家还是跟我一起来,打造北京交通大学单片机实验程序报告
51单片机实验程序
单片机实验答案
单片机基于C语言的编程程序
单片机C语言小程序
单片机实验参考程序
单片机实验程序
单片机c程序编写
STC向单片机发送数据小程序(C语言)
教你如何用C++写单片机程序