单片机作业 可乐浇汁 “苦乐交织”

**

实际编程前画个流程图好还是写伪代码好

**

画图是真实业务抽象设计bai成程序模型的能力,这个du能力培养起zhi来,可以走架构的路dao。类图,可以把复杂的业务关系梳理成业务对象之间的关系,再抽象到程序设计上。时序图,可以把用户交互到服务端处理的完整调用链规划清楚,对于复杂的业务非常适用,还可以用这个时序图直接生成代码(EA)数据流,可以把业务对象之间的数据扭转关系梳理清楚,方便开发和沉淀产物。这些图,主要面向负责的业务逻辑或者技术难点。如果是简单的增删改,没啥复杂功能,是没有必要去画的,顶多就是画一个数据结构。再说说伪代码相较于画图的难度,伪代码可能更容易被入门程序员接受,因为比较具象了。每个方法级别输入输出,方法体内需要的逻辑设想好,写好就行。伪代码也是代码规划的一种,比较适合入门。但是缺点就是没办法从宏观交付看整体结构、成员之间的关系,设计产出的内容变动会比较频繁。

如何写好伪代码
如何写程序流程图

单片机c常用关键字,标识符详解

单片机c常用关键字,标识符详解

第一次作业

**第一次基础测试
题目:设计一个单片机程序,控制LED灯,每5s闪烁一次,每次点亮时间1s
完成要求:
(1)熟悉单片机(51或stm32)的基本配置,(2)会控制单片机端口的高低电平(3)同时会实用单片机内部的计时器中断进行计时(4)并且计时要求严格准确
提交时间:2020年7月14日21点前


