求一个基于51单片机的C语言程序,要求从串口接收一组数据,然后将其通过串口输出

求一个基于51单片机的C语言程序,要求从串口接收一组数据,然后将其通过串口输出,第1张

#include <AT89X51.H>//单片机51头文件,存放着单片机的寄存器

unsigned char dat //用于存储单片机接收发送缓冲寄存器SBUF里面的内容

sbit gewei=P2^2 //个位选通定义

sbit shiwei=P2^3//十位选通定义

unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67,0x77,0x7c,0x39,0x5e,0x79,0x71}

//{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67,}// 0, 1, 2, 3, 4, 5, 6, 7, 8, 9

void Delay(unsigned int tc) //延时程序

{

while( tc != 0 )

{unsigned int i

for(i=0i<100i++)

tc--}

}

void LED()//LED显示接收到的数据

{

shiwei=0

P0=~table[dat/16]

Delay(8)

shiwei=1

gewei=0

P0=~table[dat%16]

Delay(5)

gewei=1

}

void Init_Com(void)//功能:串口初始化,波特率9600,方式1

{

TMOD = 0x20

PCON = 0x00

SCON = 0x50

TH1 = 0xFd

TL1 = 0xFd

TR1 = 1

}

void main()//主程序功能:实现接收数据并把接收到的数据原样发送回去///////

{

Init_Com()//串口初始化

// P1=0xf0

while(1)

{

if ( RI ) //扫描判断是否接收到数据,

{

dat = SBUF //接收数据SBUF赋与dat

RI=0 //RI清零。

SBUF = dat //在原样把数据发送回去

}

LED() //显示接收到的数据

}

}

#include<reg51.h>

#define uchar unsigned char

#define uint unsigned int

uchar code ledtab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}//0-9

uchar scanled

uchar disdat[4]

uint ss,time

sbit led=P1^0

void dischg()

{

disdat[3]=ss%10

disdat[2]=(ss/10)%10

disdat[1]=(ss/100)%10

disdat[0]=(ss/1000)%10

}

void t0isr() interrupt 1 

{

ss++

dischg()

}

void t1isr() interrupt 3 //显示

{

TH1=(65536-5000)/256

TL1=(65536-5000)%256

P2=1<<scanled

P0=~ledtab[disdat[scanled]]

scanled++

scanled%=4

time++

if(time>100){time=0led=~led}

}

main()

{

TMOD=0x16

TH0=0xff

TL0=0xff

TH1=(65536-5000)/256

TL1=(65536-5000)%256

TR1=1

TR0=1

ET0=1

ET1=1

EA=1

led=0

scanled=0

ss=0

dischg()

while(1)

}

#include <reg51.h>

#define uchar unsigned char

#define uint unsigned int

//******************定义端口******************//

sbit SS = P1^0

sbit SCK = P1^1

sbit MOSI = P1^2

sbit MISO = P1^3

sbit PR = P1^4//PLAY = 0REC = 1

sbit STOP = P1^5

sbit AN = P1^6

sbit LED = P1^7

//******************定义ISD1700状态寄存器及各标志位******************//

uchar bdata SR0_L//SR0寄存器低位、高位

uchar bdata SR0_H

uchar bdata SR1//SR1寄存器

uchar APC_L = 0, APC_H = 0//APC寄存器

uchar PLAYADDL = 0, PLAYADDH = 0//放音指针低位、高位

uchar RECADDL = 0, RECADDH = 0//录音指针低位、高位

sbit CMD_ERR = SR0_L^0//SPI指令无效标志位

sbit FULL = SR0_L^1//芯片存储空间满标志位

sbit PU = SR0_L^2//上电标志位

sbit EOM = SR0_L^3//EOM标志位

sbit INT = SR0_L^4// *** 作完成标志位

sbit RDY = SR1^0//芯片空闲标志位

sbit ERASE = SR1^1//擦除标志位

sbit PLAY = SR1^2//放音标志位

sbit REC = SR1^3//录音标志位

//******************定义标志位******************//

uchar bdata fang

sbit PR_fang = fang^1//录音、放音标志位,放音=0,录音=1

sbit Erase_fang = fang^4//擦出标志位

sbit STOP_fang = fang^7//停止放音标志位

//******************延时μs******************//

void delay(uint time)//延时n微秒

{

while(time!=0)

{

time--

}

}

//******************延时ms******************//

void delayms(uint time)//延时n毫秒

{

for(timetime>0time--)

{

TH0 = 0xfc

TL0 = 0x18

TR0 = 1//计数器0启动

while(TF0!=1)//计数溢出处理

TF0 = 0

TR0 = 0

}

}

