C51单片机程序设计题,要求用C语言做,模拟交通灯控制单片机电路,答案要详细具体。

C51单片机程序设计题,要求用C语言做,模拟交通灯控制单片机电路,答案要详细具体。,第1张

晚上随手写,也未调试,权当看看

程序有不严谨地方还得调试修改

#include <REGX51.H>

#define STATUS_1S 1

#define STATUS_2S 2

#define STATUS_3S 3

#define STATUS_4S 4

#define STATUS_5S 5

#define STATUS_15S 15

#define STATUS_28S 28

#define STATUS_29S 29

#define STATUS_30S 30

unsigned char flag,status,status_temp=1,status_temp_

sbit K1 = P0^0

sbit K2  = P0^1

sbit RLED = P0^2

sbit YLED = P0^3

sbit GLED = P0^4

void Init(void)

{

ET0=1

TR0=1

RLED=0  //亮

YLED=0

GLED=0

while(status_temp)

{

switch (status)

{

case STATUS_1S: //1S

{

RLED=1 //灭,闪一次

YLED=1

GLED=1

} break

case STATUS_2S: //1S

{

RLED=0 //亮,闪一次

YLED=0

GLED=0

} break

case STATUS_3S: //1S

{

RLED=1    //灭

YLED=1

GLED=1

status_temp=0

} break

}

}

status_temp=1

ET0=0

TR0=0

}

void Init_Timer0(void)

{

TMOD=0x01

// ET0=1

// TR0=1

EA=1

TH0=0X3C

TL0=0XB0    // 未计算,偷楼上的

}

void M_Start(void)

{

TH0=0X3C

TL0=0XB0

ET0=1

TR0=1

RLED=0  //红亮

while(status_temp)

{

switch (status)

{

case STATUS_1S:

{

if(status_temp_==1)

{

YLED=0

}

} break

case STATUS_2S:

{

if(status_temp_==1)

{

YLED=1

}

} break

case STATUS_3S:

{

if(status_temp_==1)

{

YLED=0

status_temp_=0

}

} break

case STATUS_15S: //15S灭,绿亮

{

RLED=1

GLED=0

} break

case STATUS_28S:

{

GLED=1

} break

case STATUS_29S:

{

GLED=0

} break

case STATUS_30S:

{

GLED=1

status=0

status_temp_=1

} break

}

}

ET0=0

TR0=0

status=0

status_temp=1

YLED=1

}

void M_End(void)

{

TH0=0X3C

TL0=0XB0

ET0=1

TR0=1

RLED=0  //亮 1次

YLED=0

GLED=0

while(status_temp)

{

switch (status)

{

case STATUS_1S: //1S

{

RLED=1 //灭一次

YLED=1

GLED=1

} break

case STATUS_2S: //1S

{

RLED=0 //亮二次

YLED=0

GLED=0

} break

case STATUS_3S: //1S

{

RLED=1    ////灭二次

YLED=1

GLED=1

} break

case STATUS_4S: //1S

{

RLED=0    ////亮三次

YLED=0

GLED=0

} break

case STATUS_5S: //1S

{

RLED=1    ////灭三次

YLED=1

GLED=1

status_temp=0

} break

}

}

status_temp=1

ET0=0

TR0=0

}

main()

{

Init()//单片机初始化

Init_Timer0()//定时器初始化

while(1)

{

if(K1==0)

M_Start()//模拟开始

if(K2==0)

M_End()//模拟结束

}

}

void interrupt_time0() interrupt 1   //核对头文件,一致就好

{

TH0=0X3C

TL0=0XB0

flag++

if(flag==20)

{

status++

flag=0

}

}

一. 填空题

1. MCS-51单片机是____8____位机,其最大程序容量可达___64_____K字节,有_____4___个并行口和____32____条I/O管脚。

2. MCS-51单片机正常工作所必须的外部硬件电路是___电源_____、___时钟_____、__复位______。

3. MCS-51单片机复位电平是___高_____电平,正常工作时复位端为__低______电平,复位后并所有行口的输出为____高____电平。

4. MCS-51单片机内部结构中,四个基本功能单元分别是___CPU_____、__RAM______、____ROM____、___定时器计数器I/O口_____;三个扩展功能单元分别是____?____、___?____、___?_____。

5. MCS-51单片机内部RAM四个分区分别是__00H到1FH(R0-R7)可位寻址____、____ _ 20H-2FH___、_30H-7FH__ _____、__80H-FFH______。

6. MCS-51单片机___P0_____口没有内部上拉电阻;并行口作为输入口使用时必须保证该端口场效应管__开漏______,即向该端口写___0xff_____,此时该端口的输出锁存器Q端为___1(高电平)_____。

7. MCS-51单片机计数器工作在方式1和方式2的最大计数值分别是_____65536______、___256________。

8. MCS-51单片机若单片机的主时钟振荡频率为6MHz,定时器工作在方式1和方式2的最大定时时间分别是_____自己算!!______ms、___不懂看书!!________us。基本指令周期是___0.5-2_______us。

9. MCS-51单片机的五个中断源分别是___INT0______、__T0_______、_____INT1_____、___T1______、___UART_______。

10. 编写程序常用的三种程序结构是 __顺序结构_______、__循环结构_______、___选择结构_______。

11. C语言语法中,数据类型unsigned char 定义的是____8_____位无符号数;数据类型unsigned int定义的是___16______位无符号数。对8位和16位有符号数,定义数据类型关键词为___signed char______、____short_____。

12. 单片机上电后是从主函数void main()的___0x0000H______位置运行。

13. 单片机C语言编程时必须有的固定结构的语句是#include <reg51.h>、void main()以及____while_____。