```java
#include <reg52.h> //引入单片机头文件,频率是11.0592Mhz


#define unit unsigned int//无符号整形
#define uchar unsigned char//无符号字符型
sbit LED1=P2^0;//这里P一定要大写,发光二极管 led1 接 P1口 0 位端,用以控制 led1 的亮灭。sbit是定义特殊功能寄存器的位变量。
uchar num;
void main()
{
TMOD=0x01;//设置定时器0工作模式1,16位
	TH0=(65536-45872)/256;//50ms
	TL0=(66536-45872)%256;
	LED1=0;
	EA=1;
	ET0=1;//打开定时器0中断
	TR0=1;//启动定时器0
while(1)
{
if(num==20)//20次,说明到了1秒
{LED1=1;//1秒后,灭
	

}
if(num==100)//100次,5秒
{
	LED1=0;
	num=0;
}
}
}
void T0_time() interrupt 1
	{
		TH0=(65536-45872)/256;
	TL0=(66536-45872)%256;
		num++;
	}

TH0=(65536-1000)/256;将先求括号内的差,然后取这个差的高八位(通过除以2的八次方得到,除以一次2相当于右移一位)
TL0=(65536-1000)%256;将先求括号内的差,然后取这个差的低八位,即低字节放入TL0
计数器初值的决定

第二次作业

题目:设计一个单片机程序,在单片机内部产生6个频点的正弦波
基础完成要求:
(1) 利用单片机产生6个频点的正弦波,频点要求分别是(1:do的频率为bai261.6HZ,2:re的频率为zhi293.6HZ,3:mi的频率为329.6HZ,4:fa的频率为349.2HZ,5:so的频率为392HZ,6:la的频率为440HZ,7:si的频率为493.8HZ),六个频点的幅度都可以自由控制和调节
(2) 选取合适的时钟频率,让产生的时钟偏差不超过5Hz
(3) 可以通过按键在以上几个频率的正弦波之间进行切换,按键每按下次,频率切换一次
(4) 可以通过按键改变频率输出的幅度
(5) 控制DA输出到各个频率的正弦波,并且验证相关频点的正弦波是否正确
提交时间:2020年7月25日21点前

高级完成要求:
利用产生的频率,去控制DA输出下面的这首曲子
准备:
目标:产生六个频点的正弦波
1正弦采样点,一共有256个点。通过DA转换bai输出信du号的。
用示波器看,就是正弦信号,其实是一种曲zhi线阶梯型的信号而已

2、
**

pwm

TIM2的PWM

在这里插入图片描述

占空比是指在一个脉冲循环内,通电时间相对于总时间所占的比例。占空比(Duty Ratio)在电信领域中有如下含义:例如:脉冲宽度1μs,信号周期4μs的脉冲序列占空比为0.25。

Q: 如何用51单片机控制DAC0832产生不同频率正弦波,键盘改变频率,求具体的C语言程序

如何用51单片机控制DAC0832产生不同频率正弦波,键盘改变频率,求具体的C语言程序

如何用51单片机控制DAC0832产生不同频率正弦波,键盘改变频率,求具体的C语言程序
https://zhidao.baidu.com/question/453041357.html?qbl=relate_question_0&word=%C8%E7%BA%CE%BF%D8%D6%C6DA%CA%E4%B3%F6%B5%BD%B8%F7%B8%F6%C6%B5%C2%CA%B5%C4%D5%FD%CF%D2%B2%A8%20%B3%CC%D0%F2

#include<reg52.h>       //时钟周期是12Mhz
#include<intrins.h>
#include<math.h>
#define uchar unsigned char
#define uint unsigned int
#define GPIO_DIG P0//通用baiIO口,就是普通的输入输du出引zhi脚。,数码管连接P0口
#define GPIO_KEY P1//矩阵键盘用P1口。矩形按键控制数码管
uint i;
uint K;
uchar KeyValue;	//用来存放读取到的键值
uint xiaoshu;
unsigned char code sin_tab[] = //正弦bai波输du出表zhi
{
0x80,0x83,0x86,0x89,0x8D,0x90,0x93,0x96,0x99,0x9C,0x9F,0xA2,0xA5,0xA8,0xAB,0xAE,
0xB1,0xB4,0xB7,0xBA,0xBC,0xBF,0xC2,0xC5,0xC7,0xCA,0xCC,0xCF,0xD1,0xD4,0xD6,0xD8,
0xDA,0xDD,0xDF,0xE1,0xE3,0xE5,0xE7,0xE9,0xEA,0xEC,0xEE,0xEF,0xF1,0xF2,0xF4,0xF5,
0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFD,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFD,0xFD,0xFC,0xFB,0xFA,0xF9,0xF8,0xF7,0xF6,
0xF5,0xF4,0xF2,0xF1,0xEF,0xEE,0xEC,0xEA,0xE9,0xE7,0xE5,0xE3,0xE1,0xDF,0xDD,0xDA,
0xD8,0xD6,0xD4,0xD1,0xCF,0xCC,0xCA,0xC7,0xC5,0xC2,0xBF,0xBC,0xBA,0xB7,0xB4,0xB1,
0xAE,0xAB,0xA8,0xA5,0xA2,0x9F,0x9C,0x99,0x96,0x93,0x90,0x8D,0x89,0x86,0x83,0x80,
0x80,0x7C,0x79,0x76,0x72,0x6F,0x6C,0x69,0x66,0x63,0x60,0x5D,0x5A,0x57,0x55,0x51,
0x4E,0x4C,0x48,0x45,0x43,0x40,0x3D,0x3A,0x38,0x35,0x33,0x30,0x2E,0x2B,0x29,0x27,
0x25,0x22,0x20,0x1E,0x1C,0x1A,0x18,0x16,0x15,0x13,0x11,0x10,0x0E,0x0D,0x0B,0x0A,
0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,
0x0A,0x0B,0x0D,0x0E,0x10,0x11,0x13,0x15,0x16,0x18,0x1A,0x1C,0x1E,0x20,0x22,0x25,
0x27,0x29,0x2B,0x2E,0x30,0x33,0x35,0x38,0x3A,0x3D,0x40,0x43,0x45,0x48,0x4C,0x4E,
0x51,0x55,0x57,0x5A,0x5D,0x60,0x63,0x66,0x69,0x6C,0x6F,0x72,0x76,0x79,0x7C,0x7E
};
sbit WRI=P3^4;
sbit CS=P3^5;

uint code TIME_US[] = 
 {15,13,12,11,10,9,8};//255个间隔。每个间隔对应的微秒数
 
 void delay_1us(K) //1us延时函数
{uint i;
	for(i=0;i<=K;i++)
_nop_(); //这一个语句表示1us延时
}

//DA转换
void DAConvert(uchar Data)//注意 这里的data 还没有给与
{
 EA =0;
 CS=1;
 WRI=1;
 delay_1us(2);
 CS=0;
 WRI=0;
 P0=Data;
 CS=1;
 WRI=1;
 EA = 1;
}

 
// 共阳极数码管编码
  char code DSY_Table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
 //0,1,2,3,4,5,6,7,8
  //9,A,B,C,D,E,F,-
	
// 各音符对应的延时  
uint code Tone_Delay_Table[] = 
 { 63625,63883,64019,64104,64260,64400,64523,64684,64777,
 64820,64898,64968,65030,65058,65110,65157,65178 }; //
sbit BEEP = P1^5; // 蜂鸣器
uchar KeyValue; // 按键序号





//共阳
uchar code smgduan[17]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
					0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//显示0~F的值

/*******************************************************************************
* 函 数 名         : delay
* 函数功能		   : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(uint i)
{
	while(i--);	
}

void DelayMS(uchar x)
{
 uchar i;
 while ( x-- ) 
	 for(i = 0;i < 120; i++);
 }



/*******************************************************************************
* 函 数 名         : KeyDown
* 函数功能		   : 检测有按键按下并读取键值
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
uint KeyDown(void)
{
	char a=0;
	GPIO_KEY=0x0f;
	if(GPIO_KEY!=0x0f)//读取按键是否按下
	{
		delay(1000);//延时10ms进行消抖
		if(GPIO_KEY!=0x0f)//再次检测键盘是否按下
		{	
			//测试列
			GPIO_KEY=0X0F;
			switch(GPIO_KEY)
			{
				case(0X07):	KeyValue=0;break;
				case(0X0b):	KeyValue=1;break;
				case(0X0d): KeyValue=2;break;
				case(0X0e):	KeyValue=3;break;
			}
			//测试行
			GPIO_KEY=0XF0;
			switch(GPIO_KEY)
			{
				case(0X70):	KeyValue=KeyValue;break;
				case(0Xb0):	KeyValue=KeyValue+4;break;
				case(0Xd0): KeyValue=KeyValue+8;break;
				case(0Xe0):	KeyValue=KeyValue+12;break;
			}
			
		}
	}
	while((a<50)&&(GPIO_KEY!=0xf0))	 //检测按键松手检测
	{
		delay(100);
		a++;
	}
	return KeyValue;
}

uint fudu()
{
	if(KeyValue<=6)//控制幅度
	{xiaoshu=1;}
	 else if(KeyValue==7)
	 {
		 xiaoshu=0.75;
	 }
	 else if(KeyValue==8)
	 {
		 xiaoshu=0.5;
	 }
	 else if(KeyValue==9)
	 {xiaoshu=0.25;
 }
return xiaoshu;
}

/*******************************************************************************
* 函 数 名       : main
* 函数功能		 : 主函数
* 输    入       : 无
* 输    出    	 : 无
*******************************************************************************/

	

//------------------------------------------------
// 定时器 0 中断程序,不同频率的声音由该中断产生
//------------------------------------------------
void Play_Tone() interrupt 1
{
 TH0 = Tone_Delay_Table[ KeyValue ] / 256;
 TL0 = Tone_Delay_Table[KeyValue ] % 256;
 BEEP = ~BEEP;
 }
//--------------------------------------------
// 主程序
//--------------------------------------------
 
void main()
{WRI=0;
CS=0;

 P0 = 0x00; // 初始显示“ - ”
 TMOD = 0x01;
 IE = 0x82;
	
 while(1)
 {
 P1 = 0xF0; // 发送扫描码
 if (P1 != 0xF0) // 如果有键按下
 {
 KeyDown(); // 扫描键盘矩阵
	 if(KeyValue<=6)
	 {
	 GPIO_DIG=~smgduan[KeyValue];
	 }
 P0 = DSY_Table[ KeyValue ]; //  显示按键  
 TR0 = 1; // 启动定时器,根据 KeyNo 发音
 }
 else 
 {
 TR0 = 0; // 停止播放
 }
 DelayMS(2);
 fudu();
  if(xiaoshu!=1)
	 {KeyDown();
	 }
 if(KeyValue<=6)//使只输出7个频率,其他键只用来
	{		
 
		 K=TIME_US[KeyValue];//注意顺序,回来检查 只包含0-6
	}
	
 
 for(i=0;i<256;i++)
 {
 DAConvert(sin_tab[i]*xiaoshu);
	
if(i==256)
{
	i=0;
}
 
 delay_1us(K);  //控制正弦波每个点的输出时间以产生一定的频率
 }
 }
 }
 
 

```bash
在这里插入代码片