//******************CPU初始化******************//

void cpu_init (void)

{

P1 = 0xFF

P2 = 0xFF

P3 = 0xFF

TMOD = 0x01//定时器初始化,工作于方式1

EA = 0//关中断

fang = 0//标志位归0

LED = 1//关指示灯

}

//******************发送、读回数据******************//

uchar isd_senddata (uchar dat)

{

uchar i, BUF_ISD = dat

SS = 0

SCK = 1

delay(4)

for(i=0i<8i++)

{

SCK = 0

if((BUF_ISD&0x01)==1)

{

MOSI = 1

}

else

{

MOSI = 0

}

BUF_ISD = BUF_ISD >>1

if(MISO)

{

BUF_ISD = BUF_ISD|0x80

}

SCK = 1

delay(6)

}

MOSI = 0

return(BUF_ISD)

}

//******************上电******************//

void isd_pu (void)

{

isd_senddata (0x01)

isd_senddata (0x00)

SS = 1

delayms(50)

}

//******************停止当前 *** 作******************//

void isd_stop (void)

{

isd_senddata (0x02)

isd_senddata (0x00)

SS = 1

delayms(50)

}

//******************复位******************//

void isd_reset (void)

{

isd_senddata (0x03)

isd_senddata (0x00)

SS = 1

}

//******************清除中断******************//

void isd_clr_int (void)

{

isd_senddata (0x04)

isd_senddata (0x00)

SS = 1

}

//******************读状态寄存器内容******************//

void isd_rd_status (void)

{

isd_senddata (0x05)

isd_senddata (0x00)

isd_senddata (0x00)

SS = 1

delay(2)

SR0_L = isd_senddata (0x05)

SR0_H = isd_senddata (0x00)

SR1 = isd_senddata (0x00)

SS = 1

}

//******************读放音指针******************//

void isd_rd_playptr (void)

{

isd_senddata (0x06)

isd_senddata (0x00)

isd_senddata (0x00)

isd_senddata (0x00)

SS = 1

delay(2)

SR0_L = isd_senddata (0x06)

SR0_H = isd_senddata (0x00)

PLAYADDL = isd_senddata (0x00)

PLAYADDH = isd_senddata (0x00)

SS = 1

}

//******************下电******************//

void isd_pd (void)

{

isd_senddata (0x07)

isd_senddata (0x00)

SS = 1

delayms(50)

}

//******************读录音指针******************//

void isd_rd_recptr (void)

{

isd_senddata (0x08)

isd_senddata (0x00)

isd_senddata (0x00)

isd_senddata (0x00)

SS = 1

delay(2)

SR0_L = isd_senddata (0x08)

SR0_H = isd_senddata (0x00)

RECADDL = isd_senddata (0x00)

RECADDH = isd_senddata (0x00)

SS = 1

}

//******************读芯片ID******************//

uchar isd_devid (uchar deviceNO)

{

isd_senddata (0x09)

isd_senddata (0x00)

isd_senddata (0x00)

SS = 1

delay(2)

isd_senddata (0x09)

isd_senddata (0x00)

deviceNO = isd_senddata (0x00)

SS = 1

return(deviceNO)

}

//******************放音******************//

void isd_play (void)

{

isd_senddata (0x40)

isd_senddata (0x00)

SS = 1

}

//******************录音******************//

void isd_rec (void)

{

isd_senddata (0x41)

isd_senddata (0x00)

SS = 1

}

//******************擦除******************//

void isd_erase (void)

{

isd_senddata (0x42)

isd_senddata (0x00)

SS = 1

}

//******************全部擦出******************//

void isd_g_erase (void)

{

isd_senddata (0x43)

isd_senddata (0x00)

SS = 1

}

//******************读APC寄存器内容******************//

void isd_rd_apc (void)

{

isd_senddata (0x44)

isd_senddata (0x00)

isd_senddata (0x00)

isd_senddata (0x00)

SS = 1

delay(2)

SR0_L = isd_senddata (0x44)

SR0_H = isd_senddata (0x00)

APC_L = isd_senddata (0x00)

APC_H = isd_senddata (0x00)

SS = 1

}

//******************写APC寄存器******************//

void isd_wr_apc2 (uchar apcdatl,apcdath)

{

isd_senddata (0x65)

isd_senddata (apcdatl)

isd_senddata (apcdath)

SS = 1

}

//******************将APC寄存器内容写入NVCFG******************//

void isd_wr_nvcfg (uchar apcdatl,apcdath)

