當前位置:首頁 » 編程語言 » c語言嵌入式紅綠燈提取顯示值
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言嵌入式紅綠燈提取顯示值

發布時間: 2022-09-24 15:26:33

⑴ 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時,綠燈亮等。