‘壹’ 可编程作息时间控制器程序设计
主程序: 在程序开始时,首先初始化,设置中断0源允许、总允许为一,两个定时器的工作模式为一模式,整个程序由P2.6接低电平时启动,启动后,进入A段工作。在A短工作中调用显示子程序,A段工作完时进入B段工作,每段工作时都要调用显示子程序,,最后一段工作完时,关闭显示,即对P2送入0FFH
显示子程序:首先,对定时器赋初值,然后进行拆字,拆字采用除以十进行,除以十后,分别把商和余数送到显缓单元,再查七段码,把七段码送到P1,送字位口到P2口,进行动态显示,每次显示一位时延时255个指令周期(即FFH个指令周期),四位显示完后,再进行多次扫描,保证人眼看不到闪烁,最后判断设定的工作时间到没,到了几跳出显示子程序。
中断程序:进入中断后输出报警信号,同时显示器全部显示0,,最后跳出中断。
四:程序及其说明:
1.程序:
ORG 0000H
LJMP MAIN
ORG 0003H
LJMP BAOJING
ORG 0010H
;初始化程序
MAIN:SETB EA ;设置中断
SETB EX0
CLR IT0
MOV TMOD,#11H ;设置定时器工作模式
SETB P3.4 ;驱动继电器
SETB P3.5
SETB P3.6
SETB P3.7
HERE:JB P2.6,HERE ;判断是否启动
;进入工作阶段
GONGZUO:MOV 41H,#0AH ;工作于A段
MOV R7,#0AH ;A段工作时间
CLR P3.4 ;驱动外部继电器
LCALL SCAN ;调显示程序
SETB P3.4 ;关断外部驱动
MOV 41H,#0BH ;工作于B段
MOV R7,#14H ;B段工作时间
CLR P3.5 ;驱动外部继电器
LCALL SCAN ;调显示程序
SETB P3.5 ;关断外部驱动
MOV 41H,#0CH ;工作于C段
MOV R7,#1EH ;C段工作时间
CLR P3.6 ;驱动外部继电器
LCALL SCAN ;调显示程序
SETB P3.6 ;关断外部驱动
MOV 41H,#0DH ;工作于D段
MOV R7,#28H
CLR P3.7 ;驱动外部继电器
LCALL SCAN ;调显示程序
SETB P3.7 ;关断外部驱动
MOV P2,#0FFH ;关显示
LJMP HERE ;返回判断处,确定是否继续工作
;中断报警程序
BAOJING: MOV P2.4,#00H ;指示灯亮
Mov P2.5,#00H
MOV TL0,#0E0H ;定时20ms
MOV TH0,#0B1H
SETB TR0 ;启动定时
LP:MOV P1,#3FH ; 全部显示为零
MOV P2,#00H
MOV P2.5,#00H ;扬声器工作
JNB TF0,LP ;查询定时时间到否
SETB P2.4 ;关指示灯
SETB P2.5 ;关扬声器
RETI
;显示子程序
ORG 0F00H
SCAN: MOV 42H,#0EH ;“—”(横线)的七段码
MOV R1,#32H ;延时常数
MOV TL1,#0E0H ;定时20ms的常数
MOV TH1,#0B1H
LP1: MOV A,R7 ;拆字程序(采用除法拆字)
MOV B,#10
DIV AB
MOV 43H,A ;送显缓单元
MOV 44H,B
LP2: MOV R0,#41H ;设置显缓的初始单元
MOV R4,#0FFH ;延时常数
MOV R5,#0FEH ;送字位口
LP3: MOV A,@R0
MOV P2,#0FFH ;关显示
MOV DPTR,#TAB ;查七段码、显示
MOVC A,@A+DPTR
MOV P1,A
MOV P2,R5
LP4: DJNZ R4,LP4
INC R0 ;修改指针
MOV A,R5 ;改变显示单元
RL A
MOV R5,A
JB ACC.4,LP3 ;判断四位是否显示完
SETB TR1 ;启动定时器
JNB TF1,LP2 ;判断定时时间是否到
DJNZ R1,LP2 ;延时一秒是否到
DJNZ R7,LP1 ;判断设定时间是否到
RET
ORG 10FFH
;七段码表单
TAB: DB 3FH ,06H,5BH, 4FH, 66H,6DH , 7DH
DB 07H, 7FH,6FH,77H, 7CH,39H, 5EH, 40H
2.说明:
主程序:设整个系统工作有四个阶段,分为ABCD段,每段工作时间设为10S、20S、30S、40S,在程序的初始化阶段设定定时器的工作模式、中断允许,程序的运行由单片机的P2.6脚接低电平启动,进入工作阶段,在每个工作阶段显示工作段数和剩余工作时间。
在A段工作时,把“A”这个字符送达41H显缓单元,再设定A段的工作时间,送到R7寄存器中,设定对应的输出脚的工作电平值,然后调显示子程序,A段工作完毕,关闭对应的驱动输出脚。
B、C、D段工作均和A段工作相似,只是驱动不同的输出对象,最后一段工作完后,对P2口赋值高电平,关所有的显示,最后跳回判断处,判断是否继续工作。
显示子程序:在显示子程序中因为每段工作时,均要显示“—”,所以在开始时把“—”的对应序号(在本程序的七段码表中对应的序号为0EH)送到显缓单元,对定时器T1定时20ms进行赋初值,计算初值的公式为:
T1初值=2^n-fosc/12×t
由于定时器工作在1模式,振荡频率为12MHZ,所以计时器T1的初值为:E0B1(十六进制)
将设定的时间进行拆字,然后送到显缓单元。拆字采用除法的方式进行,将定时时间送到寄存器A中,然后在B中送常数10,经过相除后在寄存器A中得到高位送到显缓43H中,在寄存器B中得到低位送到显缓44H单元中,显缓单元指针首先指向显缓首地址,通过变址寻址方式查询对应的七段码送到P1口(字形口),对P2口送入字位口,每个显示位显示后经过延时255指令周期再进入下一步工作。每位显示完后,修改显示单元的指针,对指针单元的当前值自加一,然后对字位口进行左移,修改显示单元,再进行判断四位是否显示完,即判断字位口的第五位是否为1,若为1,则程序转移,继续显示;若为0,则依次执行。四位显示完后,启动定时器1,定时20ms,查询TF1的值,若TF1为0,则在此等待,若TF1为1,则R1自减1并判断是否为0,若不为0,则转移到显示部分,若为0,则顺序执行(即判断1S到否);1S到则R7自减1并判断R7是否为0,若不为0,转移到拆字部分,若为0,则跳出调用(即判断每段工作时间到设定时间没有)。
中断程序:若外部出现故障(外部故障用P3.2接低电平表示),P2.4、P2.5接低电平(即输出报警信号,指示灯亮,扬声器发出声音),对定时器定T0时20ms赋初值,计算公式为:
T0初值=2^n-fosc/12×t
由于定时器工作在1模式,振荡频率为12MHZ,所以计时器T1的初值为:E0B1(十六进制)
对P1口送入“0”的七段码,P2口送入00,每个显示单元全部显示为0,启动定时器,若定时时间没有到,则转到显示处,继续让全部显示0,,若时间到,则对P2.4、P2.5全部送入高电平,关闭报警提示,中断返回。
七段码表单:将要显示的数码或字母的七段码按在日常生活中的默认顺序定义在一个表单中,通过把表单的首地址付给DPTR,再把需要显示的数字或字母的对应序号送到寄存器A中,通过变址寻址的方式(即MOVC指令)即可查出对应的七段码。 希望被采纳啊!!好长时间菜找到
‘贰’ 51单片机数字电压表P0口改到P1口程序怎么改
delay(1);
EN=1;//拉高使能端,为制造有效的下降沿做准备。
delay(1);
EN=0;//en由高变低,产生下降沿,液晶执行命令。
}
void write_1602dat(uchar dat)//液晶写入数据函数
{
RS=1;//数据/指令选择置为数据
P0=dat;//送入数据 *******************************这个我改成了P1
delay(1);
EN=1; //en置高电平,为制造下降沿做准备。
delay(1);
EN=0; //en由高变低,产生下降沿,液晶执行命。
}
void lcd1602_init()//液晶初始化函数
{
uchar a;
RW=0;
write_1602com(0x38);//设置液晶工作模式,意思:16*2行显示,5*7点阵,8位数据。
write_1602com(0x0c);//开显示不显示光标
write_1602com(0x06);//整屏不移动,光标自动右移。
write_1602com(0x01);//清显示
write_1602com(0x80);//显示固定符号从第一行第0个(从第0个开始数)位置开始显示
for(a=0;a<4;a++)
{
write_1602dat(tab1[a]);//向液晶屏写固定符号部分
}
write_1602com(0x80+9);//显示固定符号写入位置,从第一行第9个(从第0个开始数)位置开始显示。
for(a=0;a<8;a++)
{
write_1602dat(tab2[a]);//写显示固定符号
}
}
/*************转速显示函数**********/
void display(unsigned long speed)//转速显示函数
{
if(speed<=99999)
{
uchar wan,qian,,shi,ge;//定义拆字变量
wan=speed/10000;//转速/10000得到万位
qian=speed%10000/1000;//转速/10000的余数/1000得到千位
‘叁’ 单片机拆字程序 ;
就是把 2000H里的低4位放在高4位与2001H里的低4位拼成一个字节放到 2002H里
如 (2000H) = 12H (2001H)= 34H
12H&0FH = 02H 02H <> 20H
34H&0FH= 04H 20H|04H=24H
2002H里就放入了 24H
‘肆’ 单片机80c51 ORG 0000H MOV 30H,#53H MOV A,30H SWAP A ANL A,#0FH MOV 31H,A MOV A,30H ANL A,#0FH MOV
指令SWAP A执行完毕后,累加器A的值为(35H ),30H单元的值为(53H ),31H单元的值为(未知 ),32H单元的值为(未知 )
并且请简单描述上列程序的功能:是把立即数,#53H拆开成高四位和低四位,分别放入31H和32H单元中。这通常称为拆字程序。
应该是问这个程序执行,
累加器A的值为(03H ),30H单元的值为(53H ),31H单元的值为(05H ),32H单元的值为(03H )
‘伍’ 求单片机课程设计实验 用汇编语言,基于51单片机的定时闹钟
MODE_RG EQU40H ;模式选择
MODE2 EQU 60H ;MODE值
MODE3 EQU61H
MODE4 EQU62H
MODE5 EQU63H
MODE6 EQU64H
MODE1 EQU65H
HOUR EQU41H ;小时缓冲区
MIN EQU42H ;分钟缓冲区
SEC EQU 43H ;秒缓冲区
TEMP EQU4AH
;*********闹钟缓冲区********************
H_ALARM EQU 6AH ;闹钟缓冲区
M_ALARM EQU6BH
S_ALARM EQU6CH
F_ALARM EQU6DH
;***********秒表缓冲区******************
M_SEC EQU76H
S_SEC EQU77H
;*********LED送显示临时变量*************
LED0 EQU51H
LED1 EQU52H
LED2EQU53H
LED3 EQU54H
MODE_KEYEQUP3.4
UP_KEY EQUP3.3
DOWN_KEY EQUP3.5
BUF EQU49H
ORG0000H
LJMPMAIN
ORG000BH
LJMPINT_0
ORG001BH
LJMPINT_1
ORG0080H
MAIN: MOVSP,#2FH ;堆栈初始化
MOVMODE_RG,#0 ;MODE_RG寄存器值初始化
MOVLED0,#0FEH ;初始化LED
MOVLED1,#0FDH
MOVLED2,#0FBH
MOVLED3,#0F7H
MOVMODE1,#1
MOVMODE2,#2
MOVMODE3,#3
MOVMODE4,#4
MOVMODE5,#5
MOVMODE6,#6
MOVF_ALARM,#0 ;错误2:一开始用CLRF_ALARM,这导致在后面的时候JZF_ALARM运行错误,
MOVBUF,#0 ;在于JZ指令是对累加器A全为0或者全为1进行判断,CLR只能对一位操作
MOVTMOD,#11H ;定时器初始化:定时器0,方式1,定时器1,方式1
MOVIP,#00001000B ;定时器1优先级高
MOVTH0,#3CH ;定时50MS
MOVTL0,#0B1H
MOVTH1,#0D8H ;定时10MS
MOVTL1,#0F0H
SETBEA
SETBET0
SETBET1
SETBTR0;启动定时器
MOVHOUR,#0 ;fortest
MOVMIN,#0
MOVSEC,#0 ;定时器计数器,50MS中断一次,200次则刚好1S
MOVM_SEC,#0
MOVS_SEC,#0
MOVH_ALARM,#0
MOVM_ALARM,#0
MAIN1: LCALLDISPLAY12
LCALLDISPLAY34
;CLRP1.4 TEST
JNBMODE_KEY,KEY_SCAN
MOVA,MODE_RG
CJNEA,MODE6,Y1 ;MODE6秒表
JNBDOWN_KEY,DEALDOWN ;判断秒表开关
JNBUP_KEY,DEALUP
Y1: MOVA,F_ALARM ;判断闹钟
JNZALARM
LJMPMAIN1
;-----------------------------------秒表开关程序---------------------------
DEALDOWN: LCALLDELY10MS
JBDOWN_KEY,MAIN1
H1: JNBDOWN_KEY,H1
CPLTR1
LJMPMAIN1
DEALUP: LCALLDELY10MS
JBUP_KEY,MAIN1
H2: JNBUP_KEY,H2
MOVM_SEC,#0
MOVS_SEC,#0
CLRTR1
LJMPMAIN1
;-----------------------------------闹钟扫描程序---------------------------
ALARM: MOVA,H_ALARM
CPLP1.2
CJNEA,HOUR,EXIT3
MOVA,M_ALARM
CJNEA,MIN,EXIT3
LJMPSTARTALARM
EXIT3: SETBP3.6
LJMPMAIN1
STARTALARM:CPLP3.6
JNBDOWN_KEY,OFFALARM
LJMPS1
OFFALARM: LCALLDELY10MS
JBDOWN_KEY,MAIN1
S2: JNBDOWN_KEY,S2
MOVF_ALARM,#0
SETBP3.6
LJMPMAIN1
S1: LCALLDELAY
LJMPMAIN1
;-----------------------------------键盘扫描程序---------------------------
KEY_SCAN: LCALLDELY10MS
JBMODE_KEY,MAIN1
INCMODE_RG
;SETBP1.4 测试
K1: JNBMODE_KEY,K1 ;按键直到用户松开按键
K2: MOVA,MODE_RG
CJNEA,#0,DEALMODE;不是在正常显示模式下则跳转到模式处理程序
LJMPMAIN1 ;返回主程序
;*******************模式处理程序部分
DEALMODE: MOVTEMP,#0 ;凡转入MODE处理,则首先清除TEMP
MOVA,MODE_RG ;有MODE_RG值不为5、0
CJNEA,MODE2,M0 ;判断MODE_RG值,不为1跳转
LJMPH_GLINT ;模式1,小时位闪烁
M0: CJNEA,MODE3,M1 ;不是模式2,跳转
LJMPM_GLINT ;模式2,分钟位闪烁
M1: CJNEA,MODE4,M2 ;不是模式3,跳转
LJMPH_GLINT
M2: CJNEA,MODE5,M3
LJMPM_GLINT
M3: CJNEA,MODE6,M4
MOVM_SEC,#0
MOVS_SEC,#0
LJMPMAIN1
M4: CJNEA,MODE1,M5
;CLRTR1
LJMPMAIN1
M5: MOVMODE_RG,#0
LJMPMAIN1
;*****************************MODE为1,3,小时位闪烁
//MOVTEMP,HOUR ;将TEMP赋值,防止在加的时候是在随机值的基础上增加
H_GLINT: ;CPLP1.0
MOVR0,#28
MOVR1,#28
K4: LCALLDISPLAY12 ;分开显示
LCALLDISPLAY34
E1: JNBMODE_KEY,K21 ;检测是否有按键按下,有按下则跳转到分钟位闪烁
JBUP_KEY,E9 ;判断加位有无按键按下
LJMPUP
E9: DJNZR0,K4
K6: LCALLDISPLAY34
JNBMODE_KEY,K21 ;检测是否有按键按下,有按下则跳转延时后进行模式判断
LJMPG1
K21: LCALLDELY10MS ;延时后确定有MODE按键按下,将
JBMODE_KEY,H_GLINT
W: JNBMODE_KEY,W
INCMODE_RG
CPLP1.4
LJMPDEALMODE ;确定有按下,MODE+1后返回MODE处理程序
JNBUP_KEY,UP ;判断加位有无按键按下
G1: DJNZR1,K6
LJMPH_GLINT ;调用完毕返回,实现闪烁
K3: LJMPMAIN1 ;可省略
;******************************MODE为2,4,分钟位闪烁
M_GLINT: MOVR0,#28
MOVR1,#28
K23: CPLP1.7
LCALLDISPLAY12
LCALLDISPLAY34
JNBMODE_KEY,KK ;跳转,确定是否有按键按下
JNBUP_KEY,UP ;判断加位有无按键按下
MOVA,MODE_RG
CJNEA,MODE3,E2 ;在MODE5的情况下要判断闹钟确认键有没按下
LJMPE5
E2: JNBDOWN_KEY,F2
LJMPE5
F2: LJMPONALARM2
E5: DJNZR0,K23
K24: LCALLDISPLAY12
JNBMODE_KEY,KK ;检测是否有按键按下,有按下则跳转
JNBUP_KEY,UP ;判断加位有无按键按下
MOVA,MODE_RG ;扫描闹钟确认键
CJNEA,MODE3,E7 ;在MODE5的情况下要判断闹钟确认键有没按下
LJMPG2
E7: JBDOWN_KEY,E8
CPLP1.3
LJMPONALARM2
E8: LJMPG2
KK: LCALLDELY10MS ;去抖
JBMODE_KEY,M_GLINT
W1: JNBMODE_KEY,W1
INCMODE_RG
CPLP1.4
LJMPDEALMODE ;确定有按下,MODE+1后返回MODE处理程序
G2: DJNZR1,K24
LJMPM_GLINT
;*************************位加,处理程序
;***************小时调整
UP: MOVR1,#20
UP11: INCTEMP
UP12: MOVA,MODE_RG ;判断此时的MODE,根据MODE将临时变量给对应的赋值
CJNEA,MODE2,AA0 ;不是在MODE2的情况下跳转
MOVA,TEMP
CJNEA,#24,A_UP1
MOVTEMP,#0
A_UP1: MOVHOUR,TEMP ;为MODE2,将临时变量赋给小时位
LJMPUP15
AA0: CJNEA,MODE4,UP13//UP13为分钟调整入口
MOVA,TEMP
CJNEA,#24,A_UP
MOVTEMP,#0
A_UP: MOVH_ALARM,TEMP ;模式3,将临时变量赋给闹钟的小时位
LJMPUP15 ;UP15为显示入口
;****************分钟调整入口
UP13: MOVA,MODE_RG
CJNEA,MODE3,UP14 ;不是模式2,跳转
MOVA,TEMP
CJNEA,#60,DISOVER2
MOVTEMP,#0
DISOVER2: MOVMIN,TEMP
LJMPUP15
UP14: MOVA,TEMP ;上面判断不是模式2,则必然是模式4
CJNEA,#60,DISOVER3
MOVTEMP,#0
DISOVER3: MOVM_ALARM,TEMP
LJMPUP15
UP15: LCALLDISPLAY12
LCALLDISPLAY34
DJNZR1,UP01
MOVR1,#1 ;
JNBUP_KEY,UP11
UP01: JNBUP_KEY,UP12
UP16: MOVA,MODE_RG ;松开键以后按照模式判断该返回哪种状态,不能返回DEALMODE函数
CJNEA,MODE2,UP17
LJMPH_GLINT
UP17: CJNEA,MODE3,UP18
MOVSEC,#0 ;每次设置完时间后将秒钟位置零保证时间准确
LJMPM_GLINT
UP18: CJNEA,MODE4,UP19
LJMPH_GLINT
UP19: CJNEA,MODE5,UP20
LJMPM_GLINT
UP20: LJMPMAIN1
ONALARM2: LCALLDELY10MS ;延时10MS,去抖
JBDOWN_KEY,B2 ;抖动所致,返回分钟位闪烁
LJMPK42
B2: LJMPM_GLINT
K42: JNBDOWN_KEY,K42
MOVF_ALARM,#0FFH
MOVMODE_RG,#0
LJMPMAIN1
;---------------------------------------中断程序入口---------------------
;*******************时间中断0*********************
;错误1:中断程序EXIT处用了MAIN1,导致一直处于中断状态
INT_0: PUSHACC
PUSHPSW
MOVTH0,#3CH
MOVTL0,#0B1H
INCBUF
MOVA,BUF
CJNEA,#20,EXIT
TIME: MOVBUF,#0
INCSEC
MOVA,SEC
CJNEA,#60,EXIT
MOVSEC,#00H
INCMIN
MOVA,MIN
CJNEA,#60,EXIT
MOVMIN,#00H
INCHOUR
MOVA,HOUR
CJNEA,#24,EXIT
MOVHOUR,#0
RETI
EXIT: POPPSW
POPACC
RETI
;******************时间中断1***********************
INT_1: MOVTH1,#0D8H ;定时10MS
MOVTL1,#0F0H
INCS_SEC
MOVA,S_SEC
CJNEA,#100,EXIT4
MOVS_SEC,#0
INCM_SEC
MOVA,M_SEC
CJNEA,#100,EXIT4
MOVM_SEC,#0
EXIT4: RETI
;---------------------------------------显示-----------------------------
DISPLAY12: MOVA,MODE_RG ;判断模式,决定是显示闹钟时间还是显示当前时间
CJNEA,MODE4,DIS0 ;模式四,显示闹钟
LJMPDIS01 ;MODE4
DIS0: CJNEA,MODE5,DIS20
DIS01: MOVR7,H_ALARM ;闹钟模式
LJMPDIS2
DIS20: CJNEA,MODE6,DIS21
MOVR7,M_SEC ;秒表模式,显示秒表高位
LJMPDIS2
DIS21: CJNEA,MODE1,DIS1
LJMPDIS22
DIS22: MOVR7,MIN
LJMPDIS2
DIS1: MOVR7,HOUR ;DISPLAY12显示高位
DIS2: LCALLBCTD ;判断完毕,调用显示
;将秒、分分别转码,放到R4,R3
MOVA,R4
MOVR3,A
LCALLDIVIDE
MOVDPTR,#NUMTAB
MOVP2,#0FH
MOVP2,LED0
MOVA,45H ;从拆字的出口获取值
MOVCA,@A+DPTR
MOVP0,A
LCALLDELY10MS
MOVP2,LED1
MOVA,46H
MOVCA,@A+DPTR
MOVP0,A
LCALLDELY10MS
RET
DISPLAY34: MOVA,MODE_RG ;判断模式,决定是显示闹钟时间还是显示当前时间
CJNEA,MODE4,DIS31
LJMPDIS32
DIS31: CJNEA,MODE5,DIS35
DIS32: MOVR7,M_ALARM
LJMPDIS34
DIS35: CJNEA,MODE6,DIS41
MOVR7,S_SEC ;秒表模式,显示秒表低位
LJMPDIS34
DIS41: CJNEA,MODE1,DIS33
MOVR7,SEC
LJMPDIS34
DIS33: MOVR7,MIN ;DISPLAY34显示低位
DIS34: LCALLBCTD
MOVA,R4
MOVR3,A
LCALLDIVIDE
MOVP2,LED2
MOVA,47H
MOVCA,@A+DPTR
MOVP0,A
LCALLDELY10MS
MOVP2,LED3
MOVA,48H
MOVCA,@A+DPTR
MOVP0,A
LCALLDELY10MS
SETBP2.3
RET
;--------------------二翻十:入口:R6R7出口:R2R3R4----------------------
BCTD: MOVR5,#16
CLRA
MOVR2,A
MOVR3,A
MOVR4,A
LOOP: CLRC
MOVA,R7
RLCA
MOVR7,A
MOVA,R6
RLCA
MOVR6,A
MOVA,R4
ADDCA,R4
DAA
MOVR4,A
MOVA,R3
ADDCA,R3
DAA
MOVR3,A
MOVA,R2
ADDCA,R2
DAA
MOVR2,A
DJNZR5,LOOP
RET
;-----------------------拆字:入口:R3R4出口:45H46H47H48H------------------
DIVIDE: MOVA,R3
ANLA,#0FH
MOV46H,A
MOVA,R3
ANLA,#0F0H
SWAPA
MOV45H,A;时拆字45H放时高位,46H放十低位
MOVA,R4
ANLA,#0FH
MOV48H,A
MOVA,R4
ANLA,#0F0H
SWAPA
MOV47H,A;分拆字47H放分高位,48H放分低位
RET
;------------------------------------延时----------------------------------
DELY10MS:MOVR6,#10
D1:MOVR7,#248
DJNZR7,$
DJNZR6,D1
RET
DELAY: MOV74H,#2;延时子程序,12M晶振延时1.002秒
L3: MOV72H,#10
L1: MOV73H,#249
L2: DJNZ73H,L2
LCALLDISPLAY12
LCALLDISPLAY34
JNBDOWN_KEY,OFFALARM1
LJMPS3
OFFALARM1: LCALLDELY10MS
JBDOWN_KEY,S3
S4: JNBDOWN_KEY,S4
MOVF_ALARM,#0
SETBP3.6
LJMPMAIN1
S3: DJNZ72H,L1
DJNZ74H,L3
RET
NUMTAB:DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,88H,83H,0C6H,0A1H,86H,8EH;码表
END
‘陆’ 单片机拆字拼字实验,要交作业了,急急急
MOV 31H, 30H
ANL 31H, #0FH
MOV A, 30H
SWAP A
ANL A, #0FH
MOV 32H, A
END
‘柒’ 请问单片机C语言定时器程序怎么写
你看过汇编吗?与汇编的格式是一样的。具体就是先开中断允许标志位(IE里面对应的各个位)在设定TMOD工作方式。下一步就是设定初始值了(TH、TL)。设置完这些就可以开定时器了。写中断中段函数是是需要另加interrupt 加上一个常数(比如是定时器0就在后面加上1)。我用89S52芯片编过一个定时器程序你参考一下,希望对你有一点帮助。
//功能:感应外界温度并用数码管显示
//时间:2005年6月20日
//设计人:
#include<reg52.h>
#define uchar unsigned char
sbit ad0809_oe=P1^0; //定义各个位
sbit ad0809_start=P1^1;
sbit ad0809_ale=P1^2;
sbit ls595_rclk=P1^3;
sbit ad0809_eoc=P1^5;
sbit ls595_oe=P1^4;
sbit ls595_ser=P3^0;
sbit ls595_srclr=P3^1;
uchar nn,mm;
uchar code tab[]={0x81,0xcf,0x92,0x86,0xcc,0xa4,0xa0,0x8f,0x80,0x84};
send(uchar); //声明函数
AD(uchar);
void display(uchar);
void init();
//********普通口输入数据*****************
send(uchar shu) //普通口串行输入
{
unsigned char i,k;
k=0x01;
for(i=0;i<8;i++)
{
if(k==(k&shu)) //判断每位上是否为1
ls595_ser=1;
else
ls595_ser=0;
k<<=1; //左移一位
ls595_srclr=0; //输入一个上升沿讲数送入595中
ls595_srclr=1;
}
}
//*****************595显示子程序********************
void display(uchar )
{
uchar ge,shi,flge; //ge拆字后个位的存放处shi拆字后十位的存放处flge ℃的存放处
shi=tab[/10]; //拆字
send(shi); //给595送数
ge=tab[%10];
send(ge);
flge=0xb1;
send(flge);
ls595_rclk=0; //上升沿送出数据
ls595_rclk=1;
}
//*******************初始化程序********************
void init() //初始化AD、定时器
{
ad0809_start=0; //Start管教上升沿将AD内部寄存器清零
ad0809_start=1;
ad0809_ale=1; //ALE高电平选择通道
nn=0;
mm=0;
TMOD=0x01; //定时器初始化
//IE=0x82;
EA=1;
ET0=1;
TCON=0x00;
TL0=(65536-50000)%256; //定时50ms
TH0=(65536-50000)/256;
}
AD(uchar wen)
{
// unsigned char tt=0;
// ad0809_ale=1; //选择通道
ad0809_start=1;
ad0809_start=0; //start下降沿启动转换信号
while(ad0809_eoc==0); //判断转换是否结束
ad0809_oe=1; //转换结束送出转换数据
wen=P2;
return (wen);
}
//**************中断服务程序*********************
void tiam0() interrupt 1 using 1 //中断服务程序
{
TL0=(65536-50000)%256; //定时50ms
TH0=(65536-50000)/256;
nn++;
if(nn==10) //0.5秒M加一
{
mm++;
nn=0;
}
}
//****************主程序***************************
void main()
{
unsigned char bb,aa,cc; //bb=计算后得到温度,aa=AD输出数据
unsigned char wen; //wen存放转换的得到的数据
init();
// wen=17;
ls595_oe=0;
cc=0;
TR0=1;
while(1)
{
aa=AD(wen);
// ad0809_oe=0;
aa=~aa;
bb=aa/4;
if(mm==2)
{
mm=0;
cc=bb;
}
display(cc); //调用显示子程序
}
}
‘捌’ 单片机拆字法原理介绍 拜托了
怎么拆?
是高、低四位,分离?
‘玖’ 单片机实验箱的实验项目
(一)软件实验
(1)清零程序;
(2)拆字程序;
(3)拼字程序;
(4)数据区传送子程序;
(5)数据排序实验;
(6)查找相同数据个数;
(7)无符号双字节快速乘法子程序;
(8)多分支程序;
(9)脉冲计数实验;
(10)电脑时钟实验。
(二)硬件实验
(1)P1口亮灯实验;
(2)P1口转弯灯实验;
(3)P3.3口输入,P1口输出实验;
(4)工业顺序控制实验;
(5)8255 A、B、C口输出方波实验;
(6)8255 PA口控制PB口;
(7)8255控制交通灯;
(8)简单I/O扩展实验;
(9)A/D0809转换实验;
(10)D/A0832转换实验;
(11)8279键盘显示实验;
(12)通用打印机实验;(打印机选配)
(13)微型打印机打印字符、曲线、汉字实验;(打印机选配)
(14)I2C储存卡读写实验;
(15)继电器控制实验;
(16)步进电机控制;
(17)8253方波实验;
(18)小直流电机调速实验;
(19)16*16 LED点阵显示实验;
(20)128*64 LCD液晶显示实验;
(21)8250可编程异步通讯接口实验(自发自收);
(22)8251可编程通讯接口实验(与PC机);
(23)单片机RS232/485串行发送实验(双机通讯);
(24)单片机RS232/485串行接收实验(双机通讯);
(25)温度实验;
(26)压力实验;
(27)DS18B20单总线数字温度传感器实验;
(28)红外线遥控通信实验;
(29)PWM脉冲宽度调制实验;
(30)射极跟随器实验;
(31)电子音乐演奏实验。
(三)扩展卡实验(选配)☆
1、KZ-1扩展卡完成以下实验:
(32)MAX813看门狗实验
(33)74LS165并转串实验
(34)74LS164串转并实验
(35)查询式键盘实验
(36)74LS138译码实验
2、KZ-2扩展卡完成以下实验:
(37)LM331 V/F转换实验
(38)LM331 F/V转换实验
(39)光耦隔离模块实验
3、KZ -3扩展卡完成以下实验:
(40)串行EEPROM 93C46读写实验
(41)I2C AT24C02读写实验
(42)TLC549串行A/D转换实验
(43)TLC5615 10位D/A串行转换实验
(44)PCF8563 I2C日历时钟实验
4、KZ -4扩展卡完成以下实验:
(45)ISD1730语音录放实验
5、CAN总线扩展卡:
(46)CAN总线通讯接口实验
6、TCP/IP以太网扩展卡
(47)以太网TCP/IP协议接口实验
7、USB2.0卡
(48)USB2.0通讯接口实验。
8、1032扩展卡:
Lattice公司:Lattice1032E芯片实验开发。
9、1K30扩展卡:
Atera公司:EP1K30TC144芯片实验开发。
10、C8051F020扩展卡+DICE-EC5仿真器:
C8051F020是完全集成的混合信号系统级MCU芯片。下面列举了一些主要芯片资源:
(1)高速流水线结构的8051兼容的CIP-51内核(最大25MIPS);
(2)全速非侵入式的系统调试接口(片内);
(3)真正12位100ksps的8通道ADC,带PGA和模拟多路开关;8位500ksps的8通道ADC;
(4)两个12位DAC,可编程更新时序;
(5)64K字节可在系统编程的FLASH存储器;
(6)4352(4096+256)字节的片内RAM;
(7)可寻址64K字节地址空间的外部数据存储器接口;
(8)硬件实现的SPI,SMBus/IIC和两个UART串行接口;
(9)5个通用的16位定时器;
(10)具有5个捕捉/比较模块的可编程计数器/定时器阵列;
(11)片内看门狗定时器,2个比较器,VDD监视器和温度传感器;
(12)64个I/O端口;
(13)-40~85度工业级温度范围;
(14)2.7V~3.6V工作电压,100脚TQFP封装;
11、DICE-DAQ数控式创新实验平台扩展卡(实验对象通过软件仿真)
闭环控制
(1)机器人扫地雷实验;
(2)刀库捷径选择实验;
(3)四层电梯实验;
(4)四级传送带实验;
(5)邮件分拣实验;
(6)水塔水位控制实验;
(7)交流电机Y/△起动实验;
开环控制:
(8)交通信号灯实验;
(9)步进电机实验;
(10)舞台灯实验;
(11)LED显示实验;
(12)液体混合装置实验;
(13)八通道逻辑分析实验;
(14)温度压力实验;
(15)连线自检实验;。
‘拾’ 单片机基础实验3个,用WAVE软件,满分悬赏,在线急等
只做一题,其他请学做。
ORG 0000H
CLR A
MOV R0,#30H ;内部RAM首地址
MOV B, #0FFH ; 需要清零的长度
L: MOVX @R0,A
INC R0
DJNZ B,L