第一篇:单片机主程序流程
演讲稿 工作总结 调研报告 讲话稿 事迹材料 心得体会 策划方案
单片机主程序流程
单片机教程 栏目导航
第一页..单片机入门教程
第二页..单片机c语言
第三页..红外遥控和步进电机
第四页..单片机问答
3.主程序流程图---51系列单片机设计实例教程
主程序流程图如图6.2所示。
图6.2 主程序流程图
本控制器在使用中,如要改变闪烁的方式,可按下相应的功能按键。当一个完整的闪烁循环结束后,即可转入新的闪烁方式。由于键扫描是在闪烁循环结束时进行,因此,功能开关按下的时间应较长才能被读入。改进的方法是把DL05S延时子程序用键扫描子程序来替代,这样,只要按下按键即可被键扫描程序读入。以下是LED小灯闪烁控制器的完整源程序:
;* * * * * * * * * * * *;;
小灯控制程序;
;* * * * * * * * * * * *;
;
;* * * * * * * * * * * *;;
中断入口程序
;
精心收集
精心编辑
精致阅读
如需请下载!
演讲稿 工作总结 调研报告 讲话稿 事迹材料 心得体会 策划方案
;* * * * * * * * * * * *;
;
ORG
OOOOH;程序执行开始地址
LJMP START;跳至START执行
ORG
OOO3H;外中断0中断入口地址
RETI;
中断返回(不开中断)
ORG
OOOBH;定时器TO中断入口地址
RETI;
中断返回(不开中断)
ORG
OO13H;外中断1中断入口地址
RETI;
中断返回(不开中断)
ORG 001BH;定时器T1中断入口地址
RETI;
中断返回(不开中断)
ORG 0023H;串行口中断入口地址
RETI;
中断返回(不开中断)
;
;* * * * * * * * * * * *;;
初始化程序;
;* * * * * * * * * * * *;
;
CLEAR: MOV
20H,#00H;20H单元内存清0(闪烁标志清0)
SETB
00H;
20H.0位置1(上电时,自动执行闪烁功能1)
精心收集
精心编辑
精致阅读
如需请下载!
演讲稿 工作总结 调研报告 讲话稿 事迹材料 心得体会 策划方案
RET;
子程序返回 ;
;* * * * * * * * * * * *;;
主程序
;
;* * * * * * * * * * * *;
;
START:
ACALL CLEAR;
调用初始化子程序
MAIN:
LCALL KEYWORK;
调用键扫描子程序
JB
OOH,FUNO;20H.0位为1时执行FUNO
JB
01H,FUN1;20H.1位为1时执行FUN1
JB
02H,FUN2;20H.2位为1时执行FUN2
JB
03H,MAIN;备用
AJMP
MAIN;
返回主程序MAIN ;
;* * * * * * * * * * * *;;
功能程序
;
;* * * * * * * * * * * *;
;第1种闪烁功能程序
FUNO:
MOV
A,OFEH;
累加器赋初值 FUNOO:
MOV
P1,A;
累加器值送至P1口
LCALL DL05S;
延时
JNB
ACC.7.MAIN;累加器最高位为0时转MAIN
精心收集
精心编辑
精致阅读
如需请下载!
演讲稿 工作总结 调研报告 讲话稿 事迹材料 心得体会 策划方案
RL
A;
累加器A中数据循环左移1位
AJMP
FUNOO;
转FUNOO循环 ;
;第2种闪烁功能程序
FUN1:
MOV
A,#OFEH;
累加器赋初值
FUN11:
MOV
P1,A;
累加器值送至P1口
LCALL DLO5S;
延时
CPL
A;
A中各位取反
MOV
P1,A;
累加器值送至P1口
LCALL DL05S;
延时
AJMP MAIN;
转MAIN ;* * * * * * * * * * * *;;
扫键程序
;
;* * * * * * * * * * * *;
;
KEYWORK:MOV
P3#OFFH;
置P3口为输入状态
JNB
P3.0,KEYO;读P3.0口,若为0转KEYO
JNB
P3.1,KEY1;读P3.1口,若为0转KEY1
JNB
P3.2,KEY2;读P3.2口,若为0转KEY2
JNB
P3.3,KEY3;读P3.3口,若为0转KEY3
RET;
子程序返回 ;
精心收集
精心编辑
精致阅读
如需请下载!
演讲稿 工作总结 调研报告 讲话稿 事迹材料 心得体会 策划方案
;闪烁功能0键处理程序
KEYO:
LCALL
DL10MS;
延时10ms消抖
JB
P3.0,OUTO;P3.0为1,子程序返回(干扰)
SETB
OOH;
20H.0位置1(执行闪烁功能1标志)
CLR
01H;
20H.1位清0
CLR
02H;
20H.2位清0 OUTO:
RET;
子程序返回 ;
;闪烁功能1键处理程序
KEY1:
LCALL
PL10MS
JB
P3.1,OUT1
SETB
01H;
20H.1位置1(执行闪烁功能2标志)
CLR
00H
CLR
02H
CLR
03H OUT2:
RET ;
;闪烁功能(备用)键处理程序
KEY3:
LCALL
DL10MS
JB
P3.2,OUT2
SETB
02H;
20H.2位置1(执行闪烁功能3标志)
精心收集
精心编辑
精致阅读
如需请下载!
演讲稿 工作总结 调研报告 讲话稿 事迹材料 心得体会 策划方案
CLR
01H
CLR
00H
CLR
03H OUT2:
RET ;
;闪烁功能(备用)键处理程序
KEY3:
LCALL
DL10MS
JB
P3.3,OUT3
SETB
03H;
20H.3位置1(执行闪烁功能3标志)
CLR
01H
CLR
02H
CLR
00H OUT3:
RET ;
;* * * * * * * * * * * *;;
延时程序
;
;* * * * * * * * * * * *;
;延时子程序,执行一次时间为513us DL512: MOV
R2,#OFFH LOOP1: DJNZ
R2,LOOP1
RET ;
精心收集
精心编辑
精致阅读
如需请下载!
演讲稿 工作总结 调研报告 讲话稿 事迹材料 心得体会 策划方案
;10ms延时子程序(调用20次0.5ms延时子程序)
DL10MS:MOV
R3,#14H LOOP2: LCALL DL512
DJNZ
R3,LOOP2
RET ;
;延时子程序,改变R4寄存器初值可改变闪烁的快慢(时间为25msX15)
DL05s: MOV
R4,#OFH LOOP3: LCALL DL25MS
DJNZ R4,LOOP3
RET ;
;延时子程序,改变R4寄存器初值可改变闪烁的快慢(时间为25msX15)
DL05S: MOV
R4,#OFH LOOP3: LCALL DL25MS
DJNZ R4,LOOP3
RET ;
;25ms延时子程序,调用扫键子程序延时,可快速读出功能按键值
DL25MS:MOV
R5,#OFFH LOOP4: LCALL KEYWORK
DJNZ R5,LOOP4
精心收集
精心编辑
精致阅读
如需请下载!
演讲稿 工作总结 调研报告 讲话稿 事迹材料 心得体会 策划方案
RET
END;
程序结束
12个经典单片机程序设计实例: 闪烁LED小灯主程序图 数码管时钟电路的主程序 单键学习型遥控器的设计 15路电器遥控器的设计 自行车里程/速度计的设计 自动往返行驶小汽车的设计 遥控小汽车的设计 数码管时钟电路的设计 8*8点阵LED字符显示器的设计 8路输入模拟信号数值显示电路的设计 8路输入模拟信号数值显示电路程序
单键学习型遥控器的程序如果对本文有疑问,请到论坛提问 编辑:51单片机学习网 @ 2009-10-20校对 中国开发板最佳品牌
版权:部分由编辑摘引,权利属原著作人
精心收集
精心编辑
精致阅读
如需请下载!
第二篇:电压表主程序模块
/**电压表主程序模块*/
#include
#define uchar unsigned char #define uint unsigned int void result(uchar);uchar value=0;#include“adc0809.h” #include“lcd1602.h” uchar str[5];uchar volt[7];
uchar a=0+0x30;uchar str1[11]=“tanxiaopin”;sbit CLK=P0^7;uint n;
void main(){
//uint i;ADC0809_init();lcd_init();while(1){
lcd_zifu(str1,0x01);
value=AD();//原值
str[0]=value/100+0x30;
str[1]=value%100/10+0x30;
str[2]=value%10+0x30;
result(value);
lcd_data(str,0x40);
lcd_data(volt,0x46);
} while(1);}
void result(uchar v)//转换成电压值 { float a;a=(v/255.0)*500.0;volt[0]=((int)a)/100+0x30;volt[1]='.';volt[2]=((int)a)%100/10+0x30;volt[3]=((int)a)%10+0x30;volt[4]=' ';volt[5]='V';} void t1(void)interrupt 3
{
CLK=~CLK;
}
/*ADC0809程序模块*/
#include
sbit ST=P0^4;sbit EOC=P0^5;sbit OE=P0^6;//sbit CLK=P0^7;sbit ADDA=P0^0;sbit ADDB=P0^1;sbit ADDC=P0^2;
sbit ALE=P0^3;
uchar v;//保存IN0和经AD转换后的数据 /*非精确演示函数*/ void delay(ms){ uint i,j;
for(i=ms;i>0;i--)
for(j=125;j>0;j--);}
void ADC0809_init(){ TMOD=0x20;TH1=(255-250);TL1=(255-250);EA=1;//开总中断
ET1=1;//开定时器1中断
TR1=1;//启动定时器1
ST=0;
OE=0;ALE=0;} /*用中断做一个500K HZ的时钟信号*/
/******AD转换函数*******/ uchar AD(){ uchar temp=0;ST=0;//EOC=1;// ALE=1;ADDA=0;ADDB=0;ADDC=0;
delay(1);// ALE=0;
//OE=0;
ST=0;
ALE=1;
ST=1;
ALE=0;
ST=0;
delay(2);
while(EOC==0);
OE=1;
temp=P2;
delay(2);
OE=0;
return temp;}
/*ADC0809 模块封装头文件*/ void ADC0809_init();uchar AD();
/*LCD1602液晶显示模块*/ #include
void lcd_1602(uchar comm);void lcd_write(uchar dat);
bit lcd_busy();sbit busy=P3^7;extern void delay(uint);
/***************************** 1602液晶写命令函数 参数: 返回值:无
******************************/ void lcd_1602(uchar comm){ while(lcd_busy());//查忙
rs = 0;rw = 0;en = 0;
_nop_();P3 = comm;_nop_();en = 1;_nop_();_nop_();en = 0;} /***************************** 1602液晶写数据函数 参数: 返回值:无
******************************/ void lcd_write(uchar dat){ while(lcd_busy());//查忙
rs = 1;
rw = 0;
en = 0;
_nop_();
P3 = dat;
_nop_();
_nop_();
en = 1;
_nop_();
_nop_();
en = 0;}
/***************************** 1602液晶初始化函数 参数:无 返回值:无
******************************/ void lcd_init(){
delay(15);lcd_1602(0x38);delay(3);lcd_1602(0x38);
delay(3);lcd_1602(0x38);delay(3);lcd_1602(0x08);lcd_1602(0x01);delay(3);lcd_1602(0x06);lcd_1602(0x0c);} /***************************** 1602液晶读忙标志 参数:无 返回值:无
******************************/ bit lcd_busy(){
bit result;rs = 0;rw = 1;en = 1;delay(2);result = busy;en = 0;return result;}
/***************************** 1602液晶写字符 参数: 返回值:无
******************************/ void lcd_zifu(uchar *p,uchar wei){ uchar temp;lcd_1602(0x80+wei);/*temp= *p;while(temp!=' '){
lcd_write(temp);
p++;
temp=*p;}*/ for(temp=*p;temp!=' ';p++,temp=*p)
lcd_write(temp);
delay(10);}
void lcd_data(uchar *p,uchar wei){ uchar temp;lcd_1602(0x80+wei);for(temp=*p;temp!=' ';p++,temp=*p)
lcd_write(temp);delay(10);} /*LCD1602液晶模块封装*/ void lcd_init();void lcd_zifu(uchar *p,uchar wei);void lcd_data(uchar *p,uchar wei);
第三篇:火车订票管理系统主程序流程
程序简介
此程序是采用多文件模块化形式编写;其中自定义头文件中包括了程序中所有调用的函数的声明,以及需要的所有系统头文件。
#include
编写时的分块包括订票块、查询块、输出块,及已订票修改部分等。
订票块则包含了定票流程的所有代码。查询块中是通过车次号码或是到达城市来查询的。输出部分包括了主界面的输出,已定车票信息的输出,所查车次信息输出的头部分。订票修改即是改定过程的编程。
即此程序包括了查询、订票、改定的流程。
编程过程
在编写该程序时,遇到了信息的保存问题。订票时与改定时的录入信息的保存不知如何处理;之后将保存的部分分为链表暂存和文件的保存,在录入信息时是暂存在链表中的,当离开此系统是会提示是否保存信息,若是则保存到文件中。此举方便了票的改定,将数据分割开了,也精简了程序,更便于阅读。
编程模块划分后,编写程序之后的编译时,总是连分文件编译时都无法通过。但是写入的代码经过检查又没有问题,一直困扰着我。直到想起老师教的课本以外的知识,并以一种玩玩试一试的心态用条件编译得以解决此问题。
同时在编程时多次用到“清屏”,保证了输出界面的简洁。
在分出模块后,未完成所有部分的编程时的试运行时出现刚一进入子程序时便会回到主界面,后发现时由于只有输出部分没有输入部分,每当运行完子程序后回到主程序时都会被“清屏”,结果造成编译时正常,到运行时却漏洞百出。
在编程时,由于对文件的处理不熟悉,以及计算机的设置问题没考虑,使用了‘w+’的调用方式,使得在保存数据到文件时出现无法写入文件的现象。在百度,问同学以及问老师后才用‘wb+’和别的方式调用,并写入成功。
这个程序时我学习计算机c以来编写的最大型涵盖面最广的一个程序,没有之一。但同时我也知道这在c语言编程中也只是很小的一个小程序而已,我在这编程中发现:我要学的还有很多,大型程序也不是一个人能写出来的,会一些编程技巧是很有必要的,与人合作是
– 1 – 必须的,当然了,我不是在写诗,而是真的这么觉得。一个人会的有限,专精方向也不同,若能好好的合作肯定可以超过一个人单干。
部分源代码
订票程序
#ifndef TRAINHEAD_H #define TRAINHEAD_H #include“trainhead.h” #endif/*条件编译,作用是防止头文件被重复引用*/ int saveflag = 0;void Bookticket(link l,booklink k){ Node *p[10],*q;char c[2],tnum[10],str[10],str1[10];Book *r,*s;int i = 0,t = 0,flag = 0,dnum;r = k;while(r->next!=NULL)
r = r->next;printf(“Input the city you want to go:”);scanf(“%s”,&str);q = l->next;while(q!=NULL)
{
if(strcmp(q->data.reachcity,str)==0)
{
p[i] = q;
i++;
}
q = q->next;
}
printf(“nthe number of record have %dn”,i);
printhead();
for(t=0;t
printdata(p[t]);
if(i==0)
printf(“nSorry!Can't find the train for you!n”);
else
{
printf(“ndo you want to book it?
scanf(“%s”,c);
if(strcmp(c,“Y”)==0||strcmp(c,“y”)==0)/*判断是否订票*/
{
s =(Book*)malloc(sizeof(Book));
printf(“nInput your name: ”);
scanf(“%s”,&s->data.name);
printf(“nInput your ID: ”);
scanf(“%s”,&str1);
相应减少*/
strcpy(s->data.num,str1);printf(“nplease input the number of the train:”);scanf(“%s”,tnum);for(t=0;tdata.num,tnum)==0){ if(p[t]->data.ticketnum < 1)/*判断剩余的供订票的票数是否为0*/ {
printf(“nsorry,no ticket!”);
Sleep(2);
return;} printf(“nremain %d ticketsn”,p[t]->data.ticketnum);flag = 1;break;} if(flag==0){ printf(“ninput error”);Sleep(2);return;} printf(“nInput your bookNum: ”);scanf(“%d”,&dnum);p[t]->data.ticketnum=p[t]->data.ticketnum-dnum;/*定票成功则可供订的票数s->data.bookNum = dnum;s->next = NULL;r->next = s;r = s;printf(“nLucky!you have booked a ticket!”);getch();
– 3 –
} } } saveflag = 1;使用说明
运行程序时,首先进入到菜单部分,菜单部分提供了菜单显示和输入功能部分。其运行效果如图19.1所示。在主界面上输入数字0——6,实现相应的功能。
图19.1 火车订票系统主界面
主界面输入“1”,进入添加火车信息界面,如图19.2所示。根据屏幕上给出的提示输入火车的车次,起点,终点,出发时间,到达时间,票价和可以订购的票数。
– 4 –
图19.2 输入效果图
主界面输入“2”,可以查询火车信息,可以选择查询的方法有两种,一种是按照车次查询,一种是按照你想要到达的地方查询,运行效果如图19.3所示。
– 5 –
图19.3 查询效果图
当在主界面输入“3”时,进入订票界面,按照提示输入你想要到达的城市,会自动显示出你终点站为你输入城市的信息,根据提示输入你是否决定订票以及你的个人信息,运行效果如图19.4所示。
图19.4 订票效果图
当在主界面输入“4”时,进入修改界面,根据提示输入你要修改的内容,修改模块的运行效果如图19.5所示。
– 6 –
图19.5 修改效果图
当在主界面输入“5”时,可以显示出所有的火车信息,显示模块效果如图19.6所示。
– 7 –
图19.6 显示效果图
当在主界面输入“6”时,进入到保存模块,将录入的火车信息进行保存,并且将订票人的信息也进行保存,存储在指定的磁盘文件中。运行效果如图19.7所示。
图19.7 保存效果图
– 8 –
第四篇:AVR单片机相关软件安装及编译烧写流程
AVR单片机相关软件安装
本次项目开发使用AVR的AT90CAN128单片机,使用JTAG
ICE仿真器,需要安装的软件及驱动有AVRStudio、iccavr、USB转串口驱动以及仿真器驱动。
一、AVRStudio软件安装
1.双击开始准备安装
2.单击“Next”,选择同意License
3.选择安装路径
4.选择USB
驱动
5.确定开始安装
6.安装中
7.安装完成二、iccavr软件安装
1.双击,接着双击,开始装备安装
2.单击下一步
3.选择安装路径
4.点击安装
5.安装完成三、USB转串口驱动
1.双击,点击INSTALL,等待安装完成即可
四、仿真器驱动安装(XP版)
1.双击点击SETUP.EXE安装
2.安装完成,重新启动计算机
AVR单片机编译烧写流程
本文以在AT90CAN128芯片上编写的工程can128_sw_defn为例,简单介绍AVR单片机的编译和烧写流程:
一、AVR单片机编译流程
1.打开ICCAVR软件,下拉菜单栏上Project,点击open,弹出对话框如下:
选择can128_sw_defn.prj打开,点击右侧栏中的can128_sw_defn.C文件,修改代码。
2.点击Project->options,或者点按钮,弹出对话框如下:
在Target下面的Device
Configuration中选择芯片为AT90CAN128,如图所示,点击OK。
3.点击Build
Project,调试栏出现下图即为编译成功,若有错误请根据错误指示进行相应代码修改即可。
二、AVR单片机烧写流程
1.将JTAG
ICE与目标板以及PC机相连。
2.打开AVRStudio,将会提示一个welcome对话框,如下图所示:
点“Cancel”即可,然后点击avr
studio主窗口中的图标前面标有Con的那个图标,然后按下图选择点“Connect”即可进行JTAG的联机(由于avr
studio会记忆用户使用的设备是并且同时会记忆用户使用的COM号,如果下次和上次使用的是相同的设备并且没有更换COM口,那么下次使用的时候直接点击右边标有AVR的那个图标就可以快速进入联机状态;如果下次和上次使用了不同的设备或不同的COM口请使用Con图标进行联机)。
3.如果出现连接失败对话框,将JTAG
虚拟出的串口改到COM1
到COM4
之间
3.1在设备管理器中找到JTAG,如图,双击JTAG
这项:
3.2
弹出属性修改框
3.3选择端口设置
3.4
单击高级
3.5查看修改后的JTAG
4.然后点击按钮,弹出以下对话框:
在Device栏中选择AT90CAN128,并将Erase
Device
Before
勾上。在Flash->Input
HEX
Fi中选择所要烧写文件的地址,比如本工程的地址为D:\iccv7avr\examples.avr\can128_sw_defn\can128_sw_defn.hex,最后点击Flash栏中的Program等待程序烧写完成。完成后上面对话框在最后一栏会出现
表示烧写成功。
第五篇:单片机课程设计
单片机课程设计
课题: 简易电子琴设计
学
院:
电气与信息工程学院 专
业:
电子信息工程 姓
名:
李琳琳 学
号:
093411106
指导老师:
田巍
河南城建学院
2014年
01 月
01 日