来今天把第三次作业放到这里 ,开心的不得了,完成第三次的时候,我有了TEAM来帮忙,虽然一点都不专,不过他们能触类旁通。也算是帮到了我的忙。昨天看《三十而已》,看到王漫妮跳槽想找新的工作,可惜呀不如愿,无法再得到高薪,那个猎头说了一句话是真的一语中的,就是他们的工作都不具备不可替代性,哎,趁春光明媚,用全力去追,青春多宝贵,没机会,去浪费。好好体会。

第三次左右

@所有人
第三次题目:
题目:设计一个单片机程序,通过串口ASCII码表
基础完成要求:
(1) 熟练使用串口通信的接口
(2) 选择合适的波特兰进行串口通信
(3) 将ASCII码表进行编码
(4) 传输英语新概念2的第一课课文到另外一个单片机上
主要考察大家的串口通信和ASCII码表的编码
截止的时间是2020年8月1日下午六点

Q:通信串口.c(49): error C249: ‘DATA’: SEGMENT TOO LARGE

答:如果你bai定义的数组不用更改就用 uchar code XX[10]=
很长的一组 就加code

Q: error C247: non-address/-constant initializer

不能通过引用数组元素的方式给变量赋初值。
WORD J=TIME[I] 这个赋值语句可以加在程序里,而不是在变量声明时引用数组元素。
答:你这几个变量声明是外部变量,那么他们应该在别的程序头文件中定义过的。你看看是不是定义了。

Q:keil里面怎么加长长的字符串。

答:char str[ ] = “china”;
char str[ ] = {‘c’,‘h’,‘i’,‘n’,‘a’};
上面的两种形式都可以,结尾没有加上’\0’结束符,编译时编译器会默认帮我们加。

Q:怎么把句子等转成ASCLL码

答:在这里插入图片描述

Q:有时候不适合把定义放在函数内,或循环里 为啥

在这里插入图片描述

在这里插入图片描述

Q:为啥卡住了呢,还有如果现实占用串口,拔掉再插上

在这里插入图片描述
在这里插入图片描述


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值