⑴ c51单片机c语言交通灯的程序
Proteus仿真原理图:
程序如下:
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar data buf[4];
uchar data sec_dx=20;//东西数默认
uchar data sec_nb=30;//南北默认值
uchar data set_timedx=20;
uchar data set_timenb=30;
int n;
uchar data b;//定时器中断次数
sbit k1=P1^6;//定义5组开关
sbit k2=P1^7;
sbit k3=P2^7;
sbit k4=P3^0;
sbit k5=P3^1;
sbit Yellow_nb=P2^5; //南北黄灯标志
sbit Yellow_dx=P2^2; //东西黄灯标志
sbit Green_nb=P2^4;
sbit Green_dx=P2^1;
sbit Buzz=P3^7;
bit Buzzer_Indicate;
bit time=0;//灯状态循环标志
bit set=1;//调时方向切换键标志
uchar code table[11]={ //共阴极字型码
0x3f, //--0
0x06, //--1
0x5b, //--2
0x4f, //--3
0x66, //--4
0x6d, //--5
0x7d, //--6
0x07, //--7
0x7f, //--8
0x6f, //--9
0x00 //--NULL
};
//函数的声明部分
void delay(int ms);//延时子程序
void key();//按键扫描子程序
void key_to1();//键处理子程序
void key_to2();
void key_to3();
void display();//显示子程序
void logo(); //开机LOGO
void Buzzer();
//主程序
void main()
{
TMOD=0X01;
TH0=0XD8;
TL0=0XF0;
EA=1;
ET0=1;
TR0=1;
EX0=1;
EX1=1;
logo();
P2=0Xc3;// 开始默认状态,东西绿灯,南北黄灯
sec_nb=sec_dx+5;
while(1)
{
key(); //调用按键扫描程序
display(); //调用显示程序
Buzzer();
}
}
//函数的定义部分
void key() //按键扫描子程序
{
if(k1!=1)
{
delay(10);
if(k1!=1)
{
while(k1!=1)
{
key_to1();
for(n=0;n<40;n++)
{ display();}
}
}
}
if(k2!=1)
{
delay(10);
if(k2!=1)
{
while(k2!=1)
{
key_to2();
for(n=0;n<40;n++)
{ display();}
}
}
}
if(k3!=1)
{
TR0=1; //启动定时器
Buzzer_Indicate=0;
sec_nb=set_timenb; //从中断回复,仍显示设置过的数值
sec_dx=set_timedx;
if(time==0)
{ P2=0X99;sec_nb=sec_dx+5; }
else { P2=0xC3;sec_dx=sec_nb+5; }
}
if(k4!=1)
{
delay(5);
if(k4!=1)
{
while(k4!=1);
set=!set;
}
}
if(k5!=1)
{
delay(5);
if(k5!=1)
{
while(k5!=1)
key_to3();
}
}
}
void display() //显示子程序
{
buf[1]=sec_dx/10; //第1位 东西秒十位
buf[2]=sec_dx%10; //第2位 东西秒个位
buf[3]=sec_nb/10; //第3位 南北秒十位
buf[0]=sec_nb%10; //第4位 南北秒个位
P1=0xff; // 初始灯为灭的
P0=0x00;
P1=0xfe; //片选LCD1
P0=table[buf[1]];
delay(1);
P1=0xff;
P0=0x00;
P1=0xfd; //片选LCD2
P0=table[buf[2]];
delay(1);
P1=0xff;
P0=0x00;
P1=0Xfb; //片选LCD3
P0=table[buf[3]];
delay(1);
P1=0xff;
P0=0x00;
P1=0Xf7;
P0=table[buf[0]]; //片选LCD4
delay(1);
}
void time0(void) interrupt 1 using 1 //定时中断子程序
{
b++;
if(b==19) // 定时器中断次数
{ b=0;
sec_dx--;
sec_nb--;
if(sec_nb<=5&&time==0) //东西黄灯闪
{ Green_dx=0;Yellow_dx=!Yellow_dx;}
if(sec_dx<=5&&time==1) //南北黄灯闪
{ Green_nb=0;Yellow_nb=!Yellow_nb;}
if(sec_dx==0&&sec_nb==5)
sec_dx=5;
if(sec_nb==0&&sec_dx==5)
sec_nb=5;
if(time==0&&sec_nb==0)
{ P2=0x99;time=!time;sec_nb=set_timenb;sec_dx=set_timenb+5;}
if(time==1&&sec_dx==0)
{P2=0Xc3;time=!time;sec_dx=set_timedx;sec_nb=set_timedx+5;}
}
}
void key_to1() //键盘处理子程序之+
{
TR0=0; //关定时器
if(set==0)
set_timenb++; //南北加1S
else
set_timedx++; //东西加1S
if(set_timenb==100)
set_timenb=1;
if( set_timedx==100)
set_timedx=1; //加到100置1
sec_nb=set_timenb ; //设置的数值赋给东西南北
sec_dx=set_timedx;
}
void key_to2() //键盘处理子程序之-
{
TR0=0; //关定时器
if(set==0)
set_timenb--; //南北减1S
else
set_timedx--; //东西减1S
if(set_timenb==0)
set_timenb=99;
if( set_timedx==0 )
set_timedx=99; //减到1重置99
sec_nb=set_timenb ; //设置的数值赋给东西南北
sec_dx=set_timedx;
}
void key_to3() //键盘处理之紧急车通行
{
TR0=0;
P2=0Xc9;
sec_dx=00;
sec_nb=00;
Buzzer_Indicate=1;
}
void int0(void) interrupt 0 using 1 //只允许东西通行
{
TR0=0;
P2=0Xc3;
Buzzer_Indicate=0;
sec_dx=00;
sec_nb=00;
}
void int1(void) interrupt 2 using 1 //只允许南北通行
{
TR0=0;
P2=0X99;
Buzzer_Indicate=0;
sec_nb=00;
sec_dx=00;
}
void logo()//开机的Logo "- - - -"
{ for(n=0;n<50;n++)
{
P0=0x40;
P1=0xfe;
delay(1);
P1=0xfd;
delay(1);
P1=0Xfb;
delay(1);
P1=0Xf7;
delay(1);
P1 = 0xff;
}
}
void Buzzer()
{
if(Buzzer_Indicate==1)
Buzz=!Buzz;
else Buzz=0;
}
void delay(int ms) //延时子程序
{
uint j,k;
for(j=0;j<ms;j++)
for(k=0;k<124;k++);
}
⑵ 求一个C语言的红绿灯程序 80C51
#include<reg51.h>/*下面中n代表north. n s w e分别代表四个不同的方向*/
sbit rednts=P1^0;
sbit yellownts=P1^1;
sbit greennts=P1^2;
sbit redwte=P1^3;
sbit yellowwte=P1^4;
sbit greenwte=P1^5;//由于实验实的板只用了P1口作输入
int tmp1=0;
int tmp2=0;
int i;
void begins()
{
rednts=0;
yellownts=0;
greennts=0;
redwte=0;
yellowwte=0;
greenwte=0;
}
void TimeInt() interrupt 1 //这是中断函数,1对应是定时、计数器0
{
i++;
if(i==2000)
{
i=0;
tmp1++;
if(10==tmp1) tmp1=0;
}//若到了,得清0 //判断是否到了0.5MS*2000=1S}
void ExteriorInt() interrupt 0
{
tmp2=!tmp2;
}
void main()
{ //int time1s,time2s,time3;;
TMOD=0x02; //启用定时器工作模式2
TH0=6;//装定时器初值高8位,0.5ms中断一次 。2US*250=0.5MS
TL0=6;//装定时器初值低8位
EA=1; //打开总中断允许
ET0=1; //打开定时器0的中断允许
TR0=1; //T0工作1******以上是对定时器0的初始化********
TCON=0x11;//TCON的设置必须保持定时器0在工作
EX0=1;//********以上是对外部中断0的初始化***********
while(1)
{
if(tmp2)
{
begins();
rednts=1;
redwte=1;
}
else if(tmp1<3)
{
begins();
rednts=1;
greenwte=1;
}
else if(tmp1<4)
{
begins();
}
else if(tmp1<5)
{
yellownts=1;
yellowwte=1;
}
else if(tmp1<6)
{
begins();
}
else if(tmp1<7)
{
yellownts=1;
yellowwte=1;
}
else if(tmp1<10)
{
begins();
greennts=1;
redwte=1;
}
}}
⑶ 求大神解答,用51单片机汇编语言实现一个红绿灯的程序,不是一个路口的,大概注释下就好
;------------------------------------
;程序实现功能
;西南北路口直行与转弯交替通行,数码管显示直行通行倒计时,红绿黄灯显示包括人行道在内的道路交通状态。
;某一方向道路拥挤时,可以人工控制调节东西南北方向通行时间。
;紧急情况时,各路口交通灯显示红灯,数码管保持数据不变。
;工作寄存器及存储单元分配
;1.工作寄存器
;R2设置为定时器定时中断次数,R6、R7用于延时程序中的寄存器
;2.片内存储单元
;30H、31H作为两组数码管显示数据存储单元;32H、33H作为交通灯初始状态存储单元;40H、41H作为交通灯显示数据存储单元
;3.标志位
;00H:南北通行标志位 ; 01H:东西通行标志位;02H:紧急事件标志位
;-----------------------------------
SNF EQU 00H ;;;南北通行标志位
EWF EQU 01H ;;;东西通行标志位
URF EQU 02H ;;;紧急事件标志位
ORG 0000H
LJMP MAIN ;;;上电转主程序
ORG 000BH ;;;定时中断入口
LJMP DSZD
ORG 0003H ;;;紧急中断入口
LJMP URZD
ORG 0030H
MAIN: LCALL INIT ;;;调用初始化子程序
LOOP: LCALL DIS ;;;循环执行显示子程序
AJMP LOOP
;///////////初始化程序
INIT: SETB SNF
SETB EWF
SETB URF
MOV R2,#20 ;;;定时器中断20次为1s
MOV TMOD,#01H ;;;初始化定时器
MOV TL0,#0B0H
MOV TH0,#3CH
SETB EA ;;;开定时中断与紧急中断
SETB ET0
SETB TR0
SETB EX0
SETB IT0 ;;;设置中断程控方式
MOV DPTR,#TAB ;;;数值首地址放入DPTR中
MOV 40H,#40 ;;;东南西北通行时间设置
MOV 41H,#40
MOV 30H,#40 ;;;通行时间初始化
MOV 31H,#60
MOV P0,#4CH ;;;初始化时南北通行并把交通灯状态分别放在32H和33H中
MOV 32H,#4CH
MOV P2,#15H
MOV 33H,#15H
RET
;////////////显示子程序
DIS: MOV P3,#0DFH ;;;选中南北方向的十位数码管
MOV A,30H ;;;把显示数据送人数码管显示
MOV B,#10
DIV AB
MOVC A,@A+DPTR
MOV P1,A ;;;
LCALL D1MS
MOV P3,#0EFH ;;;选中南北方向的个位数码管
MOV A,B ;;;送入数码管显示
MOVC A,@A+DPTR
MOV P1,A
LCALL D1MS
MOV P3,#7FH ;;;选中第东西方向的十位数码管
MOV A,31H ;;;送入数码管显示
MOV B,#10
DIV AB
MOVC A,@A+DPTR
MOV P1,A
LCALL D1MS
MOV P3,#0BFH ;;;选中第东西方向的个位数码管
MOV A,B
MOVC A,@A+DPTR
MOV P1,A
LCALL D1MS
SETB P3.0
SETB P3.1
JNB P3.0,DIS_S ;;;查询是否第一个按键按下
JNB P3.1,DIS_E ;;;查询是否第二个按键按下
AJMP DIS_R ;;;没有键按下则返回
DIS_S:LCALL D5MS ;;;按键去抖
JNB P3.0,DIS_SN
AJMP DIS_R
DIS_SN:MOV 40H,#50 ;;;对通行时间从新分配,南北通行时间加长
MOV 41H,#30
AJMP DIS_R
DIS_E:LCALL D5MS ;;;按键去抖
JNB P3.1,DIS_EW
AJMP DIS_R
DIS_EW:MOV 40H,#30 ;;;东西通行时间加长
MOV 41H,#50
DIS_R:RET
;///////定时中断处理程序
DS_C: LJMP DS_R ;;;接力跳转
DSZD: PUSH ACC ;;;保护现场
PUSH PSW
CLR TR0 ;;;关定时器及中断标志位并重新赋值
CLR TF0
MOV TL0,#0B0H
MOV TH0,#3CH
DJNZ R2,DS_C ;;;判断1m时间是否到达
MOV R2,#20 ;;;到达重新赋值
DEC 30H ;;;南北方向通行时间减一
MOV A,30H ;;;把减一后的时间送入显示存储单元
;;;;;;;南北通行到达最后4秒时黄灯闪烁
DS_10:CJNE A,#4,DS_11 ;;;如果通行时间剩余4秒
JNB SNF,DS_11 ;;;判断是否是南北通行
MOV P0,#8AH
MOV 32H, #8AH ;;;把交通灯状态存入存储单元(后面类似)
DS_11:CJNE A,#3,DS_12 ;;;不是剩余3秒,返回
JNB SNF,DS_12 ;;;不是南北通行时间,返回
MOV P0,#88H
MOV 32H, #88H
DS_12:CJNE A,#2,DS_13
JNB SNF,DS_13
MOV P0,#8AH
MOV 32H, #8AH
DS_13:CJNE A,#1,DS_14
JNB SNF,DS_14
MOV P0,#88H
MOV 32H, #88H
;------------------------
DS_14:JNZ DS_NE ;;;通行时间没有结束转向改变东西方向的数码管
CPL SNF ;;;如果通行时间结束则对标志位取反
JNB SNF,DS_1 ;;;判断是否南北通行
MOV 30H,40H ;;;是,点亮相应的交通灯
MOV P0,#4CH
MOV 32H,#4CH ;;;存储交通灯状态
MOV P2,#15H
MOV 33H, #15H ;;;存储交通灯状态
DS_NE:DEC 31H ;;;东西方向通行时间减一
MOV A,31H ;;;把通行剩余时间送入显示存储单元
;;;;;;;;东西方向通行时间剩余4秒钟黄灯闪烁(程序注释与南北方向类似 略)
DS_20:CJNE A,#4,DS_21
JB EWF,DS_21
MOV P0,#51H
MOV 32H, #51H
DS_21:CJNE A,#3,DS_22
JB EWF,DS_22
MOV P0,#41H
MOV 32H, #41H
DS_22:CJNE A,#2,DS_23
JB EWF,DS_23
MOV P0,#51H
MOV 32H, #51H
DS_23:CJNE A,#1,DS_24
JB EWF,DS_24
MOV P0,#41H
MOV 32H, #41H
;-----------------------------
DS_24:JNZ DS_R ;;;东西方向时间没有结束,返回
CPL EWF ;;;对通行状态取反
JNB EWF,DS_2 ;;;东西方向通行时间到来,跳转
MOV 31H,#80 ;;;东西方向通行结束,重新显示时间
MOV P0,#89H ;;;点亮相应的交通灯
MOV 32H, #89H
MOV P2,#29H
MOV 33H, #29H
AJMP DS_R
DS_1: MOV 30H,#80 ;;;南北通行时间结束,重新对显示存储单元赋值
MOV P0,#89H ;;;执行转弯状态1
MOV 32H, #89H
MOV P2,#26H
MOV 33H, #26H
AJMP DS_NE
DS_2: MOV 31H,41H ;;;东西方向开始通行,赋值予显示存储单元
MOV P0,#61H ;;;点亮相应的交通灯
MOV 32H, #61H
MOV P2,#15H
MOV 33H, #15H
DS_R: SETB TR0
POP PSW ;;;恢复现场
POP ACC
RETI
;/////////////紧急中断处理程序
URZD: PUSH ACC ;;;保护现场
PUSH PSW
CLR IE0 ;;;清除中断标志位
CLR TR0 ;;;关定时器
CPL URF ;;;紧急事件标志位
JB URF,UR_CON ;;;紧急结束;跳转
MOV P0,#49H ;;;各路口灯全显示红灯亮
MOV P2,#15H
AJMP UR_R
UR_CON:SETB TR0 ;;;恢复正常交通
MOV A,32H
MOV P0,A
MOV A,33H
MOV P2,A
UR_R: POP PSW ;;;恢复现场
POP ACC
RETI
;////////////查表指令0,1,2,3,4,5,6,7,8,9
TAB: DB 3FH, 06H, 5BH, 4FH, 66H, 6DH
DB 7DH, 07H, 7FH, 6FH
;//////////延时5ms与1ms
D5MS: MOV R7,#5
D1MS: MOV R7,#10
MOV R6,#50
L1: DJNZ R6,$
DJNZ R7,L1
RET
⑷ 单片机C语言红绿灯程序,要求:数码管显示时间倒计时、16*16LED点阵显示模块显示红绿黄灯、
#include <reg51.h>
#define uint unsigned int
#define uchar unsigned char
#define BLKN 2 //列锁存器数
sbit G = P1^7; //P1.7为显示允许控制信号端口
sbit RCLK = P2^0; //P2.0为输出锁存器时钟信号端
sbit SCLR = P2^1; //P2.1为移位寄存器清○端
void delay(uint); //延时函数
uchar data display[32]; //显示缓存
uchar code BMP[][32]={{16,0,16,0,37,248,36,64,120,64,8,64,16,64,32,64,124,64,0,64,0,64,12,64,112,64,3,252,0,0,0,0},
{16,0,19,240,32,16,41,240,120,16,19,252,32,64,122,72,1,80,0,224,25,80,102,76,0,64,1,192,0,0,0,0},
{4,64,4,64,63,248,4,64,127,252,1,0,31,240,17,16,31,240,17,16,31,240,8,32,16,16,32,8,0,0,0,0}}; //字模表'红‘’绿‘‘黄’
void main()
{
register uchar i,j;
SCON=0x00; //串口工作模式0:移位寄存器方式
TMOD=0x01; //定时器T0工作方式1:16位方式
P1=0x3f; //P1端口初值:允许接收、锁存、显示
TR0=1; //启动定时器T0
ET0=1; //允许定时器T0中断
EA=1; //开启总中断;
while(1)
{
delay(2000);
for(j=0;j<3;j++)
{
for(i=0;i<32;i++)
{
display[i]=~BMP[j][i];
if (i%2) delay(100);
}
delay(10000);
}
}
}
void delay(uint x)
{
register uchar i,j;
for (i=x;i>0;i--)
for (j=120;j>0;j--);
}
void leddisplay(void) interrupt 1 using 1
{
register uchar i, j=BLKN;
TH0 =(65536-100)/256; //设定显示屏刷新率每秒60帧
TL0 =(65536-100)%256;
i = P1; //读取当前显示的行号
i = ++i & 0x0f; //行号加1,屏蔽高4位
while(j)
{
j--;
SBUF = display[i*BLKN + j]; //送显示数据
while (!TI);
TI = 0;
} //完成一行数据的发送
G = 1; //消隐(关闭显示)
P1 &= 0xf0; //行号端口清○
RCLK = 1; //显示数据打入输出锁存器
P1 |= i; //写入行号
RCLK = 0; //锁存显示数据
G = 0; //打开显示
}
⑸ 急求单片机红绿灯的汇编语言程序设计
去买一本书吧!单片机原理与应用,你可能还不杂个会吧,这个你得慢慢来,只要你把那本书学会了差不多你能看会了,你可能还很年轻吧,要慢慢来,别人给你说没的意思的,年轻嘛慢慢来,我也是这样来的,我看过你这个还是简单的,我是搞仪表的,你看看我的程序吧!!! 十分之一
文件名:*******.ASM
;* 型号 : M603-VA
;* 产品名称:4位三相电流/电压表
;* PCB硬件:M603-3P-VA-01(01)/M603-3P-VA-03(01)
;* 实现功能:(1)可测三相三线电压/电流
;(2)对输入电流/电压值做任意刻度显示
;* 版本号: 第1.0版
;* 起草日期:2006.3.30 最后修改日期: 2006.8.16
;* 修改日志:
;* V1.1 解决测量漂移问题
;* 完善1:LiuQK-2007.1.1
;* 1、增加RS485通讯功能
;* 2、增加变送功能
;* 3、增加上下限报警
;//////////////////////////////////////////////////////////////
ORG 0000
AJMP MAIN
ORG 0003H;INT0中断入口地址停电保存
;ljmp irq_int0
NOP
NOP
LJMP Err;程序飞跑,转到处理程序,重新启动.
ORG 000BH;T0中断入口, 用于显示定时
LJMP IRQ_t0
NOP
NOP
LJMP Err;程序飞跑,转到处理程序,重新启动.
ORG 0013H;INT1中断口地址
LJMP IRQ_int1
NOP
NOP
LJMP Err;程序飞跑,转到处理程序,重新启动.
ORG 001BH;T1中断入口 用于A/D转换
ljmp irq_t1
NOP
NOP
LJMP Err;程序飞跑,转到处理程序,重新启动.
ORG 23H
LJMP IRQ_UART;用于RS-485通讯
NOP
NOP
LJMP Err
org 002bh ;D/A
ljmp irq_t2
nop
nop
LJMP Err
;////////////////////////////////////////////////
;主程序从MAIN开始 执行
;////////////////////////////////////////////////
;////////////////////////////////////////////////
;STC单片机附加功能宏定义
P4 DATA 0e8h;P4口地址
WDT_CONTR DATA 0E1H;看门狗控制地址
AUXR DATA 8EH ;只写寄存器,只能用MOV AUXR,#DATA 命令. 用于控制扩展RAM和使能ALE.
AUXR1 DATA 0A2H;本寄存器用于数据指针选择://=0 选择DPTR0 , =1 选择DPTR1 //
XICON DATA 0C0H;特殊功能寄存器申明
;89C52定时器T2
;T2CON DATA 0C8H
;TH2 DATA 0CDH
;TL2 DATA 0CCH
;RCAP2H DATA 0CBH
;RCAP2L DATA 0CAH
;RL2 BIT 0C8H.0
;CT2 BIT 0C8H.1
;TR2 BIT 0C8H.2
;EXEN2 BIT 0C8H.3
;TCLK BIT 0C8H.4
;RCLK BIT 0C8H.5
;EXF2 BIT 0C8H.6
;TF2 BIT 0C8H.7
;ET2 BIT 0A8H.5
;PT2 BIT 0B8H.5
ORG 35h
MAIN: mov r0,#0Ffh
FILL: clr a
MOV @R0,A
DJNZ R0,FILL;(填充)初始化RAM内的数据全部为00H。
mov psw,#0
MOV SP,#80H;堆栈指针
MOV AUXR,#00
MOV CHECK_CODE,#0AAH
ACALL DATA_CHECK;数据校验
; setb 21h.0;置仪表起动标志
;EA中断允许,ET1中断允许,ET0中断允许
SETb ea ;EA中断允许
setb IT1;INT1中断方式是负边沿触发方式
setb it0;INT0中断方式是负边沿触发方式
mov pcon,#00h;
SETB PT0
CLR PX0
CLR PT1
CLR PX1
;SETB PX1
setb et0;T0中断允许
setb ET2
JNB 25H.2,IE_1
LCALL R_LOAD;载入波特率
mov t2con,#34h
setb p1.0;将485置为接收状态
mov scon,#0D0h;初始化并启动串口
SETB ES;开中断
SETB PS;串口中断优先
CLR PS
sjmp ie_OK
ie_1: JNB 25H.1,IE_OK
mov RCAP2H,#0ffh
mov RCAP2L,#0ffh
mov t2con,#04h
SETB PT2
IE_OK: SETB 20H.0 ;仪表启动标志
mov 2fh,#0;
lcall ie_ch;启动通道
;clr p1.2
;clr p1.3
;/////////////////////////////////////////////////
;/显示程序/
main2: ;启动看门狗以及定时时间为4S
MOV WDT_CONTR,#34H
setb et0
setb tr0
main20: JB 20H.7,MAIN3;查看A/D是否运行
lCALL IE_SET ;启动测量初始化
SETB 20H.7 ;测量启动标记
main3: ;A.数据校验
ACALL DATA_CHECK;数据校验
;B.测量频率计算
ACALL CY_HZ;计算
;C.显示比例值计算
acall dis_scale
;D:计算平均值
acall Hz_av
;E:上下限报警
ACALL ALARM_OUTPUT
;F:RS485通讯/变送输出
LCALL COMMUNICATION
;g:按键处理
LCALL SETKEY
LCALL SHIFTKEY
LCALL DOWKEY
LCALL ATKEY
;h:BCD码转换
ACALL bcdCode;bcd码转换
AJMP MAIN2;重新回到MAIN2
;//////////////////////////////////////
;A/D转换采样启动程序
IE_SET: MOV 1eH,#4;INT1不中断等待次数
MOV 1fH,#0;T0定时循环次数
MOV 1cH,#0;采样脉冲个数缓冲器
MOV 1dH,#0
MOV TMOD,#00010001B;T1,T0为16位定时器.
;再次初始化T1;int1
setb ea;再次启动中断
setb et1
clr tr1
mov tl1,#0
mov th1,#0
setb tr1
CLR IE1; 清除int1中断标志
SETB EX1;开启INT1中断
RET
;********************
;测量通道设置
ie_ch: push dpl
push dph
ie_ch1: mov a,2fh
ie_ch2: rl a;左移
cjne a,#7,ie_ch20;A/D转换共5次循环
ie_ch20: jc ie_ch21
clr a
ie_ch21: mov dptr,#ie_ch3
jmp @a+dptr
nop
nop
;通道循环表
ie_ch3: sjmp ie_offset ;零点偏移测量;0
sjmp ie_pa;A相过程值1
sjmp ie_pb;B相过程值2
sjmp ie_pc;C相过程值3
nop
nop
;4051 地址引脚排列 (9) (10 ) (11) 为地址 A2(c) A1(b) A0(a).
;CPU控制引脚: (Gnd) (p1.6) (p1.7)
;地址对应关系:000-- 0 0 0------PC通道(13PIN)
;001---0 0 1-----PB通道(14PIN)
;002---0 1 0-----PA通道(15PIN)
;003---0 1 1-----offset通道(12PIN)
;004---0-----GND
;005---0-----GND
;006---0-----GND
;007---0-----GND
;PA测量
ie_pa: nop
;功能检查
setb p1.6
clr p1.7
ie_ch_com: pop dph
pop dpl
ret
nop
;PB测量
ie_pb: setb p1.7
clr p1.6
sjmp ie_ch_com
;PC测量
ie_pc: CLR p1.7
clr p1.6
sjmp ie_ch_com
;零点偏移OFFSET测量0通道,硬件连接4051 的13引脚
ie_offset: SETB p1.7
SETB p1.6
sjmp ie_ch_com
nop
nop
;**************************
;频率计算
NOSWAP:
RET
nop
CY_HZ: JNB 3EH,NOSWAP;无采样结束标志
CLR 20H.7;清除测量挂起标记
CLR 3EH;清除测量结束标记
;T0中断次数浮点数转换
cy_hz_1: CLR 3CH
MOV R2,#0
MOV R3,1fh
MOV R1,#08H
LCALL INTF;浮点数存储08H 09H 0AH
;T0中断次数计算成时间周期;每中断1次时间为65536uS
MOV 0BH,#17;65536
MOV 0CH,#80H
MOV 0DH,#00H
MOV R0,#0BH
LCALL FMUL;
mov r1,#08h
LCALL FSTR;存储08H 09H 0AH
;T0剩余时间浮点数转换
MOV R3,1Bh
MOV R2,1Ah
MOV R1,#0BH
LCALL INTF;T0内检测到的时间转换浮点数存入0BH
;计算超出定时60mS以外的时间周期
MOV R0,#08H
CLR 3AH
LCALL FABP;T0+08H内时间和
LCALL FSTR;存储0BH,0CH 0DH
;计数总时间周期
MOV 08H,#18;65.535*2mS
MOV 09H,#80H
MOV 0AH,#0h
CLR 3AH
LCALL FABP;定时时间+T0+30H得到检测总时间
LCALL FSTR;存储0BH 0CH 0DH
;---------------------------------------
;在定时周期内采样到的脉冲个数转换成浮点数
MOV R2,1ch;测量周期个数转换浮点数
MOV R3,1dH
mov r1,#08h
Lcall intf;数据存放在08H 09H AH
;计算频率值
MOV R0,#08H
MOV R1,#0bH
LCALL Fdiv;频率
LCALL FSTR;存储0b 0c 0d
mov 08h,#20
mov 09h,#0f4h
mov 0ah,#24h
Lcall fmul
; Lcall fstr
mov a,2fh
jnz time_1
;(零点测量)
; mov 10h,0bh
; mov 11h,0ch
; mov 12h,0dh
MOV R1,#10H
; lcall fstr
sjmp TIME_4
nop
nop
time_1: ; mov r0,#0bh
; mov r1,#10h
; setb 3ah
; Lcall fabp
mov a,2fh
cjne a,#1,time_2
;第二次采样值存放到30H 31H 32H 地址(PA过程值测量)
; mov 36h,0bh
; mov 37h,0ch
; mov 38h,0dh
mov r1,#30h
; Lcall fstr
sjmp time_4
; nop
; nop
time_2: cjne a,#2,time_3
;第3次采样值存放33H 34H 35H (PB过程值测量)
; mov 33h,0bh
; mov 34h,0ch
; mov 35h,0dh
mov r1,#33H
; Lcall fstr
Sjmp time_4
;第4次采样值存放36H 37H 38H (PC过程值测量)
time_3: MOV R1,#36H
setb 20h.6;置A/D转换结束标志,用于过程值计算
INC 0EH;A/D转换计数器,用于延迟报警/数据刷新
; mov 30h,0bh
; mov 31h,0ch
; mov 32h,0dh
TIME_4: LCALL FSTR
;通道切换
TIME_COM: INC 2FH
mov a,2fh
cjne a,#4,time_COM0
time_COM0: jc time_COM1
mov 2fh,#0
time_COM1: acall ie_ch
ret
⑹ 单片机 用汇编语言编写交通红绿灯 只要求红灯30秒,黄灯5秒,绿灯30秒,黄灯5秒,其他不限
看你的程序上没有很大的问题,但是你的延时都使用相同子程序,延时时间相同。你可以把延时30秒的子程序和延时5秒的程序分开来写,分别调用。另单片机的引脚一般为吸入电流,建议你将单片机的引脚输出改为0有效就可以直接接负载,电源控制按键判断也作出相应的修改。
⑺ 如何用C语言汇编红绿灯的程序
用random生成一个随机数,或者是用户自己输入一个数字,用switch语句来响应,当是1时,红灯亮,当是2时,绿灯亮等。