14. keil 集成开发软件的三个主要功能是___编译______、__调试_______、___仿真______。

15. 十进制数100对应的十六进制数是____64_____、二进制数是___01100100______。

二. 读程序题

默认有关变量x、y、z、a、b、c、i均为unsigned int (8为无符号数)(这个是不是打错了)请写出局部程序运行后的结果,用十进制表示。

1. x = ___6___, y = ___3___, z = __11____ , a = ___5___, b = ___15___, c = ___252___。

x = 50/8 y = 100%12 z = 240+26

a = z>>1 b = x | z c = ~y

2. x = _183_____, y = __10____, z = __11____ , a = __10____, b = __10____, c = ___10___。

x = 0xa5 ^ 0x12 y = 5*2 z = y++

a = --z b = a &y c = (a+z)/2

3. x = ___6___, y = __12____, i = ___3___。

x=0y=0

for (i=1i<=3i++){

x = x+i

y = y + i*2

}

4. x = __20____, y = ___10___, z = ___81___ , a = __8____, b = ____9__,

c = __48____, i = ___8___。

a=0

if (!a){

x=20y=x<<2z=y++

}else{

x=10y=x<<2z=y++

}

i=2<<2y=10

if (i>3 &&y){

a=y &0x0c

b=++i

c=x^y

}

随便做的,有些东东忘了!不懂的自己回去看看书去。

下列程序已经调好,按键显示电路可见:

http://hi.baidu.com/%D7%F6%B6%F8%C2%DB%B5%C0/blog/item/ef086222268d4f4eac34de59.html

//单片机:使用51系列兼容的即可;

//4×4矩阵键盘:接在P1口;

//两位数码显示器: P0口输出七段码,P2口输出位选码。

/========================================

//C语言程序如下。

/*************************************************************

* 文件名: KEY_LED.c

* 功能 : 对4×4矩阵键盘进行输出,在数码管后两位显示按键值。

**************************************************************/

#include <reg51.h>

#include <intrins.h>

#define uint unsigned int

#define uchar unsigned char

uchar code table[10] = {0xC0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90}

uchar sec, t_50ms

/**************************************************************

* 名称 : Delay_1ms()

* 功能 : 延时子程序,延时时间为 1ms * x

* 输入 : x (延时一毫秒的个数)

* 输出 : 无

***************************************************************/

void Delay_1ms(uint x)

{

uint i

uchar j

for(i = 0i <xi++) for(j = 0j <= 148j++)

}

/**************************************************************

* 名称: Display(uchar k)

* 功能: 将参数分成十位、个位分别显示

* 输入: k (键盘数值)

* 输出: P0口输出七段码,P2口输出位选码

***************************************************************/

void Display(uchar k)

{

P2 = 0 //消隐

P0 = table[k / 10]

P2 = 0x02Delay_1ms(5) //显示5ms十位

P2 = 0 //消隐

P0 = table[k % 10]

P2 = 0x01Delay_1ms(5) //显示5ms个位

}

/**************************************************************

* 名称: Keyscan()

* 功能: P1外接4×4按键, 按照扫描法读出键值

* 输出: 按键值0~15/如无键按下, 返回16

***************************************************************/

uchar Keyscan(void)

{

uchar i, j, temp, Buffer[4] = {0xef, 0xdf, 0xbf, 0x7f}

for(j = 0j <4j++) { //循环四次

P1 = Buffer[j]//在P1高四位分别输出一个低电平

temp = 0x01 //计划先判断P1.0位

for(i = 0i <4i++) { //循环四次

if(!(P1 &temp)) //从P1低四位,截取1位

return (i + j * 4)//返回取得的按键值

temp <<= 1 //判断的位,左移一位

} }

return 16 //判断结束,没有键按下,返回16

} //呵呵,实质性的语句不过8行,就是这么简练!

/**************************************************************

* 名称: GetKey()

* 功能: 读出按键、消抖、等待按键释放

* 输出: 按键值0~15/如无键按下, 返回16

***************************************************************/

uchar GetKey(void)

{

uchar Key_Temp1, Key_Temp2//两次读出的键值

P1 = 0xff

Key_Temp1 = Keyscan() //先读入按键

if(Key_Temp1 == 16) return 16//没有键按下,返回16

Display(sec) //用显示代替延时

Key_Temp2 = Keyscan() //再读一次按键

if(Key_Temp1 != Key_Temp2) return 16//不同,返回16

while(Keyscan() <16)//等待按键释放

Display(sec) //等待期间显示

return Key_Temp1

}

/**************************************************************

* 名称 : Main()

* 功能 : 主函数

***************************************************************/

void Main(void)

{

uchar Key_Value //读出的键值

sec = 0

TMOD = 0x01

TH1 = (65536-50000)/256

TL1 = (65536-50000)%256

TR0 = 1

ET0 = 1

EA = 1

while(1) {

Display(sec) //显示

if (GetKey() == 10) {

TR0 = 0

while (TR0 == 0) {

Display(sec) //显示

Key_Value = GetKey()

if (Key_Value <10) {

sec %= 10

sec = sec * 10 + Key_Value

}

if (Key_Value == 10) TR0 = 1

} } }

}

/**************************************************************

* 名称 : T0_INT()

* 功能 : T0中断函数

***************************************************************/

void T0_INT() interrupt 1

{

TH1 = (65536-50000)/256

TL1 = (65536-50000)%256

t_50ms++

if(t_50ms >= 20) {

t_50ms = 0

sec++

sec %= 60

}

}

/*************************************************************/


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11128435.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-13
下一篇 2023-05-13

发表评论

登录后才能评论

评论列表(0条)

保存