{

isd_senddata (0x46)

isd_senddata (apcdatl)

isd_senddata (apcdath)

SS = 1

}

//******************将NVCFG内容写入APC******************//

void isd_ld_nvcfg (void)

{

isd_senddata (0x47)

isd_senddata (0x00)

SS = 1

}

//******************快进******************//

void isd_fwd (void)

{

isd_senddata (0x48)

isd_senddata (0x00)

SS = 1

}

//******************空检查******************//

void isd_chk_mem (void)

{

isd_senddata (0x49)

isd_senddata (0x00)

SS = 1

}

//******************外部时钟的启用、关闭******************//

void isd_extclk (void)

{

isd_senddata (0x4a)

isd_senddata (0x00)

SS = 1

}

//******************指定地址放音******************//

void isd_set_play (uchar saddl,saddh,eaddl,eaddh)

{

isd_senddata (0x80)

isd_senddata (0x00)

isd_senddata (saddl)

isd_senddata (saddh)

isd_senddata (eaddl)

isd_senddata (eaddh)

isd_senddata (0x00)

SS = 1

}

//******************指定地址录音******************//

void isd_set_rec (uchar saddl,saddh,eaddl,eaddh)

{

isd_senddata (0x81)

isd_senddata (0x00)

isd_senddata (saddl)

isd_senddata (saddh)

isd_senddata (eaddl)

isd_senddata (eaddh)

isd_senddata (0x00)

SS = 1

}

//******************指定地址擦除******************//

void isd_set_erase (uchar saddl,saddh,eaddl,eaddh)

{

isd_senddata (0x82)

isd_senddata (0x00)

isd_senddata (saddl)

isd_senddata (saddh)

isd_senddata (eaddl)

isd_senddata (eaddh)

isd_senddata (0x00)

SS = 1

}

//******************芯片系统初始化******************//

void isd_init (void)

{

uchar i = 2

SS = 1

SCK = 1

MOSI = 0

do

{

isd_pu ()

isd_rd_status ()

}while(CMD_ERR||(!PU))

isd_wr_apc2 (0x40,0x04)

do

{

isd_rd_status ()

}while(RDY==0)

do

{

LED = 0

delayms(300)

LED = 1

delayms(300)

i--

}while(i>0)

}

//******************isd1700的相关 *** 作******************//

void isdwork (void)

{

uchar i

switch (fang)

{

case 0x00:

{

do

{

isd_rd_status ()

}while(RDY==0)

delayms(10)

isd_play ()

delayms(2)

LED = 0

do

{

isd_rd_status ()

if(STOP==0)

{

delayms (10)

if(STOP==0)

{

LED = 1

isd_clr_int ()

isd_stop ()

isd_reset ()

isd_pd ()

isd_init ()

return

}

}

}while(PLAY==1)

LED = 1

isd_clr_int ()

do

{

isd_rd_status ()

}while(RDY==0)

delayms (10)

isd_fwd ()

do

{

isd_rd_status ()

}while(RDY==0)

}

break

case 0x02:

{

isd_clr_int ()

do

{

isd_rd_status ()

}while(RDY==0)

delayms(10)

isd_rec ()

delayms(2)

LED = 0

do

{

isd_rd_status ()

if(FULL==1)

{

for(i=3i>0i--)

{

LED = 0

delayms (300)

LED = 1

delayms (200)

}

}

}while(AN==0)

isd_clr_int ()

isd_stop ()

LED = 1

}

break

case 0x10:

{

do

{

isd_rd_status ()

}while(RDY==0)

delayms (10)

isd_g_erase ()

delayms (2)

do

{

isd_rd_status ()

}while(RDY==0)

for(i=3i>0i--)

{

LED = 0

delayms (300)

LED = 1

delayms (200)

}

}

break

case 0x80:

{

isd_clr_int ()

isd_stop ()

isd_reset ()

isd_pd ()

}

break

}

}

//******************主程序******************//

void main (void)

{

uchar i

cpu_init ()

delayms (1)

isd_init ()

while(1)

{

if(AN==0)

{

delayms (10)

if(AN==0)

{

if(PR==1)

{

PR_fang = 1

}

else

{

PR_fang = 0

}

isdwork ()

}

}

if(STOP==0)

{

delayms (10)

if(STOP==0)

{

for(i=100i>0i--)

{

if(STOP==1)

{

STOP_fang = 1

isdwork ()

isd_init ()

break

}

delayms(30)

}

if (STOP_fang==1)

{

fang = 0

continue

}

Erase_fang = 1

isdwork ()

}

}

}

}


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

原文地址:https://54852.com/yw/8085657.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存