单片机程序,单片机产生正弦波的程序

1,单片机产生正弦波的程序DB是个伪指令 , 功能:从指定的地址单元开始,定义若干个8位的内存单元的内容 。如你给出的例子,若指定地址为2000H , 用DB连续定义了8个单元的内容,(2000H)=80H~(2007H)=96H,用查表法写程序,会通过指针@A+PC来读取列表的内容 。如果你需要转换的数有6个,出来的结果当然有六个 。数不是算出来的,是正弦采样点,一共有256个点 。通过DA转换输出信号的 。用示波器看,就是正弦信号 , 其实是一种曲线阶梯型的信号而已 。一行6个,只是一种写法,你可以写成10个,8个,随便你,但是总数不要变就行 。有空你可以看看《信号转换技术》单片机 外接ad转换芯片 再加运放 通过一定的控制程序就可产生正弦波 。实现方法: 1、通过单片机da来实现 , 需要通过查表法; 2、通过pwm方式实现; 不过都需要加硬件滤波电路来实现正弦波的平滑 。为什么说一行六个呀?最简单的拿个excel,利用函数就可以算出来 。再转成你要的16进制 。
2,单片机定时程序的编写 COUNT EQU 5;定时200us*5=1ms;********************************* ORG 0000H LJMP MAIN ORG 000BH LJMP _T0 MAIN: MOV SP,#50HMOV TH0,#38H MOV TL0,#38H MOV TMOD,#00000010B SETB TR0 SETB EA SETB ET0LOOP: MOV P1,#0FFH;输出1LOOP1: MOV A,R2CJNE A,#0,LOOP1 ;判断到1ms否MOV P1,#0FEH;到1ms输出0,否则继续检测MOV R2,#COUNT ;重置计数LOOP2: MOV A,R2CJNE A,#0,LOOP2 ;判断到1ms否MOV R2,#COUNTSJMP LOOP;到1ms循环 ;********************************** _T0: DEC R2 RETIEND ;KEIL2调试通过
3,单片机电子钟程序51单片机在数码管上显示的数字钟程序:#include "at89x51.h"unsigned char code dispcode[]=unsigned char dispbitcode[]=unsigned char dispbuf[]=unsigned char dispbitcnt;unsigned char second;unsigned char minite;unsigned char hour;unsigned int tcnt;unsigned char mstcnt;unsigned char i,j;void main(void)TMOD=0x02;TH0=0x06;TL0=0x06;TR0=1;ET0=1;EA=1; while(1)if(P0_0==0)for(i=5;i>0;i--) for(j=248;j>0;j--); if(P0_0==0)second++; if(second==60)second=0; } dispbuf[0]=second%10; dispbuf[1]=second/10; while(P0_0==0); } } if(P0_1==0)for(i=5;i>0;i--) for(j=248;j>0;j--); if(P0_1==0)minite++; if(minite==60)minite=0; } dispbuf[3]=minite%10; dispbuf[4]=minite/10; while(P0_1==0); } } if(P0_2==0)for(i=5;i>0;i--) for(j=248;j>0;j--); if(P0_2==0)hour++; if(hour==60)hour=0; } dispbuf[6]=hour%10; dispbuf[7]=hour/10; while(P0_2==0); } } }}void t0(void) interrupt 1 using 0 mstcnt++; if(mstcnt==8)mstcnt=0; P1=dispcode[dispbuf[dispbitcnt]]; P3=dispbitcode[dispbitcnt]; dispbitcnt++; if(dispbitcnt==8)dispbitcnt=0; } } tcnt++; if(tcnt==8)tcnt=0; second++; if(second==60)second=0; minite++; if(minite==60)minite=0; hour++; if(hour==24)hour=0; } } } dispbuf[0]=second%10; dispbuf[1]=second/10; dispbuf[3]=minite%10; dispbuf[4]=minite/10; dispbuf[6]=hour%10; dispbuf[7]=hour/10; }}【单片机程序,单片机产生正弦波的程序】
4,单片机的红绿灯控制程序如何写啊//--------------------------------------------------//名称:LED模拟交通灯//作者:彭伟《单片机C语言程序设计实训100例-基于8051+PROTEUS仿真》//--------------------------------------------------//说明:东西向绿灯亮若干秒后,黄灯闪烁 , 闪烁5次后亮红灯//红灯亮后,南北向由红灯变为绿灯,若干秒后南北向黄灯闪烁//闪烁5次后亮红灯 , 东西向绿灯亮 , 如此重复//---------------------------------------------------#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit RED_A=P0^0;//东西向指示灯sbit YELLOW_A=P0^1;sbit GREEN_A=P0^2;sbit RED_B=P0^3;//南北向指示灯sbit YELLOW_B=P0^4;sbit GREEN_B=P0^5;uchar Flash_count=0;Operation_type=1;//闪烁次数及操作类型变量//-----------------------------------------------------//延时//----------------------------------------------------void DelayMS(uint x) uchar i; while(x--)for(i=0;i<120;i++)}//---------------------------------------------------//交通灯切换子程序//---------------------------------------------------void Traffic_light() switch(Operation_type)case 1://东西向绿灯南北向红灯亮RED_A=1;YELLOW_A=1;GREEN_A=0;RED_B=0;YELLOW_B=1;GREEN_B=1;DelayMS(2000);Operation_type=2;break; case 2://东西向黄灯闪烁 , 绿灯关闭DelayMS(300);GREEN_A=1;YELLOW_A=~YELLOW_A;//闪烁5次if (++Flash_count!=10) return;Flash_count=0;Operation_type=3;break; case 3://南北向绿灯东西向红灯亮RED_A=0;YELLOW_A=1;GREEN_A=1;RED_B=1;YELLOW_B=1;GREEN_B=0;DelayMS(2000);Operation_type=4;break; case 4://南北向黄灯闪烁,绿灯关闭DelayMS(300);GREEN_B=1;YELLOW_B=~YELLOW_B;//闪烁5次if (++Flash_count!=10) return;Flash_count=0;Operation_type=1; }}void main() while(1) Traffic_light();}#include#define uchar unsigned char#define red 2500 //红灯时间25s#define yel 500//黄灯#define gre 1000 //绿灯sbit red=p^0;sbit yel=p^1;sbit gre=p^2;uchar count=0;uchar flag=0;void timer0() interrupt 1 using 1//10ms中断~晶振为11.0592mhz{th0=0xdb;tl0=0xff;count++;}void main(){tmod=0x01;th0=0xdb;tl0=0xff;ea=1;et0=1;tr0=1;red=1;yel=0;gre=0;while(1){switch(flag){case 0:if(count==red) {red=0;flag++;}//到25s灭红灯~else red=1;break;//否则点亮红灯~下同~case 1:if(count==yel) {yel=0;flag++;}else yel=1;break;case 2:if(count==gre) {gre=0;flag=0;}else gre=1;}}}5,单片机串口通信步进电机控制程序流程一楼的说的有道理啊 , 还是得靠自己的给你个类似的你参考一下吧!我也不会的实验实现的功能主要是:用PC上的一个软件通过串口通讯控制单片机I/O口的输出 。本次实验主要涉及PC端上位机的程序编写(用VC)与单片机程序的编写(用Keil) 。为了简化实验,PC端软件设计成具有8个按钮的对话框,每个按钮分别控制单片机P2口的一个引脚的高低电平 。为了体现直观的结果 , P2口上接上8个发光二极管 。PC与单片机的通讯协议如下:采用4800波特率,无校验位,8个数据位 , 1个停止位,一次传输一个控制字节 。一、上位机软件的编写本来控制单片机只需单向传输数据即可,为了熟悉PC端接受数据的功能,在应用软件将控制数据传输到单片机端后,单片机端回传数据给应用软件,并用16进制格式显示在编辑控件中 。VC实现对串口的控制主要有两种方式:mscomm控件与api函数 。由于mscomm控件实现简单 , 本实验采用该方式 。1.在VC中创建一个基于对话框的应用程序,在该程序中插入Mscomm控件 。修改对话框资源,增加Mscomm及8个按钮控件与一个编辑框 。并为Mscomm控件增加一个控件变量m-com 。2.在对话框的OnInitDialog()函数中初始化串口 , 代码如下:if(m_com.GetPortOpen())m_com.SetPortOpen(FALSE);m_com.SetCommPort(1);//选择com1if(!m_com.GetPortOpen())m_com.SetPortOpen(TRUE);//打开串口elseMessageBox("无法打开串口!");m_com.SetSettings("4800,n,8,1");//波特率4800,无校验,8个数据位,1个停止位m_com.SetInputMode(1); //1:表示以二进制方式检取数据m_com.SetRThreshold(1);//参数1表示每当串口接收缓冲区中有多于//或等于1个字符时将引发一个接收数据的OnComm事件m_com.SetInputLen(0); //设置当前接收区数据长度为0m_com.GetInput();//先预读缓冲区以清除残留数据3.为每个按钮添加命令函数 。下面为其中一个函数的代码,其他与此类似 。void CComDlg::OnP20() // TODO: Add your control notification handler code hereOutput.Format("%c",0x01);m_com.SetOutput(COleVariant(Output));}4.接受数据时采用Mscomm控件的响应函数进行对事件的捕捉 。处理代码如下:void CComDlg::OnComm() // TODO: Add your control notification handler code hereVARIANT Input;CString temp;long k,len;COleSafeArray OleArray;BYTE rxdata[10];if (2==m_com.GetCommEvent())Input=m_com.GetInput();OleArray=Input;len=OleArray.GetOneDimSize();for (k=0;k<len;k++)OleArray.GetElement(&k,rxdata+k);BYTE bt=*(char *)(rxdata+k);temp.Format("%02X ",bt);m_recv+=temp;}}UpdateData(FALSE);}二、单片机程序的编写 。单片机程序编写相对容易,只需进行初始话串口 , 接受数据,发送数据等工作即可 。代码如下:#i nclude <reg51.h>unsigned char inbuf;unsigned char flag;//初始化函数void init_serialcomm(void)SCON = 0x50;//SCON: serail mode 1, 8-bit UART, enable ucvr,0101000bTMOD |= 0x20;//TMOD: timer 1, mode 2, 8-bit reload,0010000bPCON |= 0x80;//SMOD=1;10000000bTH1= 0xF4;//Baud:4800 fosc=11.0592MHzIE|= 0x90;//Enable Serial InterruptTR1= 1;// timer 1 runinbuf=0;P2=0;// TI=1; }//向串口发送一个字符 void send_char_com(unsigned char ch)SBUF=ch;while(TI==0);TI=0;}//串口接收中断函数void serial () interrupt 4 using 3if(RI)RI = 0;inbuf=SBUF;}flag=1;}main()init_serialcomm(); //初始化串口while(1)if(flag)P2=inbuf;send_char_com(inbuf);flag=0;}}}网上能找到的我估计人家还是能COPY给你的,呵呵假设p0口低4位接步进电机正转p0=8delayms(1)p0= 4 delayms(1)p0=2delayms(1)p0= 1delayms(1)反转的话输出 1 2 4 8即可我相信,你的这几个问题在这里没人能帮你解决!原因是问题不够简单,不直接,想帮你的人不能直接在这里给你马上做出回答 。还有一个学习是要自己摸索的,不能够全部要别人来代劳,若碰到有不懂的点 , 可以在这里提问,相信很多人会为你解答 , 但像要别人写流程,写代码之类的 , 是不可能了!

    推荐阅读